fix: Smart Pickup-fane — synkron genopbygning ved run-/målskift (update() kaldes ikke i ESC-menuen), vogn + 'kan bære' vises for alle traktorer (v1.9.3.0)

This commit is contained in:
2026-09-23 00:25:33 +02:00
parent 3c22eae0eb
commit f60f27340b
4 changed files with 49 additions and 16 deletions
+46 -15
View File
@@ -147,6 +147,14 @@ function SmartPickupFrame:setStatusText(text)
end end
end end
-- ESC-menuen kalder ikke altid update() på siden, så genopbygningen sker straks. De
-- elementer der udløser den (Run/Mål/Varer-tilstand, knapperne) er statiske og slettes
-- ikke af rebuild, så det er sikkert; pendingRebuild er kun bagstopper.
function SmartPickupFrame:requestRebuild()
self.pendingRebuild = false
self:safe(self.rebuild)
end
function SmartPickupFrame:getRun() function SmartPickupFrame:getRun()
return self.selectedRunId ~= nil and ADRuns.getRun(ADRunsController.store, self.selectedRunId) or nil return self.selectedRunId ~= nil and ADRuns.getRun(ADRunsController.store, self.selectedRunId) or nil
end end
@@ -314,16 +322,18 @@ function SmartPickupFrame:fillVehicleRows(adEnv, run)
end end
-- "Fastrac 2135 4WS (#1) — 1.000.000 l — ✔" / "… — ✖ ingen vogn"; reservationsnote fra Start bevares. -- "Fastrac 2135 4WS (#1) — 1.000.000 l — ✔" / "… — ✖ ingen vogn"; reservationsnote fra Start bevares.
-- "Fastrac 2135 4WS (#1) — 1.000.000 l — kan bære: Halm, TMR — ✔" / "… — ✖ ingen vogn".
-- Vises for ALLE traktorer, så man kan se om vognen passer, før man siger Ja.
function SmartPickupFrame:describeVehicle(adEnv, run, vehicle, isInRun) function SmartPickupFrame:describeVehicle(adEnv, run, vehicle, isInRun)
local label = ADRunsController.getVehicleLabel(adEnv, vehicle) local label = ADRunsController.getVehicleLabel(adEnv, vehicle)
if not isInRun then
return label
end
local validation = ADRunsController.validateVehicle(adEnv, run, vehicle) local validation = ADRunsController.validateVehicle(adEnv, run, vehicle)
local capacity = validation.capacity ~= nil and string.format(self.i18n:getText("spu_capacity"), g_i18n:formatNumber(validation.capacity, 0)) or nil
local parts = {label} local parts = {label}
if capacity ~= nil then if validation.capacity ~= nil then
table.insert(parts, capacity) table.insert(parts, string.format(self.i18n:getText("spu_capacity"), g_i18n:formatNumber(validation.capacity, 0)))
local carriable = self:describeCarriable(adEnv, run, vehicle, validation.carriable)
if carriable ~= nil then
table.insert(parts, carriable)
end
end end
if validation.ok then if validation.ok then
table.insert(parts, "✔") table.insert(parts, "✔")
@@ -333,6 +343,25 @@ function SmartPickupFrame:describeVehicle(adEnv, run, vehicle, isInRun)
return table.concat(parts, " — ") return table.concat(parts, " — ")
end end
-- Hvilke af run'ets varer vognen kan bære (titler); nil når ingen.
function SmartPickupFrame:describeCarriable(adEnv, run, vehicle, carriable)
local canCarry = {}
for _, fillType in ipairs(carriable or {}) do
canCarry[fillType] = true
end
local titles = {}
for _, fillType in ipairs(ADRunsController.getRunIngredients(adEnv, run, vehicle)) do
if canCarry[fillType] then
local title = g_fillTypeManager.getFillTypeTitleByIndex ~= nil and g_fillTypeManager:getFillTypeTitleByIndex(fillType) or nil
table.insert(titles, tostring(title or g_fillTypeManager:getFillTypeNameByIndex(fillType)))
end
end
if #titles == 0 then
return nil
end
return string.format(self.i18n:getText("spu_canCarry"), table.concat(titles, ", "))
end
function SmartPickupFrame:fillPoolRows(adEnv) function SmartPickupFrame:fillPoolRows(adEnv)
if adEnv == nil then if adEnv == nil then
return return
@@ -382,8 +411,10 @@ function SmartPickupFrame:refreshLive()
or string.format(self.i18n:getText("spu_status_stopped"), status.total) or string.format(self.i18n:getText("spu_status_stopped"), status.total)
self:setStatusText(self.statusOverride or text) self:setStatusText(self.statusOverride or text)
for option, data in pairs(self.rowData) do for option, data in pairs(self.rowData) do
if data.kind == "vehicle" and data.row ~= nil then -- kun run'ets egne traktorer opdateres live (alle valideres ved rebuild)
data.row:getDescendantByName("title"):setText(self:describeVehicle(adEnv, run, data.vehicle, SmartPickupFrame.getOptionState(option) == SmartPickupFrame.STATE_ON)) local isInRun = SmartPickupFrame.getOptionState(option) == SmartPickupFrame.STATE_ON
if data.kind == "vehicle" and data.row ~= nil and isInRun then
data.row:getDescendantByName("title"):setText(self:describeVehicle(adEnv, run, data.vehicle, true))
end end
end end
else else
@@ -404,7 +435,7 @@ end
function SmartPickupFrame:onClickRun(state) function SmartPickupFrame:onClickRun(state)
self.selectedRunId = self.runIds[state] self.selectedRunId = self.runIds[state]
self.statusOverride = nil self.statusOverride = nil
self.pendingRebuild = true self:requestRebuild()
end end
function SmartPickupFrame:onClickTarget(state) function SmartPickupFrame:onClickTarget(state)
@@ -413,7 +444,7 @@ function SmartPickupFrame:onClickTarget(state)
if run == nil then return end if run == nil then return end
-- targetIds[1] er false = "(vælg mål)"; modellen tolker false som "ryd målet" -- targetIds[1] er false = "(vælg mål)"; modellen tolker false som "ryd målet"
ADRunsController.updateRun(run.id, {targetWayPointId = frame.targetIds[state] or false}) ADRunsController.updateRun(run.id, {targetWayPointId = frame.targetIds[state] or false})
frame.pendingRebuild = true frame:requestRebuild()
end) end)
end end
@@ -422,7 +453,7 @@ function SmartPickupFrame:onClickIngredientMode(state)
local run = frame:getRun() local run = frame:getRun()
if run == nil then return end if run == nil then return end
ADRunsController.updateRun(run.id, {ingredientMode = state == SmartPickupFrame.STATE_ON and "manual" or "auto"}) ADRunsController.updateRun(run.id, {ingredientMode = state == SmartPickupFrame.STATE_ON and "manual" or "auto"})
frame.pendingRebuild = true frame:requestRebuild()
end) end)
end end
@@ -491,7 +522,7 @@ function SmartPickupFrame:onClickStartStop()
frame.statusOverride = string.format(frame.i18n:getText("spu_status_started"), started, skipped) frame.statusOverride = string.format(frame.i18n:getText("spu_status_started"), started, skipped)
end end
ADRunsController.save() ADRunsController.save()
frame.pendingRebuild = true frame:requestRebuild()
end) end)
end end
@@ -501,7 +532,7 @@ function SmartPickupFrame:onClickNew()
local run = ADRunsController.createRun(string.format(frame.i18n:getText("spu_newRunName"), ADRunsController.store.nextId)) local run = ADRunsController.createRun(string.format(frame.i18n:getText("spu_newRunName"), ADRunsController.store.nextId))
frame.selectedRunId = run.id frame.selectedRunId = run.id
frame.statusOverride = nil frame.statusOverride = nil
frame.pendingRebuild = true frame:requestRebuild()
end) end)
end end
@@ -520,7 +551,7 @@ function SmartPickupFrame:onRenameResult(value, clickOk)
local run = frame:getRun() local run = frame:getRun()
if clickOk and run ~= nil and value ~= nil and value:match("%S") then if clickOk and run ~= nil and value ~= nil and value:match("%S") then
ADRunsController.updateRun(run.id, {name = value}) ADRunsController.updateRun(run.id, {name = value})
frame.pendingRebuild = true frame:requestRebuild()
end end
end) end)
end end
@@ -540,7 +571,7 @@ function SmartPickupFrame:onDeleteResult(yes)
if yes and run ~= nil then if yes and run ~= nil then
ADRunsController.deleteRun(run.id) ADRunsController.deleteRun(run.id)
frame.selectedRunId = nil frame.selectedRunId = nil
frame.pendingRebuild = true frame:requestRebuild()
end end
end) end)
end end
+1
View File
@@ -42,5 +42,6 @@
<text name="spu_renameTitle" text="Navn på run"/> <text name="spu_renameTitle" text="Navn på run"/>
<text name="spu_deleteConfirm" text="Slet run '%s'? Traktorerne stoppes ikke."/> <text name="spu_deleteConfirm" text="Slet run '%s'? Traktorerne stoppes ikke."/>
<text name="spu_capacity" text="%s l"/> <text name="spu_capacity" text="%s l"/>
<text name="spu_canCarry" text="kan bære: %s"/>
</texts> </texts>
</l10n> </l10n>
+1
View File
@@ -42,5 +42,6 @@
<text name="spu_renameTitle" text="Run name"/> <text name="spu_renameTitle" text="Run name"/>
<text name="spu_deleteConfirm" text="Delete run '%s'? Tractors are not stopped."/> <text name="spu_deleteConfirm" text="Delete run '%s'? Tractors are not stopped."/>
<text name="spu_capacity" text="%s l"/> <text name="spu_capacity" text="%s l"/>
<text name="spu_canCarry" text="can carry: %s"/>
</texts> </texts>
</l10n> </l10n>
+1 -1
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?> <?xml version="1.0" encoding="utf-8" standalone="no"?>
<modDesc descVersion="107"> <modDesc descVersion="107">
<author>masterdraco</author> <author>masterdraco</author>
<version>1.9.2.0</version> <version>1.9.3.0</version>
<title> <title>
<en>AD Smart Pickup</en> <en>AD Smart Pickup</en>
</title> </title>