232 lines
10 KiB
Lua
232 lines
10 KiB
Lua
-- Smart Pickup — fælles guide-skærm ("Opsæt mark" / "Opsæt flow")
|
|
-- Ét trin ad gangen: overskrift, "Trin 3 af 7 — …", kort forklaring, valgene som rækker og bundknapperne
|
|
-- Næste/Gem, Tilbage, Annullér (+ Gem uden at starte på oversigts-trinnet). Al logik ligger i ADGuide og
|
|
-- trin-definitionerne (ADFieldGuide/ADFlowGuide); her tegnes kun rækkerne og klik routes.
|
|
-- Hver guide registrerer sig i SmartPickupFrame.GUIDE_HOOKS[kind] = {
|
|
-- model, tab, heading(frame, guide), context(frame, adEnv, guide) -> context|nil (nil = luk guiden),
|
|
-- choose(frame, id, value) -> handled, save(frame, guide, start), startKey(guide), showSaveOnly(guide),
|
|
-- canAdvance(guide), afterRows(frame, adEnv, guide) }
|
|
-- Funktionerne lægges på SmartPickupFrame (indlæses efter SmartPickupFrame.lua).
|
|
|
|
SmartPickupFrame.GUIDE_HOOKS = SmartPickupFrame.GUIDE_HOOKS or {}
|
|
|
|
function SmartPickupFrame:initGuideButtons(i18n)
|
|
self.guideNextButtonInfo = {inputAction = InputAction.MENU_ACTIVATE, text = i18n:getText("spu_guide_next"), callback = function() self:onClickGuideNext(true) end}
|
|
self.guideSaveOnlyButtonInfo = {inputAction = InputAction.MENU_EXTRA_1, text = i18n:getText("spu_guide_saveOnly"), callback = function() self:onClickGuideNext(false) end}
|
|
self.guidePrevButtonInfo = {inputAction = InputAction.MENU_EXTRA_2, text = i18n:getText("spu_guide_back"), callback = function() self:onClickGuideBack() end}
|
|
self.guideCancelButtonInfo = {inputAction = InputAction.MENU_CANCEL, text = i18n:getText("spu_guide_cancel"), callback = function() self:onClickGuideCancel() end}
|
|
self.guideButtons = {self.backButtonInfo, self.guideNextButtonInfo, self.guidePrevButtonInfo, self.guideCancelButtonInfo}
|
|
self.guideSummaryButtons = {self.backButtonInfo, self.guideNextButtonInfo, self.guideSaveOnlyButtonInfo, self.guidePrevButtonInfo, self.guideCancelButtonInfo}
|
|
end
|
|
|
|
function SmartPickupFrame:guideHooks()
|
|
return self.guideKind ~= nil and SmartPickupFrame.GUIDE_HOOKS[self.guideKind] or nil
|
|
end
|
|
|
|
-- Er der en åben guide på fanen?
|
|
function SmartPickupFrame:hasGuideOn(tab)
|
|
local hooks = self:guideHooks()
|
|
return self.guide ~= nil and hooks ~= nil and hooks.tab == tab
|
|
end
|
|
|
|
function SmartPickupFrame:openGuide(kind, guide)
|
|
self.guideKind, self.guide = kind, guide
|
|
self.statusOverride = nil
|
|
self:requestRebuild()
|
|
end
|
|
|
|
-- Kladden kasseres (Annullér, fanebyt, lukket menu).
|
|
function SmartPickupFrame:closeGuide()
|
|
self.guideKind, self.guide = nil, nil
|
|
end
|
|
|
|
function SmartPickupFrame:guideText(label)
|
|
return ADGuide.labelText(label, function(key) return self.i18n:getText(key) end)
|
|
end
|
|
|
|
-- Klikbar tekstrække (ombrydes; alle linjer er klikbare). Handlingen køres fra update() (pendingClick).
|
|
function SmartPickupFrame:addLinkRow(text, action)
|
|
local first = nil
|
|
for _, line in ipairs(ADFlowView.wrapText(text, SmartPickupFrame.TEXT_ROW_CHARS)) do
|
|
local row = self:addRow(self.textPrefab, {kind = "text"})
|
|
local title = row:getDescendantByName("title")
|
|
title:setText(line)
|
|
self:makeRowClickable(row, action)
|
|
first = first or title
|
|
end
|
|
return first
|
|
end
|
|
|
|
local function optionIndex(options, value)
|
|
for index, option in ipairs(options) do
|
|
if option.value == value then return index end
|
|
end
|
|
return 1
|
|
end
|
|
|
|
function SmartPickupFrame:addGuideRow(row)
|
|
local data = {kind = "guideRow", row = row}
|
|
if row.type == "choice" then
|
|
local element = self:addRow(self.productPrefab, data)
|
|
local option = element:getDescendantByName("option")
|
|
local texts = {}
|
|
for _, entry in ipairs(row.options) do table.insert(texts, self:guideText(entry.label)) end
|
|
option:setTexts(texts)
|
|
option:setState(optionIndex(row.options, row.value), false)
|
|
element:getDescendantByName("title"):setText(self:guideText(row.title))
|
|
elseif row.type == "toggle" or row.type == "check" then
|
|
local element = self:addRow(self.ingredientPrefab, data)
|
|
local option = element:getDescendantByName("option")
|
|
if row.type == "toggle" then option:setTexts({self:guideText(row.off), self:guideText(row.on)}) end
|
|
option:setState(row.value and SmartPickupFrame.STATE_ON or SmartPickupFrame.STATE_OFF, false)
|
|
element:getDescendantByName("title"):setText((row.type == "check" and " " or "") .. self:guideText(row.title))
|
|
elseif row.type == "link" then
|
|
local text = row.label ~= nil and self:guideText(row.label)
|
|
or (ADGuide.lineText(row.line, function(key) return self.i18n:getText(key) end) .. self.i18n:getText("spu_guide_editSuffix"))
|
|
self:addLinkRow(" " .. text, function(frame) frame:onGuideLink(row) end)
|
|
else
|
|
self:addTextRow(self:guideText(row.label))
|
|
end
|
|
end
|
|
|
|
-- Tegner den åbne guide. false = guiden er lukket (fx marken findes ikke længere) — fanen viser oversigten.
|
|
function SmartPickupFrame:fillGuideRows(adEnv)
|
|
local hooks = self:guideHooks()
|
|
if hooks == nil or self.guide == nil then return false end
|
|
local context = hooks.context(self, adEnv, self.guide)
|
|
if context == nil then
|
|
self:closeGuide()
|
|
self.statusOverride = self.i18n:getText("spu_guide_closed")
|
|
self.statusOverrideTicks = SmartPickupFrame.STATUS_OVERRIDE_TICKS
|
|
return false
|
|
end
|
|
self.guide = ADGuide.withContext(self.guide, context)
|
|
local guide, model = self.guide, hooks.model
|
|
self:addTextRow(hooks.heading(self, guide))
|
|
local stepTitle = self.i18n:getText(model.stepKey(guide.step, guide))
|
|
local index, total = ADGuide.position(guide)
|
|
local header
|
|
if guide.single then
|
|
header = string.format(self.i18n:getText("spu_guide_editStep"), stepTitle)
|
|
elseif index ~= nil and total > 1 then
|
|
header = string.format(self.i18n:getText("spu_guide_stepOf"), index, total, stepTitle)
|
|
else
|
|
header = string.format(self.i18n:getText("spu_guide_stepOne"), index or 1, stepTitle)
|
|
end
|
|
self:addTextRow(header)
|
|
self:addTextRow(" " .. self.i18n:getText(model.hintKey(guide.step, guide)))
|
|
for _, row in ipairs(model.rows(guide)) do
|
|
self:addGuideRow(row)
|
|
end
|
|
if hooks.afterRows ~= nil then hooks.afterRows(self, adEnv, guide) end
|
|
return true
|
|
end
|
|
|
|
-- ---- klik ----
|
|
|
|
function SmartPickupFrame:applyGuideChoice(id, value)
|
|
local hooks = self:guideHooks()
|
|
if hooks == nil or self.guide == nil then return end
|
|
if hooks.choose ~= nil and hooks.choose(self, id, value) then return end
|
|
self.guide = hooks.model.choose(self.guide, id, value)
|
|
end
|
|
|
|
function SmartPickupFrame:onClickGuideRow(state, data)
|
|
self:safe(function(frame)
|
|
local row = data ~= nil and data.row or nil
|
|
if row == nil or frame.guide == nil then return end
|
|
local value
|
|
if row.type == "choice" then
|
|
local option = row.options[state]
|
|
if option == nil then return end
|
|
value = option.value
|
|
-- valg pr. vare (fx politik): modellen skal vide hvilken
|
|
if row.item ~= nil then value = {item = row.item, value = option.value} end
|
|
elseif row.type == "toggle" then
|
|
value = state == SmartPickupFrame.STATE_ON
|
|
elseif row.type == "check" then
|
|
value = {item = row.item, on = state == SmartPickupFrame.STATE_ON}
|
|
else
|
|
return
|
|
end
|
|
frame:applyGuideChoice(row.id, value)
|
|
frame:requestRebuild()
|
|
end)
|
|
end
|
|
|
|
-- Klikbare linjer: [Ret] på oversigts-trinnet åbner ét trin; andre links er valg (fx mark i trin 1).
|
|
function SmartPickupFrame:onGuideLink(row)
|
|
if self.guide == nil then return end
|
|
if row.id == "jump" then
|
|
self.guide = ADGuide.jump(self.guide, row.value, "summary")
|
|
else
|
|
self:applyGuideChoice(row.id, row.value)
|
|
end
|
|
self:requestRebuild()
|
|
end
|
|
|
|
local function finish(frame, hooks, guide, start)
|
|
hooks.save(frame, guide, start)
|
|
frame:closeGuide()
|
|
frame:requestRebuild()
|
|
end
|
|
|
|
-- Næste / Gem / Kør automatisk (start = true) og Gem uden at starte (start = false).
|
|
function SmartPickupFrame:onClickGuideNext(start)
|
|
self:safe(function(frame)
|
|
local hooks, guide = frame:guideHooks(), frame.guide
|
|
if hooks == nil or guide == nil then return end
|
|
if hooks.canAdvance ~= nil and not hooks.canAdvance(guide) then
|
|
frame:showOverride(frame.i18n:getText(hooks.cannotAdvanceKey or "spu_guide_cannotAdvance"))
|
|
return
|
|
end
|
|
if guide.single and guide.returnTo == "close" then
|
|
if start == false then return end
|
|
return finish(frame, hooks, guide, nil)
|
|
end
|
|
if guide.step == "summary" and not guide.single then
|
|
return finish(frame, hooks, guide, start)
|
|
end
|
|
if start == false then return end
|
|
local nextGuide, event = ADGuide.next(guide)
|
|
if event == "done" then return finish(frame, hooks, guide, true) end
|
|
frame.guide = nextGuide
|
|
frame:requestRebuild()
|
|
end)
|
|
end
|
|
|
|
function SmartPickupFrame:onClickGuideBack()
|
|
self:safe(function(frame)
|
|
if frame.guide == nil then return end
|
|
local previous, event = ADGuide.back(frame.guide)
|
|
if event == "cancel" then frame:closeGuide() else frame.guide = previous end
|
|
frame:requestRebuild()
|
|
end)
|
|
end
|
|
|
|
function SmartPickupFrame:onClickGuideCancel()
|
|
self:safe(function(frame)
|
|
frame:closeGuide()
|
|
frame:requestRebuild()
|
|
end)
|
|
end
|
|
|
|
-- Knapperne følger trinnet: Næste / OK (tilbage til oversigten) / Gem ([Ret] fra fanen) / Kør automatisk.
|
|
function SmartPickupFrame:getGuideButtons()
|
|
local hooks, guide = self:guideHooks(), self.guide
|
|
local i18n = self.i18n
|
|
local isSummary = guide.step == "summary" and not guide.single
|
|
local key = "spu_guide_next"
|
|
if guide.single then
|
|
key = guide.returnTo == "close" and "spu_guide_save" or "spu_guide_ok"
|
|
elseif isSummary then
|
|
key = hooks.startKey ~= nil and hooks.startKey(guide) or "spu_guide_save"
|
|
end
|
|
self.guideNextButtonInfo.text = i18n:getText(key)
|
|
self.guideNextButtonInfo.disabled = hooks.canAdvance ~= nil and not hooks.canAdvance(guide)
|
|
if isSummary and (hooks.showSaveOnly == nil or hooks.showSaveOnly(guide)) then
|
|
return self.guideSummaryButtons
|
|
end
|
|
return self.guideButtons
|
|
end
|