# Copyright 2007, 2008, 2009, 2010, 2011 Kevin Ryde # This file is part of Gtk2-Ex-History. # # Gtk2-Ex-History is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the Free # Software Foundation; either version 3, or (at your option) any later # version. # # Gtk2-Ex-History 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 Gtk2-Ex-History. If not, see . package Gtk2::Ex::History::Button; use 5.008; use strict; use warnings; use Gtk2 1.220; use Gtk2::Ex::History; use Glib::Ex::ConnectProperties 13; # v.13 for model-rows # uncomment this to run the ### lines #use Smart::Comments; our $VERSION = 8; use Glib::Object::Subclass 'Gtk2::Button', signals => { clicked => \&_do_clicked, button_press_event => \&_do_button_press_event }, properties => [ Glib::ParamSpec->object ('history', 'History object', 'The history object to act on.', 'Gtk2::Ex::History', Glib::G_PARAM_READWRITE), Glib::ParamSpec->enum ('way', 'Which way', 'Which way to go in the history when clicked, either back or forward.', 'Gtk2::Ex::History::Way', 'back', Glib::G_PARAM_READWRITE), ]; sub INIT_INSTANCE { my ($self) = @_; # for some reason these setting don't take effect here but must be done in # SET_PROPERTY below $self->set_label ("gtk-go-back"); # default $self->set_use_stock (1); } sub SET_PROPERTY { my ($self, $pspec, $newval) = @_; my $pname = $pspec->get_name; $self->{$pname} = $newval; # per default GET_PROPERTY # if ($pname eq 'history' || $pname eq 'way') { ... # should only need to update the icon when setting 'way', but as of gtk # 2.18 the icon in INIT_INSTANCE doesn't take effect -- something about # "constructor" -- so as a workaround apply the stock icon when setting # 'history' too # my $way = $self->get('way'); $self->set_label ("gtk-go-$way"); $self->set_use_stock (1); # the history model, either the back or forward one my $history = $self->{'history'}; $self->{'connp'} = $history && Glib::Ex::ConnectProperties->dynamic ([$history->model($way), 'model-rows#not-empty'], [$self, 'sensitive']); } # 'clicked' class closure sub _do_clicked { my ($self) = @_; ### History-Button clicked: $self->get('way') my $history = $self->{'history'} || return; my $way = $self->get('way'); $history->$way; return shift->signal_chain_from_overridden(@_); } # 'button-press-event' class closure # # Might like this popup to work even when there's no items in the model and # the button is therefore insensitive, but the button-press-event doesn't # come through when insensitive. # sub _do_button_press_event { my ($self, $event) = @_; ### History-Button button-press-event: $event->button if ($event->button == 3 && (my $history = $self->{'history'})) { require Gtk2::Ex::History::Menu; Gtk2::Ex::History::Menu->new_popup (history => $history, way => $self->get('way'), event => $event); } return shift->signal_chain_from_overridden(@_); } 1; __END__ =for stopwords enum Ryde Gtk2-Ex-History =head1 NAME Gtk2::Ex::History::Button -- button for history "back" or "forward" =for test_synopsis my ($my_history) =head1 SYNOPSIS use Gtk2::Ex::History::Button; my $button = Gtk2::Ex::History::Button->new (history => $my_history, way => 'forward'); =head1 OBJECT HIERARCHY C is a subclass of C. Gtk2::Widget Gtk2::Container Gtk2::Bin Gtk2::Button Gtk2::Ex::History::Button =head1 DESCRIPTION A C invokes either C or C on a C object. +--------------+ | ==> Forward | +--------------+ Mouse button-3 opens a C to select an entry from a menu to jump to, to go more than one place back or forward. A button like this can be used anywhere desired. If it's put in a C it can be used in a C, though if using C then see L instead. =head1 FUNCTIONS =over 4 =item C<< $button = Gtk2::Ex::History::Button->new (key => value, ...) >> Create and return a new history button. Optional key/value pairs can be given to set initial properties, as per C<< Glib::Object->new >>. The C property should be set to say what to display, and C for back or forward. my $button = Gtk2::Ex::History::Button->new (history => $history, way => 'forward'); =back =head1 PROPERTIES =over 4 =item C (C object, default C) The history object to act on. =item C (enum C, default "back") The direction to go, either "back" or "forward". The "stock" icon is set from this, either C or C. =back =head1 BUGS The initial button display is empty, not the intended default C "back". Setting a history object or an explicit initial C works. my $button = Gtk2::Ex::History::Button->new (way => 'back'); # explicit as a workaround It's something to do with object "constructor" stuff making the stock icon setup in C not work. Usually you set a C in initially and that's jigged up to kick it into life. my $button = Gtk2::Ex::History::Button->new (history => $history); # ok, "back" button =head1 SEE ALSO L, L, L, L, L =head1 HOME PAGE L =head1 LICENSE Gtk2-Ex-History is Copyright 2010, 2011 Kevin Ryde Gtk2-Ex-History is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. Gtk2-Ex-History 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 Gtk2-Ex-History. If not, see L. =cut