From a1798d238ecfbe1964b99ab47ccee9f52ece1447 Mon Sep 17 00:00:00 2001 From: Will Berry <73126355+wdberry@users.noreply.github.com> Date: Sun, 5 Mar 2023 15:32:18 -0500 Subject: [PATCH 01/24] Stations tab mostly working (control signals need virtual signal sprite paths figured out) --- .gitignore | 2 + cybersyn/scripts/gui/main.lua | 18 ++++- cybersyn/scripts/gui/stations.lua | 61 ++++++--------- cybersyn/scripts/gui/util.lua | 123 +++++++++++++++++++++++++++++- cybersyn/scripts/main.lua | 3 + 5 files changed, 165 insertions(+), 42 deletions(-) diff --git a/.gitignore b/.gitignore index c4c4ffc..31f6fd3 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ *.zip +.vscode/launch.json +.vscode/settings.json \ No newline at end of file diff --git a/cybersyn/scripts/gui/main.lua b/cybersyn/scripts/gui/main.lua index e94adc1..9712b23 100644 --- a/cybersyn/scripts/gui/main.lua +++ b/cybersyn/scripts/gui/main.lua @@ -4,7 +4,7 @@ local mod_gui = require("__core__.lualib.mod-gui") local manager = require("scripts.gui.manager") --- @class Manager ---- @field players table +--- @field players table --- @field item_order table --- @class PlayerData @@ -65,7 +65,7 @@ function manager_gui.on_player_created(e) } global.manager.players[e.player_index] = player_data - manager.update(global, player, player_data) + --manager.update(global, player, player_data) --top_left_button_update(player, player_data) end @@ -92,6 +92,8 @@ function manager_gui.on_runtime_mod_setting_changed(e) end + + --- @param manager Manager local function init_items(manager) local item_order = {} @@ -135,4 +137,16 @@ function manager_gui.on_init() end --gui.handle_events() +---@param global cybersyn.global +function manager_gui.tick(global) + local manager_data = global.manager + if manager_data then + for i, v in pairs(manager_data.players) do + if v.is_manager_open then + manager.update(global, v) + end + end + end +end + return manager_gui diff --git a/cybersyn/scripts/gui/stations.lua b/cybersyn/scripts/gui/stations.lua index ef5341f..71f472a 100644 --- a/cybersyn/scripts/gui/stations.lua +++ b/cybersyn/scripts/gui/stations.lua @@ -9,6 +9,7 @@ local stations_tab = {} function stations_tab.create(widths) return { tab = { + name = "manager_stations_tab", type = "tab", caption = { "gui.ltnm-stations" }, ref = { "stations", "tab" }, @@ -17,6 +18,7 @@ function stations_tab.create(widths) }, }, content = { + name = "manager_stations_content_frame", type = "frame", style = "ltnm_main_content_frame", direction = "vertical", @@ -37,7 +39,7 @@ function stations_tab.create(widths) templates.sort_checkbox(widths, "stations", "shipments", false, { "gui.ltnm-shipments-description" }), templates.sort_checkbox(widths, "stations", "control_signals", false), }, - { type = "scroll-pane", style = "ltnm_table_scroll_pane", ref = { "stations", "scroll_pane" } }, + { name = "manager_stations_tab_scroll_pane", type = "scroll-pane", style = "ltnm_table_scroll_pane", ref = { "stations", "scroll_pane" } }, { type = "flow", style = "ltnm_warning_flow", @@ -60,6 +62,7 @@ end function stations_tab.build(map_data, player_data) local widths = constants.gui["en"] + local refs = player_data.refs local search_item = player_data.search_item local search_network_name = player_data.search_network_name @@ -182,65 +185,45 @@ function stations_tab.build(map_data, player_data) return (not player_data.trains_orderings_invert[#player_data.trains_orderings_invert]) == (a < b) end) - local scroll_pane = refs.scroll_pane + local scroll_pane = refs.manager_stations_tab_scroll_pane for i, station_id in pairs(stations_sorted) do local station = map_data.stations[station_id] local color = i % 2 == 0 and "dark" or "light" - local row = gui.add(scroll_pane, { + gui.add(scroll_pane, { type = "frame", style = "ltnm_table_row_frame_" .. color, { type = "label", style = "ltnm_clickable_semibold_label", - style_mods = { width = widths.name }, + style_mods = { width = widths.stations.name }, tooltip = constants.open_station_gui_tooltip, + caption = station.entity_stop.backer_name, }, - templates.status_indicator(widths.status, true), - { type = "label", style_mods = { width = widths.network_id, horizontal_align = "center" } }, - templates.small_slot_table(widths, color, "provided_requested"), - templates.small_slot_table(widths, color, "shipments"), - templates.small_slot_table(widths, color, "control_signals"), - }) + --templates.status_indicator(widths.stations.status, true), --repurposing status column for network name + { type = "label", style_mods = { width = widths.stations.network_id, }, caption = station.network_name }, + { type = "label", style_mods = { width = widths.stations.network_id, horizontal_align = "center" }, caption = station.network_flag }, + templates.small_slot_table(widths.stations, color, "provided_requested"), + templates.small_slot_table(widths.stations, color, "shipments"), + templates.small_slot_table(widths.stations, color, "control_signals"), + }, refs) - gui.add(row, { - { - elem_mods = { caption = station.entity_stop.name }, - handler = stations_tab.hande.open_station_gui, - tags = station_id, - }, - { elem_mods = { caption = station.network_name } }, - { elem_mods = { caption = station.network_flag } }, - }) + gui.add(refs.provided_requested_table, util.slot_table_build_from_station(station), refs) + gui.add(refs.shipments_table, util.slot_table_build_from_deliveries(station), refs) + gui.add(refs.control_signals_table, util.slot_table_build_from_control_signals(station), refs) - util.slot_table_update(row.provided_requested_frame.provided_requested_table, { - { color = "green", entries = station.provided, translations = dictionaries.materials }, - { color = "red", entries = station.requested, translations = dictionaries.materials }, - }) - util.slot_table_update(row.shipments_frame.shipments_table, { - { color = "green", entries = station.inbound, translations = dictionaries.materials }, - { color = "blue", entries = station.outbound, translations = dictionaries.materials }, - }) - util.slot_table_update(row.control_signals_frame.control_signals_table, { - { - color = "default", - entries = station.control_signals, - translations = dictionaries.virtual_signals, - type = "virtual-signal", - }, - }) end if #stations_sorted == 0 then - refs.warning_flow.visible = true + --refs.warning_flow.visible = true scroll_pane.visible = false - refs.content_frame.style = "ltnm_main_warning_frame" + --refs.content_frame.style = "ltnm_main_warning_frame" else - refs.warning_flow.visible = false + --refs.warning_flow.visible = false scroll_pane.visible = true - refs.content_frame.style = "ltnm_main_content_frame" + --refs.content_frame.style = "ltnm_main_content_frame" end end diff --git a/cybersyn/scripts/gui/util.lua b/cybersyn/scripts/gui/util.lua index 5b3893a..1920d96 100644 --- a/cybersyn/scripts/gui/util.lua +++ b/cybersyn/scripts/gui/util.lua @@ -37,7 +37,7 @@ end --- @param manifest Manifest --- @param color string --- @return GuiElemDef[] -function util.slot_table_build(manifest, color) +function util.slot_table_build_from_manifest(manifest, color) ---@type GuiElemDef[] local children = {} for _, item in pairs(manifest) do @@ -66,6 +66,127 @@ function util.slot_table_build(manifest, color) return children end +--- @param station Station +--- @param color string +--- @return GuiElemDef[] +function util.slot_table_build_from_station(station) + ---@type GuiElemDef[] + local children = {} + local comb1_signals, comb2_signals = get_signals(station) + if comb1_signals then + for _, v in pairs(comb1_signals) do + local item = v.signal + local count = v.count + local name = item.name + local sprite + local color + if count > 0 then + color = "green" + else + color = "red" + end + if item.type then + sprite = item.type .. "/" .. name + else + if name then + sprite = string.gsub(name, ",", "/") + else + --idunno? + end + end + if game.is_valid_sprite_path(sprite) then + children[#children + 1] = { + type = "sprite-button", + enabled = false, + style = "ltnm_small_slot_button_" .. color, + sprite = sprite, + tooltip = { + "", + "[img=" .. sprite .. "]", + { "item-name." .. name }, + "\n"..format.number(count), + }, + number = count + } + end + end + end + return children +end + +function util.slot_table_build_from_deliveries(station) + ---@type GuiElemDef[] + local children = {} + local deliveries = station.deliveries + local sprite = "" + for item, count in pairs(deliveries) do + local color + if count > 0 then + color = "green" + else + color = "blue" + end + if game.is_valid_sprite_path("item/" .. item) then + sprite = "item/" .. item + elseif game.is_valid_sprite_path("fluid/" .. item) then + sprite = "fluid/" .. item + end + if game.is_valid_sprite_path(sprite) then + children[#children + 1] = { + type = "sprite-button", + enabled = false, + style = "ltnm_small_slot_button_" .. color, + sprite = sprite, + tooltip = { + "", + "[img=" .. sprite .. "]", + { item }, + "\n"..format.number(count), + }, + number = count + } + end + end + return children +end + +--- @param station Station +--- @return GuiElemDef[] +function util.slot_table_build_from_control_signals(station) + ---@type GuiElemDef[] + local children = {} + local comb1_signals, comb2_signals = get_signals(station) + if comb1_signals then + for _, v in pairs(comb1_signals) do + local item = v.signal + local count = v.count + local name = item.name + local sprite = "" + local color = "default" + if item.type == "virtual" then + -- don't know how to get the sprite path for signals like cybersyn-priority, so this fizzles + sprite = item.type .. "/" .. name + end + if game.is_valid_sprite_path(sprite) then + children[#children + 1] = { + type = "sprite-button", + enabled = false, + style = "ltnm_small_slot_button_" .. color, + sprite = sprite, + tooltip = { + "", + "[img=" .. sprite .. "]", + { "item-name." .. name }, + "\n"..format.number(count), + }, + number = count + } + end + end + end + return children +end + function util.sorted_iterator(arr, src_tbl, sort_state) local step = sort_state and 1 or -1 local i = sort_state and 1 or #arr diff --git a/cybersyn/scripts/main.lua b/cybersyn/scripts/main.lua index aac6038..fbebe11 100644 --- a/cybersyn/scripts/main.lua +++ b/cybersyn/scripts/main.lua @@ -933,6 +933,9 @@ local function main() script.on_event(defines.events.on_player_removed, manager.on_player_removed) script.on_event(defines.events.on_player_created, manager.on_player_created) script.on_event(defines.events.on_lua_shortcut, manager.on_lua_shortcut) + script.on_nth_tick(60, function() + manager.tick(global) + end) end end From f8756efbae969e08b64020648a18c74d35b97039 Mon Sep 17 00:00:00 2001 From: Will Berry <73126355+wdberry@users.noreply.github.com> Date: Sun, 5 Mar 2023 15:37:39 -0500 Subject: [PATCH 02/24] missed staging file --- cybersyn/scripts/gui/manager.lua | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/cybersyn/scripts/gui/manager.lua b/cybersyn/scripts/gui/manager.lua index c801d73..044859e 100644 --- a/cybersyn/scripts/gui/manager.lua +++ b/cybersyn/scripts/gui/manager.lua @@ -92,10 +92,8 @@ function manager.create(player) name = "manager_tabbed_pane", type = "tabbed-pane", style = "ltnm_tabbed_pane", + stations_tab.create(widths), selected_tab_index = 1, - tabs = { - stations_tab.create(widths) - } }, }, }, @@ -112,11 +110,9 @@ function manager.create(player) end --- @param map_data MapData ---- @param player LuaPlayer --- @param player_data PlayerData -function manager.update(map_data, player, player_data) - --local tab = trains_tab.build(map_data, player_data) - --gui.add(_, tab, player_data.refs) +function manager.update(map_data, player_data) + stations_tab.build(map_data, player_data) end @@ -260,6 +256,7 @@ function manager.handle.manager_update_surface(player, player_data, refs) end + gui.add_handlers(manager.handle, manager.wrapper) return manager From 7e745232bcbde126c76db3b25d421520fb453087 Mon Sep 17 00:00:00 2001 From: Will Berry <73126355+wdberry@users.noreply.github.com> Date: Sun, 5 Mar 2023 23:07:13 -0500 Subject: [PATCH 03/24] BEHOLD, the magical duplicating inventory --- cybersyn/scripts/gui/inventory.lua | 233 +++++++++++++++++++++++------ cybersyn/scripts/gui/manager.lua | 4 +- cybersyn/scripts/gui/templates.lua | 2 +- 3 files changed, 193 insertions(+), 46 deletions(-) diff --git a/cybersyn/scripts/gui/inventory.lua b/cybersyn/scripts/gui/inventory.lua index f882a03..328e645 100644 --- a/cybersyn/scripts/gui/inventory.lua +++ b/cybersyn/scripts/gui/inventory.lua @@ -1,12 +1,14 @@ -local misc = require("__flib__.misc") +local gui = require("__flib__.gui-lite") -local templates = require("templates") +local templates = require("scripts.gui.templates") +local misc = require("__flib__.misc") local inventory_tab = {} -function inventory_tab.build() +function inventory_tab.create() return { tab = { + name = "manager_inventory_tab", type = "tab", caption = { "gui.ltnm-inventory" }, ref = { "inventory", "tab" }, @@ -15,6 +17,7 @@ function inventory_tab.build() }, }, content = { + name = "manager_inventory_content_frame", type = "flow", style_mods = { horizontal_spacing = 12 }, direction = "horizontal", @@ -26,62 +29,204 @@ function inventory_tab.build() } end -local function update_table(self, name, color) - local translations = self.player_table.dictionaries.materials +---@param map_data MapData +---@param player_data PlayerData +function inventory_tab.build(map_data, player_data) - local state = self.state - local refs = self.refs.inventory + local refs = player_data.refs - local search_query = state.search_query - local search_network_id = state.network_id - local search_surface = state.surface + local search_item = player_data.search_item + local search_network_name = player_data.search_network_name + local search_network_mask = player_data.search_network_mask + local search_surface_idx = player_data.search_surface_idx + + local inventory_provided = {} + local inventory_in_transit = {} + local inventory_requested = {} - local ltn_inventory = state.ltn_data.inventory[name][search_surface] + local stations_sorted = {} - local i = 0 + for id, station in pairs(map_data.stations) do + local entity = station.entity_stop + if not entity.valid then + goto continue + end - local table = refs[name].table - local children = table.children + if search_network_name then + if search_network_name ~= station.network_name then + goto continue + end + local train_flag = get_network_flag(station, search_network_name) + if not bit32.btest(search_network_mask, train_flag) then + goto continue + end + elseif search_network_mask ~= -1 then + if station.network_name == NETWORK_EACH then + local masks = station.network_flag--[[@as {}]] + for _, network_flag in pairs(masks) do + if bit32.btest(search_network_mask, network_flag) then + goto has_match + end + end + goto continue + ::has_match:: + elseif not bit32.btest(search_network_mask, station.network_flag) then + goto continue + end + end - for name, count_by_network_id in pairs(ltn_inventory or {}) do - if - bit32.btest(count_by_network_id.combined_id, search_network_id) - and string.find(string.lower(translations[name]), string.lower(search_query)) - then - local running_count = 0 - for network_id, count in pairs(count_by_network_id) do - if network_id ~= "combined_id" and bit32.btest(network_id, search_network_id) then - running_count = running_count + count + if search_surface_idx then + if entity.surface.index ~= search_surface_idx then + goto continue + end + end + + if search_item then + if not station.deliveries then + goto continue + end + for item_name, _ in pairs(station.deliveries) do + if item_name == search_item then + goto has_match + end + end + goto continue + ::has_match:: + end + + stations_sorted[#stations_sorted + 1] = id + ::continue:: + end + + for i, station_id in pairs(stations_sorted) do + --- @class Station + local station = map_data.stations[station_id] + + local comb1_signals, _ = get_signals(station) + if comb1_signals then + for _, v in pairs(comb1_signals) do + local item = v.signal + local count = v.count + if item.type ~= "virtual" then + if count > 0 then + if inventory_provided[item.name] == nil then + inventory_provided[item.name] = count + else + inventory_provided[item.name] = inventory_provided[item.name] + count + end + else + if inventory_requested[item.name] == nil then + inventory_requested[item.name] = count + else + inventory_requested[item.name] = inventory_requested[item.name] + count + end + end end end + end - if running_count > 0 then - i = i + 1 - local button = children[i] - if not button then - button = table.add({ type = "sprite-button", style = "flib_slot_button_" .. color, enabled = false }) + local deliveries = station.deliveries + if deliveries then + for item, count in pairs(deliveries) do + if count > 0 then + if inventory_in_transit[item] == nil then + inventory_in_transit[item] = 0 + else + inventory_in_transit[item] = inventory_in_transit[item] + count + end end - button.sprite = string.gsub(name, ",", "/") - button.number = running_count - button.tooltip = "[img=" - .. string.gsub(name, ",", "/") - .. "] [font=default-semibold]" - .. translations[name] - .. "[/font]\n" - .. misc.delineate_number(running_count) end end end - for j = i + 1, #children do - children[j].destroy() - end -end + local provided_children = {} + + local i = 0 + for item, count in pairs(inventory_provided) do + i = i + 1 + local sprite = "" + if game.is_valid_sprite_path("item/" .. item) then + sprite = "item/" .. item + elseif game.is_valid_sprite_path("fluid/" .. item) then + sprite = "fluid/" .. item + end + if game.is_valid_sprite_path(sprite) then + provided_children[#provided_children+1] = { + type = "sprite-button", + style = "flib_slot_button_green", + enabled = false, + sprite = sprite, + number = count, + tooltip = "[img=" + .. string.gsub(item, ",", "/") + .. "] [font=default-semibold]" + .. item + .. "[/font]\n" + .. misc.delineate_number(count) + } + end + end + + local requested_children = {} + + local i = 0 + for item, count in pairs(inventory_requested) do + i = i + 1 + local sprite = "" + if game.is_valid_sprite_path("item/" .. item) then + sprite = "item/" .. item + elseif game.is_valid_sprite_path("fluid/" .. item) then + sprite = "fluid/" .. item + end + if game.is_valid_sprite_path(sprite) then + requested_children[#requested_children+1] = { + type = "sprite-button", + style = "flib_slot_button_red", + enabled = false, + sprite = sprite, + number = count, + tooltip = "[img=" + .. string.gsub(item, ",", "/") + .. "] [font=default-semibold]" + .. item + .. "[/font]\n" + .. misc.delineate_number(count) + } + end + end + + local in_transit_children = {} + + local i = 0 + for item, count in pairs(inventory_in_transit) do + i = i + 1 + local sprite = "" + if game.is_valid_sprite_path("item/" .. item) then + sprite = "item/" .. item + elseif game.is_valid_sprite_path("fluid/" .. item) then + sprite = "fluid/" .. item + end + if game.is_valid_sprite_path(sprite) then + in_transit_children[#in_transit_children+1] = { + type = "sprite-button", + style = "flib_slot_button_blue", + enabled = false, + sprite = sprite, + number = count, + tooltip = "[img=" + .. string.gsub(item, ",", "/") + .. "] [font=default-semibold]" + .. item + .. "[/font]\n" + .. misc.delineate_number(count) + } + end + end + + gui.add(refs.inventory_provided_table, provided_children) + gui.add(refs.inventory_requested_table, requested_children) + gui.add(refs.inventory_in_transit_table, in_transit_children) -function inventory_tab.update(self) - update_table(self, "provided", "green") - update_table(self, "in_transit", "blue") - update_table(self, "requested", "red") end return inventory_tab diff --git a/cybersyn/scripts/gui/manager.lua b/cybersyn/scripts/gui/manager.lua index 044859e..2473c4f 100644 --- a/cybersyn/scripts/gui/manager.lua +++ b/cybersyn/scripts/gui/manager.lua @@ -8,7 +8,7 @@ local templates = require("scripts.gui.templates") local stations_tab = require("scripts.gui.stations") --local trains_tab = require("scripts.gui.trains") --local depots_tab = require("scripts.gui.depots") ---local inventory_tab = require("scripts.gui.inventory") +local inventory_tab = require("scripts.gui.inventory") --local history_tab = require("scripts.gui.history") --local alerts_tab = require("scripts.gui.alerts") @@ -93,6 +93,7 @@ function manager.create(player) type = "tabbed-pane", style = "ltnm_tabbed_pane", stations_tab.create(widths), + inventory_tab.create(), selected_tab_index = 1, }, }, @@ -113,6 +114,7 @@ end --- @param player_data PlayerData function manager.update(map_data, player_data) stations_tab.build(map_data, player_data) + inventory_tab.build(map_data, player_data) end diff --git a/cybersyn/scripts/gui/templates.lua b/cybersyn/scripts/gui/templates.lua index e2553d3..22c70c8 100644 --- a/cybersyn/scripts/gui/templates.lua +++ b/cybersyn/scripts/gui/templates.lua @@ -43,7 +43,7 @@ function templates.inventory_slot_table(name, columns) vertical_scroll_policy = "auto-and-reserve-space", -- vertical_scroll_policy = "always", ref = { "inventory", name, "scroll_pane" }, - { type = "table", style = "slot_table", column_count = columns, ref = { "inventory", name, "table" } }, + { type = "table", name = "inventory_" .. name .. "_table", style = "slot_table", column_count = columns, ref = { "inventory", name, "table" } }, }, }, } From af5f606cbb7ef95ba23a312796896f42b118633b Mon Sep 17 00:00:00 2001 From: Will Berry <73126355+wdberry@users.noreply.github.com> Date: Mon, 6 Mar 2023 12:47:09 -0500 Subject: [PATCH 04/24] MVP Stations and Inventory tabs --- cybersyn/scripts/gui/inventory.lua | 48 ++++++++++++++---------------- cybersyn/scripts/gui/stations.lua | 12 ++++---- cybersyn/scripts/gui/util.lua | 21 +++++++++++-- 3 files changed, 49 insertions(+), 32 deletions(-) diff --git a/cybersyn/scripts/gui/inventory.lua b/cybersyn/scripts/gui/inventory.lua index 328e645..ea9a17a 100644 --- a/cybersyn/scripts/gui/inventory.lua +++ b/cybersyn/scripts/gui/inventory.lua @@ -1,5 +1,6 @@ local gui = require("__flib__.gui-lite") +local util = require("scripts.gui.util") local templates = require("scripts.gui.templates") local misc = require("__flib__.misc") @@ -46,6 +47,8 @@ function inventory_tab.build(map_data, player_data) local stations_sorted = {} + + for id, station in pairs(map_data.stations) do local entity = station.entity_stop if not entity.valid then @@ -131,6 +134,7 @@ function inventory_tab.build(map_data, player_data) if count > 0 then if inventory_in_transit[item] == nil then inventory_in_transit[item] = 0 + inventory_in_transit[item] = inventory_in_transit[item] + count else inventory_in_transit[item] = inventory_in_transit[item] + count end @@ -139,17 +143,13 @@ function inventory_tab.build(map_data, player_data) end end + local inventory_provided_table = refs.inventory_provided_table local provided_children = {} local i = 0 for item, count in pairs(inventory_provided) do i = i + 1 - local sprite = "" - if game.is_valid_sprite_path("item/" .. item) then - sprite = "item/" .. item - elseif game.is_valid_sprite_path("fluid/" .. item) then - sprite = "fluid/" .. item - end + local sprite = util.build_sprite_path(item) if game.is_valid_sprite_path(sprite) then provided_children[#provided_children+1] = { type = "sprite-button", @@ -162,22 +162,17 @@ function inventory_tab.build(map_data, player_data) .. "] [font=default-semibold]" .. item .. "[/font]\n" - .. misc.delineate_number(count) - } + .. misc.delineate_number(count)} end end + local inventory_requested_table = refs.inventory_requested_table local requested_children = {} local i = 0 for item, count in pairs(inventory_requested) do i = i + 1 - local sprite = "" - if game.is_valid_sprite_path("item/" .. item) then - sprite = "item/" .. item - elseif game.is_valid_sprite_path("fluid/" .. item) then - sprite = "fluid/" .. item - end + local sprite = util.build_sprite_path(item) if game.is_valid_sprite_path(sprite) then requested_children[#requested_children+1] = { type = "sprite-button", @@ -190,22 +185,17 @@ function inventory_tab.build(map_data, player_data) .. "] [font=default-semibold]" .. item .. "[/font]\n" - .. misc.delineate_number(count) - } + .. misc.delineate_number(count)} end end + local inventory_in_transit_table = refs.inventory_in_transit_table local in_transit_children = {} local i = 0 for item, count in pairs(inventory_in_transit) do i = i + 1 - local sprite = "" - if game.is_valid_sprite_path("item/" .. item) then - sprite = "item/" .. item - elseif game.is_valid_sprite_path("fluid/" .. item) then - sprite = "fluid/" .. item - end + local sprite = util.build_sprite_path(item) if game.is_valid_sprite_path(sprite) then in_transit_children[#in_transit_children+1] = { type = "sprite-button", @@ -218,11 +208,19 @@ function inventory_tab.build(map_data, player_data) .. "] [font=default-semibold]" .. item .. "[/font]\n" - .. misc.delineate_number(count) - } + .. misc.delineate_number(count)} + end end - end + if next(inventory_provided_table.children) ~= nil then + refs.inventory_provided_table.clear() + end + if next(inventory_requested_table.children) ~= nil then + refs.inventory_requested_table.clear() + end + if next(inventory_in_transit_table.children) ~=nil then + refs.inventory_in_transit_table.clear() + end gui.add(refs.inventory_provided_table, provided_children) gui.add(refs.inventory_requested_table, requested_children) gui.add(refs.inventory_in_transit_table, in_transit_children) diff --git a/cybersyn/scripts/gui/stations.lua b/cybersyn/scripts/gui/stations.lua index 71f472a..494f35f 100644 --- a/cybersyn/scripts/gui/stations.lua +++ b/cybersyn/scripts/gui/stations.lua @@ -186,7 +186,9 @@ function stations_tab.build(map_data, player_data) end) local scroll_pane = refs.manager_stations_tab_scroll_pane - + if next(scroll_pane.children) ~= nil then + refs.manager_stations_tab_scroll_pane.clear() + end for i, station_id in pairs(stations_sorted) do local station = map_data.stations[station_id] @@ -203,16 +205,16 @@ function stations_tab.build(map_data, player_data) caption = station.entity_stop.backer_name, }, --templates.status_indicator(widths.stations.status, true), --repurposing status column for network name - { type = "label", style_mods = { width = widths.stations.network_id, }, caption = station.network_name }, + { type = "sprite-button", style = "ltnm_small_slot_button_default", enabled = false, sprite = "virtual-signal/" .. station.network_name, }, { type = "label", style_mods = { width = widths.stations.network_id, horizontal_align = "center" }, caption = station.network_flag }, templates.small_slot_table(widths.stations, color, "provided_requested"), templates.small_slot_table(widths.stations, color, "shipments"), templates.small_slot_table(widths.stations, color, "control_signals"), }, refs) - gui.add(refs.provided_requested_table, util.slot_table_build_from_station(station), refs) - gui.add(refs.shipments_table, util.slot_table_build_from_deliveries(station), refs) - gui.add(refs.control_signals_table, util.slot_table_build_from_control_signals(station), refs) + gui.add(refs.provided_requested_table, util.slot_table_build_from_station(station)) + gui.add(refs.shipments_table, util.slot_table_build_from_deliveries(station)) + gui.add(refs.control_signals_table, util.slot_table_build_from_control_signals(station)) end diff --git a/cybersyn/scripts/gui/util.lua b/cybersyn/scripts/gui/util.lua index 1920d96..074dbba 100644 --- a/cybersyn/scripts/gui/util.lua +++ b/cybersyn/scripts/gui/util.lua @@ -33,6 +33,20 @@ function util.gui_list(parent, iterator, test, build, update, ...) end end +--- Builds a valid sprite path or returns nil +--- @param item string +--- @return string +function util.build_sprite_path(item) + local sprite = nil + if game.is_valid_sprite_path("item/" .. item) then + sprite = "item/" .. item + elseif game.is_valid_sprite_path("fluid/" .. item) then + sprite = "fluid/" .. item + end + return sprite +end + + --- Updates a slot table based on the passed criteria. --- @param manifest Manifest --- @param color string @@ -163,9 +177,11 @@ function util.slot_table_build_from_control_signals(station) local name = item.name local sprite = "" local color = "default" - if item.type == "virtual" then + if item.type ~= "virtual" then + goto continue + else -- don't know how to get the sprite path for signals like cybersyn-priority, so this fizzles - sprite = item.type .. "/" .. name + sprite = "virtual-signal" .. "/" .. name end if game.is_valid_sprite_path(sprite) then children[#children + 1] = { @@ -182,6 +198,7 @@ function util.slot_table_build_from_control_signals(station) number = count } end + ::continue:: end end return children From 732d63d65b96e606662199f68a2d048287a57bb7 Mon Sep 17 00:00:00 2001 From: Will Berry <73126355+wdberry@users.noreply.github.com> Date: Mon, 6 Mar 2023 13:02:50 -0500 Subject: [PATCH 05/24] Modify GUI tick rate to 10s from 1s and refactor some of the stations code with improvements from inventory --- cybersyn/scripts/gui/util.lua | 101 ++++++++++++++++------------------ cybersyn/scripts/main.lua | 4 +- 2 files changed, 48 insertions(+), 57 deletions(-) diff --git a/cybersyn/scripts/gui/util.lua b/cybersyn/scripts/gui/util.lua index 074dbba..9187e8c 100644 --- a/cybersyn/scripts/gui/util.lua +++ b/cybersyn/scripts/gui/util.lua @@ -92,36 +92,29 @@ function util.slot_table_build_from_station(station) local item = v.signal local count = v.count local name = item.name - local sprite - local color - if count > 0 then - color = "green" - else - color = "red" - end - if item.type then - sprite = item.type .. "/" .. name - else - if name then - sprite = string.gsub(name, ",", "/") + local sprite = util.build_sprite_path(name) + if sprite ~= nil then + local color + if count > 0 then + color = "green" else - --idunno? + color = "red" + end + if game.is_valid_sprite_path(sprite) then + children[#children + 1] = { + type = "sprite-button", + enabled = false, + style = "ltnm_small_slot_button_" .. color, + sprite = sprite, + tooltip = { + "", + "[img=" .. sprite .. "]", + { "item-name." .. name }, + "\n"..format.number(count), + }, + number = count + } end - end - if game.is_valid_sprite_path(sprite) then - children[#children + 1] = { - type = "sprite-button", - enabled = false, - style = "ltnm_small_slot_button_" .. color, - sprite = sprite, - tooltip = { - "", - "[img=" .. sprite .. "]", - { "item-name." .. name }, - "\n"..format.number(count), - }, - number = count - } end end end @@ -132,33 +125,32 @@ function util.slot_table_build_from_deliveries(station) ---@type GuiElemDef[] local children = {} local deliveries = station.deliveries - local sprite = "" + for item, count in pairs(deliveries) do - local color - if count > 0 then - color = "green" - else - color = "blue" - end - if game.is_valid_sprite_path("item/" .. item) then - sprite = "item/" .. item - elseif game.is_valid_sprite_path("fluid/" .. item) then - sprite = "fluid/" .. item - end - if game.is_valid_sprite_path(sprite) then - children[#children + 1] = { - type = "sprite-button", - enabled = false, - style = "ltnm_small_slot_button_" .. color, - sprite = sprite, - tooltip = { - "", - "[img=" .. sprite .. "]", - { item }, - "\n"..format.number(count), - }, - number = count - } + + local sprite = util.build_sprite_path(item) + if sprite ~= nil then + local color + if count > 0 then + color = "green" + else + color = "blue" + end + if game.is_valid_sprite_path(sprite) then + children[#children + 1] = { + type = "sprite-button", + enabled = false, + style = "ltnm_small_slot_button_" .. color, + sprite = sprite, + tooltip = { + "", + "[img=" .. sprite .. "]", + { item }, + "\n"..format.number(count), + }, + number = count + } + end end end return children @@ -180,7 +172,6 @@ function util.slot_table_build_from_control_signals(station) if item.type ~= "virtual" then goto continue else - -- don't know how to get the sprite path for signals like cybersyn-priority, so this fizzles sprite = "virtual-signal" .. "/" .. name end if game.is_valid_sprite_path(sprite) then diff --git a/cybersyn/scripts/main.lua b/cybersyn/scripts/main.lua index fbebe11..a0a0713 100644 --- a/cybersyn/scripts/main.lua +++ b/cybersyn/scripts/main.lua @@ -903,7 +903,7 @@ local function main() end - local MANAGER_ENABLED = true + local MANAGER_ENABLED = true --convert to mod setting? script.on_init(function() local setting = settings.global["cybersyn-invert-sign"] @@ -933,7 +933,7 @@ local function main() script.on_event(defines.events.on_player_removed, manager.on_player_removed) script.on_event(defines.events.on_player_created, manager.on_player_created) script.on_event(defines.events.on_lua_shortcut, manager.on_lua_shortcut) - script.on_nth_tick(60, function() + script.on_nth_tick(600, function() --TODO: tick value needs to be converted to mod setting manager.tick(global) end) end From d5fb6417fac6b2330172675d34574dd7f948ddbc Mon Sep 17 00:00:00 2001 From: Will Berry <73126355+wdberry@users.noreply.github.com> Date: Tue, 7 Mar 2023 11:34:09 -0500 Subject: [PATCH 06/24] Minor refactoring, fixed localization for EN on GUI, added incompatibility with LtnManager due to potential issues with collisions, renamed some LtnManager references in code. --- cybersyn/constants.lua | 20 ++++++------ cybersyn/data.lua | 4 +-- cybersyn/info.json | 3 +- cybersyn/locale/en/manager.cfg | 9 ++++-- cybersyn/prototypes/gui-style.lua | 6 ++-- cybersyn/scripts/gui/alerts.lua | 14 ++++----- cybersyn/scripts/gui/constants.lua | 20 ++++++------ cybersyn/scripts/gui/depots.lua | 6 ++-- cybersyn/scripts/gui/history.lua | 6 ++-- cybersyn/scripts/gui/inventory.lua | 49 ++++++++++++++++-------------- cybersyn/scripts/gui/main.lua | 2 +- cybersyn/scripts/gui/manager.lua | 20 ++++++------ cybersyn/scripts/gui/stations.lua | 10 +++--- cybersyn/scripts/gui/templates.lua | 4 +-- cybersyn/scripts/gui/trains.lua | 8 ++--- cybersyn/scripts/gui/util.lua | 28 ++++++++++------- 16 files changed, 111 insertions(+), 98 deletions(-) diff --git a/cybersyn/constants.lua b/cybersyn/constants.lua index 98f9d75..086de2b 100644 --- a/cybersyn/constants.lua +++ b/cybersyn/constants.lua @@ -85,14 +85,14 @@ constants.gui_content_frame_height = 744 constants.gui_inventory_table_height = 40 * 18 constants.gui_translations = { - delivering_to = { "gui.ltnm-delivering-to" }, - fetching_from = { "gui.ltnm-fetching-from" }, - loading_at = { "gui.ltnm-loading-at" }, - not_available = { "gui.ltnm-not-available" }, - parked_at_depot_with_residue = { "gui.ltnm-parked-at-depot-with-residue" }, - parked_at_depot = { "gui.ltnm-parked-at-depot" }, - returning_to_depot = { "gui.ltnm-returning-to-depot" }, - unloading_at = { "gui.ltnm-unloading-at" }, + delivering_to = { "cybersyn-gui.delivering-to" }, + fetching_from = { "cybersyn-gui.fetching-from" }, + loading_at = { "cybersyn-gui.loading-at" }, + not_available = { "cybersyn-gui.not-available" }, + parked_at_depot_with_residue = { "cybersyn-gui.parked-at-depot-with-residue" }, + parked_at_depot = { "cybersyn-gui.parked-at-depot" }, + returning_to_depot = { "cybersyn-gui.returning-to-depot" }, + unloading_at = { "cybersyn-gui.unloading-at" }, } constants.input_sanitizers = { @@ -144,8 +144,8 @@ constants.ltn_event_names = { if script then constants.open_station_gui_tooltip = { "", - { "gui.ltnm-open-station-gui" }, - remote.interfaces["ltn-combinator"] and { "", "\n", { "gui.ltnm-open-ltn-combinator-gui" } } or nil, + { "cybersyn-gui.open-station-gui" }, + remote.interfaces["ltn-combinator"] and { "", "\n", { "cybersyn-gui.open-ltn-combinator-gui" } } or nil, } end diff --git a/cybersyn/data.lua b/cybersyn/data.lua index 7cfd739..3d57f68 100644 --- a/cybersyn/data.lua +++ b/cybersyn/data.lua @@ -26,14 +26,14 @@ data:extend({ --{ -- type = "shortcut", - -- name = "ltnm-toggle-gui", + -- name = "cybersyn-toggle-gui", -- icon = data_util.build_sprite(nil, { 0, 0 }, util.paths.shortcut_icons, 32, 2), -- disabled_icon = data_util.build_sprite(nil, { 48, 0 }, util.paths.shortcut_icons, 32, 2), -- small_icon = data_util.build_sprite(nil, { 0, 32 }, util.paths.shortcut_icons, 24, 2), -- disabled_small_icon = data_util.build_sprite(nil, { 36, 32 }, util.paths.shortcut_icons, 24, 2), -- toggleable = true, -- action = "lua", - -- associated_control_input = "ltnm-toggle-gui", + -- associated_control_input = "cybersyn-toggle-gui", -- technology_to_unlock = "logistic-train-network", --}, }) diff --git a/cybersyn/info.json b/cybersyn/info.json index e1a036f..9bb2ecc 100644 --- a/cybersyn/info.json +++ b/cybersyn/info.json @@ -11,6 +11,7 @@ "? space-exploration >= 0.6.94", "? miniloader", "? nullius", - "? pypostprocessing" + "? pypostprocessing", + "! LtnManager" ] } diff --git a/cybersyn/locale/en/manager.cfg b/cybersyn/locale/en/manager.cfg index fadaa5a..a9d46af 100644 --- a/cybersyn/locale/en/manager.cfg +++ b/cybersyn/locale/en/manager.cfg @@ -1,5 +1,8 @@ +[mod-name] +cybersyn=Cybersyn GUI + [controls] -cybersyn-toggle-gui=Toggle LTN Manager +cybersyn-toggle-gui=Toggle Cybersyn Manager [cybersyn-gui] alert-delivery-failed=Delivery failed @@ -60,7 +63,7 @@ shipment=Shipment shipments=Shipments stations=Stations status-description=[img=flib_indicator_green]1 = normal status\n[img=flib_indicator_blue]n = LTN Controlled Train parked at stop, n = number of trains\n[img=flib_indicator_yellow]n = Stop is part of a scheduled delivery, n = number of trains\n[img=flib_indicator_white]1 = Error - not initialized\n[img=flib_indicator_red]1 = Error - short circuit\n[img=flib_indicator_red]2 = Error - deactivated stop -status=Status +status=Network Signal surface-label=Surface: time=Time train-id=Train ID @@ -81,4 +84,4 @@ history-length=History length iterations-per-tick=Iterations per tick [img=info] [shortcut-name] -cybersyn-toggle-gui=Toggle LTN Manager +cybersyn-toggle-gui=Toggle Cybersyn Manager diff --git a/cybersyn/prototypes/gui-style.lua b/cybersyn/prototypes/gui-style.lua index b4ce7da..e0657da 100644 --- a/cybersyn/prototypes/gui-style.lua +++ b/cybersyn/prototypes/gui-style.lua @@ -364,7 +364,7 @@ data:extend({ -- custom inputs --{ -- type = "custom-input", - -- name = "ltnm-toggle-gui", + -- name = "cybersyn-toggle-gui", -- key_sequence = "CONTROL + T", --}, --{ @@ -376,14 +376,14 @@ data:extend({ -- shortcuts { type = "shortcut", - name = "ltnm-toggle-gui", + name = "cybersyn-toggle-gui", icon = data_util.build_sprite(nil, { 0, 0 }, util.paths.shortcut_icons, 32, 2), disabled_icon = data_util.build_sprite(nil, { 48, 0 }, util.paths.shortcut_icons, 32, 2), small_icon = data_util.build_sprite(nil, { 0, 32 }, util.paths.shortcut_icons, 24, 2), disabled_small_icon = data_util.build_sprite(nil, { 36, 32 }, util.paths.shortcut_icons, 24, 2), toggleable = true, action = "lua", - --associated_control_input = "ltnm-toggle-gui", + --associated_control_input = "cybersyn-toggle-gui", technology_to_unlock = "cybersyn-train-network", }, }) diff --git a/cybersyn/scripts/gui/alerts.lua b/cybersyn/scripts/gui/alerts.lua index 1e915a5..46840f3 100644 --- a/cybersyn/scripts/gui/alerts.lua +++ b/cybersyn/scripts/gui/alerts.lua @@ -12,7 +12,7 @@ function alerts_tab.build(widths) return { tab = { type = "tab", - caption = { "gui.ltnm-alerts" }, + caption = { "cybersyn-gui.alerts" }, ref = { "alerts", "tab" }, actions = { on_click = { gui = "main", action = "change_tab", tab = "alerts" }, @@ -36,7 +36,7 @@ function alerts_tab.build(widths) type = "sprite-button", style = "tool_button_red", sprite = "utility/trash", - tooltip = { "gui.ltnm-delete-all-alerts" }, + tooltip = { "cybersyn-gui.delete-all-alerts" }, ref = { "alerts", "delete_all_button" }, actions = { on_click = { gui = "main", action = "delete_all_alerts" }, @@ -52,7 +52,7 @@ function alerts_tab.build(widths) { type = "label", style = "ltnm_semibold_label", - caption = { "gui.ltnm-no-alerts" }, + caption = { "cybersyn-gui.no-alerts" }, ref = { "alerts", "warning_label" }, }, }, @@ -121,7 +121,7 @@ function alerts_tab.update(self) type = "label", style = "ltnm_clickable_semibold_label", style_mods = { width = widths.alerts.train_id, horizontal_align = "center" }, - tooltip = { "gui.ltnm-open-train-gui" }, + tooltip = { "cybersyn-gui.open-train-gui" }, }, { type = "flow", @@ -153,7 +153,7 @@ function alerts_tab.update(self) type = "sprite-button", style = "tool_button_red", sprite = "utility/trash", - tooltip = { "gui.ltnm-delete-alert" }, + tooltip = { "cybersyn-gui.delete-alert" }, }, }) end @@ -185,8 +185,8 @@ function alerts_tab.update(self) { elem_mods = { caption = util.signed_int32(alerts_entry.train.network_id) } }, { elem_mods = { - caption = { "gui.ltnm-alert-" .. string.gsub(alerts_entry.type, "_", "-") }, - tooltip = { "gui.ltnm-alert-" .. string.gsub(alerts_entry.type, "_", "-") .. "-description" }, + caption = { "cybersyn-gui.alert-" .. string.gsub(alerts_entry.type, "_", "-") }, + tooltip = { "cybersyn-gui.alert-" .. string.gsub(alerts_entry.type, "_", "-") .. "-description" }, }, }, {}, diff --git a/cybersyn/scripts/gui/constants.lua b/cybersyn/scripts/gui/constants.lua index 98f9d75..086de2b 100644 --- a/cybersyn/scripts/gui/constants.lua +++ b/cybersyn/scripts/gui/constants.lua @@ -85,14 +85,14 @@ constants.gui_content_frame_height = 744 constants.gui_inventory_table_height = 40 * 18 constants.gui_translations = { - delivering_to = { "gui.ltnm-delivering-to" }, - fetching_from = { "gui.ltnm-fetching-from" }, - loading_at = { "gui.ltnm-loading-at" }, - not_available = { "gui.ltnm-not-available" }, - parked_at_depot_with_residue = { "gui.ltnm-parked-at-depot-with-residue" }, - parked_at_depot = { "gui.ltnm-parked-at-depot" }, - returning_to_depot = { "gui.ltnm-returning-to-depot" }, - unloading_at = { "gui.ltnm-unloading-at" }, + delivering_to = { "cybersyn-gui.delivering-to" }, + fetching_from = { "cybersyn-gui.fetching-from" }, + loading_at = { "cybersyn-gui.loading-at" }, + not_available = { "cybersyn-gui.not-available" }, + parked_at_depot_with_residue = { "cybersyn-gui.parked-at-depot-with-residue" }, + parked_at_depot = { "cybersyn-gui.parked-at-depot" }, + returning_to_depot = { "cybersyn-gui.returning-to-depot" }, + unloading_at = { "cybersyn-gui.unloading-at" }, } constants.input_sanitizers = { @@ -144,8 +144,8 @@ constants.ltn_event_names = { if script then constants.open_station_gui_tooltip = { "", - { "gui.ltnm-open-station-gui" }, - remote.interfaces["ltn-combinator"] and { "", "\n", { "gui.ltnm-open-ltn-combinator-gui" } } or nil, + { "cybersyn-gui.open-station-gui" }, + remote.interfaces["ltn-combinator"] and { "", "\n", { "cybersyn-gui.open-ltn-combinator-gui" } } or nil, } end diff --git a/cybersyn/scripts/gui/depots.lua b/cybersyn/scripts/gui/depots.lua index 5dfa81a..4520bcc 100644 --- a/cybersyn/scripts/gui/depots.lua +++ b/cybersyn/scripts/gui/depots.lua @@ -8,7 +8,7 @@ function depots_tab.build(widths) return { tab = { type = "tab", - caption = { "gui.ltnm-depots" }, + caption = { "cybersyn-gui.depots" }, ref = { "depots", "tab" }, actions = { on_click = { gui = "main", action = "change_tab", tab = "depots" }, @@ -25,7 +25,7 @@ function depots_tab.build(widths) style_mods = { right_padding = 4 }, templates.sort_checkbox(widths, "depots", "name", true, nil, true), templates.sort_checkbox(widths, "depots", "network_id", false), - templates.sort_checkbox(widths, "depots", "status", false, { "gui.ltnm-status-description" }), + templates.sort_checkbox(widths, "depots", "status", false, { "cybersyn-gui.status-description" }), templates.sort_checkbox(widths, "depots", "trains", false), }, { type = "scroll-pane", style = "ltnm_table_scroll_pane", ref = { "depots", "scroll_pane" } }, @@ -37,7 +37,7 @@ function depots_tab.build(widths) { type = "label", style = "ltnm_semibold_label", - caption = { "gui.ltnm-no-depots" }, + caption = { "cybersyn-gui.no-depots" }, ref = { "depots", "warning_label" }, }, }, diff --git a/cybersyn/scripts/gui/history.lua b/cybersyn/scripts/gui/history.lua index fa57171..d2277f0 100644 --- a/cybersyn/scripts/gui/history.lua +++ b/cybersyn/scripts/gui/history.lua @@ -12,7 +12,7 @@ function history_tab.build(widths) return { tab = { type = "tab", - caption = { "gui.ltnm-history" }, + caption = { "cybersyn-gui.history" }, ref = { "history", "tab" }, actions = { on_click = { gui = "main", action = "change_tab", tab = "history" }, @@ -38,7 +38,7 @@ function history_tab.build(widths) type = "sprite-button", style = "tool_button_red", sprite = "utility/trash", - tooltip = { "gui.ltnm-clear-history" }, + tooltip = { "cybersyn-gui.clear-history" }, ref = { "history", "clear_button" }, actions = { on_click = { gui = "main", action = "clear_history" }, @@ -54,7 +54,7 @@ function history_tab.build(widths) { type = "label", style = "ltnm_semibold_label", - caption = { "gui.ltnm-no-history" }, + caption = { "cybersyn-gui.no-history" }, ref = { "history", "warning_label" }, }, }, diff --git a/cybersyn/scripts/gui/inventory.lua b/cybersyn/scripts/gui/inventory.lua index ea9a17a..cffc5b2 100644 --- a/cybersyn/scripts/gui/inventory.lua +++ b/cybersyn/scripts/gui/inventory.lua @@ -2,7 +2,7 @@ local gui = require("__flib__.gui-lite") local util = require("scripts.gui.util") local templates = require("scripts.gui.templates") -local misc = require("__flib__.misc") +local format = require("__flib__.format") local inventory_tab = {} @@ -11,7 +11,7 @@ function inventory_tab.create() tab = { name = "manager_inventory_tab", type = "tab", - caption = { "gui.ltnm-inventory" }, + caption = { "cybersyn-gui.inventory" }, ref = { "inventory", "tab" }, actions = { on_click = { gui = "main", action = "change_tab", tab = "inventory" }, @@ -149,7 +149,7 @@ function inventory_tab.build(map_data, player_data) local i = 0 for item, count in pairs(inventory_provided) do i = i + 1 - local sprite = util.build_sprite_path(item) + local sprite, img_path, item_string = util.generate_item_references(item) if game.is_valid_sprite_path(sprite) then provided_children[#provided_children+1] = { type = "sprite-button", @@ -157,12 +157,13 @@ function inventory_tab.build(map_data, player_data) enabled = false, sprite = sprite, number = count, - tooltip = "[img=" - .. string.gsub(item, ",", "/") - .. "] [font=default-semibold]" - .. item - .. "[/font]\n" - .. misc.delineate_number(count)} + tooltip = { "", + img_path, + " [font=default-semibold]", + { item_string }, + "[/font]\n"..format.number(count), + }, + } end end @@ -172,7 +173,7 @@ function inventory_tab.build(map_data, player_data) local i = 0 for item, count in pairs(inventory_requested) do i = i + 1 - local sprite = util.build_sprite_path(item) + local sprite, img_path, item_string = util.generate_item_references(item) if game.is_valid_sprite_path(sprite) then requested_children[#requested_children+1] = { type = "sprite-button", @@ -180,12 +181,13 @@ function inventory_tab.build(map_data, player_data) enabled = false, sprite = sprite, number = count, - tooltip = "[img=" - .. string.gsub(item, ",", "/") - .. "] [font=default-semibold]" - .. item - .. "[/font]\n" - .. misc.delineate_number(count)} + tooltip = { "", + img_path, + " [font=default-semibold]", + { item_string }, + "[/font]\n"..format.number(count), + }, + } end end @@ -195,7 +197,7 @@ function inventory_tab.build(map_data, player_data) local i = 0 for item, count in pairs(inventory_in_transit) do i = i + 1 - local sprite = util.build_sprite_path(item) + local sprite, img_path, item_string = util.generate_item_references(item) if game.is_valid_sprite_path(sprite) then in_transit_children[#in_transit_children+1] = { type = "sprite-button", @@ -203,12 +205,13 @@ function inventory_tab.build(map_data, player_data) enabled = false, sprite = sprite, number = count, - tooltip = "[img=" - .. string.gsub(item, ",", "/") - .. "] [font=default-semibold]" - .. item - .. "[/font]\n" - .. misc.delineate_number(count)} + tooltip = { "", + img_path, + " [font=default-semibold]", + { item_string }, + "[/font]\n"..format.number(count), + }, + } end end diff --git a/cybersyn/scripts/gui/main.lua b/cybersyn/scripts/gui/main.lua index 9712b23..8443678 100644 --- a/cybersyn/scripts/gui/main.lua +++ b/cybersyn/scripts/gui/main.lua @@ -46,7 +46,7 @@ end local manager_gui = {} function manager_gui.on_lua_shortcut(e) - if e.prototype_name == "ltnm-toggle-gui" then + if e.prototype_name == "cybersyn-toggle-gui" then manager.wrapper(e, manager.handle.manager_toggle) end end diff --git a/cybersyn/scripts/gui/manager.lua b/cybersyn/scripts/gui/manager.lua index 2473c4f..5386c51 100644 --- a/cybersyn/scripts/gui/manager.lua +++ b/cybersyn/scripts/gui/manager.lua @@ -36,19 +36,19 @@ function manager.create(player) style = "flib_titlebar_flow", handler = manager.handle.manager_titlebar_click, children = { - { type = "label", style = "frame_title", caption = { "mod-name.LtnManager" }, ignored_by_interaction = true }, + { type = "label", style = "frame_title", caption = { "mod-name.cybersyn" }, ignored_by_interaction = true }, { type = "empty-widget", style = "flib_titlebar_drag_handle", ignored_by_interaction = true }, { name = "manager_dispatcher_status_label", type = "label", style = "bold_label", style_mods = { font_color = constants.colors.red.tbl, left_margin = -4, top_margin = 1 }, - caption = { "gui.ltnm-dispatcher-disabled" }, - tooltip = { "gui.ltnm-dispatcher-disabled-description" }, + caption = { "cybersyn-gui.dispatcher-disabled" }, + tooltip = { "cybersyn-gui.dispatcher-disabled-description" }, visible = not settings.global["cybersyn-enable-planner"].value, }, - templates.frame_action_button("manager_pin_button", "ltnm_pin", { "gui.ltnm-keep-open" }, manager.handle.manager_pin),--on_gui_clicked - templates.frame_action_button("manager_refresh_button", "ltnm_refresh", { "gui.ltnm-refresh-tooltip" }, manager.handle.manager_refresh_click),--on_gui_clicked + templates.frame_action_button("manager_pin_button", "ltnm_pin", { "cybersyn-gui.keep-open" }, manager.handle.manager_pin),--on_gui_clicked + templates.frame_action_button("manager_refresh_button", "ltnm_refresh", { "cybersyn-gui.refresh-tooltip" }, manager.handle.manager_refresh_click),--on_gui_clicked templates.frame_action_button(nil, "utility/close", { "gui.close-instruction" }, manager.handle.manager_close),--on_gui_clicked }, }, @@ -61,7 +61,7 @@ function manager.create(player) type = "frame", style = "ltnm_main_toolbar_frame", children = { - { type = "label", style = "subheader_caption_label", caption = { "gui.ltnm-search-label" } }, + { type = "label", style = "subheader_caption_label", caption = { "cybersyn-gui.search-label" } }, { name = "manager_text_search_field", type = "textfield", @@ -69,7 +69,7 @@ function manager.create(player) handler = manager.handle.manager_update_text_search, --on_gui_text_changed }, { type = "empty-widget", style = "flib_horizontal_pusher" }, - { type = "label", style = "caption_label", caption = { "gui.ltnm-network-id-label" } }, + { type = "label", style = "caption_label", caption = { "cybersyn-gui.network-id-label" } }, { name = "manager_network_mask_field", type = "textfield", @@ -80,7 +80,7 @@ function manager.create(player) text = "-1", handler = manager.handle.manager_update_network_mask, --on_gui_text_changed }, - { type = "label", style = "caption_label", caption = { "gui.ltnm-surface-label" } }, + { type = "label", style = "caption_label", caption = { "cybersyn-gui.surface-label" } }, { name = "manager_surface_dropdown", type = "drop-down", @@ -155,7 +155,7 @@ function manager.handle.manager_open(player, player_data, refs) end player_data.is_manager_open = true - player.set_shortcut_toggled("ltnm-toggle-gui", true) + player.set_shortcut_toggled("cybersyn-toggle-gui", true) end @@ -175,7 +175,7 @@ function manager.handle.manager_close(player, player_data, refs) end player_data.is_manager_open = false - player.set_shortcut_toggled("ltnm-toggle-gui", false) + player.set_shortcut_toggled("cybersyn-toggle-gui", false) player_data.refs.manager_window.destroy() diff --git a/cybersyn/scripts/gui/stations.lua b/cybersyn/scripts/gui/stations.lua index 494f35f..ac2746c 100644 --- a/cybersyn/scripts/gui/stations.lua +++ b/cybersyn/scripts/gui/stations.lua @@ -11,7 +11,7 @@ function stations_tab.create(widths) tab = { name = "manager_stations_tab", type = "tab", - caption = { "gui.ltnm-stations" }, + caption = { "cybersyn-gui.stations" }, ref = { "stations", "tab" }, actions = { on_click = { gui = "main", action = "change_tab", tab = "stations" }, @@ -27,16 +27,16 @@ function stations_tab.create(widths) type = "frame", style = "ltnm_table_toolbar_frame", templates.sort_checkbox(widths, "stations", "name", true), - templates.sort_checkbox(widths, "stations", "status", false, { "gui.ltnm-status-description" }), + templates.sort_checkbox(widths, "stations", "status", false), --repurposed status column, description no longer necessary templates.sort_checkbox(widths, "stations", "network_id", false), templates.sort_checkbox( widths, "stations", "provided_requested", false, - { "gui.ltnm-provided-requested-description" } + { "cybersyn-gui-provided-requested-description" } ), - templates.sort_checkbox(widths, "stations", "shipments", false, { "gui.ltnm-shipments-description" }), + templates.sort_checkbox(widths, "stations", "shipments", false, { "cybersyn-gui-shipments-description" }), templates.sort_checkbox(widths, "stations", "control_signals", false), }, { name = "manager_stations_tab_scroll_pane", type = "scroll-pane", style = "ltnm_table_scroll_pane", ref = { "stations", "scroll_pane" } }, @@ -48,7 +48,7 @@ function stations_tab.create(widths) { type = "label", style = "ltnm_semibold_label", - caption = { "gui.ltnm-no-stations" }, + caption = { "cybersyn-gui-no-stations" }, ref = { "stations", "warning_label" }, }, }, diff --git a/cybersyn/scripts/gui/templates.lua b/cybersyn/scripts/gui/templates.lua index 22c70c8..3490c32 100644 --- a/cybersyn/scripts/gui/templates.lua +++ b/cybersyn/scripts/gui/templates.lua @@ -30,7 +30,7 @@ function templates.inventory_slot_table(name, columns) return { type = "flow", direction = "vertical", - { type = "label", style = "bold_label", caption = { "gui.ltnm-" .. string.gsub(name, "_", "-") } }, + { type = "label", style = "bold_label", caption = { "cybersyn-gui." .. string.gsub(name, "_", "-") } }, { type = "frame", style = "deep_frame_in_shallow_frame", @@ -77,7 +77,7 @@ function templates.sort_checkbox(widths, tab, column, selected, tooltip, state) type = "checkbox", style = selected and "ltnm_selected_sort_checkbox" or "ltnm_sort_checkbox", style_mods = { width = widths and widths[tab][column] or nil, horizontally_stretchable = not widths }, - caption = { "gui.ltnm-" .. string.gsub(column, "_", "-") }, + caption = { "cybersyn-gui." .. string.gsub(column, "_", "-") }, tooltip = tooltip, state = state, ref = { tab, "toolbar", column .. "_checkbox" }, diff --git a/cybersyn/scripts/gui/trains.lua b/cybersyn/scripts/gui/trains.lua index 05fd9c8..91498b6 100644 --- a/cybersyn/scripts/gui/trains.lua +++ b/cybersyn/scripts/gui/trains.lua @@ -133,7 +133,7 @@ function trains_tab.build(map_data, player_data) train_list[1] = { type = "label", style = "ltnm_semibold_label", - caption = { "gui.ltnm-no-trains" }, + caption = { "cybersyn-gui.no-trains" }, } else for idx, train_id in ipairs(trains_sorted) do @@ -156,7 +156,7 @@ function trains_tab.build(map_data, player_data) { type = "button", style = "ltnm_train_minimap_button", - tooltip = { "gui.ltnm-open-train-gui" }, + tooltip = { "cybersyn-gui.open-train-gui" }, elem_mods = { entity = get_any_train_entity(train.entity) }, handler = trains_tab.handle.open_train_gui, --on_click tags = { train_id = train_id }, @@ -197,7 +197,7 @@ function trains_tab.build(map_data, player_data) tab = { name = "trains_tab", type = "tab", - caption = #trains_sorted == 0 and { "gui.ltnm-trains" } or { "gui.ltnm-trains", #train_list }, + caption = #trains_sorted == 0 and { "cybersyn-gui.trains" } or { "cybersyn-gui.trains", #train_list }, --badge_text = format.number(#ltn_data.sorted_trains.composition), handler = trains_tab.handle.change_tab, --on_click tags = { tab = "trains_tab" }, @@ -212,7 +212,7 @@ function trains_tab.build(map_data, player_data) type = "frame", style = "ltnm_table_toolbar_frame", templates.sort_checkbox(widths, "trains", "status", false), - templates.sort_checkbox(widths, "trains", "layout", false, { "gui.ltnm-composition-description" }), + templates.sort_checkbox(widths, "trains", "layout", false, { "cybersyn-gui.composition-description" }), templates.sort_checkbox(widths, "trains", "depot", false), templates.sort_checkbox(widths, "trains", "shipment", false), }, diff --git a/cybersyn/scripts/gui/util.lua b/cybersyn/scripts/gui/util.lua index 9187e8c..1b154e1 100644 --- a/cybersyn/scripts/gui/util.lua +++ b/cybersyn/scripts/gui/util.lua @@ -35,15 +35,21 @@ end --- Builds a valid sprite path or returns nil --- @param item string ---- @return string -function util.build_sprite_path(item) +--- @return string, string, string +function util.generate_item_references(item) local sprite = nil + local image_path = "" + local item_name = "" if game.is_valid_sprite_path("item/" .. item) then sprite = "item/" .. item + image_path = "[img=item." .. item .. "]" + item_name = "item-name." .. item elseif game.is_valid_sprite_path("fluid/" .. item) then sprite = "fluid/" .. item + image_path = "[img=fluid." .. item .. "]" + item_name = "fluid-name." .. item end - return sprite + return sprite, image_path, item_name end @@ -92,7 +98,7 @@ function util.slot_table_build_from_station(station) local item = v.signal local count = v.count local name = item.name - local sprite = util.build_sprite_path(name) + local sprite, img_path, item_string = util.generate_item_references(name) if sprite ~= nil then local color if count > 0 then @@ -108,8 +114,8 @@ function util.slot_table_build_from_station(station) sprite = sprite, tooltip = { "", - "[img=" .. sprite .. "]", - { "item-name." .. name }, + img_path, + { item_string }, "\n"..format.number(count), }, number = count @@ -128,7 +134,7 @@ function util.slot_table_build_from_deliveries(station) for item, count in pairs(deliveries) do - local sprite = util.build_sprite_path(item) + local sprite, img_path, item_string = util.generate_item_references(item) if sprite ~= nil then local color if count > 0 then @@ -144,8 +150,8 @@ function util.slot_table_build_from_deliveries(station) sprite = sprite, tooltip = { "", - "[img=" .. sprite .. "]", - { item }, + img_path, + { item_string }, "\n"..format.number(count), }, number = count @@ -182,8 +188,8 @@ function util.slot_table_build_from_control_signals(station) sprite = sprite, tooltip = { "", - "[img=" .. sprite .. "]", - { "item-name." .. name }, + "[img=virtual-signal." .. name .. "]", + { "virtual-signal-name." .. name }, "\n"..format.number(count), }, number = count From 4927539d752f2783fef3bb917a1f3d860dcb5a91 Mon Sep 17 00:00:00 2001 From: Will Berry <73126355+wdberry@users.noreply.github.com> Date: Tue, 7 Mar 2023 16:38:08 -0500 Subject: [PATCH 07/24] Everything but configurable mod settings should be good to go, potential release candidate. --- cybersyn/locale/en/manager.cfg | 3 +- cybersyn/scripts/constants.lua | 2 + cybersyn/scripts/global.lua | 2 + cybersyn/scripts/gui/inventory.lua | 25 +++++++++--- cybersyn/scripts/gui/manager.lua | 63 ++++++++++++++++++++++++++---- cybersyn/scripts/gui/stations.lua | 29 +++++++++++--- cybersyn/scripts/main.lua | 2 +- 7 files changed, 106 insertions(+), 20 deletions(-) diff --git a/cybersyn/locale/en/manager.cfg b/cybersyn/locale/en/manager.cfg index a9d46af..6f8d27a 100644 --- a/cybersyn/locale/en/manager.cfg +++ b/cybersyn/locale/en/manager.cfg @@ -1,5 +1,5 @@ [mod-name] -cybersyn=Cybersyn GUI +cybersyn=Project Cybersyn [controls] cybersyn-toggle-gui=Toggle Cybersyn Manager @@ -36,6 +36,7 @@ inventory=Inventory keep-open=Keep open loading-at=Loading at name=Name +network-name-label=Network: network-id-label=Network ID: network-id=Network ID no-alerts=[img=warning-white] No alerts diff --git a/cybersyn/scripts/constants.lua b/cybersyn/scripts/constants.lua index 999edcb..23637e3 100644 --- a/cybersyn/scripts/constants.lua +++ b/cybersyn/scripts/constants.lua @@ -30,6 +30,8 @@ SETTING_DISABLE_DEPOT_BYPASS = 6 SETTING_ENABLE_SLOT_BARRING = 7 NETWORK_SIGNAL_DEFAULT = {name="signal-A", type="virtual"} +NETWORK_SIGNAL_GUI_DEFAULT = {name="signal-each", type="virtual"} +NETWORK_ANYTHING = "signal-anything" NETWORK_EACH = "signal-each" INACTIVITY_TIME = 100 LOCK_TRAIN_TIME = 60*60*60*24*7 diff --git a/cybersyn/scripts/global.lua b/cybersyn/scripts/global.lua index d0180fa..8550b66 100644 --- a/cybersyn/scripts/global.lua +++ b/cybersyn/scripts/global.lua @@ -124,6 +124,8 @@ ---@field public stuck_train_alert_enabled boolean --interface setting ---@field public react_to_train_at_incorrect_station boolean --interface setting ---@field public react_to_train_early_to_depot boolean --interface setting +---@field public enable_manager boolean +---@field public manager_tps double --manager tick rate --if this is uncommented it means there are migrations to write diff --git a/cybersyn/scripts/gui/inventory.lua b/cybersyn/scripts/gui/inventory.lua index cffc5b2..d31e4ae 100644 --- a/cybersyn/scripts/gui/inventory.lua +++ b/cybersyn/scripts/gui/inventory.lua @@ -36,6 +36,7 @@ function inventory_tab.build(map_data, player_data) local refs = player_data.refs + local search_query = player_data.search_query local search_item = player_data.search_item local search_network_name = player_data.search_network_name local search_network_mask = player_data.search_network_mask @@ -55,10 +56,28 @@ function inventory_tab.build(map_data, player_data) goto continue end + if search_query then + if not string.match(entity.backer_name, search_query) then + goto continue + end + end + -- move surface comparison up higher in query to short circuit query earlier if surface doesn't match + if search_surface_idx then + if search_surface_idx == -1 then + goto has_match + elseif entity.surface.index ~= search_surface_idx then + goto continue + end + ::has_match:: + end if search_network_name then + if search_network_name == (NETWORK_EACH or NETWORK_ANYTHING) then + goto has_match + end if search_network_name ~= station.network_name then goto continue end + ::has_match:: local train_flag = get_network_flag(station, search_network_name) if not bit32.btest(search_network_mask, train_flag) then goto continue @@ -78,12 +97,6 @@ function inventory_tab.build(map_data, player_data) end end - if search_surface_idx then - if entity.surface.index ~= search_surface_idx then - goto continue - end - end - if search_item then if not station.deliveries then goto continue diff --git a/cybersyn/scripts/gui/manager.lua b/cybersyn/scripts/gui/manager.lua index 5386c51..0406509 100644 --- a/cybersyn/scripts/gui/manager.lua +++ b/cybersyn/scripts/gui/manager.lua @@ -69,6 +69,8 @@ function manager.create(player) handler = manager.handle.manager_update_text_search, --on_gui_text_changed }, { type = "empty-widget", style = "flib_horizontal_pusher" }, + { type = "label", style = "caption_label", caption = { "cybersyn-gui.network-name-label" } }, + { type= "choose-elem-button", name="network", style="slot_button_in_shallow_frame", elem_type="signal", tooltip={"cybersyn-gui.network-tooltip"}, signal=NETWORK_SIGNAL_GUI_DEFAULT, handler=manager.handle.manager_update_network_name, }, { type = "label", style = "caption_label", caption = { "cybersyn-gui.network-id-label" } }, { name = "manager_network_mask_field", @@ -110,9 +112,45 @@ function manager.create(player) return refs end +function manager.build(player_data) + local refs = player_data.refs + -- Surface dropdown + --- @type LuaGuiElement + local surface_dropdown = refs.manager_surface_dropdown + local surfaces = game.surfaces + local selected_surface_id = player_data.search_surface_idx + local currently_selected_index = surface_dropdown.selected_index + local currently_selected_surface = nil + if currently_selected_index ~= (nil or 0) then + currently_selected_surface = surface_dropdown.get_item(currently_selected_index) + end + surface_dropdown.clear_items() + i = 0 + for name, _ in pairs(surfaces) do + i = i + 1 + surface_dropdown.add_item(name, i) + --reselect same surface + if name == currently_selected_surface then + refs.manager_surface_dropdown.selected_index = i + end + end + -- Validate that the selected index still exist + if selected_surface_id then + local selected_surface = game.get_surface(selected_surface_id) + -- If the surface was invalidated since last update, reset to all + if not selected_surface then + player_data.search_surface_idx = -1 + end + else + player_data.search_surface_idx = -1 + end + +end + --- @param map_data MapData --- @param player_data PlayerData function manager.update(map_data, player_data) + manager.build(player_data) stations_tab.build(map_data, player_data) inventory_tab.build(map_data, player_data) end @@ -235,8 +273,9 @@ end --- @param player LuaPlayer --- @param player_data PlayerData --- @param refs table -function manager.handle.manager_update_network_name(player, player_data, refs) - local signal = refs.manager_network_name.elem_value +function manager.handle.manager_update_network_name(player, player_data, refs, e) + local element = e.element + local signal = element.elem_value if signal then player_data.search_network_name = signal.name else @@ -246,15 +285,25 @@ end --- @param player LuaPlayer --- @param player_data PlayerData --- @param refs table -function manager.handle.manager_update_network_mask(player, player_data, refs) - player_data.search_network_mask = tonumber(refs.manager_network_mask_field.text) or -1 +function manager.handle.manager_update_network_mask(player, player_data, refs, e) + player_data.search_network_mask = tonumber(e.text) or -1 end --- @param player LuaPlayer --- @param player_data PlayerData --- @param refs table -function manager.handle.manager_update_surface(player, player_data, refs) - local i = refs.manager_surface_dropdown.selected_index - player_data.search_surface_idx = i--TODO: fix this +function manager.handle.manager_update_surface(player, player_data, refs, e) + --- @type LuaGuiElement + local element = e.element + local i = element.selected_index + local refs = player_data.refs + local surface_id = -1 + if i > 0 then + local surface_name = refs.manager_surface_dropdown.get_item(i) + local surface = game.get_surface(surface_name) + surface_id = surface.index + end + + player_data.search_surface_idx = surface_id end diff --git a/cybersyn/scripts/gui/stations.lua b/cybersyn/scripts/gui/stations.lua index ac2746c..23d86fb 100644 --- a/cybersyn/scripts/gui/stations.lua +++ b/cybersyn/scripts/gui/stations.lua @@ -64,6 +64,7 @@ function stations_tab.build(map_data, player_data) local widths = constants.gui["en"] local refs = player_data.refs + local search_query = player_data.search_query local search_item = player_data.search_item local search_network_name = player_data.search_network_name local search_network_mask = player_data.search_network_mask @@ -78,10 +79,33 @@ function stations_tab.build(map_data, player_data) goto continue end + + + if search_query then + if not string.match(entity.backer_name, search_query) then + goto continue + end + end + + -- move surface comparison up higher in query to short circuit query earlier if surface doesn't match; this can exclude hundreds of stations instantly in SE + if search_surface_idx then + if search_surface_idx == -1 then + goto has_match + elseif entity.surface.index ~= search_surface_idx then + goto continue + end + ::has_match:: + end + if search_network_name then + --setting default for GUI to NETWORK_EACH, which will match all + if search_network_name == (NETWORK_EACH or NETWORK_ANYTHING) then + goto has_match + end if search_network_name ~= station.network_name then goto continue end + ::has_match:: local train_flag = get_network_flag(station, search_network_name) if not bit32.btest(search_network_mask, train_flag) then goto continue @@ -101,11 +125,6 @@ function stations_tab.build(map_data, player_data) end end - if search_surface_idx then - if entity.surface.index ~= search_surface_idx then - goto continue - end - end if search_item then if not station.deliveries then diff --git a/cybersyn/scripts/main.lua b/cybersyn/scripts/main.lua index a0a0713..587fee6 100644 --- a/cybersyn/scripts/main.lua +++ b/cybersyn/scripts/main.lua @@ -933,7 +933,7 @@ local function main() script.on_event(defines.events.on_player_removed, manager.on_player_removed) script.on_event(defines.events.on_player_created, manager.on_player_created) script.on_event(defines.events.on_lua_shortcut, manager.on_lua_shortcut) - script.on_nth_tick(600, function() --TODO: tick value needs to be converted to mod setting + script.on_nth_tick(60, function() --TODO: tick value needs to be converted to mod setting manager.tick(global) end) end From 838f6f50b2d0c6e502ff714d9f476adda68400c3 Mon Sep 17 00:00:00 2001 From: Will Berry <73126355+wdberry@users.noreply.github.com> Date: Wed, 8 Mar 2023 12:04:20 -0500 Subject: [PATCH 08/24] attempt to fix reported crash --- cybersyn/scripts/gui/stations.lua | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/cybersyn/scripts/gui/stations.lua b/cybersyn/scripts/gui/stations.lua index 23d86fb..7847bc4 100644 --- a/cybersyn/scripts/gui/stations.lua +++ b/cybersyn/scripts/gui/stations.lua @@ -211,6 +211,14 @@ function stations_tab.build(map_data, player_data) for i, station_id in pairs(stations_sorted) do local station = map_data.stations[station_id] + local network_name = "signal-nothing" + local network_flag = -1 + if station.search_network_name ~= nil then + network_name = station.network_name + end + if station.network_flag ~= nil then + network_flag = station.network_flag + end local color = i % 2 == 0 and "dark" or "light" gui.add(scroll_pane, { @@ -224,8 +232,8 @@ function stations_tab.build(map_data, player_data) caption = station.entity_stop.backer_name, }, --templates.status_indicator(widths.stations.status, true), --repurposing status column for network name - { type = "sprite-button", style = "ltnm_small_slot_button_default", enabled = false, sprite = "virtual-signal/" .. station.network_name, }, - { type = "label", style_mods = { width = widths.stations.network_id, horizontal_align = "center" }, caption = station.network_flag }, + { type = "sprite-button", style = "ltnm_small_slot_button_default", enabled = false, sprite = "virtual-signal/" .. network_name, }, + { type = "label", style_mods = { width = widths.stations.network_id, horizontal_align = "center" }, caption = network_flag }, templates.small_slot_table(widths.stations, color, "provided_requested"), templates.small_slot_table(widths.stations, color, "shipments"), templates.small_slot_table(widths.stations, color, "control_signals"), From 38770b67bd666100b3bb24a6257fe28859671056 Mon Sep 17 00:00:00 2001 From: Will Berry <73126355+wdberry@users.noreply.github.com> Date: Wed, 8 Mar 2023 12:53:04 -0500 Subject: [PATCH 09/24] fix incorrect default signal name --- cybersyn/scripts/gui/stations.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cybersyn/scripts/gui/stations.lua b/cybersyn/scripts/gui/stations.lua index 7847bc4..00eba85 100644 --- a/cybersyn/scripts/gui/stations.lua +++ b/cybersyn/scripts/gui/stations.lua @@ -211,7 +211,7 @@ function stations_tab.build(map_data, player_data) for i, station_id in pairs(stations_sorted) do local station = map_data.stations[station_id] - local network_name = "signal-nothing" + local network_name = "signal-everything" local network_flag = -1 if station.search_network_name ~= nil then network_name = station.network_name From c55a5fc79d094865fdb8fcaf9f18e38c0e0c3075 Mon Sep 17 00:00:00 2001 From: Will Berry <73126355+wdberry@users.noreply.github.com> Date: Thu, 9 Mar 2023 11:27:54 -0500 Subject: [PATCH 10/24] Add mod setting, add click handlers for station tab --- cybersyn/locale/en/manager.cfg | 8 ++-- cybersyn/scripts/global.lua | 2 +- cybersyn/scripts/gui/constants.lua | 1 - cybersyn/scripts/gui/manager.lua | 40 ++++++++++------- cybersyn/scripts/gui/stations.lua | 70 +++++++++++++++++++++++++++--- cybersyn/scripts/gui/util.lua | 17 ++++++++ cybersyn/scripts/main.lua | 4 +- cybersyn/settings.lua | 9 ++++ 8 files changed, 124 insertions(+), 27 deletions(-) diff --git a/cybersyn/locale/en/manager.cfg b/cybersyn/locale/en/manager.cfg index 6f8d27a..5bfca09 100644 --- a/cybersyn/locale/en/manager.cfg +++ b/cybersyn/locale/en/manager.cfg @@ -45,8 +45,7 @@ no-history=[img=warning-white] No history no-stations=[img=warning-white] No stations not-available=Not available no-trains=[img=warning-white] No trains -open-ltn-combinator-gui=[font=default-semibold][color=128,206,240]Control:[/color][/font] Open LTN Combinator GUI -open-station-gui=Open station GUI\n[font=default-semibold][color=128,206,240]Shift:[/color][/font] Open station on map +open-station-gui=Open station GUI\n[font=default-semibold][color=128,206,240]Shift:[/color][/font] Open station on map\n[font=default-semibold][color=128,206,240]Control:[/color][/font] Open Station Cybernetic Combinator\n[font=default-semibold][color=128,206,240]Alt:[/color][/font] Open Station Control Cybernetic Combinator open-train-gui=Open train GUI parked-at-depot=Parked at depot parked-at-depot-with-residue=Parked at depot with residue @@ -59,6 +58,7 @@ returning-to-depot=Returning to depot route=Route runtime=Runtime search-label=Search: +search-item-label=Search by item: shipments-description=Green = Inbound\nBlue = Outbound shipment=Shipment shipments=Shipments @@ -73,7 +73,8 @@ type=Type unloading-at=Unloading at [cybersyn-message] -error-ltn-combinator-not-found=Could not find an LTN Combinator for this station. +error-cybernetic-combinator-not-found=Could not find a cybernetic combinator for this station. +error-station-control-combinator-not-found=Could not find a station control cybernetic combinator for this station. error-station-is-invalid=Station is invalid, please refresh the GUI. error-train-is-invalid=Train is invalid, please refresh the GUI. @@ -83,6 +84,7 @@ iterations-per-tick=Decrease this number if you're having performance issues. [cybersyn-mod-setting-name] history-length=History length iterations-per-tick=Iterations per tick [img=info] +cybersyn-manager-update-rate=Manager refresh tick interval [shortcut-name] cybersyn-toggle-gui=Toggle Cybersyn Manager diff --git a/cybersyn/scripts/global.lua b/cybersyn/scripts/global.lua index 8550b66..7b64316 100644 --- a/cybersyn/scripts/global.lua +++ b/cybersyn/scripts/global.lua @@ -125,7 +125,7 @@ ---@field public react_to_train_at_incorrect_station boolean --interface setting ---@field public react_to_train_early_to_depot boolean --interface setting ---@field public enable_manager boolean ----@field public manager_tps double --manager tick rate +---@field public manager_update_rate int --if this is uncommented it means there are migrations to write diff --git a/cybersyn/scripts/gui/constants.lua b/cybersyn/scripts/gui/constants.lua index 086de2b..6d7305d 100644 --- a/cybersyn/scripts/gui/constants.lua +++ b/cybersyn/scripts/gui/constants.lua @@ -145,7 +145,6 @@ if script then constants.open_station_gui_tooltip = { "", { "cybersyn-gui.open-station-gui" }, - remote.interfaces["ltn-combinator"] and { "", "\n", { "cybersyn-gui.open-ltn-combinator-gui" } } or nil, } end diff --git a/cybersyn/scripts/gui/manager.lua b/cybersyn/scripts/gui/manager.lua index 0406509..0a8844a 100644 --- a/cybersyn/scripts/gui/manager.lua +++ b/cybersyn/scripts/gui/manager.lua @@ -11,6 +11,7 @@ local stations_tab = require("scripts.gui.stations") local inventory_tab = require("scripts.gui.inventory") --local history_tab = require("scripts.gui.history") --local alerts_tab = require("scripts.gui.alerts") +local util = require("scripts.gui.util") local manager = {} @@ -68,6 +69,14 @@ function manager.create(player) clear_and_focus_on_right_click = true, handler = manager.handle.manager_update_text_search, --on_gui_text_changed }, + -- item search box commented out. It *works*, but, the filtering logic only checks delivieres, so I'm not sure what Mami intended it for, so I'm leaving it off for now... + --{ type = "label", style = "subheader_caption_label", caption = { "cybersyn-gui.search-item-label" } }, + --{ + -- name = "manager_item_search_field", + -- type = "textfield", + -- clear_and_focus_on_right_click = true, + -- handler = manager.handle.manager_update_item_search, --on_gui_text_changed + --}, { type = "empty-widget", style = "flib_horizontal_pusher" }, { type = "label", style = "caption_label", caption = { "cybersyn-gui.network-name-label" } }, { type= "choose-elem-button", name="network", style="slot_button_in_shallow_frame", elem_type="signal", tooltip={"cybersyn-gui.network-tooltip"}, signal=NETWORK_SIGNAL_GUI_DEFAULT, handler=manager.handle.manager_update_network_name, }, @@ -201,21 +210,7 @@ end --- @param player_data PlayerData --- @param refs table function manager.handle.manager_close(player, player_data, refs) - if player_data.pinning then - return - end - - refs.manager_window.visible = false - player_data.visible = false - - if player.opened == refs.manager_window then - player.opened = nil - end - - player_data.is_manager_open = false - player.set_shortcut_toggled("cybersyn-toggle-gui", false) - - + util.close_manager_window(player, player_data, refs) player_data.refs.manager_window.destroy() player_data.refs = manager.create(player) end @@ -269,6 +264,21 @@ function manager.handle.manager_update_text_search(player, player_data, refs, e) player_data.search_query = query end +--- @param player LuaPlayer +--- @param player_data PlayerData +--- @param refs table +--- @param e GuiEventData +function manager.handle.manager_update_item_search(player, player_data, refs, e) + local query = e.text + if query then + -- Input sanitization + for pattern, replacement in pairs(constants.input_sanitizers) do + query = string.gsub(query, pattern, replacement) + end + end + player_data.search_item = query +end + --- @param player LuaPlayer --- @param player_data PlayerData diff --git a/cybersyn/scripts/gui/stations.lua b/cybersyn/scripts/gui/stations.lua index 00eba85..9c186ed 100644 --- a/cybersyn/scripts/gui/stations.lua +++ b/cybersyn/scripts/gui/stations.lua @@ -70,10 +70,11 @@ function stations_tab.build(map_data, player_data) local search_network_mask = player_data.search_network_mask local search_surface_idx = player_data.search_surface_idx + local stations = map_data.stations local stations_sorted = {} local to_sorted_manifest = {} - for id, station in pairs(map_data.stations) do + for id, station in pairs(stations) do local entity = station.entity_stop if not entity.valid then goto continue @@ -210,10 +211,11 @@ function stations_tab.build(map_data, player_data) end for i, station_id in pairs(stations_sorted) do - local station = map_data.stations[station_id] + --- @type Station + local station = stations[station_id] local network_name = "signal-everything" local network_flag = -1 - if station.search_network_name ~= nil then + if station.network_name ~= nil then network_name = station.network_name end if station.network_flag ~= nil then @@ -223,13 +225,14 @@ function stations_tab.build(map_data, player_data) local color = i % 2 == 0 and "dark" or "light" gui.add(scroll_pane, { type = "frame", - style = "ltnm_table_row_frame_" .. color, { type = "label", style = "ltnm_clickable_semibold_label", style_mods = { width = widths.stations.name }, tooltip = constants.open_station_gui_tooltip, caption = station.entity_stop.backer_name, + handler = stations_tab.handle.open_station_gui, + tags = { station_id = station_id } }, --templates.status_indicator(widths.stations.status, true), --repurposing status column for network name { type = "sprite-button", style = "ltnm_small_slot_button_default", enabled = false, sprite = "virtual-signal/" .. network_name, }, @@ -257,9 +260,64 @@ function stations_tab.build(map_data, player_data) end -stations_tab.hande = {} +stations_tab.handle = {} -function stations_tab.hande.open_station_gui() +--- @param e {player_index: uint} +function stations_tab.wrapper(e, handler) + local player = game.get_player(e.player_index) + if not player then return end + local player_data = global.manager.players[e.player_index] + handler(player, player_data, player_data.refs, e) end +--- @param e GuiEventData +--- @param player_data PlayerData +function stations_tab.handle.open_station_gui(player, player_data, refs, e) + local station_id = e.element.tags.station_id + --- @type Station + local station = global.stations[station_id] + local station_entity = station.entity_stop + local station_comb1 = station.entity_comb1 + local station_comb2 = station.entity_comb2 + + if not station_entity or not station_entity.valid then + util.error_flying_text(gui.player, { "message.ltnm-error-station-is-invalid" }) + return + end + + if e.shift then + player.zoom_to_world(station_entity.position, 1, station_entity) + + rendering.draw_circle({ + color = constants.colors.red.tbl, + target = station_entity.position, + surface = station_entity.surface, + radius = 0.5, + filled = false, + width = 5, + time_to_live = 60 * 3, + players = { player }, + }) + + if not player_data.pinning then util.close_manager_window(player, player_data, refs) end + elseif e.control then + if station_comb1 ~= nil and station_comb1.valid then + player.opened = station_comb1 + else + util.error_flying_text(player, { "cybersyn-message.error-cybernetic-combinator-not-found" }) + end + + elseif e.alt then + if station_comb2 ~= nil and station_comb2.valid then + player.opened = station_comb2 + else + util.error_flying_text(player, { "cybersyn-message.error-station-control-combinator-not-found" }) + end + else + player.opened = station_entity + end +end + +gui.add_handlers(stations_tab.handle, stations_tab.wrapper) + return stations_tab diff --git a/cybersyn/scripts/gui/util.lua b/cybersyn/scripts/gui/util.lua index 1b154e1..8d8ed7f 100644 --- a/cybersyn/scripts/gui/util.lua +++ b/cybersyn/scripts/gui/util.lua @@ -221,4 +221,21 @@ function util.signed_int32(val) return (val >= MAX_INT and val - (2 * MAX_INT)) or val end +function util.close_manager_window(player, player_data, refs) + if player_data.pinning then + return + end + + refs.manager_window.visible = false + player_data.visible = false + + if player.opened == refs.manager_window then + player.opened = nil + end + + player_data.is_manager_open = false + player.set_shortcut_toggled("cybersyn-toggle-gui", false) + +end + return util diff --git a/cybersyn/scripts/main.lua b/cybersyn/scripts/main.lua index 587fee6..64087cc 100644 --- a/cybersyn/scripts/main.lua +++ b/cybersyn/scripts/main.lua @@ -825,6 +825,7 @@ local function grab_all_settings() mod_settings.stuck_train_time = settings.global["cybersyn-stuck-train-time"].value--[[@as double]] mod_settings.allow_cargo_in_depot = settings.global["cybersyn-allow-cargo-in-depot"].value--[[@as boolean]] mod_settings.invert_sign = settings.global["cybersyn-invert-sign"].value--[[@as boolean]] + mod_settings.manager_update_rate = settings.startup["cybersyn-manager-update-rate"].value--[[@as int]] end local function on_settings_changed(event) grab_all_settings() @@ -933,7 +934,8 @@ local function main() script.on_event(defines.events.on_player_removed, manager.on_player_removed) script.on_event(defines.events.on_player_created, manager.on_player_created) script.on_event(defines.events.on_lua_shortcut, manager.on_lua_shortcut) - script.on_nth_tick(60, function() --TODO: tick value needs to be converted to mod setting + -- TODO: rework this to work as a per-player runtime setting + script.on_nth_tick(mod_settings.manager_update_rate, function() manager.tick(global) end) end diff --git a/cybersyn/settings.lua b/cybersyn/settings.lua index 664fcca..3f66799 100644 --- a/cybersyn/settings.lua +++ b/cybersyn/settings.lua @@ -102,6 +102,15 @@ data:extend({ setting_type = "runtime-global", default_value = false, }, + { + type = "int-setting", + name = "cybersyn-manager-update-rate", + order = "ad", + setting_type = "startup", + default_value = 60, + minimum_value = 1, + maximum_value = 2147483647, + }, --{ -- type = "bool-setting", -- name = "cybersyn-disable-top-left-button", From 7d60f9412a1f0fe7aeea64a7cb17ce2ef6bcd3e0 Mon Sep 17 00:00:00 2001 From: Will Berry <73126355+wdberry@users.noreply.github.com> Date: Thu, 9 Mar 2023 12:09:16 -0500 Subject: [PATCH 11/24] Attempt to fix reported crash __cybersyn__/scripts/gui/stations.lua:110: bad argument #2 of 3 to 'btest' (number expected, got nil) --- cybersyn/scripts/gui/inventory.lua | 2 +- cybersyn/scripts/gui/stations.lua | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cybersyn/scripts/gui/inventory.lua b/cybersyn/scripts/gui/inventory.lua index d31e4ae..a1deed9 100644 --- a/cybersyn/scripts/gui/inventory.lua +++ b/cybersyn/scripts/gui/inventory.lua @@ -78,7 +78,7 @@ function inventory_tab.build(map_data, player_data) goto continue end ::has_match:: - local train_flag = get_network_flag(station, search_network_name) + local train_flag = get_network_flag(station, station.network_name) if not bit32.btest(search_network_mask, train_flag) then goto continue end diff --git a/cybersyn/scripts/gui/stations.lua b/cybersyn/scripts/gui/stations.lua index 9c186ed..7e746b5 100644 --- a/cybersyn/scripts/gui/stations.lua +++ b/cybersyn/scripts/gui/stations.lua @@ -100,14 +100,14 @@ function stations_tab.build(map_data, player_data) if search_network_name then --setting default for GUI to NETWORK_EACH, which will match all - if search_network_name == (NETWORK_EACH or NETWORK_ANYTHING) then + if search_network_name == (NETWORK_EACH or NETWORK_ANYTHING) then --NETWORK_ANYTHING prevents crash due station having a nil issue, may need to be addressed in a different way goto has_match end if search_network_name ~= station.network_name then goto continue end ::has_match:: - local train_flag = get_network_flag(station, search_network_name) + local train_flag = get_network_flag(station, station.network_name) --we already validated search network name or a "match anything" if not bit32.btest(search_network_mask, train_flag) then goto continue end From 547bb93390da8245bf2b6231619d3a061bdd68fb Mon Sep 17 00:00:00 2001 From: Will Berry <73126355+wdberry@users.noreply.github.com> Date: Thu, 9 Mar 2023 12:59:37 -0500 Subject: [PATCH 12/24] Fix crash condition on station with non-virtual signal for network --- cybersyn/scripts/gui/inventory.lua | 2 +- cybersyn/scripts/gui/stations.lua | 15 ++++++--------- cybersyn/scripts/gui/util.lua | 4 ++++ 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/cybersyn/scripts/gui/inventory.lua b/cybersyn/scripts/gui/inventory.lua index a1deed9..f80ca49 100644 --- a/cybersyn/scripts/gui/inventory.lua +++ b/cybersyn/scripts/gui/inventory.lua @@ -234,7 +234,7 @@ function inventory_tab.build(map_data, player_data) if next(inventory_requested_table.children) ~= nil then refs.inventory_requested_table.clear() end - if next(inventory_in_transit_table.children) ~=nil then + if next(inventory_in_transit_table.children) ~= nil then refs.inventory_in_transit_table.clear() end gui.add(refs.inventory_provided_table, provided_children) diff --git a/cybersyn/scripts/gui/stations.lua b/cybersyn/scripts/gui/stations.lua index 7e746b5..2117adb 100644 --- a/cybersyn/scripts/gui/stations.lua +++ b/cybersyn/scripts/gui/stations.lua @@ -213,15 +213,12 @@ function stations_tab.build(map_data, player_data) for i, station_id in pairs(stations_sorted) do --- @type Station local station = stations[station_id] - local network_name = "signal-everything" - local network_flag = -1 - if station.network_name ~= nil then - network_name = station.network_name + local network_sprite = "virtual-signal/signal-everything" + local network_name = station.network_name + local network_flag = get_network_flag(station, network_name) + if network_name ~= nil then + network_sprite, _, _ = util.generate_item_references(network_name) end - if station.network_flag ~= nil then - network_flag = station.network_flag - end - local color = i % 2 == 0 and "dark" or "light" gui.add(scroll_pane, { type = "frame", @@ -235,7 +232,7 @@ function stations_tab.build(map_data, player_data) tags = { station_id = station_id } }, --templates.status_indicator(widths.stations.status, true), --repurposing status column for network name - { type = "sprite-button", style = "ltnm_small_slot_button_default", enabled = false, sprite = "virtual-signal/" .. network_name, }, + { type = "sprite-button", style = "ltnm_small_slot_button_default", enabled = false, sprite = network_sprite, }, { type = "label", style_mods = { width = widths.stations.network_id, horizontal_align = "center" }, caption = network_flag }, templates.small_slot_table(widths.stations, color, "provided_requested"), templates.small_slot_table(widths.stations, color, "shipments"), diff --git a/cybersyn/scripts/gui/util.lua b/cybersyn/scripts/gui/util.lua index 8d8ed7f..c7b7a6c 100644 --- a/cybersyn/scripts/gui/util.lua +++ b/cybersyn/scripts/gui/util.lua @@ -48,6 +48,10 @@ function util.generate_item_references(item) sprite = "fluid/" .. item image_path = "[img=fluid." .. item .. "]" item_name = "fluid-name." .. item + elseif game.is_valid_sprite_path("virtual-signal/" .. item) then + sprite = "virtual-signal/" .. item + image_path = "[img=virtual-signal." .. item .. "]" + item_name = "virtual-signal." .. item end return sprite, image_path, item_name end From 7aeab435981cb510e9c448eb8a951449664de685 Mon Sep 17 00:00:00 2001 From: Will Berry <73126355+wdberry@users.noreply.github.com> Date: Thu, 9 Mar 2023 13:24:23 -0500 Subject: [PATCH 13/24] Changed default for network filter to be nothing rather than network each --- cybersyn/locale/en/manager.cfg | 2 +- cybersyn/scripts/gui/manager.lua | 2 +- cybersyn/scripts/gui/stations.lua | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cybersyn/locale/en/manager.cfg b/cybersyn/locale/en/manager.cfg index 5bfca09..ad64f1d 100644 --- a/cybersyn/locale/en/manager.cfg +++ b/cybersyn/locale/en/manager.cfg @@ -36,7 +36,7 @@ inventory=Inventory keep-open=Keep open loading-at=Loading at name=Name -network-name-label=Network: +network-name-label=Network Filter: network-id-label=Network ID: network-id=Network ID no-alerts=[img=warning-white] No alerts diff --git a/cybersyn/scripts/gui/manager.lua b/cybersyn/scripts/gui/manager.lua index 0a8844a..d28e180 100644 --- a/cybersyn/scripts/gui/manager.lua +++ b/cybersyn/scripts/gui/manager.lua @@ -79,7 +79,7 @@ function manager.create(player) --}, { type = "empty-widget", style = "flib_horizontal_pusher" }, { type = "label", style = "caption_label", caption = { "cybersyn-gui.network-name-label" } }, - { type= "choose-elem-button", name="network", style="slot_button_in_shallow_frame", elem_type="signal", tooltip={"cybersyn-gui.network-tooltip"}, signal=NETWORK_SIGNAL_GUI_DEFAULT, handler=manager.handle.manager_update_network_name, }, + { type= "choose-elem-button", name="network", style="slot_button_in_shallow_frame", elem_type="signal", tooltip={"cybersyn-gui.network-tooltip"}, handler=manager.handle.manager_update_network_name, }, { type = "label", style = "caption_label", caption = { "cybersyn-gui.network-id-label" } }, { name = "manager_network_mask_field", diff --git a/cybersyn/scripts/gui/stations.lua b/cybersyn/scripts/gui/stations.lua index 2117adb..abe61fc 100644 --- a/cybersyn/scripts/gui/stations.lua +++ b/cybersyn/scripts/gui/stations.lua @@ -99,15 +99,15 @@ function stations_tab.build(map_data, player_data) end if search_network_name then - --setting default for GUI to NETWORK_EACH, which will match all - if search_network_name == (NETWORK_EACH or NETWORK_ANYTHING) then --NETWORK_ANYTHING prevents crash due station having a nil issue, may need to be addressed in a different way + --nil matches all? + if search_network_name == nil then goto has_match end if search_network_name ~= station.network_name then goto continue end ::has_match:: - local train_flag = get_network_flag(station, station.network_name) --we already validated search network name or a "match anything" + local train_flag = get_network_flag(station, station.network_name) if not bit32.btest(search_network_mask, train_flag) then goto continue end @@ -213,7 +213,7 @@ function stations_tab.build(map_data, player_data) for i, station_id in pairs(stations_sorted) do --- @type Station local station = stations[station_id] - local network_sprite = "virtual-signal/signal-everything" + local network_sprite = "utility/close_black" local network_name = station.network_name local network_flag = get_network_flag(station, network_name) if network_name ~= nil then From 5342e8018338e40d8c927e046e1e8906629b8504 Mon Sep 17 00:00:00 2001 From: Will Berry <73126355+wdberry@users.noreply.github.com> Date: Thu, 9 Mar 2023 13:45:43 -0500 Subject: [PATCH 14/24] Removed manager window from being recreated every open and close and added remote interface to manually rebuild it for people who have already run the migration that initializes it --- cybersyn/scripts/gui/manager.lua | 2 -- cybersyn/scripts/remote-interface.lua | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/cybersyn/scripts/gui/manager.lua b/cybersyn/scripts/gui/manager.lua index d28e180..dafe4e3 100644 --- a/cybersyn/scripts/gui/manager.lua +++ b/cybersyn/scripts/gui/manager.lua @@ -211,8 +211,6 @@ end --- @param refs table function manager.handle.manager_close(player, player_data, refs) util.close_manager_window(player, player_data, refs) - player_data.refs.manager_window.destroy() - player_data.refs = manager.create(player) end --- @param player LuaPlayer diff --git a/cybersyn/scripts/remote-interface.lua b/cybersyn/scripts/remote-interface.lua index 169889f..c24a641 100644 --- a/cybersyn/scripts/remote-interface.lua +++ b/cybersyn/scripts/remote-interface.lua @@ -243,6 +243,22 @@ function interface.update_stop_from_rail(rail, forbidden_entity, force_update) update_stop_from_rail(global, rail, forbidden_entity, force_update) end +function interface.rebuild_manager_windows() + local manager = require("scripts.gui.manager") + local manager_data = global.manager + if manager_data then + + ---@param v PlayerData + for i, v in pairs(manager_data.players) do + v.refs.manager_window.destroy() + player = game.get_player(i) + if player ~= nil then + v.refs = manager.create(player) + end + end + end +end + ------------------------------------------------------------------ --[[unsafe API]] ------------------------------------------------------------------ From c178555343f71eeeaeff78de24614380d34eaef1 Mon Sep 17 00:00:00 2001 From: Will Berry <73126355+wdberry@users.noreply.github.com> Date: Thu, 9 Mar 2023 14:32:17 -0500 Subject: [PATCH 15/24] Reverted the half-baked remote interface and added a command instead to recreate the window --- cybersyn/scripts/gui/main.lua | 15 ++++++++++++++- cybersyn/scripts/remote-interface.lua | 15 --------------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/cybersyn/scripts/gui/main.lua b/cybersyn/scripts/gui/main.lua index 8443678..3f28d97 100644 --- a/cybersyn/scripts/gui/main.lua +++ b/cybersyn/scripts/gui/main.lua @@ -91,7 +91,20 @@ function manager_gui.on_runtime_mod_setting_changed(e) end end - +commands.add_command("cybersyn_rebuild_manager_windows", nil, function(command) + local manager_data = global.manager + if manager_data then + + ---@param v PlayerData + for i, v in pairs(manager_data.players) do + local player = game.get_player(i) + if player ~= nil then + v.refs.manager_window.destroy() + v.refs = manager.create(player) + end + end + end +end) --- @param manager Manager diff --git a/cybersyn/scripts/remote-interface.lua b/cybersyn/scripts/remote-interface.lua index c24a641..efaa420 100644 --- a/cybersyn/scripts/remote-interface.lua +++ b/cybersyn/scripts/remote-interface.lua @@ -243,21 +243,6 @@ function interface.update_stop_from_rail(rail, forbidden_entity, force_update) update_stop_from_rail(global, rail, forbidden_entity, force_update) end -function interface.rebuild_manager_windows() - local manager = require("scripts.gui.manager") - local manager_data = global.manager - if manager_data then - - ---@param v PlayerData - for i, v in pairs(manager_data.players) do - v.refs.manager_window.destroy() - player = game.get_player(i) - if player ~= nil then - v.refs = manager.create(player) - end - end - end -end ------------------------------------------------------------------ --[[unsafe API]] From 118f8c9eb218a6ca967384b93c707ef77edff0ea Mon Sep 17 00:00:00 2001 From: Will Berry <73126355+wdberry@users.noreply.github.com> Date: Thu, 9 Mar 2023 14:47:50 -0500 Subject: [PATCH 16/24] Added startup mod setting to disable/enable manager in the event it causes crashes or UPS issues so that it can be "optional" --- cybersyn/locale/en/base.cfg | 3 +++ cybersyn/locale/en/manager.cfg | 1 - cybersyn/scripts/main.lua | 3 ++- cybersyn/settings.lua | 7 +++++++ 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/cybersyn/locale/en/base.cfg b/cybersyn/locale/en/base.cfg index 6671d9d..ab182b1 100644 --- a/cybersyn/locale/en/base.cfg +++ b/cybersyn/locale/en/base.cfg @@ -12,6 +12,8 @@ cybersyn-warmup-time=Station warmup time (sec) cybersyn-stuck-train-time=Stuck train timeout (sec) cybersyn-allow-cargo-in-depot=Allow cargo in depots cybersyn-invert-sign=Invert combinator output (deprecated) +cybersyn-manager-enabled=Enable the Cybersyn GUI. +cybersyn-manager-update-rate=Manager refresh tick interval [mod-setting-description] cybersyn-enable-planner=Enable or disable the central planning algorithm. If disabled no new trains will be dispatched. @@ -28,6 +30,7 @@ cybersyn-stuck-train-time=After this many seconds from a train's dispatch, an al cybersyn-allow-cargo-in-depot=If checked, trains will be allowed to have cargo in depots; no alerts will be generated and the train will not be held. In addition, trains with orders to visit requester stations with "Inactivity condition" checked will wait for inactivity instead of waiting for empty cargo. Useful for creating train systems where depots handle excess cargo. For advanced users only. cybersyn-invert-sign=Flip the sign of the output of cybernetic combinators to be the same as it is in LTN or in earlier versions of Project Cybersyn. + [item-name] cybersyn-combinator=Cybernetic combinator diff --git a/cybersyn/locale/en/manager.cfg b/cybersyn/locale/en/manager.cfg index ad64f1d..7730cb9 100644 --- a/cybersyn/locale/en/manager.cfg +++ b/cybersyn/locale/en/manager.cfg @@ -84,7 +84,6 @@ iterations-per-tick=Decrease this number if you're having performance issues. [cybersyn-mod-setting-name] history-length=History length iterations-per-tick=Iterations per tick [img=info] -cybersyn-manager-update-rate=Manager refresh tick interval [shortcut-name] cybersyn-toggle-gui=Toggle Cybersyn Manager diff --git a/cybersyn/scripts/main.lua b/cybersyn/scripts/main.lua index 64087cc..a424048 100644 --- a/cybersyn/scripts/main.lua +++ b/cybersyn/scripts/main.lua @@ -825,6 +825,7 @@ local function grab_all_settings() mod_settings.stuck_train_time = settings.global["cybersyn-stuck-train-time"].value--[[@as double]] mod_settings.allow_cargo_in_depot = settings.global["cybersyn-allow-cargo-in-depot"].value--[[@as boolean]] mod_settings.invert_sign = settings.global["cybersyn-invert-sign"].value--[[@as boolean]] + mod_settings.manager_enabled = settings.startup["cybersyn-manager-enabled"].value--[[@as boolean]] mod_settings.manager_update_rate = settings.startup["cybersyn-manager-update-rate"].value--[[@as int]] end local function on_settings_changed(event) @@ -904,7 +905,7 @@ local function main() end - local MANAGER_ENABLED = true --convert to mod setting? + local MANAGER_ENABLED = mod_settings.manager_enabled script.on_init(function() local setting = settings.global["cybersyn-invert-sign"] diff --git a/cybersyn/settings.lua b/cybersyn/settings.lua index 3f66799..b5494e4 100644 --- a/cybersyn/settings.lua +++ b/cybersyn/settings.lua @@ -111,6 +111,13 @@ data:extend({ minimum_value = 1, maximum_value = 2147483647, }, + { + type = "bool-setting", + name = "cybersyn-manager-enabled", + order = "aa", + setting_type = "startup", + default_value = true, + }, --{ -- type = "bool-setting", -- name = "cybersyn-disable-top-left-button", From 9343d06620d901faaefebac4306de8b1479545ab Mon Sep 17 00:00:00 2001 From: Will Berry <73126355+wdberry@users.noreply.github.com> Date: Fri, 10 Mar 2023 10:19:30 -0500 Subject: [PATCH 17/24] Only refresh open tab and exclude virtual signals from provided/requested on stations tab --- cybersyn/scripts/gui/inventory.lua | 22 +++++++++++++++++++--- cybersyn/scripts/gui/main.lua | 1 + cybersyn/scripts/gui/manager.lua | 17 ++++++++++++----- cybersyn/scripts/gui/stations.lua | 10 +++++++--- cybersyn/scripts/gui/util.lua | 4 ++++ 5 files changed, 43 insertions(+), 11 deletions(-) diff --git a/cybersyn/scripts/gui/inventory.lua b/cybersyn/scripts/gui/inventory.lua index f80ca49..a335eeb 100644 --- a/cybersyn/scripts/gui/inventory.lua +++ b/cybersyn/scripts/gui/inventory.lua @@ -13,9 +13,7 @@ function inventory_tab.create() type = "tab", caption = { "cybersyn-gui.inventory" }, ref = { "inventory", "tab" }, - actions = { - on_click = { gui = "main", action = "change_tab", tab = "inventory" }, - }, + handler = inventory_tab.handle.on_inventory_tab_selected }, content = { name = "manager_inventory_content_frame", @@ -243,4 +241,22 @@ function inventory_tab.build(map_data, player_data) end +inventory_tab.handle = {} + +--- @param e {player_index: uint} +function inventory_tab.wrapper(e, handler) + local player = game.get_player(e.player_index) + if not player then return end + local player_data = global.manager.players[e.player_index] + handler(player, player_data, player_data.refs, e) +end + +---@param player LuaPlayer +---@param player_data PlayerData +function inventory_tab.handle.on_inventory_tab_selected(player, player_data) + player_data.selected_tab = "inventory_tab" +end + +gui.add_handlers(inventory_tab.handle, inventory_tab.wrapper) + return inventory_tab diff --git a/cybersyn/scripts/gui/main.lua b/cybersyn/scripts/gui/main.lua index 3f28d97..18893a0 100644 --- a/cybersyn/scripts/gui/main.lua +++ b/cybersyn/scripts/gui/main.lua @@ -18,6 +18,7 @@ local manager = require("scripts.gui.manager") --- @field trains_orderings uint[] --- @field trains_orderings_invert boolean[] --- @field pinning boolean +--- @field selected_tab string? diff --git a/cybersyn/scripts/gui/manager.lua b/cybersyn/scripts/gui/manager.lua index dafe4e3..d978792 100644 --- a/cybersyn/scripts/gui/manager.lua +++ b/cybersyn/scripts/gui/manager.lua @@ -134,7 +134,8 @@ function manager.build(player_data) currently_selected_surface = surface_dropdown.get_item(currently_selected_index) end surface_dropdown.clear_items() - i = 0 + surface_dropdown.add_item("all", 1) + i = 1 for name, _ in pairs(surfaces) do i = i + 1 surface_dropdown.add_item(name, i) @@ -159,9 +160,14 @@ end --- @param map_data MapData --- @param player_data PlayerData function manager.update(map_data, player_data) - manager.build(player_data) - stations_tab.build(map_data, player_data) - inventory_tab.build(map_data, player_data) + if player_data.selected_tab ~= nil then + manager.build(player_data) + end + if player_data.selected_tab == "stations_tab" then + stations_tab.build(map_data, player_data) + elseif player_data.selected_tab == "inventory_tab" then + inventory_tab.build(map_data, player_data) + end end @@ -305,7 +311,8 @@ function manager.handle.manager_update_surface(player, player_data, refs, e) local i = element.selected_index local refs = player_data.refs local surface_id = -1 - if i > 0 then + --all surfaces should always be the first entry with an index of 1 + if i > 1 then local surface_name = refs.manager_surface_dropdown.get_item(i) local surface = game.get_surface(surface_name) surface_id = surface.index diff --git a/cybersyn/scripts/gui/stations.lua b/cybersyn/scripts/gui/stations.lua index abe61fc..da7065e 100644 --- a/cybersyn/scripts/gui/stations.lua +++ b/cybersyn/scripts/gui/stations.lua @@ -13,9 +13,7 @@ function stations_tab.create(widths) type = "tab", caption = { "cybersyn-gui.stations" }, ref = { "stations", "tab" }, - actions = { - on_click = { gui = "main", action = "change_tab", tab = "stations" }, - }, + handler = stations_tab.handle.on_stations_tab_selected }, content = { name = "manager_stations_content_frame", @@ -315,6 +313,12 @@ function stations_tab.handle.open_station_gui(player, player_data, refs, e) end end +---@param player LuaPlayer +---@param player_data PlayerData +function stations_tab.handle.on_stations_tab_selected(player, player_data) + player_data.selected_tab = "stations_tab" +end + gui.add_handlers(stations_tab.handle, stations_tab.wrapper) return stations_tab diff --git a/cybersyn/scripts/gui/util.lua b/cybersyn/scripts/gui/util.lua index c7b7a6c..c1981f3 100644 --- a/cybersyn/scripts/gui/util.lua +++ b/cybersyn/scripts/gui/util.lua @@ -100,6 +100,9 @@ function util.slot_table_build_from_station(station) if comb1_signals then for _, v in pairs(comb1_signals) do local item = v.signal + if item.type == "virtual" then + goto continue + end local count = v.count local name = item.name local sprite, img_path, item_string = util.generate_item_references(name) @@ -126,6 +129,7 @@ function util.slot_table_build_from_station(station) } end end + ::continue:: end end return children From 458ef89f585cbf78f9f3a9fdc8e94ef3b68d04f3 Mon Sep 17 00:00:00 2001 From: Will Berry <73126355+wdberry@users.noreply.github.com> Date: Fri, 10 Mar 2023 12:39:39 -0500 Subject: [PATCH 18/24] Add query limit per-player setting to limit results in Stations/Trains GUI tabs --- cybersyn/locale/en/base.cfg | 3 ++- cybersyn/scripts/gui/main.lua | 3 ++- cybersyn/scripts/gui/manager.lua | 4 ++-- cybersyn/scripts/gui/stations.lua | 8 +++++++- cybersyn/scripts/gui/trains.lua | 8 +++++++- cybersyn/settings.lua | 9 +++++++++ 6 files changed, 29 insertions(+), 6 deletions(-) diff --git a/cybersyn/locale/en/base.cfg b/cybersyn/locale/en/base.cfg index ab182b1..42d7217 100644 --- a/cybersyn/locale/en/base.cfg +++ b/cybersyn/locale/en/base.cfg @@ -14,6 +14,7 @@ cybersyn-allow-cargo-in-depot=Allow cargo in depots cybersyn-invert-sign=Invert combinator output (deprecated) cybersyn-manager-enabled=Enable the Cybersyn GUI. cybersyn-manager-update-rate=Manager refresh tick interval +cybersyn-manager-result-limit=Max entities displayed on GUI pages. [mod-setting-description] cybersyn-enable-planner=Enable or disable the central planning algorithm. If disabled no new trains will be dispatched. @@ -29,7 +30,7 @@ cybersyn-warmup-time=How many seconds a cybernetic combinator will wait before c cybersyn-stuck-train-time=After this many seconds from a train's dispatch, an alert will be sent to let you know a train is probably stuck and has not completed its delivery. The player will likely have to debug their network to get the train unstuck. cybersyn-allow-cargo-in-depot=If checked, trains will be allowed to have cargo in depots; no alerts will be generated and the train will not be held. In addition, trains with orders to visit requester stations with "Inactivity condition" checked will wait for inactivity instead of waiting for empty cargo. Useful for creating train systems where depots handle excess cargo. For advanced users only. cybersyn-invert-sign=Flip the sign of the output of cybernetic combinators to be the same as it is in LTN or in earlier versions of Project Cybersyn. - +cybersyn-manager-result-limit=Caps the number of matching enitities (e.g. stations, trains) to limit the amount of update time consumed when the list is refreshed.\n-1 means return all results. [item-name] cybersyn-combinator=Cybernetic combinator diff --git a/cybersyn/scripts/gui/main.lua b/cybersyn/scripts/gui/main.lua index 18893a0..8c8cd4a 100644 --- a/cybersyn/scripts/gui/main.lua +++ b/cybersyn/scripts/gui/main.lua @@ -157,7 +157,8 @@ function manager_gui.tick(global) if manager_data then for i, v in pairs(manager_data.players) do if v.is_manager_open then - manager.update(global, v) + local query_limit = settings.get_player_settings(i)["cybersyn-manager-result-limit"].value + manager.update(global, v, query_limit) end end end diff --git a/cybersyn/scripts/gui/manager.lua b/cybersyn/scripts/gui/manager.lua index d978792..bea70d6 100644 --- a/cybersyn/scripts/gui/manager.lua +++ b/cybersyn/scripts/gui/manager.lua @@ -159,12 +159,12 @@ end --- @param map_data MapData --- @param player_data PlayerData -function manager.update(map_data, player_data) +function manager.update(map_data, player_data, query_limit) if player_data.selected_tab ~= nil then manager.build(player_data) end if player_data.selected_tab == "stations_tab" then - stations_tab.build(map_data, player_data) + stations_tab.build(map_data, player_data, query_limit) elseif player_data.selected_tab == "inventory_tab" then inventory_tab.build(map_data, player_data) end diff --git a/cybersyn/scripts/gui/stations.lua b/cybersyn/scripts/gui/stations.lua index da7065e..f8b1106 100644 --- a/cybersyn/scripts/gui/stations.lua +++ b/cybersyn/scripts/gui/stations.lua @@ -57,7 +57,7 @@ end --- @param map_data MapData --- @param player_data PlayerData --- @return GuiElemDef -function stations_tab.build(map_data, player_data) +function stations_tab.build(map_data, player_data, query_limit) local widths = constants.gui["en"] local refs = player_data.refs @@ -72,6 +72,8 @@ function stations_tab.build(map_data, player_data) local stations_sorted = {} local to_sorted_manifest = {} + + local i = 0 for id, station in pairs(stations) do local entity = station.entity_stop if not entity.valid then @@ -139,6 +141,10 @@ function stations_tab.build(map_data, player_data) end stations_sorted[#stations_sorted + 1] = id + i = i + 1 + if query_limit ~= -1 and i >= query_limit then + break + end ::continue:: end diff --git a/cybersyn/scripts/gui/trains.lua b/cybersyn/scripts/gui/trains.lua index 91498b6..7c3057c 100644 --- a/cybersyn/scripts/gui/trains.lua +++ b/cybersyn/scripts/gui/trains.lua @@ -12,7 +12,7 @@ local trains_tab = {} --- @param map_data MapData --- @param player_data PlayerData --- @return GuiElemDef -function trains_tab.build(map_data, player_data) +function trains_tab.build(map_data, player_data, query_limit) local widths = constants.gui["en"] local search_item = player_data.search_item @@ -22,6 +22,8 @@ function trains_tab.build(map_data, player_data) local trains_sorted = {} + + local i = 0 for id, train in pairs(map_data.trains) do if search_network_name then if search_network_name ~= train.network_name then @@ -70,6 +72,10 @@ function trains_tab.build(map_data, player_data) end trains_sorted[#trains_sorted + 1] = id + i = i + 1 + if query_limit ~= -1 and i >= query_limit then + break + end ::continue:: end diff --git a/cybersyn/settings.lua b/cybersyn/settings.lua index b5494e4..56522c0 100644 --- a/cybersyn/settings.lua +++ b/cybersyn/settings.lua @@ -118,6 +118,15 @@ data:extend({ setting_type = "startup", default_value = true, }, + { + type = "int-setting", + name = "cybersyn-manager-result-limit", + order = "aa", + setting_type = "runtime-per-user", + default_value = -1, + minimum_value = -1, + maximum_value = 2147483647, + } --{ -- type = "bool-setting", -- name = "cybersyn-disable-top-left-button", From 42c1285dbac8107d7d55e44f2c929ad22c87ba26 Mon Sep 17 00:00:00 2001 From: Will Berry <73126355+wdberry@users.noreply.github.com> Date: Fri, 10 Mar 2023 13:05:55 -0500 Subject: [PATCH 19/24] Prevent crash for attempting to move camera to a surface different than the camera is currently on --- cybersyn/locale/en/manager.cfg | 1 + cybersyn/scripts/gui/stations.lua | 31 ++++++++++++++++++------------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/cybersyn/locale/en/manager.cfg b/cybersyn/locale/en/manager.cfg index 7730cb9..5d5040e 100644 --- a/cybersyn/locale/en/manager.cfg +++ b/cybersyn/locale/en/manager.cfg @@ -77,6 +77,7 @@ error-cybernetic-combinator-not-found=Could not find a cybernetic combinator for error-station-control-combinator-not-found=Could not find a station control cybernetic combinator for this station. error-station-is-invalid=Station is invalid, please refresh the GUI. error-train-is-invalid=Train is invalid, please refresh the GUI. +error-cross-surface-camera-invalid=Cannot move the camera to an entity on a different surface! [cybersyn-mod-setting-description] iterations-per-tick=Decrease this number if you're having performance issues. diff --git a/cybersyn/scripts/gui/stations.lua b/cybersyn/scripts/gui/stations.lua index f8b1106..b93ef45 100644 --- a/cybersyn/scripts/gui/stations.lua +++ b/cybersyn/scripts/gui/stations.lua @@ -272,6 +272,7 @@ function stations_tab.wrapper(e, handler) end --- @param e GuiEventData +--- @param player LuaPlayer --- @param player_data PlayerData function stations_tab.handle.open_station_gui(player, player_data, refs, e) local station_id = e.element.tags.station_id @@ -287,20 +288,24 @@ function stations_tab.handle.open_station_gui(player, player_data, refs, e) end if e.shift then - player.zoom_to_world(station_entity.position, 1, station_entity) + if station_entity.surface ~= player.surface then + util.error_flying_text(gui.player, { "cybersyn-message.error-cross-surface-camera-invalid" }) + else + player.zoom_to_world(station_entity.position, 1, station_entity) + + rendering.draw_circle({ + color = constants.colors.red.tbl, + target = station_entity.position, + surface = station_entity.surface, + radius = 0.5, + filled = false, + width = 5, + time_to_live = 60 * 3, + players = { player }, + }) - rendering.draw_circle({ - color = constants.colors.red.tbl, - target = station_entity.position, - surface = station_entity.surface, - radius = 0.5, - filled = false, - width = 5, - time_to_live = 60 * 3, - players = { player }, - }) - - if not player_data.pinning then util.close_manager_window(player, player_data, refs) end + if not player_data.pinning then util.close_manager_window(player, player_data, refs) end + end elseif e.control then if station_comb1 ~= nil and station_comb1.valid then player.opened = station_comb1 From 681358705f014959c44ca96aa1084d27700989f7 Mon Sep 17 00:00:00 2001 From: Will Berry <73126355+wdberry@users.noreply.github.com> Date: Fri, 10 Mar 2023 13:29:59 -0500 Subject: [PATCH 20/24] fix invalid reference --- cybersyn/scripts/gui/stations.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cybersyn/scripts/gui/stations.lua b/cybersyn/scripts/gui/stations.lua index b93ef45..2c34a7c 100644 --- a/cybersyn/scripts/gui/stations.lua +++ b/cybersyn/scripts/gui/stations.lua @@ -283,7 +283,7 @@ function stations_tab.handle.open_station_gui(player, player_data, refs, e) local station_comb2 = station.entity_comb2 if not station_entity or not station_entity.valid then - util.error_flying_text(gui.player, { "message.ltnm-error-station-is-invalid" }) + util.error_flying_text(player, { "message.ltnm-error-station-is-invalid" }) return end From 726b8162be09c43e207e8573bb6168f2e66f1143 Mon Sep 17 00:00:00 2001 From: Will Berry <73126355+wdberry@users.noreply.github.com> Date: Fri, 10 Mar 2023 13:57:28 -0500 Subject: [PATCH 21/24] Potential item search implementation --- cybersyn/scripts/gui/inventory.lua | 21 +++++++++++++++------ cybersyn/scripts/gui/manager.lua | 16 ++++++++-------- cybersyn/scripts/gui/stations.lua | 29 +++++++++++++++++------------ 3 files changed, 40 insertions(+), 26 deletions(-) diff --git a/cybersyn/scripts/gui/inventory.lua b/cybersyn/scripts/gui/inventory.lua index a335eeb..b1262be 100644 --- a/cybersyn/scripts/gui/inventory.lua +++ b/cybersyn/scripts/gui/inventory.lua @@ -96,12 +96,21 @@ function inventory_tab.build(map_data, player_data) end if search_item then - if not station.deliveries then - goto continue - end - for item_name, _ in pairs(station.deliveries) do - if item_name == search_item then - goto has_match + if station.deliveries then + for item_name, _ in pairs(station.deliveries) do + if item_name == search_item then + goto has_match + end + end + else + local comb1_signals, _ = get_signals(station) + for _, signal_ID in pairs(comb1_signals) do + local item = signal_ID.signal.name + if item then + if string.match(item, search_item) then + goto has_match + end + end end end goto continue diff --git a/cybersyn/scripts/gui/manager.lua b/cybersyn/scripts/gui/manager.lua index bea70d6..d4b371d 100644 --- a/cybersyn/scripts/gui/manager.lua +++ b/cybersyn/scripts/gui/manager.lua @@ -69,14 +69,14 @@ function manager.create(player) clear_and_focus_on_right_click = true, handler = manager.handle.manager_update_text_search, --on_gui_text_changed }, - -- item search box commented out. It *works*, but, the filtering logic only checks delivieres, so I'm not sure what Mami intended it for, so I'm leaving it off for now... - --{ type = "label", style = "subheader_caption_label", caption = { "cybersyn-gui.search-item-label" } }, - --{ - -- name = "manager_item_search_field", - -- type = "textfield", - -- clear_and_focus_on_right_click = true, - -- handler = manager.handle.manager_update_item_search, --on_gui_text_changed - --}, + --item search box commented out. It *works*, but, the filtering logic only checks delivieres, so I'm not sure what Mami intended it for, so I'm leaving it off for now... + { type = "label", style = "subheader_caption_label", caption = { "cybersyn-gui.search-item-label" } }, + { + name = "manager_item_search_field", + type = "textfield", + clear_and_focus_on_right_click = true, + handler = manager.handle.manager_update_item_search, --on_gui_text_changed + }, { type = "empty-widget", style = "flib_horizontal_pusher" }, { type = "label", style = "caption_label", caption = { "cybersyn-gui.network-name-label" } }, { type= "choose-elem-button", name="network", style="slot_button_in_shallow_frame", elem_type="signal", tooltip={"cybersyn-gui.network-tooltip"}, handler=manager.handle.manager_update_network_name, }, diff --git a/cybersyn/scripts/gui/stations.lua b/cybersyn/scripts/gui/stations.lua index 2c34a7c..33a7c5f 100644 --- a/cybersyn/scripts/gui/stations.lua +++ b/cybersyn/scripts/gui/stations.lua @@ -99,14 +99,9 @@ function stations_tab.build(map_data, player_data, query_limit) end if search_network_name then - --nil matches all? - if search_network_name == nil then - goto has_match - end if search_network_name ~= station.network_name then goto continue end - ::has_match:: local train_flag = get_network_flag(station, station.network_name) if not bit32.btest(search_network_mask, train_flag) then goto continue @@ -128,12 +123,22 @@ function stations_tab.build(map_data, player_data, query_limit) if search_item then - if not station.deliveries then - goto continue - end - for item_name, _ in pairs(station.deliveries) do - if item_name == search_item then - goto has_match + + if station.deliveries then + for item_name, _ in pairs(station.deliveries) do + if item_name == search_item then + goto has_match + end + end + else + local comb1_signals, _ = get_signals(station) + for _, signal_ID in pairs(comb1_signals) do + local item = signal_ID.signal.name + if item then + if string.match(item, search_item) then + goto has_match + end + end end end goto continue @@ -289,7 +294,7 @@ function stations_tab.handle.open_station_gui(player, player_data, refs, e) if e.shift then if station_entity.surface ~= player.surface then - util.error_flying_text(gui.player, { "cybersyn-message.error-cross-surface-camera-invalid" }) + util.error_flying_text(player, { "cybersyn-message.error-cross-surface-camera-invalid" }) else player.zoom_to_world(station_entity.position, 1, station_entity) From 4be0ab2004ab46b137b12c687657bc41fee93ac3 Mon Sep 17 00:00:00 2001 From: Will Berry <73126355+wdberry@users.noreply.github.com> Date: Fri, 10 Mar 2023 19:25:49 -0500 Subject: [PATCH 22/24] Fix invalid reference --- cybersyn/scripts/gui/manager.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cybersyn/scripts/gui/manager.lua b/cybersyn/scripts/gui/manager.lua index d4b371d..3acafd1 100644 --- a/cybersyn/scripts/gui/manager.lua +++ b/cybersyn/scripts/gui/manager.lua @@ -273,7 +273,7 @@ end --- @param refs table --- @param e GuiEventData function manager.handle.manager_update_item_search(player, player_data, refs, e) - local query = e.text + local query = e.element.text if query then -- Input sanitization for pattern, replacement in pairs(constants.input_sanitizers) do From 0cd1292ed656707344e56012c08d3eb6a1a682dc Mon Sep 17 00:00:00 2001 From: Will Berry <73126355+wdberry@users.noreply.github.com> Date: Fri, 10 Mar 2023 19:37:31 -0500 Subject: [PATCH 23/24] appears successful --- cybersyn/scripts/gui/inventory.lua | 5 +++-- cybersyn/scripts/gui/stations.lua | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/cybersyn/scripts/gui/inventory.lua b/cybersyn/scripts/gui/inventory.lua index b1262be..86833b7 100644 --- a/cybersyn/scripts/gui/inventory.lua +++ b/cybersyn/scripts/gui/inventory.lua @@ -102,8 +102,9 @@ function inventory_tab.build(map_data, player_data) goto has_match end end - else - local comb1_signals, _ = get_signals(station) + end + local comb1_signals, _ = get_signals(station) + if comb1_signals then for _, signal_ID in pairs(comb1_signals) do local item = signal_ID.signal.name if item then diff --git a/cybersyn/scripts/gui/stations.lua b/cybersyn/scripts/gui/stations.lua index 33a7c5f..cf29242 100644 --- a/cybersyn/scripts/gui/stations.lua +++ b/cybersyn/scripts/gui/stations.lua @@ -123,15 +123,15 @@ function stations_tab.build(map_data, player_data, query_limit) if search_item then - if station.deliveries then for item_name, _ in pairs(station.deliveries) do if item_name == search_item then goto has_match end end - else - local comb1_signals, _ = get_signals(station) + end + local comb1_signals, _ = get_signals(station) + if comb1_signals then for _, signal_ID in pairs(comb1_signals) do local item = signal_ID.signal.name if item then From c75ba3a517b844db4ae83a3c5bb35f23a7f1668e Mon Sep 17 00:00:00 2001 From: Will Berry <73126355+wdberry@users.noreply.github.com> Date: Fri, 10 Mar 2023 20:20:44 -0500 Subject: [PATCH 24/24] re-implemented item search via choose-elem-button for exact matching regardless of locale --- cybersyn/locale/en/manager.cfg | 4 ++-- cybersyn/scripts/gui/inventory.lua | 2 +- cybersyn/scripts/gui/manager.lua | 20 +++++++------------- cybersyn/scripts/gui/stations.lua | 2 +- 4 files changed, 11 insertions(+), 17 deletions(-) diff --git a/cybersyn/locale/en/manager.cfg b/cybersyn/locale/en/manager.cfg index 5d5040e..a82667b 100644 --- a/cybersyn/locale/en/manager.cfg +++ b/cybersyn/locale/en/manager.cfg @@ -57,8 +57,8 @@ requested=Requested returning-to-depot=Returning to depot route=Route runtime=Runtime -search-label=Search: -search-item-label=Search by item: +search-label=Station Name: +search-item-label=Item Filter: shipments-description=Green = Inbound\nBlue = Outbound shipment=Shipment shipments=Shipments diff --git a/cybersyn/scripts/gui/inventory.lua b/cybersyn/scripts/gui/inventory.lua index 86833b7..8540d07 100644 --- a/cybersyn/scripts/gui/inventory.lua +++ b/cybersyn/scripts/gui/inventory.lua @@ -108,7 +108,7 @@ function inventory_tab.build(map_data, player_data) for _, signal_ID in pairs(comb1_signals) do local item = signal_ID.signal.name if item then - if string.match(item, search_item) then + if item == search_item then goto has_match end end diff --git a/cybersyn/scripts/gui/manager.lua b/cybersyn/scripts/gui/manager.lua index 3acafd1..70d3320 100644 --- a/cybersyn/scripts/gui/manager.lua +++ b/cybersyn/scripts/gui/manager.lua @@ -71,12 +71,7 @@ function manager.create(player) }, --item search box commented out. It *works*, but, the filtering logic only checks delivieres, so I'm not sure what Mami intended it for, so I'm leaving it off for now... { type = "label", style = "subheader_caption_label", caption = { "cybersyn-gui.search-item-label" } }, - { - name = "manager_item_search_field", - type = "textfield", - clear_and_focus_on_right_click = true, - handler = manager.handle.manager_update_item_search, --on_gui_text_changed - }, + { type= "choose-elem-button", name="manager_item_filter", style="slot_button_in_shallow_frame", elem_type="signal", handler=manager.handle.manager_update_item_search, }, { type = "empty-widget", style = "flib_horizontal_pusher" }, { type = "label", style = "caption_label", caption = { "cybersyn-gui.network-name-label" } }, { type= "choose-elem-button", name="network", style="slot_button_in_shallow_frame", elem_type="signal", tooltip={"cybersyn-gui.network-tooltip"}, handler=manager.handle.manager_update_network_name, }, @@ -273,14 +268,13 @@ end --- @param refs table --- @param e GuiEventData function manager.handle.manager_update_item_search(player, player_data, refs, e) - local query = e.element.text - if query then - -- Input sanitization - for pattern, replacement in pairs(constants.input_sanitizers) do - query = string.gsub(query, pattern, replacement) - end + local element = e.element + local signal = element.elem_value + if signal then + player_data.search_item = signal.name + else + player_data.search_item = nil end - player_data.search_item = query end diff --git a/cybersyn/scripts/gui/stations.lua b/cybersyn/scripts/gui/stations.lua index cf29242..c8ee7c7 100644 --- a/cybersyn/scripts/gui/stations.lua +++ b/cybersyn/scripts/gui/stations.lua @@ -135,7 +135,7 @@ function stations_tab.build(map_data, player_data, query_limit) for _, signal_ID in pairs(comb1_signals) do local item = signal_ID.signal.name if item then - if string.match(item, search_item) then + if item == search_item then goto has_match end end