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
-- 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()
return self.selectedRunId ~= nil and ADRuns.getRun(ADRunsController.store, self.selectedRunId) or nil
end
@@ -314,16 +322,18 @@ function SmartPickupFrame:fillVehicleRows(adEnv, run)
end
-- "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)
local label = ADRunsController.getVehicleLabel(adEnv, vehicle)
if not isInRun then
return label
end
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}
if capacity ~= nil then
table.insert(parts, capacity)
if validation.capacity ~= nil then
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
if validation.ok then
table.insert(parts, "✔")
@@ -333,6 +343,25 @@ function SmartPickupFrame:describeVehicle(adEnv, run, vehicle, isInRun)
return table.concat(parts, " — ")
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)
if adEnv == nil then
return
@@ -382,8 +411,10 @@ function SmartPickupFrame:refreshLive()
or string.format(self.i18n:getText("spu_status_stopped"), status.total)
self:setStatusText(self.statusOverride or text)
for option, data in pairs(self.rowData) do
if data.kind == "vehicle" and data.row ~= nil then
data.row:getDescendantByName("title"):setText(self:describeVehicle(adEnv, run, data.vehicle, SmartPickupFrame.getOptionState(option) == SmartPickupFrame.STATE_ON))
-- kun run'ets egne traktorer opdateres live (alle valideres ved rebuild)
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
else
@@ -404,7 +435,7 @@ end
function SmartPickupFrame:onClickRun(state)
self.selectedRunId = self.runIds[state]
self.statusOverride = nil
self.pendingRebuild = true
self:requestRebuild()
end
function SmartPickupFrame:onClickTarget(state)
@@ -413,7 +444,7 @@ function SmartPickupFrame:onClickTarget(state)
if run == nil then return end
-- 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})
frame.pendingRebuild = true
frame:requestRebuild()
end)
end
@@ -422,7 +453,7 @@ function SmartPickupFrame:onClickIngredientMode(state)
local run = frame:getRun()
if run == nil then return end
ADRunsController.updateRun(run.id, {ingredientMode = state == SmartPickupFrame.STATE_ON and "manual" or "auto"})
frame.pendingRebuild = true
frame:requestRebuild()
end)
end
@@ -491,7 +522,7 @@ function SmartPickupFrame:onClickStartStop()
frame.statusOverride = string.format(frame.i18n:getText("spu_status_started"), started, skipped)
end
ADRunsController.save()
frame.pendingRebuild = true
frame:requestRebuild()
end)
end
@@ -501,7 +532,7 @@ function SmartPickupFrame:onClickNew()
local run = ADRunsController.createRun(string.format(frame.i18n:getText("spu_newRunName"), ADRunsController.store.nextId))
frame.selectedRunId = run.id
frame.statusOverride = nil
frame.pendingRebuild = true
frame:requestRebuild()
end)
end
@@ -520,7 +551,7 @@ function SmartPickupFrame:onRenameResult(value, clickOk)
local run = frame:getRun()
if clickOk and run ~= nil and value ~= nil and value:match("%S") then
ADRunsController.updateRun(run.id, {name = value})
frame.pendingRebuild = true
frame:requestRebuild()
end
end)
end
@@ -540,7 +571,7 @@ function SmartPickupFrame:onDeleteResult(yes)
if yes and run ~= nil then
ADRunsController.deleteRun(run.id)
frame.selectedRunId = nil
frame.pendingRebuild = true
frame:requestRebuild()
end
end)
end