Skip to content

Commit 55d3acd

Browse files
committed
gui/mass-remove.toolbar: compatibility with released default_pos; roll back the fancier positioning
Now that this overlay has been released (51.09-r1), it is important to go back to a default_pos that matches the released value. This prevents a "jump" in positioning when trying this code after having used the mainline version. If a overlay version change is done in the future, it would probably make sense to reset the default position to a value that lets the overlay be moved all the way to the left. Beyond that, rollback the fancier "apply the same idea in all directions" code to make the code easier to compare with the what is on master. That stuff is probably at least worth thinking about, but not as a part of simply demonstrating how the "toolbar" library could be used for toolbar-relative positioning.
1 parent dc3836e commit 55d3acd

File tree

1 file changed

+73
-75
lines changed

1 file changed

+73
-75
lines changed

gui/mass-remove.lua

Lines changed: 73 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -399,25 +399,33 @@ end
399399
-- MassRemoveToolbarOverlay
400400
--
401401

402-
-- The overlay is positioned so that (by default) its button is placed next to
403-
-- the right-most button of the secondary toolbar displayed for the "erase" tool
402+
-- The overlay is positioned (by default) so that, no matter what size interface
403+
-- is being used, the overlay's button is placed one column to the right of the
404+
-- right-most button of the secondary toolbar displayed for the "erase" tool
404405
-- (used to remove designations).
405406

406407
-- This would be straightforward in a full_interface overlay (just set its
407-
-- l/r/t/b frame positioning fields). However, to preserve player-positioning,
408-
-- we take a more circuitous route.
409-
410-
-- In a minimum-size interface area, the player is allowed to place the overlay
411-
-- (a combination of the button and the tooltip) anywhere inside the interface
412-
-- area. When the interface area is resized (usually through window resizes, but
413-
-- also through interface percentage changes), placement is maintained relative
414-
-- to the "ideal" position of the button (i.e. positions are relative to the
415-
-- "ideal" position). When repositioning the overlay in a larger-than-minimum
416-
-- interface area the overlays size is artificially inflated so that the overlay
417-
-- can not be positioned (with respect to the "ideal" button position) farther
418-
-- away than is possible in a minimum-size interface area. This limits the
419-
-- positioning, but keeps the (relative) position consistent across all possible
420-
-- resizes.
408+
-- l/r/t/b frame positioning fields based on the "erase" toolbar's position).
409+
-- However, to preserve player-positioning, we take a more circuitous route.
410+
411+
-- Usually, the player-configured positions are relative to the edges of the DF
412+
-- interface area. But because the button of this overlay needs to "stick with"
413+
-- the rest of the toolbar buttons, the player-configured positioning is
414+
-- reinterpreted a bit.
415+
416+
-- The offset between the overlay's default position and its player-configured
417+
-- position is used as the overlay's effective offset from its "ideal" position.
418+
-- This "effective offset" is realized by updating the overlay's width, not its
419+
-- position (which we leave in the hands of the overlay system, under player
420+
-- control). When combined with the player-configured position, this results in
421+
-- translating the overlay position to be relative to its "ideal" position so
422+
-- that the overlay "moves with" the rest of the toolbar buttons, but still
423+
-- allows for player customization.
424+
425+
-- Note: This "position reinterpretation" currently only works when the overlay
426+
-- is anchored to the left and bottom edges of the interface area. If the
427+
-- overlay is player-reconfigured to be anchored to the right or top edges, it
428+
-- will result in normal edge-relative positioning.
421429

422430
local tb = reqscript('internal/df-bottom-toolbars')
423431

@@ -438,12 +446,17 @@ local function mass_remove_button_offsets(interface_rect)
438446
}
439447
end
440448

441-
local MR_MIN_OFFSETS = mass_remove_button_offsets(tb.MINIMUM_INTERFACE_RECT)
449+
-- This value is compatible with the initial release of the overlay, but it not
450+
-- the actual left-offset of this overlay; if bumping overlay version, this
451+
-- could be changed to mass_remove_button_offsets(tb.MINIMUM_INTERFACE_RECT).l
452+
-- Adopting the calculated value would let the overlay be moved all the way to
453+
-- the left (in a minimum-size interface).
454+
local MR_DEFAULT_OFFSET = 41
442455

