NAME
Tickit::WidgetRole::Movable - support for resizable/movable "panels"
SYNOPSIS
package Tickit::Widget::MovingThing;
use parent qw(Tickit::WidgetRole::Movable Tickit::Widget);
sub lines { 2 }
sub cols { 2 }
sub render_to_rb { ... }
DESCRIPTION
Apply this as a parent class to a widget to provide for resize/move semantics, similar to behaviour provided by common window managers.
Expects the widget to be contained by a parent object which provides a suitable area in which to resize/move the widget.
State information is stored in the _movable_role
hashref in $self
, so this requires instances to be blessed hashrefs.
MIN_HEIGHT
Minimum height to apply to this widget. Default is 2.
MIN_WIDTH
Minimum width to apply to this widget. Default is 2.
METHODS
export_subs_for
Empty implementation for Tickit::WidgetRole export_subs_for
.
on_mouse
Handle mouse events.
We can be in one of three states here: a mouse press, a drag event, or a release.
We delegate each of these to separate methods - see:
"mouse_press" - first click, this is either a one-off or the start of a drag event
"mouse_release" - mouse has been released, either after a click or after dragging
"mouse_drag" - one or more mouse buttons are pressed and the mouse has moved
mouse_press
Handle a mouse press event.
We're either in:
a corner - start resizing in both directions
an edge - start resizing in one dimension
the title bar - start moving the window
position_is_corner
If this location is a corner of the window, return the appropriate constant (NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST), otherwise returns false.
position_is_corner
If this location is an edge for this window, return the appropriate constant (NORTH, EAST, SOUTH, WEST), otherwise returns false.
position_is_title
If this location is somewhere in the title (currently defined as "top row, apart from corners and close button), returns true.
start_resize_from_corner
Start resizing from a corner.
start_resize_from_edge
Start resizing from an edge.
start_moving
Start moving the window.
mouse_drag
Deal with our drag events by changing window geometry accordingly.
move
Handle ongoing move events.
resize_from_corner
Resize action, from a corner.
resize_from_edge
Resize action - starting from an edge.
mouse_release
On release make sure we hand back input to the previous handler.
change_geometry
Default action when attempting to change geometry is to proxy this to the Tickit::Window directly. Override this in subclasses to implement constraints (e.g. clamp co-ordinates and pass to -
SUPER::change_geometry >, or return early without applying the action) or linked window actions (move/resize another window after applying the geometry change to this one).
SEE ALSO
AUTHOR
Tom Molesworth <TEAM@cpan.org>
LICENSE
Copyright Tom Molesworth 2012-2024. Licensed under the same terms as Perl itself.