summaryrefslogtreecommitdiff
path: root/library/lua
diff options
context:
space:
mode:
authorAlexander Gavrilov2012-08-24 13:28:34 +0400
committerAlexander Gavrilov2012-08-24 13:28:34 +0400
commit296f82b02fcd0801d6614bb45da05c88ed7c88d2 (patch)
tree4d13745e4d88ea48a9fb7168abf832d740a7dec6 /library/lua
parente825dc5ddb1f2c0798b571ebcb02a52e184fc689 (diff)
downloaddfhack-296f82b02fcd0801d6614bb45da05c88ed7c88d2.tar.gz
dfhack-296f82b02fcd0801d6614bb45da05c88ed7c88d2.tar.bz2
dfhack-296f82b02fcd0801d6614bb45da05c88ed7c88d2.tar.xz
Try using the Objective-C 'alloc + init' idiom for lua screen objects.
Diffstat (limited to 'library/lua')
-rw-r--r--library/lua/dfhack.lua26
-rw-r--r--library/lua/gui.lua57
-rw-r--r--library/lua/gui/dwarfmode.lua17
3 files changed, 72 insertions, 28 deletions
diff --git a/library/lua/dfhack.lua b/library/lua/dfhack.lua
index 5699e8a2..2cbd019a 100644
--- a/library/lua/dfhack.lua
+++ b/library/lua/dfhack.lua
@@ -104,11 +104,21 @@ end
-- Trivial classes
+function rawset_default(target,source)
+ for k,v in pairs(source) do
+ if rawget(target,k) == nil then
+ rawset(target,k,v)
+ end
+ end
+end
+
function defclass(class,parent)
class = class or {}
- rawset(class, '__index', rawget(class, '__index') or class)
+ rawset_default(class, { __index = class })
if parent then
setmetatable(class, parent)
+ else
+ rawset_default(class, { init_fields = rawset_default })
end
return class
end
@@ -153,14 +163,6 @@ function xyz2pos(x,y,z)
end
end
-function rawset_default(target,source)
- for k,v in pairs(source) do
- if rawget(target,k) == nil then
- rawset(target,k,v)
- end
- end
-end
-
function safe_index(obj,idx,...)
if obj == nil or idx == nil then
return nil
@@ -202,12 +204,6 @@ function dfhack.buildings.getSize(bld)
return bld.x2+1-x, bld.y2+1-y, bld.centerx-x, bld.centery-y
end
-dfhack.screen.__index = dfhack.screen
-
-function dfhack.screen:__tostring()
- return "<lua viewscreen: "..tostring(self._native)..">"
-end
-
-- Interactive
local print_banner = true
diff --git a/library/lua/gui.lua b/library/lua/gui.lua
index 62e393f0..ac032166 100644
--- a/library/lua/gui.lua
+++ b/library/lua/gui.lua
@@ -4,6 +4,8 @@ local _ENV = mkmodule('gui')
local dscreen = dfhack.screen
+USE_GRAPHICS = dscreen.inGraphicsMode()
+
CLEAR_PEN = {ch=32,fg=0,bg=0}
function simulateInput(screen,...)
@@ -52,6 +54,9 @@ function inset(rect,dx1,dy1,dx2,dy2)
rect.x2-(dx2 or dx1), rect.y2-(dy2 or dy1)
)
end
+function is_in_rect(rect,x,y)
+ return x and y and x >= rect.x1 and x <= rect.x2 and y >= rect.y1 and y <= rect.y2
+end
local function to_pen(default, pen, bg, bold)
if pen == nil then
@@ -201,10 +206,17 @@ end
-- Base screen object --
------------------------
-Screen = defclass(Screen, dfhack.screen)
+Screen = defclass(Screen)
Screen.text_input_mode = false
+function Screen:init()
+ self:updateLayout()
+ return self
+end
+
+Screen.isDismissed = dscreen.isDismissed
+
function Screen:isShown()
return self._native ~= nil
end
@@ -213,6 +225,18 @@ function Screen:isActive()
return self:isShown() and not self:isDismissed()
end
+function Screen:invalidate()
+ dscreen.invalidate()
+end
+
+function Screen:getWindowSize()
+ return dscreen.getWindowSize()
+end
+
+function Screen:getMousePos()
+ return dscreen.getMousePos()
+end
+
function Screen:renderParent()
if self._native and self._native.parent then
self._native.parent:render()
@@ -241,6 +265,7 @@ function Screen:onAboutToShow()
end
function Screen:onShow()
+ self:updateLayout()
end
function Screen:dismiss()
@@ -252,6 +277,13 @@ end
function Screen:onDismiss()
end
+function Screen:onResize(w,h)
+ self:updateLayout()
+end
+
+function Screen:updateLayout()
+end
+
------------------------
-- Framed screen object --
------------------------
@@ -318,7 +350,8 @@ local function hint_coord(gap,hint)
end
end
-function FramedScreen:updateFrameSize(sw,sh)
+function FramedScreen:updateFrameSize()
+ local sw, sh = dscreen.getWindowSize()
local iw, ih = sw-2, sh-2
local width = math.min(self.frame_width or iw, iw)
local height = math.min(self.frame_height or ih, ih)
@@ -328,8 +361,21 @@ function FramedScreen:updateFrameSize(sw,sh)
self.frame_opaque = (gw == 0 and gh == 0)
end
-function FramedScreen:onResize(w,h)
- self:updateFrameSize(w,h)
+function FramedScreen:updateLayout()
+ self:updateFrameSize()
+end
+
+function FramedScreen:getWindowSize()
+ local rect = self.frame_rect
+ return rect.width, rect.height
+end
+
+function FramedScreen:getMousePos()
+ local rect = self.frame_rect
+ local x,y = dscreen.getMousePos()
+ if is_in_rect(rect,x,y) then
+ return x-rect.x1, y-rect.y1
+ end
end
function FramedScreen:onRender()
@@ -348,4 +394,7 @@ function FramedScreen:onRender()
self:onRenderBody(Painter.new(rect))
end
+function FramedScreen:onRenderBody(dc)
+end
+
return _ENV
diff --git a/library/lua/gui/dwarfmode.lua b/library/lua/gui/dwarfmode.lua
index dde5225a..b5ffa728 100644
--- a/library/lua/gui/dwarfmode.lua
+++ b/library/lua/gui/dwarfmode.lua
@@ -179,14 +179,6 @@ function DwarfOverlay:updateLayout()
self.df_layout = getPanelLayout()
end
-function DwarfOverlay:onShown()
- self:updateLayout()
-end
-
-function DwarfOverlay:onResize(w,h)
- self:updateLayout()
-end
-
function DwarfOverlay:getViewport(old_vp)
if old_vp then
return old_vp:resize(self.df_layout)
@@ -238,6 +230,14 @@ end
MenuOverlay = defclass(MenuOverlay, DwarfOverlay)
+function MenuOverlay:updateLayout()
+ DwarfOverlay.updateLayout(self)
+ self.frame_rect = self.df_layout.menu
+end
+
+MenuOverlay.getWindowSize = gui.FramedScreen.getWindowSize
+MenuOverlay.getMousePos = gui.FramedScreen.getMousePos
+
function MenuOverlay:onAboutToShow(below)
DwarfOverlay.onAboutToShow(self,below)
@@ -249,7 +249,6 @@ end
function MenuOverlay:onRender()
self:renderParent()
- self:updateLayout()
local menu = self.df_layout.menu
if menu then