NAME

Tickit::Widget::Layout::Desktop - provides a holder for "desktop-like" widget behaviour

SYNOPSIS

#!/usr/bin/env perl
use strict;
use warnings;
use Tickit;
use Tickit::Widget::Placegrid;
use Tickit::Widget::Layout::Desktop;

my $tickit = Tickit->new;
my $desktop = Tickit::Widget::Layout::Desktop->new;
$tickit->later(sub {
	my $left = int($desktop->window->cols * rand);
	my $top = int($desktop->window->lines * rand);
	my $cols = 20 + int(10 * rand);
	my $lines = 5 + int(20 * rand);
	$left = $desktop->window->cols - $cols if $left + $cols >= $desktop->window->cols;
	$top = $desktop->window->lines - $lines if $top + $lines >= $desktop->window->lines;
	$desktop->create_panel(
		label => 'widget',
		left => $left,
		top => $top,
		cols => $cols,
		lines => $lines,
	)->add(Tickit::Widget::Placegrid->new);
});
$tickit->set_root_widget($desktop);
$tickit->run;

DESCRIPTION

Experimental release for a container that provides move/resize/minimize/maximize "window" behaviour.

Desktop widget in action

Constructed of:

and maybe later:

  • ::Desktop::Taskbar - a subclass of statusbar which provides window lists and launchers

METHODS

render_to_rb

Clears the exposed area. All rendering happens in the floating windows on top of this widget.

overlay

Render all window outlines on top of the target widget.

Takes the following parameters:

  • $rb - the Tickit::RenderBuffer we will be drawing into

  • $exclude - the current Tickit::Widget we are drawing - this will be used to check for intersections so we don't waste time drawing unrelated areas

window_gained

Records our initial window geometry when the Tickit::Window is first attached.

create_panel

Creates a Tickit::Widget::Layout::Desktop::Window on this Tickit::Widget::Layout::Desktop.

Takes the following named parameters:

  • top - offset from top of desktop

  • left - offset from desktop left margin

  • lines - how many lines the new widget will have, should be >2 to display anything useful

  • cols - how many columns the new widget will have, should be >2 to display anything useful

  • label - what label to use, default is the uninspiring text window

API METHODS

These methods are provided as an API for the Tickit::Widget::Layout::Desktop::Window children. They allow widgets to interact with the desktop for requesting focus etc.

make_active

Makes the requested Tickit::Widget::Layout::Desktop::Window active - brings it to the front of the stack and gives it focus.

Returns $self.

weld

"Welds" edges of windows together.

Takes 4 parameters:

  • Source widget edge

  • Source widget

  • Destination edge

  • Destination widget

For example:

$desktop->weld(
 right => $left_panel,
 left  => $right_panel,
);

Given a two-panel layout, this would mean any changes to the right edge of the panel on the left would adjust the left edge of the panel on the right, and vice versa.

As you increase the size of the left panel, the right panel shrinks, so instead of the normal behaviour where the widget on the left would start to overlap the one on the right, this maintains the relative positioning by resizing the target widget. This can be used to provide movable dividers between desktop panels, allowing temporary resize without disrupting the layout.

Returns $self for chaining.

reshape

Deal with reshape requests.

Since our windows are positioned directly, we're going to lose some information if shrink then expand the parent window again. This isn't ideal but hopefully we can get away with it for now.

Returns $self.

cascade

Arrange all the windows in a cascade (first at 1,1, second at 2,2, etc.).

tile

Tiles all the windows. Tries to lay them out so things don't overlap. Since we're resizing, things may end up ridiculously small.

Pass overlap => 1 to have overlapping edges.

Returns $self.

close_all

Close all the windows.

SEE ALSO

AUTHOR

Tom Molesworth <TEAM@cpan.org>

LICENSE

Copyright Tom Molesworth 2011-2017. Licensed under the same terms as Perl itself.