[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
Re: Glib::ParamSpec->enum or boxed
- From: "muppet" <scott asofyet org>
- To: gtk-perl-list gnome org
- Subject: Re: Glib::ParamSpec->enum or boxed
- Date: Wed, 23 Jan 2008 10:18:48 -0500 (EST)
Jeffrey Ratcliffe wrote:
> Below is some demo code for composite widget. At the moment, it used
> Glib::ParamSpec->string for the property, but as only three values are
> possible, enum or boxed I assume would be better - but I can't see how
> to do it.
>
> Any hints?
Super easy. Changes to your code inline below:
> Thanks
>
> Jeff
>
> #!/usr/bin/perl
>
> package Foo::PageRange;
>
> use strict;
> use warnings;
> use Gtk2;
> use Glib qw(TRUE FALSE); # To get TRUE and FALSE
# Note: in a BEGIN block to ensure that the registration is complete
# by the time the use Subclass goes to look for it.
BEGIN {
Glib::Type->register_enum ('Foo::PageRange::Range',
qw(current selected all));
}
> use Glib::Object::Subclass
> Gtk2::Frame::,
> signals => {
> changed => {},
> },
> properties => [
# The only real difference here is enum instead of string, and adding
# the enumeration's package name.
Glib::ParamSpec->enum (
'range', # name
'Range', # nickname
'Either current, selected, or all', #blurb
'Foo::PageRange::Range',
'all', # default
[qw/readable writable/] #flags
> ]
> ;
>
>
> sub INIT_INSTANCE {
> my ($self, $range) = @_;
> $range = 'all' if (!$range);
> $self->{range} = $range;
> my $frame = Gtk2::Frame->new;
> $self->add ($frame);
> my $vbox = Gtk2::VBox -> new;
> # $vboxp -> set_border_width($border_width);
> $frame -> add ($vbox);
# Instead of repetitive and error-prone code to manage the radio
# buttons by hand, let's play golf, using a single loop and some
# introspection to do the whole thing:
my $radio = undef;
foreach my $value (Glib::Type->list_values ('Foo::PageRange::Range')) {
$radio = Gtk2::RadioButton->new ($radio, ucfirst $value->{nick});
$radio->signal_connect (toggled => sub {
$self->set_active ($value->{nick}) if $_[0]->get_active;
});
$vbox->pack_start ($radio, TRUE, TRUE, 0);
$radio->set_active (TRUE) if $self->{range} eq $value->{nick};
}
# The rest is unchanged.
> }
>
>
> sub get_active {
> my ($self) = @_;
> return $self->get ('range');
> }
>
>
> sub set_active {
> my ($self, $range) = @_;
> $self->{range} = $range;
> $self->signal_emit ('changed');
> }
>
>
> package main;
>
> use strict;
> use warnings;
> use Glib qw(TRUE FALSE); # To get TRUE and FALSE
> use Gtk2 -init;
>
> my $window = Gtk2::Window->new;
> $window->set_title ('Page Range');
> $window->signal_connect (delete_event => sub { Gtk2->main_quit; TRUE });
>
> my $vbox = Gtk2::VBox->new;
> $window->add ($vbox);
>
> my $pr = Foo::PageRange->new;
> $vbox->pack_start ($pr, TRUE, TRUE, 0);
>
> $pr->signal_connect (changed => sub {
> warn $_[0]->get_active, "\n";
> });
>
> $window->show_all;
> Gtk2->main;
> _______________________________________________
> gtk-perl-list mailing list
> gtk-perl-list gnome org
> http://mail.gnome.org/mailman/listinfo/gtk-perl-list
>
--
muppet <scott at asofyet dot org>
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]