diff options
Diffstat (limited to 'lib/ManaTools/Shared/GUI')
| -rw-r--r-- | lib/ManaTools/Shared/GUI/ButtonBoxSelection.pm | 230 | ||||
| -rw-r--r-- | lib/ManaTools/Shared/GUI/CustomSelectionWidget.pm | 419 | ||||
| -rw-r--r-- | lib/ManaTools/Shared/GUI/SelectionWidgetRole.pm | 82 | 
3 files changed, 731 insertions, 0 deletions
diff --git a/lib/ManaTools/Shared/GUI/ButtonBoxSelection.pm b/lib/ManaTools/Shared/GUI/ButtonBoxSelection.pm new file mode 100644 index 00000000..dcad0e49 --- /dev/null +++ b/lib/ManaTools/Shared/GUI/ButtonBoxSelection.pm @@ -0,0 +1,230 @@ +# vim: set et ts=4 sw=4: +package ManaTools::Shared::GUI::ButtonBoxSelection; +#============================================================= -*-perl-*- + +=head1 NAME + +ManaTools::Shared::GUI::ButtonBoxSelection - Class to manage a yui YSelectionBox properly + +=head1 SYNOPSIS + +use ManaTools::Shared::GUI::ButtonBoxSelection; + +my $extlist = ManaTools::Shared::GUI::ButtonBoxSelection->new(name => "ButtonBox1", eventHandler => $dialog, parentWidget => $widget, callback => { my $self = shift; my $yevent = shift; my $backenditem = $_; ... }); + +$extlist->addSelectorItem("Label 1", $backenditem1, sub { +    my ($self, $parent, $backendItem) = @_; +    my $dialog = $self->parentDialog(); +    my $factory = $dialog->factory(); +    my $vbox = $factory->createVBox($parent); +    my $button1 = $self->addWidget($backendItem->label() .'_button1', $factory->createPushButton('Button 1', $vbox), sub { +        my $self = shift; +        my $yevent = shift; +        my $backendItem = shift; +        my $list = $self->eventHandler(); +        ... +    }, $backendItem); +    my $button2 = $self->addWidget($backendItem->label() .'_button2', $factory->createPushButton('Button 2', $vbox), sub {...}, $backendItem); +    ... +}); +$extlist->addSelectorItem("Label 2", $backenditem2, sub { my ($self, $parent, $backendItem) = @_; my $factory = $self->parentDialog()->factory(); my $vbox = $factory->createVBox($parent); ... } ); +$extlist->addSelectorItem("Label 3", $backenditem3, sub { my ($self, $parent, $backendItem) = @_; my $factory = $self->parentDialog()->factory(); my $vbox = $factory->createVBox($parent); ... } ); +$extlist->addSelectorItem("Label 4", $backenditem4, sub { my ($self, $parent, $backendItem) = @_; my $factory = $self->parentDialog()->factory(); my $vbox = $factory->createVBox($parent); ... } ); +$extlist->finishedSelectorItems(); + + +=head1 DESCRIPTION + +This class wraps YSelectionBox with backend items to handle + + +=head1 SUPPORT + +You can find documentation for this module with the perldoc command: + +perldoc ManaTools::Shared::GUI::ButtonBoxSelection + +=head1 SEE ALSO + +yui::YSelectionBox + +=head1 AUTHOR + +Maarten Vanraes <alien@rmail.be> + +=head1 COPYRIGHT and LICENSE + +Copyright (C) 2015-2016, Maarten Vanraes. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License version 2, as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + +=head1 FUNCTIONS + +=cut + + +use Moose; +use diagnostics; +use utf8; + +extends 'ManaTools::Shared::GUI::CustomSelectionWidget'; + +has 'buttonWidths' => ( +    is => 'ro', +    isa => 'ArrayRef[Int]', +    default => sub { +        return []; +    }, +); + +has 'replacepoint' => ( +    is => 'ro', +    isa => 'ManaTools::Shared::GUI::ReplacePoint', +    init_arg => undef, +    lazy => 1, +    default => sub { +        my $self = shift; +        my $eventHandler = $self->eventHandler(); +        my $dialog = $eventHandler->parentDialog(); +        my $factory = $dialog->factory(); +        my $rpl = ManaTools::Shared::GUI::ReplacePoint->new(eventHandler => $self->eventHandler(), parentWidget => $self->parentWidget()); +        $dialog->D("$self: built replacepoint $rpl in parent ". $self->parentWidget()); +        $factory->createVStretch($rpl->container()); +        $rpl->finished(); +        return $rpl; +    }, +); + +#============================================================= + +=head2 _buildSelectionWidget + +=head3 INPUT + +    $self: this object + +=head3 DESCRIPTION + +    builds the SelectionWidget structure + +=cut + +#============================================================= +override('_buildSelectionWidget', sub { +    my $self = shift; +    my $parentWidget = $self->parentWidget(); +    my $eventHandler = $self->eventHandler(); +    my $dialog = $eventHandler->parentDialog(); +    my $factory = $dialog->factory(); +    # Force replacepoint to be first +    $dialog->D("$self: force replacepoint creation."); +    my $rpl = $self->replacepoint(); +    $dialog->D("$self: clear replacepoint $rpl."); +    $rpl->clear(); +    $dialog->D("$self: cleared $rpl, build HBox in it"); +#    $rpl->container()->setStretchable(0, 1); + +    # container should be a hbox in an rpl +    my $container = $factory->createHBox($rpl->container()); +    $dialog->D("$self: HBox is $container, return it"); +    # need to set it manually, even if it will be set due to it being a builder; because we trigger this function manually sometimes too, and otherwise the hbox will be cleared and redone and be different. +    $self->{'container'} = $container; +    return $container; +}); + +#============================================================= + +=head2 _buildItem + +=head3 INPUT + +    $self: this object +    $item: yui::YItem + +=head3 DESCRIPTION + +    build an Item into the SelectionWidget + +=cut + +#============================================================= +override('_buildItem', sub { +    my $self = shift; +    my $yitem = shift; +    my $index = shift; +    my $eventHandler = $self->eventHandler(); +    my $dialog = $eventHandler->parentDialog(); +    my $factory = $dialog->factory(); +    my $rpl = $self->replacepoint(); +    $dialog->D("$self: forcing container..."); +    my $container = $self->container(); +    $dialog->D("$self: container is $container"); +    my $buttonWidths = $self->buttonWidths(); +    $dialog->D("$self: build button in $container"); + +    $dialog->D("$self: create the button: ". $yitem->label() ." in container $container with factory $factory"); +    # add a pushbutton inside the container +    my $button = $factory->createPushButton($container, $yitem->label()); +    $dialog->D("$self: button $button created in parent $container with label: ". $yitem->label() ."."); +    $rpl->addWidget($yitem->label(), $button, sub { +        my $self = shift; +        my $yevent = shift; +        my $backendItem = shift; +        my $buttonbox = $backendItem->[0]; +        my $yitem = $backendItem->[1]; +        $buttonbox->lastItem($yitem); +        my $eventHandler = $self->eventHandler(); +        my $dialog = $eventHandler->parentDialog(); +        $dialog->D("$self: builder function to select item $yitem in $backendItem"); + +        # make sure the event isn't caught and is carried on +        return -1; +    }, [$self, $yitem]); +    # take care of the width +    $dialog->D("$self: set weight: ". $buttonWidths->[$index] ." on button $button."); +    $button->setWeight(0, $buttonWidths->[$index]) if (defined $buttonWidths->[$index]); +    $button->setStretchable(1, 1); # vert stretch +}); + +#============================================================= + +=head2 _finishSelectionWidget + +=head3 INPUT + +    $self: this object + +=head3 DESCRIPTION + +    builds the SelectionWidget structure + +=cut + +#============================================================= +override('_finishSelectionWidget', sub { +    my $self = shift; +    my $rpl = $self->replacepoint(); +    my $eventHandler = $self->eventHandler(); +    my $dialog = $eventHandler->parentDialog(); +    $dialog->D("$self: finish replacepoint $rpl"); +    $rpl->finished(); +}); + +#============================================================= + +no Moose; +__PACKAGE__->meta->make_immutable; + + +1; diff --git a/lib/ManaTools/Shared/GUI/CustomSelectionWidget.pm b/lib/ManaTools/Shared/GUI/CustomSelectionWidget.pm new file mode 100644 index 00000000..14bb005f --- /dev/null +++ b/lib/ManaTools/Shared/GUI/CustomSelectionWidget.pm @@ -0,0 +1,419 @@ +# vim: set et ts=4 sw=4: +package ManaTools::Shared::GUI::CustomSelectionWidget; +#============================================================= -*-perl-*- + +=head1 NAME + +ManaTools::Shared::GUI::CustomSelectionWidget - Class to manage a yui YSelectionBox properly + +=head1 SYNOPSIS + +use ManaTools::Shared::GUI::CustomSelectionWidget; + +my $extlist = ManaTools::Shared::GUI::CustomSelectionWidget->new(name => "ButtonBox1", eventHandler => $dialog, parentWidget => $widget, callback => { my $self = shift; my $yevent = shift; my $backenditem = $_; ... }); + +$extlist->addSelectorItem("Label 1", $backenditem1, sub { +    my ($self, $parent, $backendItem) = @_; +    my $dialog = $self->parentDialog(); +    my $factory = $dialog->factory(); +    my $vbox = $factory->createVBox($parent); +    my $button1 = $self->addWidget($backendItem->label() .'_button1', $factory->createPushButton('Button 1', $vbox), sub { +        my $self = shift; +        my $yevent = shift; +        my $backendItem = shift; +        my $list = $self->eventHandler(); +        ... +    }, $backendItem); +    my $button2 = $self->addWidget($backendItem->label() .'_button2', $factory->createPushButton('Button 2', $vbox), sub {...}, $backendItem); +    ... +}); +$extlist->addSelectorItem("Label 2", $backenditem2, sub { my ($self, $parent, $backendItem) = @_; my $factory = $self->parentDialog()->factory(); my $vbox = $factory->createVBox($parent); ... } ); +$extlist->addSelectorItem("Label 3", $backenditem3, sub { my ($self, $parent, $backendItem) = @_; my $factory = $self->parentDialog()->factory(); my $vbox = $factory->createVBox($parent); ... } ); +$extlist->addSelectorItem("Label 4", $backenditem4, sub { my ($self, $parent, $backendItem) = @_; my $factory = $self->parentDialog()->factory(); my $vbox = $factory->createVBox($parent); ... } ); +$extlist->finishedSelectorItems(); + + +=head1 DESCRIPTION + +This class wraps YSelectionBox with backend items to handle + + +=head1 SUPPORT + +You can find documentation for this module with the perldoc command: + +perldoc ManaTools::Shared::GUI::CustomSelectionWidget + +=head1 SEE ALSO + +yui::YSelectionBox + +=head1 AUTHOR + +Maarten Vanraes <alien@rmail.be> + +=head1 COPYRIGHT and LICENSE + +Copyright (C) 2015-2016, Maarten Vanraes. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License version 2, as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + +=head1 FUNCTIONS + +=cut + + +use Moose; +use diagnostics; +use utf8; + +with 'ManaTools::Shared::GUI::SelectionWidgetRole'; + +use yui; + +has 'eventHandler' => ( +    is => 'ro', +    does => 'ManaTools::Shared::GUI::EventHandlerRole', +    required => 1, +    handles => [ 'parentDialog' ], +); + +has 'items' => ( +    is => 'rw', +    isa => 'ArrayRef[yui::YItem]', +    default => sub { return [] }, +); + +has 'lastItem' => ( +    is => 'rw', +    isa => 'Maybe[yui::YItem]', +); + +has 'parentWidget' => ( +    is => 'ro', +    isa => 'yui::YWidget', +    required => 1, +); + +has 'container' => ( +    is => 'ro', +    isa => 'yui::YWidget', +    required => 0, +    lazy => 1, +    init_arg => undef, +    builder => '_buildSelectionWidget', +); + +#============================================================= + +=head2 new + +=head3 INPUT + +    hash ref containing +        name:               a name for the widget to add event to the eventHandler +        eventHandler:       the parent that does eventHandlerRole +        parentWidget:       the parent widget +        callback:           optional parameter to execute a callback when an item has changed + + +=head3 DESCRIPTION + +    new is inherited from ExtWidget, to create a CustomSelectionWidget object + +=cut + +#============================================================= + +=head2 selectedItem + +=head3 INPUT + +    $self: this object + +=head3 OUTPUT + +    YItem: the selected item + +=head3 DESCRIPTION + +    returns the item that is selected when an event fires + +=cut + +#============================================================= +sub selectedItem { +    my $self = shift; +    return $self->lastItem(); +} + +#============================================================= + +=head2 _buildSelectionWidget + +=head3 INPUT + +    $self: this object + +=head3 DESCRIPTION + +    builds the SelectionWidget structure + +=cut + +#============================================================= +sub _buildSelectionWidget { +    my $self = shift; +    my $parentWidget = $self->parentWidget(); +    my $dialog = $self->parentDialog(); +    my $factory = $dialog->factory(); + +    return undef; +}; + +#============================================================= + +=head2 buildSelectionWidget + +=head3 INPUT + +    $self: this object + +=head3 OUTPUT + +    yui::YWidget + +=head3 DESCRIPTION + +    builds the SelectionWidget structure according to current Items + +=cut + +#============================================================= +sub buildSelectionWidget { +    my $self = shift; +    my $dialog = $self->parentDialog(); + +    $dialog->D("$self: trigger _buildSelectionWidget"); +    my $container = $self->_buildSelectionWidget(); +    $dialog->D("$self: triggered _buildSelectionWidget"); + +    my $i = 0; +    for my $yitem (@{$self->items()}) { +        $dialog->D("$self: trigger buildItem($yitem, $i)"); +        $self->buildItem($yitem, $i); +        $i = $i + 1; +    } + +    return $container; +}; + +#============================================================= + +=head2 _buildItem + +=head3 INPUT + +    $self: this object +    $item: yui::YItem + +=head3 DESCRIPTION + +    build an Item into the SelectionWidget + +=cut + +#============================================================= +sub _buildItem { +    my $self = shift; +    my $yitem = shift; +    my $index = shift; +    my $dialog = $self->parentDialog(); +    my $factory = $dialog->factory(); +    # force the presence of the container +    my $container = $self->container(); + +}; + +#============================================================= + +=head2 buildItem + +=head3 INPUT + +    $self: this object +    $item: yui::YItem + +=head3 DESCRIPTION + +    build an Item into the SelectionWidget and sets lastItem + +=cut + +#============================================================= +sub buildItem { +    my $self = shift; +    my $yitem = shift; +    my $index = shift; +    my $dialog = $self->parentDialog(); + +    # add stuff according to container +    $dialog->D("$self: trigger _buildItem"); +    $self->_buildItem($yitem, $index); +    if (!defined $self->lastItem()) { +        # set first item as lastItem(); +        $self->lastItem($yitem); +    } +}; + +#============================================================= + +=head2 _finishSelectionWidget + +=head3 INPUT + +    $self: this object + +=head3 DESCRIPTION + +    finishes the SelectionWidget structure + +=cut + +#============================================================= +sub _finishSelectionWidget { +    my $self = shift; +    my $parentWidget = $self->parentWidget(); +    my $dialog = $self->parentDialog(); +    my $factory = $dialog->factory(); + +}; + +#============================================================= + +=head2 finishSelectionWidget + +=head3 INPUT + +    $self: this object + +=head3 DESCRIPTION + +    finishes the SelectionWidget structure + +=cut + +#============================================================= +sub finishSelectionWidget { +    my $self = shift; +    my $dialog = $self->parentDialog(); +    $dialog->D("$self: trigger _finishSelectionWidget"); +    $self->_finishSelectionWidget(); +}; + +#============================================================= + +=head2 addItems + +=head3 INPUT + +    $self: this object +    $items: yui::YItemCollection + +=head3 DESCRIPTION + +    adds the items + +=cut + +#============================================================= +sub addItems { +    my $self = shift; +    my $yitemcollection = shift; + +    # check we're adding nothing +    if ($yitemcollection->size() == 0) { +        # no change, just bail out +        return ; +    } +    my $dialog = $self->parentDialog(); + +    # start rebuild if needed +    $dialog->D("$self: maybe needed: buildSelectionWidget()"); +    my $container = $self->buildSelectionWidget(); +    $dialog->D("$self: container is $container"); + +    my $i = 0; +    while ($i < $yitemcollection->size()) { +        my $yitem = $yitemcollection->get($i); +        push @{$self->items()}, $yitem; + +    $dialog->D("$self: trigger buildItem($yitem, $i)"); +        $self->buildItem($yitem, $i); +        $i = $i + 1; +    } + +    # finish building SelectionWidget +    $dialog->D("$self: trigger finishSelectionWidget()"); +    $self->finishSelectionWidget(); +}; + +#============================================================= + +=head2 deleteAllItems + +=head3 INPUT + +    $self: this object + +=head3 DESCRIPTION + +    clears all items + +=cut + +#============================================================= +sub deleteAllItems { +    my $self = shift; +    my $items = $self->items(); + +    # check if it's empty already +    if (scalar(@{$items}) == 0) { +        # no change, just bail out +        return ; +    } + +    my $dialog = $self->parentDialog(); +    # clear the inner dialogs and update +    @{$items} = (); + +    # start rebuild if needed (and clear it) +    $dialog->D("$self: trigger buildSelectionWidget()"); +    my $container = $self->buildSelectionWidget(); + +    # clear lastItem +    $self->lastItem(undef); + +    # finish building SelectionWidget +    $dialog->D("$self: trigger finishSelectionWidget()"); +    $self->finishSelectionWidget(); +}; + +#============================================================= + +no Moose; +__PACKAGE__->meta->make_immutable; + + +1; diff --git a/lib/ManaTools/Shared/GUI/SelectionWidgetRole.pm b/lib/ManaTools/Shared/GUI/SelectionWidgetRole.pm new file mode 100644 index 00000000..74d4b86b --- /dev/null +++ b/lib/ManaTools/Shared/GUI/SelectionWidgetRole.pm @@ -0,0 +1,82 @@ +# vim: set et ts=4 sw=4: +package ManaTools::Shared::GUI::SelectionWidgetRole; + +#============================================================= -*-perl-*- + +=head1 NAME + +    ManaTools::Shared::GUI::SelectionWidgetRole - a Properties Moose::Role + +=head1 SYNOPSIS +    package Foo; + +    with 'ManaTools::Shared::GUI::SelectionWidgetRole'; + +    sub selectedItem { +        my $self = shift; +        ... +        return $item; +    } + +    sub addItems { +        my $self = shift; +        my $yitemcollection = shift; +        ... +    } + +    sub deleteAllItems { +        my $self = shift; +        ... +    } + +    1; + +    ... + + +=head1 DESCRIPTION + +    This Role is to specify an SelectionWidgetRole, specifically, the need to provide a proper processSelectionWidget function + +=head1 SUPPORT + +    You can find documentation for this Role with the perldoc command: + +    perldoc ManaTools::Shared::GUI::SelectionWidgetRole + + +=head1 AUTHOR + +    Maarten Vanraes <alien@rmail.be> + +=head1 COPYRIGHT and LICENSE + +Copyright (c) 2015-2016 Maarten Vanraes <alien@rmail.be> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License version 2, as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +=head1 METHODS + +=cut + +use Moose::Role; + +requires 'addItems'; +requires 'deleteAllItems'; +requires 'selectedItem'; + +#============================================================= + +1; +  | 
