feat: overblik øverst i fanen — pr. run: status, hver traktors aktivitet (kører med læs/tom mod silo/venter), målets niveauer (v1.10.0.0)
This commit is contained in:
@@ -176,6 +176,7 @@ function SmartPickupFrame:clearRows()
|
||||
self.clonedRows, self.rowData = {}, {}
|
||||
self.statusRow = nil
|
||||
self.needsRow = nil
|
||||
self.overviewRows = {}
|
||||
end
|
||||
|
||||
function SmartPickupFrame:addRow(prefab, data)
|
||||
@@ -221,6 +222,9 @@ function SmartPickupFrame:rebuild()
|
||||
self.selectedRunId = store.runs[1] ~= nil and store.runs[1].id or nil
|
||||
end
|
||||
self:clearRows()
|
||||
if adEnv ~= nil then
|
||||
self:fillOverviewRows(adEnv)
|
||||
end
|
||||
self:fillRunOption(adEnv)
|
||||
local run = self:getRun()
|
||||
local hasRun = run ~= nil and adEnv ~= nil
|
||||
@@ -396,44 +400,104 @@ function SmartPickupFrame:syncOptionsFromModel(adEnv, run)
|
||||
sync(self.loopsOption, run.loops + 1)
|
||||
end
|
||||
|
||||
-- "Hentes (mest trængende først): Forage 0/33.750 l · Silage 0/33.750 l · Straw 21.375/21.375 l"
|
||||
function SmartPickupFrame:describeNeeds(adEnv, run)
|
||||
local farmId = g_currentMission:getFarmId()
|
||||
local target = run.targetWayPointId ~= nil and ADSmartPickup.getUnloadStationAtWayPointId(adEnv, run.targetWayPointId, farmId) or nil
|
||||
if target == nil then
|
||||
return self.i18n:getText("spu_needs_noTarget")
|
||||
end
|
||||
local fillTypes = {}
|
||||
if run.ingredientMode == "manual" then
|
||||
for _, name in ipairs(run.ingredients) do
|
||||
local index = g_fillTypeManager:getFillTypeIndexByName(name)
|
||||
if index ~= nil then table.insert(fillTypes, index) end
|
||||
end
|
||||
else
|
||||
for _, fillType in ipairs(ADRunsController.getTargetAcceptedFillTypes(adEnv, run)) do
|
||||
table.insert(fillTypes, fillType.index)
|
||||
end
|
||||
end
|
||||
local needs = {}
|
||||
for _, fillType in ipairs(fillTypes) do
|
||||
local level, capacity = ADSmartPickup.getStationLevelAndCapacity(target, fillType, farmId)
|
||||
if level ~= nil then
|
||||
table.insert(needs, {fillType = fillType, level = level, capacity = capacity, free = capacity - level})
|
||||
end
|
||||
end
|
||||
table.sort(needs, function(a, b)
|
||||
if a.free ~= b.free then return a.free > b.free end
|
||||
return a.fillType < b.fillType
|
||||
end)
|
||||
-- "Silage 0/33.750 l · Straw 21.375/21.375 l" — mest trængende først.
|
||||
function SmartPickupFrame:formatLevels(levels)
|
||||
local parts = {}
|
||||
for _, need in ipairs(needs) do
|
||||
for _, need in ipairs(levels) do
|
||||
local title = g_fillTypeManager.getFillTypeTitleByIndex ~= nil and g_fillTypeManager:getFillTypeTitleByIndex(need.fillType) or g_fillTypeManager:getFillTypeNameByIndex(need.fillType)
|
||||
table.insert(parts, string.format("%s %s/%s l", tostring(title), g_i18n:formatNumber(need.level, 0), g_i18n:formatNumber(need.capacity, 0)))
|
||||
end
|
||||
if #parts == 0 then
|
||||
return table.concat(parts, " · ")
|
||||
end
|
||||
|
||||
function SmartPickupFrame:describeNeeds(adEnv, run)
|
||||
if run.targetWayPointId == nil then
|
||||
return self.i18n:getText("spu_needs_noTarget")
|
||||
end
|
||||
local levels = ADRunsController.getTargetLevels(adEnv, run)
|
||||
if #levels == 0 then
|
||||
return self.i18n:getText("spu_needs_none")
|
||||
end
|
||||
return string.format(self.i18n:getText("spu_needs"), table.concat(parts, " · "))
|
||||
return string.format(self.i18n:getText("spu_needs"), self:formatLevels(levels))
|
||||
end
|
||||
|
||||
-- ---- overblik (øverst): ét afsnit pr. run — status, traktorernes aktivitet, målets niveauer ----
|
||||
|
||||
function SmartPickupFrame:describeActivity(adEnv, vehicle)
|
||||
local activity = ADRunsController.getVehicleActivity(adEnv, vehicle)
|
||||
local label = ADRunsController.getVehicleLabel(adEnv, vehicle)
|
||||
local fillTypeName = activity.fillType ~= nil and (g_fillTypeManager.getFillTypeTitleByIndex ~= nil and g_fillTypeManager:getFillTypeTitleByIndex(activity.fillType) or g_fillTypeManager:getFillTypeNameByIndex(activity.fillType)) or "?"
|
||||
local place = tostring(activity.place or "?")
|
||||
if activity.kind == "stopped" then
|
||||
return string.format("%s: %s", label, self.i18n:getText("spu_activity_stopped"))
|
||||
elseif activity.kind == "waiting" then
|
||||
return string.format("%s: %s", label, string.format(self.i18n:getText("spu_activity_waiting"), place, g_i18n:formatNumber(activity.liters or 0, 0), fillTypeName))
|
||||
elseif activity.kind == "loaded" then
|
||||
return string.format("%s: %s", label, string.format(self.i18n:getText("spu_activity_loaded"), g_i18n:formatNumber(activity.liters or 0, 0), fillTypeName, place))
|
||||
end
|
||||
if activity.fillType ~= nil then
|
||||
return string.format("%s: %s", label, string.format(self.i18n:getText("spu_activity_empty"), place, fillTypeName))
|
||||
end
|
||||
return string.format("%s: %s", label, string.format(self.i18n:getText("spu_activity_driving"), place))
|
||||
end
|
||||
|
||||
-- Rækkerne klones bagest og flyttes derefter forrest i layoutet.
|
||||
function SmartPickupFrame:fillOverviewRows(adEnv)
|
||||
local rows = {}
|
||||
local function add(text)
|
||||
local title = self:addTextRow(text)
|
||||
table.insert(rows, title.parent)
|
||||
return title
|
||||
end
|
||||
add(self.i18n:getText("spu_overview"))
|
||||
local targetMarkerName = function(run)
|
||||
local marker = run.targetWayPointId ~= nil and adEnv.ADGraphManager:getMapMarkerByWayPointId(run.targetWayPointId) or nil
|
||||
return marker ~= nil and tostring(marker.name) or self.i18n:getText("spu_noTarget")
|
||||
end
|
||||
self.overviewRows = {}
|
||||
for _, run in ipairs(ADRunsController.store.runs) do
|
||||
local status = ADRunsController.getRunStatus(adEnv, run)
|
||||
local statusText = status.running > 0 and string.format(self.i18n:getText("spu_status_running"), status.running, status.total)
|
||||
or string.format(self.i18n:getText("spu_status_stopped"), status.total)
|
||||
local header = add(string.format("%s — %s", run.name, statusText))
|
||||
local entry = {run = run, header = header, vehicles = {}, target = nil}
|
||||
for _, vehicleId in ipairs(run.vehicleIds) do
|
||||
local vehicle = ADRunsController.findVehicleById(adEnv, vehicleId)
|
||||
if vehicle ~= nil then
|
||||
table.insert(entry.vehicles, {vehicle = vehicle, title = add(" " .. self:describeActivity(adEnv, vehicle))})
|
||||
end
|
||||
end
|
||||
entry.target = add(string.format(" %s: %s", targetMarkerName(run), self:formatLevels(ADRunsController.getTargetLevels(adEnv, run))))
|
||||
table.insert(self.overviewRows, entry)
|
||||
end
|
||||
-- forrest i layoutet: fjern de klonede rækker bagfra og sæt dem ind i rækkefølge først
|
||||
local elements = self.boxLayout.elements
|
||||
for index = #rows, 1, -1 do
|
||||
for position = #elements, 1, -1 do
|
||||
if elements[position] == rows[index] then
|
||||
table.remove(elements, position)
|
||||
break
|
||||
end
|
||||
end
|
||||
table.insert(elements, 1, rows[index])
|
||||
end
|
||||
end
|
||||
|
||||
-- Opdateres hvert sekund uden genopbygning (kun tekster).
|
||||
function SmartPickupFrame:refreshOverview(adEnv)
|
||||
for _, entry in ipairs(self.overviewRows or {}) do
|
||||
local status = ADRunsController.getRunStatus(adEnv, entry.run)
|
||||
local statusText = status.running > 0 and string.format(self.i18n:getText("spu_status_running"), status.running, status.total)
|
||||
or string.format(self.i18n:getText("spu_status_stopped"), status.total)
|
||||
entry.header:setText(string.format("%s — %s", entry.run.name, statusText))
|
||||
for _, item in ipairs(entry.vehicles) do
|
||||
item.title:setText(" " .. self:describeActivity(adEnv, item.vehicle))
|
||||
end
|
||||
if entry.target ~= nil then
|
||||
local marker = entry.run.targetWayPointId ~= nil and adEnv.ADGraphManager:getMapMarkerByWayPointId(entry.run.targetWayPointId) or nil
|
||||
entry.target:setText(string.format(" %s: %s", marker ~= nil and tostring(marker.name) or self.i18n:getText("spu_noTarget"), self:formatLevels(ADRunsController.getTargetLevels(adEnv, entry.run))))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function SmartPickupFrame:fillPoolRows(adEnv)
|
||||
@@ -477,6 +541,7 @@ function SmartPickupFrame:refreshLive()
|
||||
self:setStatusText(self.i18n:getText("spu_status_noAd"))
|
||||
return
|
||||
end
|
||||
self:refreshOverview(adEnv)
|
||||
local isRunning = false
|
||||
if run ~= nil then
|
||||
self:syncOptionsFromModel(adEnv, run)
|
||||
|
||||
Reference in New Issue
Block a user