1
0
mirror of https://github.com/Refactorio/RedMew.git synced 2024-12-14 10:13:13 +02:00
RedMew/features/gui/debug/gui_data_view.lua
2019-05-29 23:12:31 +01:00

285 lines
8.6 KiB
Lua

local Gui = require 'utils.gui'
local Color = require 'resources.color_presets'
local Model = require 'features.gui.debug.model'
local dump = Model.dump
local dump_text = Model.dump_text
local concat = table.concat
local Public = {}
local player_header_name = Gui.uid_name()
local element_header_name = Gui.uid_name()
local player_panel_name = Gui.uid_name()
local element_panel_name = Gui.uid_name()
local input_text_box_name = Gui.uid_name()
local refresh_name = Gui.uid_name()
local data_panel_name = Gui.uid_name()
Public.name = 'Gui Data'
local function draw_player_headers(player_panel, selected_index)
local selected_header = nil
for player_index, values in pairs(Gui.data()) do
local player = game.get_player(player_index)
local player_name
if not player then
player_name = 'invalid player'
else
player_name = player.name
end
local header =
player_panel.add({type = 'flow'}).add {
type = 'label',
name = player_header_name,
caption = concat({player_index, ' - ', player_name})
}
Gui.set_data(header, {values = values, player_index = player_index})
if player_index == selected_index then
selected_header = header
end
end
return selected_header
end
function Public.show(container)
local main_flow = container.add {type = 'flow', direction = 'horizontal'}
local player_panel = main_flow.add {type = 'scroll-pane', name = player_panel_name}
local player_panel_style = player_panel.style
player_panel_style.width = 200
draw_player_headers(player_panel)
local right_flow = main_flow.add {type = 'flow', direction = 'vertical'}
local element_panel = right_flow.add {type = 'scroll-pane', name = element_panel_name}
local element_panel_style = element_panel.style
element_panel_style.horizontally_stretchable = true
element_panel_style.height = 200
local right_middle_flow = right_flow.add {type = 'flow', direction = 'horizontal'}
local input_text_box = right_middle_flow.add {type = 'text-box', name = input_text_box_name}
local input_text_box_style = input_text_box.style
input_text_box_style.horizontally_stretchable = true
input_text_box_style.height = 32
input_text_box_style.maximal_width = 1000
local refresh_button =
right_middle_flow.add {
type = 'sprite-button',
name = refresh_name,
sprite = 'utility/reset',
tooltip = 'refresh'
}
local refresh_button_style = refresh_button.style
refresh_button_style.width = 32
refresh_button_style.height = 32
local data_panel = right_flow.add {type = 'text-box', name = data_panel_name}
data_panel.read_only = true
data_panel.selectable = true
local data_panel_style = data_panel.style
data_panel_style.vertically_stretchable = true
data_panel_style.horizontally_stretchable = true
data_panel_style.maximal_width = 1000
data_panel_style.maximal_height = 1000
local data = {
player_panel = player_panel,
element_panel = element_panel,
input_text_box = input_text_box,
data_panel = data_panel,
selected_player_header = nil,
selected_element_header = nil,
selected_player_index = nil,
selected_element_index = nil
}
Gui.set_data(player_panel, data)
Gui.set_data(element_panel, data)
Gui.set_data(input_text_box, data)
Gui.set_data(refresh_button, data)
end
local function draw_element_headers(element_panel, values, selected_index)
local copy = {}
for k, v in pairs(values) do
copy[k] = v
end
local selected_header = nil
local element_map = Gui.element_map()
local name_map = Gui.names
for ei, stored_data in pairs(copy) do
local ele = element_map[ei]
local ele_name = ''
if ele and ele.valid then
ele_name = ele.name
end
local gui_name = name_map[ele_name]
if gui_name then
ele_name = gui_name
end
if ele_name:match('%d* %- features/gui/debug') then
goto continue
end
local middle_header =
element_panel.add({type = 'flow'}).add {
type = 'label',
name = element_header_name,
caption = concat({ei, ' - ', ele_name})
}
Gui.set_data(middle_header, {stored_data = stored_data, element_index = ei})
if ei == selected_index then
selected_header = middle_header
end
::continue::
end
return selected_header
end
Gui.on_click(
player_header_name,
function(event)
local element = event.element
local header_data = Gui.get_data(element)
local values = header_data.values
local player_index = header_data.player_index
local player_panel = element.parent.parent
local data = Gui.get_data(player_panel)
local element_panel = data.element_panel
local selected_player_header = data.selected_player_header
local input_text_box = data.input_text_box
if selected_player_header then
selected_player_header.style.font_color = Color.white
end
element.style.font_color = Color.orange
data.selected_player_header = element
data.selected_player_index = player_index
data.selected_element_index = nil
input_text_box.text = ''
if not values then
return
end
draw_element_headers(element_panel, values)
end
)
Gui.on_click(
element_header_name,
function(event)
local element = event.element
local header_data = Gui.get_data(element)
local stored_data = header_data.stored_data
local element_index = header_data.element_index
local player_panel = element.parent.parent
local data = Gui.get_data(player_panel)
local data_panel = data.data_panel
local selected_element_header = data.selected_element_header
local input_text_box = data.input_text_box
if selected_element_header then
selected_element_header.style.font_color = Color.white
end
element.style.font_color = Color.orange
data.selected_element_header = element
data.selected_element_index = element_index
local selected_player_index = data.selected_player_index
if selected_player_index then
input_text_box.text =
concat {'global.tokens[', Gui.token, '].data[', selected_player_index, '][', element_index, ']'}
else
input_text_box.text = 'missing player'
end
local content = dump(stored_data) or 'nil'
data_panel.text = content
end
)
local function update_dump(text_input, data, player)
local suc, ouput = dump_text(text_input.text, player)
if not suc then
text_input.style.font_color = Color.red
else
text_input.style.font_color = Color.black
data.data_panel.text = ouput
end
end
Gui.on_text_changed(
input_text_box_name,
function(event)
local element = event.element
local data = Gui.get_data(element)
update_dump(element, data, event.player)
end
)
Gui.on_click(
refresh_name,
function(event)
local element = event.element
local data = Gui.get_data(element)
local input_text_box = data.input_text_box
local player_panel = data.player_panel
local element_panel = data.element_panel
local selected_player_index = data.selected_player_index
local selected_element_index = data.selected_element_index
Gui.clear(player_panel)
local selected_player_header = draw_player_headers(player_panel, selected_player_index)
data.selected_player_header = selected_player_header
if selected_player_header then
selected_player_header.style.font_color = Color.orange
end
Gui.clear(element_panel)
if selected_player_header then
local player_header_data = Gui.get_data(selected_player_header)
local values = player_header_data.values
local selected_element_header = draw_element_headers(element_panel, values, selected_element_index)
data.selected_element_header = selected_element_header
if selected_element_header then
selected_element_header.style.font_color = Color.orange
update_dump(input_text_box, data, event.player)
return
end
end
data.input_text_box.text = ''
data.data_panel.text = ''
end
)
return Public