From 222a36623edff155ecb846f1c4b5a161658b5f6f Mon Sep 17 00:00:00 2001 From: Cidwel Highwind Date: Sat, 4 Apr 2026 13:29:21 +0200 Subject: [PATCH] Remember preview window size per mode (All/One/Sta), per preset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Each mode stores its own window width/height in the preset file - Switching modes saves current bounds and reopens with saved size - Fit clears saved size to recalculate from content - Button order: Mode → Fit → Setup; "Sta" renamed to "Static" --- aniphallow.lua | 98 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 68 insertions(+), 30 deletions(-) diff --git a/aniphallow.lua b/aniphallow.lua index bac6478..8a176a7 100644 --- a/aniphallow.lua +++ b/aniphallow.lua @@ -118,6 +118,10 @@ local S = { previewLayoutValue = 2, -- number for fixed cols/rows previewMode = "all", -- "all", "single", or "static" previewSingleIdx = 1, -- which animation to show in single mode + -- Per-mode preview window size (0 = auto/not set yet) + pvWinWAll = 0, pvWinHAll = 0, + pvWinWOne = 0, pvWinHOne = 0, + pvWinWSta = 0, pvWinHSta = 0, -- Static preview scroll/pan previewStaScrollX = 0, previewStaScrollY = 0, @@ -310,6 +314,12 @@ local function savePreset(presetName) f:write("gbAlwaysOverwrite=" .. tostring(S.gbAlwaysOverwrite) .. "\n") f:write("gbTileW=" .. S.gbTileW .. "\n") f:write("gbTileH=" .. S.gbTileH .. "\n") + f:write("pvWinWAll=" .. S.pvWinWAll .. "\n") + f:write("pvWinHAll=" .. S.pvWinHAll .. "\n") + f:write("pvWinWOne=" .. S.pvWinWOne .. "\n") + f:write("pvWinHOne=" .. S.pvWinHOne .. "\n") + f:write("pvWinWSta=" .. S.pvWinWSta .. "\n") + f:write("pvWinHSta=" .. S.pvWinHSta .. "\n") for i, name in ipairs(S.animNames) do f:write("anim_" .. (i - 1) .. "=" .. serializeFrames(S.anims[name] or {}) .. "\n") end @@ -378,6 +388,12 @@ local function loadPreset(presetName) S.gbTileW = ts S.gbTileH = ts end + if k == "pvWinWAll" then S.pvWinWAll = tonumber(v) or 0 end + if k == "pvWinHAll" then S.pvWinHAll = tonumber(v) or 0 end + if k == "pvWinWOne" then S.pvWinWOne = tonumber(v) or 0 end + if k == "pvWinHOne" then S.pvWinHOne = tonumber(v) or 0 end + if k == "pvWinWSta" then S.pvWinWSta = tonumber(v) or 0 end + if k == "pvWinHSta" then S.pvWinHSta = tonumber(v) or 0 end -- Dynamic anim frames: anim_0, anim_1, ... local animIdx = k and string.match(k, "^anim_(%d+)$") if animIdx then @@ -1314,21 +1330,15 @@ openPreviewWindow = function() S.previewSingleIdx = 1 end - -- calcPreviewSize helper (Sta mode excluded — uses last All/One size) + -- calcPreviewSize: compute "natural" content size for Fit (All/One only) local function calcPreviewSize() - local z - if S.previewMode == "static" then - -- Don't try to auto-size for Sta; fall through to All sizing - z = S.previewZoomAll - else - z = pvZoom() - end + local z = pvZoom() local ptw = S.tileW * z local pth = S.tileH * z local cellW = ptw + PV_MARGIN * 2 local cellH = pth + PV_MARGIN * 2 if S.previewMode == "single" then - return cellW, cellH + 14 -- extra space for name label + return cellW, cellH + 14 else local numAnims = #S.animNames local cols, rows = getPreviewGrid(numAnims) @@ -1336,14 +1346,41 @@ openPreviewWindow = function() end end - -- Calculate initial size - local pvWidth, pvHeight = calcPreviewSize() + -- Save current window bounds into S for the given mode + local function saveBoundsForMode(mode) + if not previewDlg then return end + local ok, b = pcall(function() return previewDlg.bounds end) + if not ok or not b then return end + if mode == "all" then S.pvWinWAll = b.width; S.pvWinHAll = b.height + elseif mode == "single" then S.pvWinWOne = b.width; S.pvWinHOne = b.height + elseif mode == "static" then S.pvWinWSta = b.width; S.pvWinHSta = b.height + end + end + + -- Get saved size for current mode, or fallback to calcPreviewSize + local function getWinSize() + local w, h = 0, 0 + if S.previewMode == "all" then w = S.pvWinWAll; h = S.pvWinHAll + elseif S.previewMode == "single" then w = S.pvWinWOne; h = S.pvWinHOne + elseif S.previewMode == "static" then w = S.pvWinWSta; h = S.pvWinHSta + end + if w > 0 and h > 0 then return w, h end + -- No saved size: use content fit (Sta defaults to 200x200) + if S.previewMode == "static" then return 200, 200 end + local cw, ch = calcPreviewSize() + return math.max(cw, 120), math.max(ch, 40) + end + + -- Calculate initial canvas size from saved window size + local pvWidth, pvHeight = getWinSize() + -- Canvas is smaller than window (buttons/decorations), but we approximate pvWidth = math.max(pvWidth, 120) pvHeight = math.max(pvHeight, 40) previewDlg = Dialog{ title = "AniPhallow (" .. S.currentPreset .. ")", onclose = function() + saveBoundsForMode(S.previewMode) if previewTimer then pcall(function() previewTimer:stop() end) end if pvRefreshTimer then pcall(function() pvRefreshTimer:stop() end) end previewTimer = nil @@ -1356,18 +1393,10 @@ openPreviewWindow = function() end } - -- All buttons on the same row: Setup, toggle mode, Fit - previewDlg:button{ - id = "pvSetup", - text = "Setup", - onclick = function() - openMainDialog() - end - } - + -- Buttons: Mode, Fit, Setup local function getModeLabel() if S.previewMode == "single" then return "One" - elseif S.previewMode == "static" then return "Sta" + elseif S.previewMode == "static" then return "Static" else return "All" end end @@ -1375,6 +1404,8 @@ openPreviewWindow = function() id = "pvToggleMode", text = getModeLabel(), onclick = function() + -- Save current bounds before switching + saveBoundsForMode(S.previewMode) if S.previewMode == "all" then S.previewMode = "single" if #S.animNames > 0 then @@ -1383,17 +1414,13 @@ openPreviewWindow = function() end elseif S.previewMode == "single" then S.previewMode = "static" - refreshSource() -- ensure source image is ready + refreshSource() else S.previewMode = "all" end - -- Update button text, label visibility, and Fit enabled state - pcall(function() - previewDlg:modify{ id = "pvToggleMode", text = getModeLabel() } - previewDlg:modify{ id = "pvAnimName", visible = (S.previewMode == "single") } - previewDlg:modify{ id = "pvFit", enabled = (S.previewMode ~= "static") } - end) - previewDlg:repaint() + -- Close and reopen with new mode's saved size + pcall(function() previewDlg:close() end) + openPreviewWindow() end } @@ -1403,12 +1430,23 @@ openPreviewWindow = function() enabled = (S.previewMode ~= "static"), onclick = function() if S.previewMode == "static" then return end - -- Close and reopen to refit + -- Clear saved size so it recalculates from content + if S.previewMode == "all" then S.pvWinWAll = 0; S.pvWinHAll = 0 + elseif S.previewMode == "single" then S.pvWinWOne = 0; S.pvWinHOne = 0 + end pcall(function() previewDlg:close() end) openPreviewWindow() end } + previewDlg:button{ + id = "pvSetup", + text = "Setup", + onclick = function() + openMainDialog() + end + } + previewDlg:canvas{ id = "pvCanvas", width = pvWidth,