Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local Frames = {}
- local CurrentFrame = 0
- local Versions = {}
- local CurrentVersion = 0
- function Canvas:addFrame()
- local key = tostring(math.random()):sub(3)
- local img = image(Canvas.width, Canvas.height) -- Create new empty image
- CurrentFrame = CurrentFrame + 1
- saveImage("Documents:Pixelboy_"..key, img)
- table.insert(Frames, CurrentFrame, key)
- Version:saveState()
- end
- function Canvas:deleteFrame(frame)
- frame = frame or CurrentFrame
- if frame <= #Frames then
- table.remove(Frames, CurrentFrame, frame)
- CurrentFrame = math.max(CurrentFrame - 1, 1)
- if #Frames == 0 then
- CurrentFrame = 0
- Canvas:addFrame()
- else
- Version:saveState()
- end
- end
- end
- -- Delete all data from previous project session
- function Version:clearAll()
- local list = assetList("Documents")
- for id, imgKey in ipairs(list) do
- if imgKey:find("Pixelboy_") then
- saveImage("Documents:"..imgKey, nil)
- end
- end
- end
- function Version:saveState()
- -- Lua memory storage is restricted to ~4MB = 4096Kb on iPad. If Versions stack rises to high, lower it (this also cleans "Documents")
- while #Versions > 1 and collectgarbage("count") > 4096 do
- local whitelist = table.concat(Versions[2].Frames, " ")
- for imgKey, _ in pairs(Versions[1].Frames) do
- if not whitelist:find(imgKey) then
- saveImage("Documents:Pixelboy_"..imgKey, nil)
- end
- end
- table.remove(Versions, 1)
- collectgarbage()
- end
- -- Undid some Versions until CurrentVersion -> Delete all redundant Versions from stack until #Versions
- if CurrentVersion then
- local whitelist = table.concat(Versions[CurrentVersion].Frames, " ")
- for id = CurrentVersion + 1, #Versions do
- for imgKey, pos in pairs(Versions[id].Frames) do
- if pos > 1 and not whitelist:find(imgKey) then
- saveImage("Documents:Pixelboy_"..imgKey, nil)
- end
- end
- Versions[id] = nil
- end
- CurrentVersion = nil
- end
- -- Add new Version to the stack
- local frames = {}
- for pos, imgKey in ipairs(Frames) do
- frames[imgKey] = pos
- end
- table.insert(Versions, {CurrentFrame = CurrentFrame, Frames = frames})
- end
- function Version:restoreState()
- if CurrentVersion then
- local action = Versions[CurrentVersion]
- CurrentFrame = action.CurrentFrame
- Frames = {}
- for imgKey, pos in pairs(action.Frames) do
- Frames[pos] = imgKey
- end
- Canvas.image = readImage("Documents:Pixelboy_"..Frames[CurrentFrame])
- end
- end
- function Version:undo()
- if #Versions > 0 then
- CurrentVersion = math.max((CurrentVersion or #Versions) - 1, 1)
- Version:restoreState()
- end
- end
- function Version:redo()
- if CurrentVersion then
- CurrentVersion = math.min(CurrentVersion + 1, #Versions)
- Version:restoreState()
- if CurrentVersion == #Versions then CurrentVersion = nil end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement