-- 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 SmartPickupFrame.EDIT_PANEL_ROW_PX = 860 -- rækkerne er ~835 px brede 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.panelButtonsNoDelete = {self.panelCloseButtonInfo, self.panelStartButtonInfo} self.panelGuideButtonCache = setmetatable({}, {__mode = "k"}) end -- Vinduets knaplinje (uden Slet for arter der ikke kan slettes). function SmartPickupFrame:getPanelButtons() local hooks = self:editPanelHooks() return (hooks ~= nil and hooks.canDelete) and self.panelButtons or self.panelButtonsNoDelete 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 -- Sæt størrelse FØR position: setSize kan genberegne den absolutte position ud fra forælderen (review 29/9). -- -> true hvis elementet flyttede sig. local function place(element, x, y, w, h) if w ~= nil then element:setSize(w, h) end local pos = element.absPosition local moved = pos == nil or math.abs(pos[1] - x) > 1e-6 or math.abs(pos[2] - y) > 1e-6 element:setAbsolutePosition(x, y) return moved end -- Vinduet dækker listens flade; panelet er centreret i den (absolutte koordinater, y opad). Kaldes ved åbning, -- ved hver opbygning og hvert sekund, så en layout-gennemgang i menuen ikke flytter det væk. 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] place(self.editBackdrop, x, y, w, h) -- så bredt som rækkerne (~835 px) + margen, ikke bredere end listen local pw = math.min(w * SmartPickupFrame.EDIT_PANEL_WIDTH, SmartPickupFrame.EDIT_PANEL_ROW_PX * g_pixelSizeScaledX) local ph = h * SmartPickupFrame.EDIT_PANEL_HEIGHT local px, py = x + (w - pw) / 2, y + (h - ph) / 2 place(self.editPanel, px, py, pw, ph) local header = SmartPickupFrame.EDIT_PANEL_HEADER_PX * g_pixelSizeScaledY local margin = 20 * g_pixelSizeScaledX place(self.editTitle, px + margin, py + ph - header * 0.45) place(self.editStatus, px + margin, py + ph - header * 0.85) if place(self.editLayout, px, py, pw, ph - header) then self.editLayout:invalidateLayout() end 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) -- listen skjules bag vinduet: dens tekster skinnede igennem panelet (in-game 29/9) self.boxLayout:setVisible(false) 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 if self.boxLayout ~= nil then self.boxLayout:setVisible(true) 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.statusOverride = self.i18n:getText("spu_panel_gone") self.statusOverrideTicks = SmartPickupFrame.STATUS_OVERRIDE_TICKS self:closeEditPanel() return end self:layoutEditPanel() 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.panelStartButtonInfo.disabled = hooks.canStart ~= nil and not hooks.canStart(self, self.editPanelId) end -- ESC mens vinduet er åbent: menuen spørger requestClose; vinduet lukkes (trin først), menuen bliver. -- Kalder spillet OGSÅ knappens callback for samme tryk, må det ikke lukke to trin (panelClosedAt). SmartPickupFrame.PANEL_ESC_DEBOUNCE_MS = 250 function SmartPickupFrame:requestClose(callback) if self.editPanelOpen then self:onClickPanelClose() return false end if g_time ~= nil and self.panelClosedAt ~= nil and g_time - self.panelClosedAt < SmartPickupFrame.PANEL_ESC_DEBOUNCE_MS then return false end return SmartPickupFrame:superClass().requestClose(self, callback) end function SmartPickupFrame:onClickPanelClose() if g_time ~= nil and self.panelClosedAt ~= nil and g_time - self.panelClosedAt < SmartPickupFrame.PANEL_ESC_DEBOUNCE_MS then return end self.panelClosedAt = g_time 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