mirror of
https://github.com/Dadido3/noita-mapcap.git
synced 2024-11-22 21:17:33 +00:00
Add progress bar
- Change process runner to return state table - Add progress bar graphics - Add progress bar UI - Fill progress runner context state with more capturing info
This commit is contained in:
parent
014cba54af
commit
a2cb806ffa
@ -79,6 +79,7 @@ local function captureScreenshot(pos, ensureLoaded, dontOverwrite, ctx, outputPi
|
|||||||
if pos then CameraAPI.SetPos(pos) end
|
if pos then CameraAPI.SetPos(pos) end
|
||||||
if ensureLoaded then
|
if ensureLoaded then
|
||||||
local delayFrames = 0
|
local delayFrames = 0
|
||||||
|
if ctx then ctx.state.WaitFrames = delayFrames end
|
||||||
repeat
|
repeat
|
||||||
-- Prematurely stop capturing if that is requested by the context.
|
-- Prematurely stop capturing if that is requested by the context.
|
||||||
if ctx and ctx:IsStopping() then return end
|
if ctx and ctx:IsStopping() then return end
|
||||||
@ -88,11 +89,13 @@ local function captureScreenshot(pos, ensureLoaded, dontOverwrite, ctx, outputPi
|
|||||||
if pos then CameraAPI.SetPos(pos + Vec2(math.random(-10, 10), math.random(-10, 10))) end
|
if pos then CameraAPI.SetPos(pos + Vec2(math.random(-10, 10), math.random(-10, 10))) end
|
||||||
wait(0)
|
wait(0)
|
||||||
delayFrames = delayFrames + 1
|
delayFrames = delayFrames + 1
|
||||||
|
if ctx then ctx.state.WaitFrames = delayFrames end
|
||||||
if pos then CameraAPI.SetPos(pos) end
|
if pos then CameraAPI.SetPos(pos) end
|
||||||
end
|
end
|
||||||
|
|
||||||
wait(0)
|
wait(0)
|
||||||
delayFrames = delayFrames + 1
|
delayFrames = delayFrames + 1
|
||||||
|
if ctx then ctx.state.WaitFrames = delayFrames end
|
||||||
|
|
||||||
local topLeftBounds, bottomRightBounds = CameraAPI:Bounds()
|
local topLeftBounds, bottomRightBounds = CameraAPI:Bounds()
|
||||||
until DoesWorldExistAt(topLeftBounds.x, topLeftBounds.y, bottomRightBounds.x, bottomRightBounds.y)
|
until DoesWorldExistAt(topLeftBounds.x, topLeftBounds.y, bottomRightBounds.x, bottomRightBounds.y)
|
||||||
@ -230,7 +233,7 @@ function Capture:StartCapturingArea(topLeft, bottomRight, captureGridSize, outpu
|
|||||||
---@param ctx ProcessRunnerCtx
|
---@param ctx ProcessRunnerCtx
|
||||||
local function handleDo(ctx)
|
local function handleDo(ctx)
|
||||||
Modification.SetCameraFree(true)
|
Modification.SetCameraFree(true)
|
||||||
ctx.progressCurrent, ctx.progressEnd = 0, gridSize.x * gridSize.y
|
ctx.state = {Current = 0, Max = gridSize.x * gridSize.y}
|
||||||
|
|
||||||
while t < tLimit do
|
while t < tLimit do
|
||||||
-- Prematurely stop capturing if that is requested by the context.
|
-- Prematurely stop capturing if that is requested by the context.
|
||||||
@ -245,7 +248,7 @@ function Capture:StartCapturingArea(topLeft, bottomRight, captureGridSize, outpu
|
|||||||
local pos = (hilbertPos + gridTopLeft) * captureGridSize
|
local pos = (hilbertPos + gridTopLeft) * captureGridSize
|
||||||
pos:Add(Vec2(256, 256)) -- Move to chunk center -- TODO: Align chunks with top left pixel
|
pos:Add(Vec2(256, 256)) -- Move to chunk center -- TODO: Align chunks with top left pixel
|
||||||
captureScreenshot(pos, true, true, ctx, outputPixelScale)
|
captureScreenshot(pos, true, true, ctx, outputPixelScale)
|
||||||
ctx.progressCurrent = ctx.progressCurrent + 1
|
ctx.state.Current = ctx.state.Current + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
t = t + 1
|
t = t + 1
|
||||||
|
@ -21,8 +21,7 @@ local ProcessRunner = {}
|
|||||||
---@class ProcessRunnerCtx
|
---@class ProcessRunnerCtx
|
||||||
---@field running boolean|nil
|
---@field running boolean|nil
|
||||||
---@field stopping boolean|nil
|
---@field stopping boolean|nil
|
||||||
---@field progressCurrent number|nil
|
---@field state table|nil
|
||||||
---@field progressEnd number|nil
|
|
||||||
local Context = {}
|
local Context = {}
|
||||||
Context.__index = Context
|
Context.__index = Context
|
||||||
|
|
||||||
@ -52,11 +51,11 @@ function Context:IsStopping()
|
|||||||
return self.stopping or false
|
return self.stopping or false
|
||||||
end
|
end
|
||||||
|
|
||||||
---Returns the progress of the process.
|
---Returns a table with information about the current state of the process.
|
||||||
---@return number current
|
---Will return nil if there is no process.
|
||||||
---@return number end
|
---@return table|nil -- Custom to the process.
|
||||||
function Context:GetProgress()
|
function Context:GetState()
|
||||||
return self.progressCurrent or 0, self.progressEnd or 0
|
return self.state
|
||||||
end
|
end
|
||||||
|
|
||||||
---Tells the currently running process to stop.
|
---Tells the currently running process to stop.
|
||||||
@ -74,12 +73,12 @@ end
|
|||||||
---@param doFunc fun(ctx:ProcessRunnerCtx)|nil -- Called after `initFunc` has been run.
|
---@param doFunc fun(ctx:ProcessRunnerCtx)|nil -- Called after `initFunc` has been run.
|
||||||
---@param endFunc fun(ctx:ProcessRunnerCtx)|nil -- Called after `doFunc` has been run.
|
---@param endFunc fun(ctx:ProcessRunnerCtx)|nil -- Called after `doFunc` has been run.
|
||||||
---@param errFunc fun(err:string, scope:"init"|"do"|"end") -- Called on any error.
|
---@param errFunc fun(err:string, scope:"init"|"do"|"end") -- Called on any error.
|
||||||
|
---@return boolean -- True if process was started successfully.
|
||||||
function Context:Run(initFunc, doFunc, endFunc, errFunc)
|
function Context:Run(initFunc, doFunc, endFunc, errFunc)
|
||||||
if self.running then return end
|
if self.running then return false end
|
||||||
|
self.running, self.stopping, self.state = true, false, {}
|
||||||
|
|
||||||
async(function()
|
async(function()
|
||||||
self.running, self.stopping, self.progressCurrent, self.progressEnd = true, false, nil, nil
|
|
||||||
|
|
||||||
-- Init function.
|
-- Init function.
|
||||||
if initFunc then
|
if initFunc then
|
||||||
local ok, err = pcall(initFunc, self)
|
local ok, err = pcall(initFunc, self)
|
||||||
@ -110,8 +109,10 @@ function Context:Run(initFunc, doFunc, endFunc, errFunc)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
self.running, self.stopping = false, false
|
self.running, self.stopping, self.state = false, false, nil
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
return ProcessRunner
|
return ProcessRunner
|
||||||
|
BIN
files/ui-gfx/progress-a.png
Normal file
BIN
files/ui-gfx/progress-a.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 187 B |
BIN
files/ui-gfx/progress-b.png
Normal file
BIN
files/ui-gfx/progress-b.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 143 B |
35
files/ui.lua
35
files/ui.lua
@ -68,7 +68,7 @@ function UI:_DrawMessages(messages)
|
|||||||
|
|
||||||
-- Abort if there is no messages list.
|
-- Abort if there is no messages list.
|
||||||
if not messages then return end
|
if not messages then return end
|
||||||
|
|
||||||
GuiZSet(gui, 0)
|
GuiZSet(gui, 0)
|
||||||
|
|
||||||
-- Unfortunately you can't stack multiple layout containers with the same direction.
|
-- Unfortunately you can't stack multiple layout containers with the same direction.
|
||||||
@ -125,6 +125,38 @@ function UI:_DrawMessages(messages)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function UI:_DrawProgress()
|
||||||
|
local gui = self.gui
|
||||||
|
|
||||||
|
-- Check if there is progress to show.
|
||||||
|
local state = Capture.MapCapturingCtx:GetState()
|
||||||
|
if not state then return end
|
||||||
|
|
||||||
|
local factor
|
||||||
|
if state.Current and state.Max > 0 then
|
||||||
|
factor = state.Current / state.Max
|
||||||
|
end
|
||||||
|
|
||||||
|
local width, height = GuiGetScreenDimensions(gui)
|
||||||
|
local widthHalf, heightHalf = math.floor(width/2), math.floor(height/2)
|
||||||
|
GuiZSet(gui, -20)
|
||||||
|
|
||||||
|
local barWidth = width - 60
|
||||||
|
local y = heightHalf
|
||||||
|
if factor then
|
||||||
|
GuiImageNinePiece(gui, self:_GenID(), 30, y, barWidth, 9, 1, "mods/noita-mapcap/files/ui-gfx/progress-a.png", "mods/noita-mapcap/files/ui-gfx/progress-a.png")
|
||||||
|
GuiImageNinePiece(gui, self:_GenID(), 30, y, math.floor(barWidth * factor + 0.5), 9, 1, "mods/noita-mapcap/files/ui-gfx/progress-b.png", "mods/noita-mapcap/files/ui-gfx/progress-b.png")
|
||||||
|
GuiOptionsAddForNextWidget(gui, GUI_OPTION.Align_HorizontalCenter)
|
||||||
|
GuiText(gui, widthHalf, y, string.format("%d of %d (%.1f%%)", state.Current, state.Max, factor*100)) y = y + 11
|
||||||
|
y = y + 15
|
||||||
|
end
|
||||||
|
|
||||||
|
if state.WaitFrames then
|
||||||
|
GuiOptionsAddForNextWidget(gui, GUI_OPTION.Align_HorizontalCenter)
|
||||||
|
GuiText(gui, widthHalf, y, string.format("Waiting for %d frames.", state.WaitFrames)) y = y + 11
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function UI:Draw()
|
function UI:Draw()
|
||||||
self.gui = self.gui or GuiCreate()
|
self.gui = self.gui or GuiCreate()
|
||||||
local gui = self.gui
|
local gui = self.gui
|
||||||
@ -143,6 +175,7 @@ function UI:Draw()
|
|||||||
|
|
||||||
self:_DrawToolbar()
|
self:_DrawToolbar()
|
||||||
self:_DrawMessages(Message.List)
|
self:_DrawMessages(Message.List)
|
||||||
|
self:_DrawProgress()
|
||||||
|
|
||||||
GuiIdPop(gui)
|
GuiIdPop(gui)
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user