diff --git a/FS25_ADSmartPickup/adSmartPickup.lua b/FS25_ADSmartPickup/adSmartPickup.lua index 48915b7..33e381c 100644 --- a/FS25_ADSmartPickup/adSmartPickup.lua +++ b/FS25_ADSmartPickup/adSmartPickup.lua @@ -31,6 +31,7 @@ if ADSmartPickup.dir ~= nil and source ~= nil then source(ADSmartPickup.dir .. "gui/SmartPickupGuide.lua") source(ADSmartPickup.dir .. "gui/SmartPickupFieldGuide.lua") source(ADSmartPickup.dir .. "gui/SmartPickupFlowGuide.lua") + source(ADSmartPickup.dir .. "gui/SmartPickupEditPanel.lua") end -- Markøren er dér hvor trækkerens næse stopper; læssetriggeren ligger et diff --git a/FS25_ADSmartPickup/gui/SmartPickupEditPanel.lua b/FS25_ADSmartPickup/gui/SmartPickupEditPanel.lua new file mode 100644 index 0000000..4453530 --- /dev/null +++ b/FS25_ADSmartPickup/gui/SmartPickupEditPanel.lua @@ -0,0 +1,149 @@ +-- Smart Pickup — redigeringsvindue (v1.58) +-- Klik på en række i Flows/Fields åbner et panel oven på listen. Indholdet tegnes af den eksisterende +-- resumé-/guide-kode i vinduets egen ScrollingLayout (SmartPickupFrame:withRowTarget). Knapper i bunden via +-- menuButtonInfo: Luk (MENU_BACK = ESC), Start/Stop, Slet. Hver art registrerer sig i EDIT_PANEL_KINDS[kind] = +-- {title, exists, fill, status, startStop, startStopText, canDelete, delete} (se Flows-/Fields-fanen). +-- Funktionerne lægges på SmartPickupFrame (indlæses efter SmartPickupFrame.lua). + +SmartPickupFrame.EDIT_PANEL_KINDS = SmartPickupFrame.EDIT_PANEL_KINDS or {} +SmartPickupFrame.EDIT_PANEL_WIDTH, SmartPickupFrame.EDIT_PANEL_HEIGHT = 0.80, 0.90 -- andel af listens flade +SmartPickupFrame.EDIT_PANEL_HEADER_PX = 80 + +function SmartPickupFrame:initEditPanelButtons(i18n) + self.panelCloseButtonInfo = {inputAction = InputAction.MENU_BACK, text = i18n:getText("spu_panel_close"), callback = function() self:onClickPanelClose() end} + self.panelStartButtonInfo = {inputAction = InputAction.MENU_ACTIVATE, text = i18n:getText("spu_button_start"), callback = function() self:onClickPanelStartStop() end} + self.panelDeleteButtonInfo = {inputAction = InputAction.MENU_CANCEL, text = i18n:getText("spu_button_delete"), callback = function() self:onClickPanelDelete() end} + self.panelButtons = {self.panelCloseButtonInfo, self.panelStartButtonInfo, self.panelDeleteButtonInfo} + self.panelGuideButtonCache = setmetatable({}, {__mode = "k"}) +end + +function SmartPickupFrame:editPanelHooks() + return self.editPanelOpen and SmartPickupFrame.EDIT_PANEL_KINDS[self.editPanelKind] or nil +end + +-- Guidens knapper i vinduet: Tilbage (ESC) lukker trinnet/vinduet i stedet for hele menuen. +function SmartPickupFrame:panelGuideButtons() + local source = self:getGuideButtons() + local cached = self.panelGuideButtonCache[source] + if cached == nil then + cached = {} + for index, info in ipairs(source) do + cached[index] = info == self.backButtonInfo and self.panelCloseButtonInfo or info + end + self.panelGuideButtonCache[source] = cached + end + return cached +end + +-- Vinduet dækker listens flade; panelet er centreret i den (absolutte koordinater, y opad). +function SmartPickupFrame:layoutEditPanel() + local box = self.boxLayout + if box == nil or box.absPosition == nil or box.absSize == nil then return end + local x, y, w, h = box.absPosition[1], box.absPosition[2], box.absSize[1], box.absSize[2] + self.editBackdrop:setAbsolutePosition(x, y) + self.editBackdrop:setSize(w, h) + local pw, ph = w * SmartPickupFrame.EDIT_PANEL_WIDTH, h * SmartPickupFrame.EDIT_PANEL_HEIGHT + local px, py = x + (w - pw) / 2, y + (h - ph) / 2 + self.editPanel:setAbsolutePosition(px, py) + self.editPanel:setSize(pw, ph) + local header = SmartPickupFrame.EDIT_PANEL_HEADER_PX * g_pixelSizeScaledY + local margin = 20 * g_pixelSizeScaledX + self.editTitle:setAbsolutePosition(px + margin, py + ph - header * 0.45) + self.editStatus:setAbsolutePosition(px + margin, py + ph - header * 0.85) + self.editLayout:setAbsolutePosition(px, py) + self.editLayout:setSize(pw, ph - header) +end + +function SmartPickupFrame:openEditPanel(kind, id) + if SmartPickupFrame.EDIT_PANEL_KINDS[kind] == nil or self.editOverlay == nil then return end + self.editPanelOpen, self.editPanelKind, self.editPanelId = true, kind, id + self:closeGuide() + self.editOverlay:setVisible(true) + self:layoutEditPanel() + self:requestRebuild() +end + +-- Lukker uden genopbygning (fanebyt, lukket menu, slettet post). +function SmartPickupFrame:hideEditPanel() + self.editPanelOpen, self.editPanelKind, self.editPanelId = false, nil, nil + self:clearPanelRows() + if self.editOverlay ~= nil then self.editOverlay:setVisible(false) end +end + +function SmartPickupFrame:closeEditPanel() + if not self.editPanelOpen then return end + self:closeGuide() + self:hideEditPanel() + self:requestRebuild() +end + +-- Kaldes fra rebuild (efter listen): vinduets rækker genopbygges i editLayout. +function SmartPickupFrame:fillEditPanel(adEnv) + self:clearPanelRows() + local hooks = self:editPanelHooks() + if hooks == nil then return end + if not hooks.exists(self, self.editPanelId) then + self.statusOverride = self.i18n:getText("spu_panel_gone") + self.statusOverrideTicks = SmartPickupFrame.STATUS_OVERRIDE_TICKS + self:closeGuide() + self:hideEditPanel() + return + end + self:layoutEditPanel() + self.editTitle:setText(hooks.title(self, self.editPanelId)) + self:withRowTarget(self.editLayout, function(frame) + if frame.guide ~= nil then + frame:fillGuideRows(adEnv) + else + hooks.fill(frame, adEnv, frame.editPanelId) + end + end) + self:colorLayout(self.editLayout) + self.editLayout:invalidateLayout() + self:refreshEditPanel(adEnv) +end + +-- Hvert sekund: status i niveaufarve + knaptekster. +function SmartPickupFrame:refreshEditPanel(adEnv) + local hooks = self:editPanelHooks() + if hooks == nil or adEnv == nil then return end + if not hooks.exists(self, self.editPanelId) then + self:closeEditPanel() + return + end + local status = hooks.status(self, adEnv, self.editPanelId) + self.editStatus:setText(tostring(status.text or "")) + local color = ADFlowView.LEVEL_COLORS[status.level] or ADFlowView.LEVEL_COLORS.stopped + if self.editStatus.setTextColor ~= nil then + self.editStatus:setTextColor(color[1], color[2], color[3], color[4]) + end + self.panelStartButtonInfo.text = hooks.startStopText(self, adEnv, self.editPanelId) + self.panelDeleteButtonInfo.disabled = not hooks.canDelete +end + +function SmartPickupFrame:onClickPanelClose() + self:safe(function(frame) + -- et åbent [Edit]-trin lukkes først (kladden kasseres som ved Annullér) + if frame.guide ~= nil then + frame:closeGuide() + frame:requestRebuild() + return + end + frame:closeEditPanel() + end) +end + +function SmartPickupFrame:onClickPanelStartStop() + self:safe(function(frame) + local hooks = frame:editPanelHooks() + if hooks ~= nil then hooks.startStop(frame, frame.editPanelId) end + frame:requestRebuild() + end) +end + +function SmartPickupFrame:onClickPanelDelete() + self:safe(function(frame) + local hooks = frame:editPanelHooks() + if hooks ~= nil and hooks.canDelete then hooks.delete(frame, frame.editPanelId) end + end) +end diff --git a/FS25_ADSmartPickup/gui/SmartPickupFieldTab.lua b/FS25_ADSmartPickup/gui/SmartPickupFieldTab.lua index 1b48f09..4c66555 100644 --- a/FS25_ADSmartPickup/gui/SmartPickupFieldTab.lua +++ b/FS25_ADSmartPickup/gui/SmartPickupFieldTab.lua @@ -118,7 +118,7 @@ end function SmartPickupFrame:fillFieldRows(adEnv) self.fieldRows = {} - if self:hasGuideOn(SmartPickupFrame.TAB_FIELDS) and self:fillGuideRows(adEnv) then return end + if not self.editPanelOpen and self:hasGuideOn(SmartPickupFrame.TAB_FIELDS) and self:fillGuideRows(adEnv) then return end if self.fieldView == "fleet" then self:fillFleetRows(adEnv) return diff --git a/FS25_ADSmartPickup/gui/SmartPickupFrame.lua b/FS25_ADSmartPickup/gui/SmartPickupFrame.lua index 5c6b293..52ca61c 100644 --- a/FS25_ADSmartPickup/gui/SmartPickupFrame.lua +++ b/FS25_ADSmartPickup/gui/SmartPickupFrame.lua @@ -68,6 +68,7 @@ function SmartPickupFrame.new(i18n, getAdEnv) self:initGuideButtons(i18n) -- Flows: [Start/Stop] [Opsæt flow] [Nyt flow] [Slet] (gui/SmartPickupFlowGuide.lua) self:initFlowButtons(i18n) + self:initEditPanelButtons(i18n) -- Egen reference til listen: fallback'en i refreshButtons skal kunne sende den igen. self.menuButtonInfo = self.overviewButtons self:setMenuButtonInfo(self.menuButtonInfo) @@ -211,7 +212,8 @@ end function SmartPickupFrame:onFrameClose() self.frameOpen = false - -- en åben guide kasseres (intet er gemt før [Gem]) + -- et åbent redigeringsvindue og en åben guide kasseres (intet er gemt før [Gem]) + self:hideEditPanel() self:closeGuide() SmartPickupFrame:superClass().onFrameClose(self) end @@ -259,6 +261,10 @@ function SmartPickupFrame:requestRebuild() end function SmartPickupFrame:switchTab(tabIndex) + if self.editPanelOpen then + self:closeGuide() + self:hideEditPanel() + end if self.guide ~= nil and not self:hasGuideOn(tabIndex) then self:closeGuide() end self.currentTab = tabIndex for index, tab in ipairs(self.subCategoryTabs) do @@ -440,6 +446,7 @@ function SmartPickupFrame:rebuild() self.statusRow = self:addTextRow("") self:colorRows() self.boxLayout:invalidateLayout() + if self.editPanelOpen then self:fillEditPanel(adEnv) end self:refreshLive() self:restoreFocusIfLost() return @@ -485,6 +492,7 @@ function SmartPickupFrame:rebuild() self.statusRow = self:addTextRow("") self:colorRows() self.boxLayout:invalidateLayout() + if self.editPanelOpen then self:fillEditPanel(adEnv) end self:refreshLive() self:restoreFocusIfLost() end @@ -591,7 +599,9 @@ end -- sendes listen igen. Kaldes hvert sekund, så den må aldrig kaste. function SmartPickupFrame:refreshButtons() local wanted = self.flowButtons - if self:hasGuideOn(self.currentTab) then + if self.editPanelOpen then + wanted = self.guide ~= nil and self:panelGuideButtons() or self.panelButtons + elseif self:hasGuideOn(self.currentTab) then wanted = self:getGuideButtons() elseif self.currentTab == SmartPickupFrame.TAB_OVERVIEW then wanted = self.overviewButtons @@ -632,6 +642,7 @@ function SmartPickupFrame:refreshLive() if isOverview then self:refreshOverview(adEnv) end + if self.editPanelOpen then self:refreshEditPanel(adEnv) end if self.currentTab == SmartPickupFrame.TAB_FIELDS then self:refreshFieldRows(adEnv) self.statusOverrideTicks = (self.statusOverrideTicks or 0) - 1 diff --git a/FS25_ADSmartPickup/gui/SmartPickupFrame.xml b/FS25_ADSmartPickup/gui/SmartPickupFrame.xml index 1461b2f..d2bcf9c 100644 --- a/FS25_ADSmartPickup/gui/SmartPickupFrame.xml +++ b/FS25_ADSmartPickup/gui/SmartPickupFrame.xml @@ -57,6 +57,14 @@ + + + + + + + + diff --git a/FS25_ADSmartPickup/gui/guiProfiles.xml b/FS25_ADSmartPickup/gui/guiProfiles.xml index a91e3eb..883a2f8 100644 --- a/FS25_ADSmartPickup/gui/guiProfiles.xml +++ b/FS25_ADSmartPickup/gui/guiProfiles.xml @@ -53,4 +53,17 @@ + + + + + + + + + + + + + diff --git a/FS25_ADSmartPickup/l10n/l10n_da.xml b/FS25_ADSmartPickup/l10n/l10n_da.xml index 47969c2..0e71106 100644 --- a/FS25_ADSmartPickup/l10n/l10n_da.xml +++ b/FS25_ADSmartPickup/l10n/l10n_da.xml @@ -252,6 +252,8 @@ + + diff --git a/FS25_ADSmartPickup/l10n/l10n_en.xml b/FS25_ADSmartPickup/l10n/l10n_en.xml index b67dc63..d492ba8 100644 --- a/FS25_ADSmartPickup/l10n/l10n_en.xml +++ b/FS25_ADSmartPickup/l10n/l10n_en.xml @@ -252,6 +252,8 @@ + +