Skip to content

Commit 3cc5e14

Browse files
committed
Fixes: validate min/max in logistic sections, better error messages, restrict non-combinator section editing to items, and allow negative numbers for constant combinators
1 parent 136a82b commit 3cc5e14

5 files changed

Lines changed: 54 additions & 19 deletions

File tree

locale/en/ui-menu.cfg

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,9 @@ logistics-deleted=Request deleted
132132
logistics-add-request=Add Request
133133
logistics-request-added=Request added: __1__
134134
logistics-invalid-number=Invalid number
135+
logistics-value-cannot-be-negative=Value cannot be negative
136+
logistics-max-must-be-at-least-min=Max must be at least __1__
137+
logistics-min-must-be-at-most-max=Min must be at most __1__
135138
infinity=Infinity
136139

137140
# Logistics overview

scripts/circuit-network.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,7 @@ function mod.constant_combinator_signals_info(entity, pindex)
510510
for _, signal_info in ipairs(all_signals) do
511511
msg:list_item()
512512
msg:fragment(mod.localise_signal(signal_info.signal))
513-
if signal_info.count > 0 then
513+
if signal_info.count ~= 0 then
514514
msg:fragment("x")
515515
msg:fragment(tostring(signal_info.count))
516516
end

scripts/ui/constant-combinator.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ local function render_overview(ctx)
5858
for _, signal_info in ipairs(all_signals) do
5959
ctx.message:list_item()
6060
ctx.message:fragment(CircuitNetwork.localise_signal(signal_info.signal))
61-
if signal_info.count > 0 then
61+
if signal_info.count ~= 0 then
6262
ctx.message:fragment("x")
6363
ctx.message:fragment(tostring(signal_info.count))
6464
end

scripts/ui/tabs/logistics-section-editor.lua

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ local function render_section(ctx, point_index, section_index)
4343

4444
local menu = Menu.MenuBuilder.new()
4545

46+
-- Detect if this is a constant combinator to determine signal mode
47+
local is_combinator = entity.type == "constant-combinator"
48+
local signal_mode = is_combinator and "all" or "item"
49+
4650
-- Add rows for each existing filter/request
4751
for i = 1, section.filters_count do
4852
local slot = section.get_slot(i)
@@ -70,7 +74,7 @@ local function render_section(ctx, point_index, section_index)
7074
on_click = function(ctx)
7175
ctx.controller:open_child_ui(
7276
Router.UI_NAMES.SIGNAL_CHOOSER,
73-
{},
77+
{ mode = signal_mode },
7478
{ node = row_key .. "_overview", slot_index = i }
7579
)
7680
end,
@@ -110,18 +114,26 @@ local function render_section(ctx, point_index, section_index)
110114
end,
111115
on_child_result = function(ctx, result)
112116
local num = tonumber(result)
113-
if num and num >= 0 then
117+
if not num then
118+
UiSounds.play_ui_edge(ctx.pindex)
119+
ctx.controller.message:fragment({ "fa.logistics-invalid-number" })
120+
elseif not is_combinator and num < 0 then
121+
UiSounds.play_ui_edge(ctx.pindex)
122+
ctx.controller.message:fragment({ "fa.logistics-value-cannot-be-negative" })
123+
else
114124
local section = provider.get_section(section_index)
115125
if not section then return end
116126

117127
local slot = section.get_slot(i)
118-
slot.min = math.floor(num)
119-
section.set_slot(i, slot)
128+
if slot.max and num > slot.max then
129+
UiSounds.play_ui_edge(ctx.pindex)
130+
ctx.controller.message:fragment({ "fa.logistics-min-must-be-at-most-max", tostring(slot.max) })
131+
else
132+
slot.min = math.floor(num)
133+
section.set_slot(i, slot)
120134

121-
ctx.controller.message:fragment(tostring(math.floor(num)))
122-
else
123-
UiSounds.play_ui_edge(ctx.pindex)
124-
ctx.controller.message:fragment({ "fa.logistics-invalid-number" })
135+
ctx.controller.message:fragment(tostring(math.floor(num)))
136+
end
125137
end
126138
end,
127139
on_clear = function(ctx)
@@ -167,18 +179,27 @@ local function render_section(ctx, point_index, section_index)
167179
ctx.controller.message:fragment({ "fa.infinity" })
168180
else
169181
local num = tonumber(result)
170-
if num and num >= 0 then
182+
if not num then
183+
UiSounds.play_ui_edge(ctx.pindex)
184+
ctx.controller.message:fragment({ "fa.logistics-invalid-number" })
185+
elseif num < 0 then
186+
UiSounds.play_ui_edge(ctx.pindex)
187+
ctx.controller.message:fragment({ "fa.logistics-value-cannot-be-negative" })
188+
else
171189
local section = provider.get_section(section_index)
172190
if not section then return end
173191

174192
local slot = section.get_slot(i)
175-
slot.max = math.floor(num)
176-
section.set_slot(i, slot)
177-
178-
ctx.controller.message:fragment(tostring(math.floor(num)))
179-
else
180-
UiSounds.play_ui_edge(ctx.pindex)
181-
ctx.controller.message:fragment({ "fa.logistics-invalid-number" })
193+
local min_val = slot.min or 0
194+
if num < min_val then
195+
UiSounds.play_ui_edge(ctx.pindex)
196+
ctx.controller.message:fragment({ "fa.logistics-max-must-be-at-least-min", tostring(min_val) })
197+
else
198+
slot.max = math.floor(num)
199+
section.set_slot(i, slot)
200+
201+
ctx.controller.message:fragment(tostring(math.floor(num)))
202+
end
182203
end
183204
end
184205
end,
@@ -220,7 +241,7 @@ local function render_section(ctx, point_index, section_index)
220241
ctx.message:fragment({ "fa.logistics-add-request" })
221242
end,
222243
on_click = function(ctx)
223-
ctx.controller:open_child_ui(Router.UI_NAMES.SIGNAL_CHOOSER, {}, { node = "add_filter" })
244+
ctx.controller:open_child_ui(Router.UI_NAMES.SIGNAL_CHOOSER, { mode = signal_mode }, { node = "add_filter" })
224245
end,
225246
on_child_result = function(ctx, result)
226247
if result then

scripts/ui/tabs/signal-chooser.lua

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,18 @@ local mod = {}
99
---@param ctx fa.ui.graph.Ctx
1010
local function build_signal_tree(ctx)
1111
local builder = TreeChooser.TreeChooserBuilder.new()
12+
local mode = ctx.global_parameters and ctx.global_parameters.mode
1213

14+
-- If mode is "item" or "fluid", add signals directly to root without category wrapper
15+
if mode == "item" then
16+
SignalHelpers.add_item_signals(builder, TreeChooser.ROOT, false, nil)
17+
return builder:build()
18+
elseif mode == "fluid" then
19+
SignalHelpers.add_fluid_signals(builder, TreeChooser.ROOT)
20+
return builder:build()
21+
end
22+
23+
-- Default mode: show all signal types with categories
1324
-- Top-level signal type categories
1425
local signal_types = {
1526
{

0 commit comments

Comments
 (0)