fix(gui): review — vinduets placering (størrelse før position, genanvendes hvert sekund, profil uden midt-anker), fokus ved sletning af vinduets rækker, ESC via requestClose, [Start] kræver markør, forældet rød status, markvindue uden Slet

This commit is contained in:
2026-09-29 17:52:23 +02:00
parent e892348374
commit f64959e2c3
7 changed files with 79 additions and 15 deletions
+49 -10
View File
@@ -14,9 +14,16 @@ function SmartPickupFrame:initEditPanelButtons(i18n)
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
@@ -35,23 +42,33 @@ function SmartPickupFrame:panelGuideButtons()
return cached
end
-- Vinduet dækker listens flade; panelet er centreret i den (absolutte koordinater, y opad).
-- 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]
self.editBackdrop:setAbsolutePosition(x, y)
self.editBackdrop:setSize(w, h)
place(self.editBackdrop, x, y, 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)
place(self.editPanel, px, py, 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)
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)
@@ -108,9 +125,12 @@ 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
@@ -118,10 +138,29 @@ function SmartPickupFrame:refreshEditPanel(adEnv)
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
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