add functions to Panel in addition to attributes

develop
Myk Taylor 2023-08-07 17:02:55 -07:00
parent 3b677854ff
commit 8bff1399d4
No known key found for this signature in database
3 changed files with 38 additions and 8 deletions

@ -71,6 +71,7 @@ Template for new versions:
- ``new()``: improved error handling so that certain errors that were previously uncatchable (creating objects with members with unknown vtables) are now catchable with ``pcall()`` - ``new()``: improved error handling so that certain errors that were previously uncatchable (creating objects with members with unknown vtables) are now catchable with ``pcall()``
- ``dfhack.items.getValue()``: remove ``caravan_buying`` param as per C++ API change - ``dfhack.items.getValue()``: remove ``caravan_buying`` param as per C++ API change
- ``widgets.BannerPanel``: panel with distinctive border for marking DFHack UI elements on otherwise vanilla screens - ``widgets.BannerPanel``: panel with distinctive border for marking DFHack UI elements on otherwise vanilla screens
- ``widgets.Panel``: new functions to override instead of setting corresponding properties (useful when subclassing instead of just setting attributes): ``onDragBegin``, ``onDragEnd``, ``onResizeBegin``, ``onResizeEnd``
## Removed ## Removed

@ -4559,7 +4559,7 @@ Has attributes:
* ``drag_anchors = {}`` (default: ``{title=true, frame=false/true, body=true}``) * ``drag_anchors = {}`` (default: ``{title=true, frame=false/true, body=true}``)
* ``drag_bound = 'frame' or 'body'`` (default: ``'frame'``) * ``drag_bound = 'frame' or 'body'`` (default: ``'frame'``)
* ``on_drag_begin = function()`` (default: ``nil``) * ``on_drag_begin = function()`` (default: ``nil``)
* ``on_drag_end = function(bool)`` (default: ``nil``) * ``on_drag_end = function(success, new_frame)`` (default: ``nil``)
If ``draggable`` is set to ``true``, then the above attributes come into play If ``draggable`` is set to ``true``, then the above attributes come into play
when the panel is dragged around the screen, either with the mouse or the when the panel is dragged around the screen, either with the mouse or the
@ -4573,13 +4573,15 @@ Has attributes:
otherwise. Dragging can be canceled by right clicking while dragging with the otherwise. Dragging can be canceled by right clicking while dragging with the
mouse, hitting :kbd:`Esc` (while dragging with the mouse or keyboard), or by mouse, hitting :kbd:`Esc` (while dragging with the mouse or keyboard), or by
calling ``Panel:setKeyboaredDragEnabled(false)`` (while dragging with the calling ``Panel:setKeyboaredDragEnabled(false)`` (while dragging with the
keyboard). keyboard). If it is more convenient to do so, you can choose to override the
``panel:onDragBegin`` and/or the ``panel:onDragEnd`` methods instead of
setting the ``on_drag_begin`` and/or ``on_drag_end`` attributes.
* ``resizable = bool`` (default: ``false``) * ``resizable = bool`` (default: ``false``)
* ``resize_anchors = {}`` (default: ``{t=false, l=true, r=true, b=true}`` * ``resize_anchors = {}`` (default: ``{t=false, l=true, r=true, b=true}``
* ``resize_min = {}`` (default: w and h from the ``frame``, or ``{w=5, h=5}``) * ``resize_min = {}`` (default: w and h from the ``frame``, or ``{w=5, h=5}``)
* ``on_resize_begin = function()`` (default: ``nil``) * ``on_resize_begin = function()`` (default: ``nil``)
* ``on_resize_end = function(bool)`` (default: ``nil``) * ``on_resize_end = function(success, new_frame)`` (default: ``nil``)
If ``resizable`` is set to ``true``, then the player can click the mouse on If ``resizable`` is set to ``true``, then the player can click the mouse on
any edge specified in ``resize_anchors`` and drag the border to resize the any edge specified in ``resize_anchors`` and drag the border to resize the
@ -4593,6 +4595,9 @@ Has attributes:
Dragging can be canceled by right clicking while resizing with the mouse, Dragging can be canceled by right clicking while resizing with the mouse,
hitting :kbd:`Esc` (while resizing with the mouse or keyboard), or by calling hitting :kbd:`Esc` (while resizing with the mouse or keyboard), or by calling
``Panel:setKeyboardResizeEnabled(false)`` (while resizing with the keyboard). ``Panel:setKeyboardResizeEnabled(false)`` (while resizing with the keyboard).
If it is more convenient to do so, you can choose to override the
``panel:onResizeBegin`` and/or the ``panel:onResizeEnd`` methods instead of
setting the ``on_resize_begin`` and/or ``on_resize_end`` attributes.
* ``autoarrange_subviews = bool`` (default: ``false``) * ``autoarrange_subviews = bool`` (default: ``false``)
* ``autoarrange_gap = int`` (default: ``0``) * ``autoarrange_gap = int`` (default: ``0``)
@ -4637,6 +4642,15 @@ Has functions:
commit the new window size or :kbd:`Esc` to cancel. If resizing is canceled, commit the new window size or :kbd:`Esc` to cancel. If resizing is canceled,
then the window size from before the resize operation is restored. then the window size from before the resize operation is restored.
* ``panel:onDragBegin()``
* ``panel:onDragEnd(success, new_frame)``
* ``panel:onResizeBegin()``
* ``panel:onResizeEnd(success, new_frame)``
The default implementations of these methods call the associated attribute (if
set). You can override them in a subclass if that is more convenient than
setting the attributes.
Double clicking: Double clicking:
If the panel is resizable and the user double-clicks on the top edge (the frame If the panel is resizable and the user double-clicks on the top edge (the frame

@ -6,7 +6,6 @@ local gui = require('gui')
local guidm = require('gui.dwarfmode') local guidm = require('gui.dwarfmode')
local utils = require('utils') local utils = require('utils')
local dscreen = dfhack.screen
local getval = utils.getval local getval = utils.getval
local to_pen = dfhack.pen.parse local to_pen = dfhack.pen.parse
@ -223,9 +222,9 @@ local function Panel_begin_drag(self, drag_offset, resize_edge)
self.prev_focus_owner = self.focus_group.cur self.prev_focus_owner = self.focus_group.cur
self:setFocus(true) self:setFocus(true)
if self.resize_edge then if self.resize_edge then
if self.on_resize_begin then self.on_resize_begin(success) end self:onResizeBegin()
else else
if self.on_drag_begin then self.on_drag_begin(success) end self:onDragBegin()
end end
end end
@ -239,9 +238,9 @@ local function Panel_end_drag(self, frame, success)
local resize_edge = self.resize_edge local resize_edge = self.resize_edge
Panel_update_frame(self, frame, true) Panel_update_frame(self, frame, true)
if resize_edge then if resize_edge then
if self.on_resize_end then self.on_resize_end(success) end self:onResizeEnd(success, self.frame)
else else
if self.on_drag_end then self.on_drag_end(success) end self:onDragEnd(success, self.frame)
end end
end end
@ -495,6 +494,22 @@ function Panel:onRenderFrame(dc, rect)
end end
end end
function Panel:onDragBegin()
if self.on_drag_begin then self.on_drag_begin() end
end
function Panel:onDragEnd(success, new_frame)
if self.on_drag_end then self.on_drag_end(success, new_frame) end
end
function Panel:onResizeBegin()
if self.on_resize_begin then self.on_resize_begin() end
end
function Panel:onResizeEnd(success, new_frame)
if self.on_resize_end then self.on_resize_end(success, new_frame) end
end
------------ ------------
-- Window -- -- Window --
------------ ------------