Merge pull request #2452 from lethosor/dwarfmonitor-cursor-widget-config

Dwarfmonitor cursor widget config
develop
Myk 2022-12-01 11:49:17 -08:00 committed by GitHub
commit e7ca1cb0c1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 73 additions and 20 deletions

@ -35,15 +35,40 @@ screen with the `overlay` framework:
They can be enabled or disable via the `overlay` command.
The :file:`dfhack-config/dwarfmonitor.json` file can be edited to specify the
format for the ``dwarfmonitor.date`` widget:
The :file:`dfhack-config/dwarfmonitor.json` file can be edited to change widget
configuration with any of the following fields:
* ``Y`` or ``y``: The current year
* ``M``: The current month, zero-padded if necessary
* ``m``: The current month, *not* zero-padded
* ``D``: The current day, zero-padded if necessary
* ``d``: The current day, *not* zero-padded
* ``date_format`` (string): format for the ``dwarfmonitor.date`` widget:
The default date format is ``Y-M-D``, per the ISO8601_ standard.
* ``Y`` or ``y``: The current year
* ``M``: The current month, zero-padded if necessary
* ``m``: The current month, *not* zero-padded
* ``D``: The current day, zero-padded if necessary
* ``d``: The current day, *not* zero-padded
The default date format is ``Y-M-D``, per the ISO8601_ standard.
* ``coords_type`` (string): the coordinate type to show in the ``dwarfmonitor.cursor`` widget:
* ``all`` (the default): show all of the coordinate types listed here
* ``mouse_ui``: the X/Y UI coordinates of the tile the mouse is positioned over
* ``mouse_map``: the X/Y/Z map coordinates of the tile the mouse is
positioned over (only if over the map)
* ``keyboard_map``: the X/Y/Z map coordinates of the tile selected by the
keyboard-controlled ``X`` cursor in DF (if active)
* ``coords_short`` (boolean, default: ``false``): if ``true``, hides explanatory
text from the ``dwarfmonitor.cursor`` widget, and only shows coordinates as
``(X,Y,Z)``
Example configuration file:
.. code-block:: json
{
"date_format": "m/d/y",
"coords_type": "mouse_map",
"coords_short": false
}
.. _ISO8601: https://en.wikipedia.org/wiki/ISO_8601

@ -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)