dfhack/library/lua/gui/dwarfmode.lua

120 lines
3.3 KiB
Lua

-- Support for messing with the dwarfmode screen
local _ENV = mkmodule('gui.dwarfmode')
local gui = require('gui')
local dscreen = dfhack.screen
AREA_MAP_WIDTH = 23
MENU_WIDTH = 30
function getPanelLayout()
local sw, sh = dscreen.getWindowSize()
local view_height = sh-2
local view_rb = sw-1
local area_x2 = sw-AREA_MAP_WIDTH-2
local menu_x2 = sw-MENU_WIDTH-2
local menu_x1 = area_x2-MENU_WIDTH-1
local area_pos = df.global.ui_area_map_width
local menu_pos = df.global.ui_menu_width
local rv = {}
if area_pos < 3 then
rv.area_map = gui.mkdims_xy(area_x2+1,1,view_rb-1,view_height)
view_rb = area_x2
end
if menu_pos < area_pos or df.global.ui.main.mode ~= 0 then
if menu_pos >= area_pos then
rv.menu_forced = true
menu_pos = area_pos-1
end
local menu_x = menu_x2
if menu_pos < 2 then menu_x = menu_x1 end
rv.menu = gui.mkdims_xy(menu_x+1,1,view_rb-1,view_height)
view_rb = menu_x
end
rv.area_pos = area_pos
rv.menu_pos = menu_pos
rv.map = gui.mkdims_xy(1,1,view_rb-1,view_height)
return rv
end
function getViewportPos()
return {
x = df.global.window_x,
y = df.global.window_y,
z = df.global.window_z
}
end
function getCursorPos()
return copyall(df.global.cursor)
end
function setCursorPos(cursor)
df.global.cursor = cursor
end
function setViewportPos(layout,view)
local map = df.global.world.map
df.global.window_x = math.max(0, math.min(view.x, map.x_count-layout.map.width))
df.global.window_y = math.max(0, math.min(view.y, map.y_count-layout.map.height))
df.global.window_z = math.max(0, math.min(view.z, map.z_count-1))
return getViewportPos()
end
function centerViewportOn(layout,target)
local mapsz = layout.map
local view = xyz2pos(
target.x-math.floor(layout.map.width/2),
target.y-math.floor(layout.map.height/2),
target.z
)
return setViewportPos(layout, view)
end
function isInViewport(layout,view,target,gap)
gap = gap or 0
return target.x-gap >= view.x and target.x+gap < view.x+layout.map.width
and target.y-gap >= view.y and target.y+gap < view.y+layout.map.height
and target.z == view.z
end
DwarfOverlay = defclass(DwarfOverlay, gui.Screen)
function DwarfOverlay:updateLayout()
self.df_layout = getPanelLayout()
self.df_viewport = getViewportPos()
self.df_cursor = getCursorPos()
end
local move_keys = {
'CURSOR_UP', 'CURSOR_DOWN', 'CURSOR_LEFT', 'CURSOR_RIGHT',
'CURSOR_UPLEFT', 'CURSOR_UPRIGHT', 'CURSOR_DOWNLEFT', 'CURSOR_DOWNRIGHT',
'CURSOR_UP_FAST', 'CURSOR_DOWN_FAST', 'CURSOR_LEFT_FAST', 'CURSOR_RIGHT_FAST',
'CURSOR_UPLEFT_FAST', 'CURSOR_UPRIGHT_FAST', 'CURSOR_DOWNLEFT_FAST', 'CURSOR_DOWNRIGHT_FAST',
'CURSOR_UP_Z', 'CURSOR_DOWN_Z', 'CURSOR_UP_Z_AUX', 'CURSOR_DOWN_Z_AUX'
}
function DwarfOverlay:propagateMoveKeys(keys)
for _,v in ipairs(move_keys) do
if keys[v] then
self:inputToParent(v)
return
end
end
end
function DwarfOverlay:onIdle()
dscreen.invalidate()
end
function DwarfOverlay:clearMenu()
local menu = self.df_layout.menu
if not menu then return nil end
dscreen.fillRect(gui.CLEAR_PEN,menu.x1,menu.y1,menu.x2,menu.y2)
return menu.x1,menu.y1,menu.width,menu.height
end
return _ENV