Gtk2-Ex-CalendarButton
view release on metacpan or search on metacpan
lib/Gtk2/Ex/CalendarButton.pm view on Meta::CPAN
use warnings;
use Gtk2 '-init';
use Glib qw /TRUE FALSE/;
use Data::Dumper;
sub new {
my ($class, $date) = @_;
my $self = {};
bless ($self, $class);
$self->{button} = Gtk2::Button->new;
$self->{calendar} = Gtk2::Calendar->new;
$self->{date} = undef;
if ($date) {
$self->set_date($date);
}
else {
$self->_update_button_label;
}
my $calwindow = $self->_create_calendar_window();
$self->{button}->signal_connect('clicked' =>
sub {
my ($self, $event) = @_;
$calwindow->set_position('mouse');
$calwindow->show_all;
}
);
return $self;
}
sub signal_connect {
my ($self, $signal, $callback) = @_;
$self->{$signal} = $callback;
}
sub get_button {
my ($self) = @_;
return $self->{button};
}
sub get_calendar {
my ($self) = @_;
return $self->{calendar};
}
sub get_date {
my ($self) = @_;
return $self->{date};
}
sub set_date {
my ($self, $date) = @_;
$self->{date} = $date;
my ($year, $month, $day) = @$date;
my $cal = $self->{calendar};
$cal->select_month($month, $year);
$cal->select_day($day);
$self->_update_button_label;
}
sub _update_button_label {
my ($self) = @_;
my ($year, $month, $day) = $self->{calendar}->get_date;
$self->{date} = [$year, $month, $day];
$month = _month()->[$month];
$self->{button}->set_label("$month $day\, $year");
&{$self->{'date-changed'}}($self) if $self->{'date-changed'};
}
sub _create_calendar_window {
my ($self) = @_;
my $vbox = Gtk2::VBox->new;
my $ok = Gtk2::Button->new_from_stock('gtk-ok');
my $cancel= Gtk2::Button->new_from_stock('gtk-cancel');
my $hbox = Gtk2::HBox->new;
$hbox->pack_start($ok, TRUE, TRUE, 0);
$hbox->pack_start($cancel, TRUE, TRUE, 0);
$vbox->pack_start($self->{calendar}, TRUE, TRUE, 0);
$vbox->pack_start($hbox, TRUE, TRUE, 0);
my $calwindow = Gtk2::Window->new('popup');
$calwindow->add($vbox);
$ok->signal_connect('clicked' =>
sub {
my ($okself, $event) = @_;
$self->_update_button_label;
$calwindow->hide;
}
);
lib/Gtk2/Ex/CalendarButton.pm view on Meta::CPAN
=head1 EXPORT
A list of functions that can be exported. You can delete this section
if you don't export anything, such as for a purely object-oriented module.
=head1 FUNCTIONS
=head2 get_button
=head2 get_calendar
=head2 get_date
=head2 set_date
=head1 AUTHOR
Ofey Aikon, C<< <ofey.aikon at gmail.com> >>
=head1 COPYRIGHT & LICENSE
use Data::Dumper;
use Gtk2::TestHelper tests => 7;
my ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = localtime();
my $year = 1900 + $yearOffset;
my $date = [$year, $month, $dayOfMonth];
my $calbutton = Gtk2::Ex::CalendarButton->new;
isa_ok($calbutton, "Gtk2::Ex::CalendarButton");
isa_ok($calbutton->{calendar}, "Gtk2::Calendar");
isa_ok($calbutton->{button}, "Gtk2::Button");
isa_ok($calbutton->get_calendar, "Gtk2::Calendar");
isa_ok($calbutton->get_button, "Gtk2::Button");
is(Dumper($calbutton->{date}), Dumper($date));
is(Dumper($calbutton->get_date), Dumper($date));
my $window = Gtk2::Window->new;
$window->signal_connect('destroy', sub {Gtk2->main_quit;});
$window->show_all;
my $event_count = 0;
$calbutton->signal_connect('date-changed' =>
sub {
my ($self) = @_;
is(Dumper($self), Dumper($calbutton));
$event_count++;
is($event_count, 1);
}
);
$calbutton->{calendar}->select_month($month, $year);
$calbutton->{calendar}->select_day($day);
$calbutton->_update_button_label;
is(Dumper($calbutton->{date}), Dumper($date));
my $window = Gtk2::Window->new;
$window->signal_connect('destroy', sub {Gtk2->main_quit;});
$window->show_all;
( run in 0.307 second using v1.01-cache-2.11-cpan-5dc5da66d9d )