192 lines
8.4 KiB
Lua
192 lines
8.4 KiB
Lua
-- 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.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)
|
|
local pw, ph = w * SmartPickupFrame.EDIT_PANEL_WIDTH, 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
|