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.

    Constructed of:

      * Tickit::Widget::Layout::Desktop::Window - the window implementation

      * this class - background desktop on which the floats are displayed

    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

      * Tickit::Widget::FloatBox - eventually ::Desktop will probably start
      using FloatBox for the float management

AUTHOR

    Tom Molesworth <TEAM@cpan.org>

LICENSE

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