Make Cursor widget prefix and coordinate types configurable

e.g. the old behavior can be restored with "coords_type": "mouse_ui" and
"coords_short": true
develop
lethosor 2022-12-01 00:08:56 -05:00
parent ab8632cb7e
commit 40f3a3333e
No known key found for this signature in database
GPG Key ID: 76A269552F4F58C1
1 changed files with 40 additions and 12 deletions

@ -3,6 +3,7 @@ local _ENV = mkmodule('plugins.dwarfmonitor')
local json = require('json')
local guidm = require('gui.dwarfmode')
local overlay = require('plugins.overlay')
local utils = require('utils')
local DWARFMONITOR_CONFIG_FILE = 'dfhack-config/dwarfmonitor.json'
@ -150,23 +151,50 @@ CursorWidget = defclass(CursorWidget, overlay.OverlayWidget)
CursorWidget.ATTRS{
default_pos={x=2,y=-4},
viewscreens={'dungeonmode', 'dwarfmode'},
type='all',
short=false,
}
function CursorWidget:onRenderBody(dc)
local screenx, screeny = dfhack.screen.getMousePos()
local mouse_map = dfhack.gui.getMousePos()
local keyboard_map = guidm.getCursorPos()
CursorWidget.COORD_TYPES = utils.OrderedTable()
CursorWidget.COORD_TYPES.mouse_ui = {
description = 'mouse UI grid',
get_coords = function()
return xyz2pos(dfhack.screen.getMousePos())
end,
}
CursorWidget.COORD_TYPES.mouse_map = {
description = 'mouse map coord',
get_coords = dfhack.gui.getMousePos,
}
CursorWidget.COORD_TYPES.keyboard_map = {
description = 'kbd cursor coord',
get_coords = guidm.getCursorPos,
}
local text = {}
table.insert(text, ('mouse UI grid (%d,%d)'):format(screenx, screeny))
if mouse_map then
table.insert(text, ('mouse map coord (%d,%d,%d)')
:format(mouse_map.x, mouse_map.y, mouse_map.z))
function CursorWidget:init()
local ok, config = pcall(json.decode_file, DWARFMONITOR_CONFIG_FILE)
if ok then
self.type = tostring(config.coords_type or self.type)
self.short = config.coords_short
else
dfhack.printerr(('Failed to load %s: %s'):format(DWARFMONITOR_CONFIG_FILE, config))
end
if keyboard_map then
table.insert(text, ('kbd cursor coord (%d,%d,%d)')
:format(keyboard_map.x, keyboard_map.y, keyboard_map.z))
end
function CursorWidget:onRenderBody(dc)
local text = {}
for k, v in pairs(CursorWidget.COORD_TYPES) do
-- fall back to 'all' behavior if type isn't recognized
if k == self.type or not CursorWidget.COORD_TYPES[self.type] then
local coords = v.get_coords()
if coords then
local prefix = self.short and '' or (v.description .. ' ')
local coord_str = table.concat({coords.x, coords.y, coords.z}, ',')
table.insert(text, ('%s(%s)'):format(prefix, coord_str))
end
end
end
local width = 0
for i,line in ipairs(text) do
dc:seek(0, i-1):string(line)