----------------------------- -- Levak ©2011 -------------- -- http://levak.free.fr/ ---- -- levak92@gmail.com -------- ----------------------------- ------ Screen Manager Screen = class() function Screen:init() end -- virtual functions to override function Screen:paint(gc) end function Screen:timer() end function Screen:charIn(ch) end function Screen:arrowKey(key) end function Screen:escapeKey() end function Screen:enterKey() end function Screen:tabKey() end function Screen:contextMenu() end function Screen:backtabKey() end function Screen:backspaceKey() end function Screen:clearKey() end function Screen:mouseMove(x, y) end function Screen:mouseDown(x, y) end function Screen:mouseUp() end function Screen:rightMouseDown(x, y) end function Screen:deactivate() end function Screen:activate() end function Screen:help() end local Screens = {} function SwitchMode(n) PullScreen() if n == 0 then PushScreen(Make3D) elseif n == 1 then PushScreen(PropertiesScreen) end mode = n end function PushScreen(screen) table.insert(Screens, screen) platform.window:invalidate() end function PullScreen() if #Screens > 0 then table.remove(Screens) platform.window:invalidate() end end function DrawSreens(gc) for _, screen in ipairs(Screens) do screen:paint(gc) end if isWideScreen then for _,button in pairs(Buttons) do button:paint(gc) end end end function activeScreen() return Screens[#Screens] and Screens[#Screens] or Screen end -- Link events to ScreenManager function on.paint(gc) DrawSreens(gc) end function on.timer() for _, screen in pairs(Screens) do screen:timer() end end function on.charIn(ch) if ch == " " then PushScreen(ContextMenu) else activeScreen():charIn(ch) end end function on.arrowKey(key) activeScreen():arrowKey(key) end function on.escapeKey() activeScreen():escapeKey() end function on.enterKey() activeScreen():enterKey() end function on.tabKey() activeScreen():tabKey() end function on.contextMenu() activeScreen():contextMenu() end function on.backtabKey() activeScreen():backtabKey() end function on.backspaceKey() activeScreen():backspaceKey() end function on.clearKey() activeScreen():clearKey() end function on.mouseDown(x, y) -- tricky part of optimisation. -- I love this way of mind local active = false for _, button in pairs(Buttons) do -- iter over each access buttons if button:isActive(x, y) then button.fun(activeScreen()) active = true break -- exit after one found button end end if not active then activeScreen():mouseDown(x, y) end end function on.mouseUp() activeScreen():mouseUp() end function on.mouseMove(x, y) activeScreen():mouseMove(x, y) end function on.rightMouseDown(x, y) activeScreen():rightMouseDown(x, y) end function on.help() activeScreen():help() end function on.resize() local gc = platform.gc() gc:begin() initFonts(gc) initView() initGUI() gc:finish() end function on.deactivate() activeScreen():deactivate() end function on.activate() activeScreen():activate() end function on.varChange(list) for k, v in pairs(list) do local explode = v:explode("%.") local objId = getObjectId(explode[1]) print(v, explode[1], explode[2]) if explode[1] == "make3d" then if explode[2] == "objlist" then objList = {} for _, obj in pairs(var.recall(v)) do loadObj(obj) end elseif explode[2] == "selectedobj" then selectedObj = var.recall(v) elseif explode[2] == "selectedobjlist" then selectedObjList = var.recall(v) end elseif objId then local temp = var.recall(v) if temp then if explode[2] == "points" then local newValue, err = loadPoints(explode[1]) if not err then objList[objId]["points"] = newValue else PushScreen(Request("Error", err, nil, 0, nil, function() end)) end elseif explode[2] == "name" then local newName = FixName(temp) if newName ~= temp then var.store(v, newName) end objList[objId]["name"] = newName else objList[objId][explode[2]] = temp end else if table.contains(var.recall("make3d.objList"), explode[2]) then deleteObj(objId) end var.unmonitor(v) end end end return 0 end function on.save() return {animating, ortho, displayLabels, viewType, mode, animTimer, animInc, xrot, yrot, zrot, zoff} end