From 0cfb9835061e5449bb5c2b79636c0fdd1ebdca10 Mon Sep 17 00:00:00 2001 From: masterdraco Date: Tue, 29 Sep 2026 17:40:35 +0200 Subject: [PATCH] =?UTF-8?q?refactor(gui):=20r=C3=A6kker=20kan=20klones=20i?= =?UTF-8?q?nd=20i=20et=20andet=20layout=20(redigeringsvindue)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FS25_ADSmartPickup/gui/SmartPickupFlowTab.lua | 7 ++-- FS25_ADSmartPickup/gui/SmartPickupFrame.lua | 32 ++++++++++++++++--- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/FS25_ADSmartPickup/gui/SmartPickupFlowTab.lua b/FS25_ADSmartPickup/gui/SmartPickupFlowTab.lua index 9f7e93f..112a807 100644 --- a/FS25_ADSmartPickup/gui/SmartPickupFlowTab.lua +++ b/FS25_ADSmartPickup/gui/SmartPickupFlowTab.lua @@ -80,8 +80,11 @@ function SmartPickupFrame:makeRowClickable(row, action) row.mouseEvent = function(element, posX, posY, isDown, isUp, button, eventUsed) local used = baseMouseEvent(element, posX, posY, isDown, isUp, button, eventUsed) -- også inden for listens synlige udsnit: rækker scrollet ud af syne må ikke fange klik - if not used and not eventUsed and isUp and button == MOUSE_LEFT and (element.getIsVisible == nil or element:getIsVisible()) - and isInside(element, posX, posY) and isInside(frame.boxLayout, posX, posY) then + -- klik tæller inde i rækkens eget layout (listen eller redigeringsvinduet); listen er død mens vinduet er åbent + local layout = element.spuLayout or frame.boxLayout + local blockedByPanel = frame.editPanelOpen and layout == frame.boxLayout + if not used and not eventUsed and not blockedByPanel and isUp and button == MOUSE_LEFT and (element.getIsVisible == nil or element:getIsVisible()) + and isInside(element, posX, posY) and isInside(layout, posX, posY) then frame.pendingClick = action return true end diff --git a/FS25_ADSmartPickup/gui/SmartPickupFrame.lua b/FS25_ADSmartPickup/gui/SmartPickupFrame.lua index 6d23e1a..5c6b293 100644 --- a/FS25_ADSmartPickup/gui/SmartPickupFrame.lua +++ b/FS25_ADSmartPickup/gui/SmartPickupFrame.lua @@ -36,6 +36,7 @@ function SmartPickupFrame.new(i18n, getAdEnv) self.runIds, self.targetIds, self.poolGroups = {}, {}, {} self.rowData = {} -- element -> {kind = "ingredient"|"vehicle", ...} self.clonedRows = {} + self.panelRows = {} self.refreshTimer = 0 self.statusOverride = nil self.statusRow = nil -- Text-elementet i den klonede statusrække @@ -346,9 +347,11 @@ function SmartPickupFrame:addToggleRow(kind, title, texts, isOn) end function SmartPickupFrame:addRow(prefab, data) - local row = prefab:clone(self.boxLayout) + local layout = self.rowTarget or self.boxLayout + local row = prefab:clone(layout) + row.spuLayout = layout FocusManager:loadElementFromCustomValues(row) - table.insert(self.clonedRows, row) + table.insert(layout == self.boxLayout and self.clonedRows or self.panelRows, row) local option = row:getDescendantByName("option") if option ~= nil then option:setTexts({self.i18n:getText("ui_no"), self.i18n:getText("ui_yes")}) @@ -357,6 +360,23 @@ function SmartPickupFrame:addRow(prefab, data) return row end +-- Rækker klonet ind i et andet layout (redigeringsvinduet) mens fn kører. +function SmartPickupFrame:withRowTarget(layout, fn) + local previous = self.rowTarget + self.rowTarget = layout + local ok, err = pcall(fn, self) + self.rowTarget = previous + if not ok then error(err, 0) end +end + +function SmartPickupFrame:clearPanelRows() + for _, row in ipairs(self.panelRows or {}) do + FocusManager:removeElement(row) + row:delete() + end + self.panelRows = {} +end + -- Tekstrække uden valgmuligheder: sektionstitler, Wait-pulje-linjer og statuslinjen. -- Tegn pr. tekstrække før teksten ombrydes (rækken afkorter med "..." ved ca. 70 tegn). SmartPickupFrame.TEXT_ROW_CHARS = 66 @@ -375,13 +395,17 @@ end -- AutoDrive farver hver række i onCreate; her sker det efter hver genopbygning, -- fordi rækkerne først findes på det tidspunkt. function SmartPickupFrame:colorRows() + self:colorLayout(self.boxLayout) +end + +function SmartPickupFrame:colorLayout(layout) local colors = InGameMenuSettingsFrame ~= nil and InGameMenuSettingsFrame.COLOR_ALTERNATING or nil - if colors == nil or self.boxLayout == nil then + if colors == nil or layout == nil then return end local unpackFn = table.unpack or unpack local isEvenRow = false - for _, element in ipairs(self.boxLayout.elements) do + for _, element in ipairs(layout.elements) do if element.setImageColor ~= nil and colors[isEvenRow] ~= nil then element:setImageColor(nil, unpackFn(colors[isEvenRow])) end