Gtk2-Ex-History
view release on metacpan or search on metacpan
lib/Gtk2/Ex/History/Action.pm view on Meta::CPAN
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 activated, either back or forward.',
'Gtk2::Ex::History::Way',
'back',
Glib::G_PARAM_READWRITE),
];
my $connect_hook_id;
my $disconnect_hook_id;
sub INIT_INSTANCE {
my ($self) = @_;
### History-Action INIT_INSTANCE()
$connect_hook_id ||= Gtk2::ActionGroup->signal_add_emission_hook
(connect_proxy => \&_do_connect_proxy);
$disconnect_hook_id ||= Gtk2::ActionGroup->signal_add_emission_hook
(disconnect_proxy => \&_do_disconnect_proxy);
_update ($self);
}
sub SET_PROPERTY {
my ($self, $pspec, $newval) = @_;
my $pname = $pspec->get_name;
### History-Action SET_PROPERTY(): $pname
$self->{$pname} = $newval; # per default GET_PROPERTY
_update ($self);
}
# Gtk2::ActionGroup 'connect-proxy' emission hook handler
sub _do_connect_proxy {
my ($invocation_hint, $parameters) = @_;
my ($actiongroup, $self, $toolitem) = @$parameters;
### History-Action _do_connect_proxy(): "@{[$self->get_name]} $self onto $toolitem"
### child: $toolitem->get_child
my $button;
if ($self->isa(__PACKAGE__)
&& $toolitem->isa('Gtk2::ToolItem')
&& ($button = $toolitem->get_child)
&& $button->isa('Gtk2::Button')) {
# must have 'button-release-mask' or the menu doesn't pop down on button
# release, for some reason
require Gtk2::Ex::WidgetEvents;
$toolitem->{(__PACKAGE__)}->{'wevents'}
= Gtk2::Ex::WidgetEvents->new ($button, ['button-release-mask']);
require Glib::Ex::SignalIds;
Scalar::Util::weaken (my $weak_self = $self);
$toolitem->{(__PACKAGE__)}->{'ids'} = Glib::Ex::SignalIds->new
($button,
$button->signal_connect
(button_press_event => \&_do_button_press_event, \$weak_self));
### ids: $toolitem->{(__PACKAGE__)}->{'ids'}
}
return 1; # keep emission hook
}
# Gtk2::ActionGroup 'disconnect-proxy' emission hook handler
sub _do_disconnect_proxy {
my ($invocation_hint, $parameters) = @_;
my ($actiongroup, $action, $widget) = @$parameters;
### History-Action _do_disconnect_proxy(): "@{[$action->get_name]} $action from $widget"
delete $widget->{(__PACKAGE__)};
return 1; # keep emission hook
}
# 'button-press-event' handler on a toolitem button child
sub _do_button_press_event {
my ($button, $event, $ref_weak_self) = @_;
### History-Action _do_button_press_event(): $event->button
my $self = $$ref_weak_self || return;
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 Gtk2::EVENT_PROPAGATE;
}
sub _update {
my ($self) = @_;
my $way = $self->get('way');
$self->set (stock_id => "gtk-go-$way",
tooltip => ($way eq 'back'
? __('Go back.')
: __('Go forward.')));
my $history = $self->{'history'};
$self->{'connp'} = $history && Glib::Ex::ConnectProperties->dynamic
([$history->model($way), 'model-rows#not-empty'],
[$self, 'sensitive']);
}
sub _do_activate {
my ($self) = @_;
my $history = $self->{'history'} || return;
my $way = $self->get('way');
$history->$way;
}
1;
__END__
=for stopwords tooltip popup UIManager enum Ryde hashref Gtk2-Ex-History
( run in 0.540 second using v1.01-cache-2.11-cpan-a49fcb8fa48 )