443456
MassRemoveToolbarOverlay = defclass(MassRemoveToolbarOverlay, overlay.OverlayWidget)
444457
MassRemoveToolbarOverlay.ATTRS{
445458
desc='Adds a button to the erase toolbar to open the mass removal tool.',
446-
default_pos={x=MR_MIN_OFFSETS.l+1, y=-(MR_MIN_OFFSETS.b+1)},
459+
default_pos={x=MR_DEFAULT_OFFSET+1, y=-(tb.TOOLBAR_HEIGHT+1)},
447460
default_enabled=true,
448461
viewscreens='dwarfmode/Designate/ERASE',
449462
frame={w=MR_WIDTH, h=MR_HEIGHT},
@@ -458,57 +471,51 @@ function MassRemoveToolbarOverlay:init()
458471

459472
self:addviews{
460473
widgets.Panel{
461-
view_id='tt_and_icon',
462-
frame={ r=0, t=0, w=MR_WIDTH, h=MR_HEIGHT },
463-
subviews={
464-
widgets.Panel{
465-
frame={t=0, l=0, w=MR_WIDTH, h=MR_TOOLTIP_HEIGHT},
466-
frame_style=gui.FRAME_PANEL,
467-
frame_background=gui.CLEAR_PEN,
468-
frame_inset={l=1, r=1},
469-
visible=function() return self.subviews.icon:getMousePos() end,
470-
subviews={
471-
widgets.Label{
472-
text={
473-
'Open mass removal', NEWLINE,
474-
'interface.', NEWLINE,
475-
NEWLINE,
476-
{text='Hotkey: ', pen=COLOR_GRAY}, {key='CUSTOM_M'},
477-
},
478-
},
474+
frame={t=0, r=0, w=MR_WIDTH, h=MR_TOOLTIP_HEIGHT},
475+
frame_style=gui.FRAME_PANEL,
476+
frame_background=gui.CLEAR_PEN,
477+
frame_inset={l=1, r=1},
478+
visible=function() return self.subviews.icon:getMousePos() end,
479+
subviews={
480+
widgets.Label{
481+
text={
482+
'Open mass removal', NEWLINE,
483+
'interface.', NEWLINE,
484+
NEWLINE,
485+
{text='Hotkey: ', pen=COLOR_GRAY}, {key='CUSTOM_M'},
479486
},
480487
},
481-
widgets.Panel{
482-
view_id='icon',
483-
frame={b=0, l=0, w=MR_BUTTON_WIDTH, h=tb.SECONDARY_TOOLBAR_HEIGHT},
484-
subviews={
485-
widgets.Label{
486-
text=widgets.makeButtonLabelText{
487-
chars=button_chars,
488-
pens=COLOR_GRAY,
489-
tileset=toolbar_textures,
490-
tileset_offset=1,
491-
tileset_stride=8,
492-
},
493-
on_click=launch_mass_remove,
494-
visible=function () return not self.subviews.icon:getMousePos() end,
495-
},
496-
widgets.Label{
497-
text=widgets.makeButtonLabelText{
498-
chars=button_chars,
499-
pens={
500-
{COLOR_WHITE, COLOR_WHITE, COLOR_WHITE, COLOR_WHITE},
501-
{COLOR_WHITE, COLOR_GRAY, COLOR_GRAY, COLOR_WHITE},
502-
{COLOR_WHITE, COLOR_WHITE, COLOR_WHITE, COLOR_WHITE},
503-
},
504-
tileset=toolbar_textures,
505-
tileset_offset=5,
506-
tileset_stride=8,
507-
},
508-
on_click=launch_mass_remove,
509-
visible=function() return self.subviews.icon:getMousePos() end,
488+
},
489+
},
490+
widgets.Panel{
491+
view_id='icon',
492+
frame={b=0, r=0, w=MR_WIDTH, h=tb.SECONDARY_TOOLBAR_HEIGHT},
493+
subviews={
494+
widgets.Label{
495+
text=widgets.makeButtonLabelText{
496+
chars=button_chars,
497+
pens=COLOR_GRAY,
498+
tileset=toolbar_textures,
499+
tileset_offset=1,
500+
tileset_stride=8,
501+
},
502+
on_click=launch_mass_remove,
503+
visible=function () return not self.subviews.icon:getMousePos() end,
504+
},
505+
widgets.Label{
506+
text=widgets.makeButtonLabelText{
507+
chars=button_chars,
508+
pens={
509+
{COLOR_WHITE, COLOR_WHITE, COLOR_WHITE, COLOR_WHITE},
510+
{COLOR_WHITE, COLOR_GRAY, COLOR_GRAY, COLOR_WHITE},
511+
{COLOR_WHITE, COLOR_WHITE, COLOR_WHITE, COLOR_WHITE},
510512
},
513+
tileset=toolbar_textures,
514+
tileset_offset=5,
515+
tileset_stride=8,
511516
},
517+
on_click=launch_mass_remove,
518+
visible=function() return self.subviews.icon:getMousePos() end,
512519
},
513520
},
514521
},
@@ -517,16 +524,7 @@ end
517524

518525
function MassRemoveToolbarOverlay:preUpdateLayout(parent_rect)
519526
local offsets = mass_remove_button_offsets(parent_rect)
520-
local r = offsets.r - MR_MIN_OFFSETS.r
521-
local l = offsets.l - MR_MIN_OFFSETS.l
522-
local t = offsets.t - MR_MIN_OFFSETS.t
523-
local b = offsets.b - MR_MIN_OFFSETS.b
524-
self.frame.w = MR_WIDTH + l + r
525-
self.frame.h = MR_HEIGHT + t + b
526-
self.subviews.tt_and_icon.frame.l = l
527-
self.subviews.tt_and_icon.frame.r = r
528-
self.subviews.tt_and_icon.frame.t = t
529-
self.subviews.tt_and_icon.frame.b = b
527+
self.frame.w = MR_WIDTH + offsets.l - MR_DEFAULT_OFFSET
530528
end
531529

532530
function MassRemoveToolbarOverlay:onInput(keys)

0 commit comments

Comments
 (0)