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.700 second using v1.01-cache-2.11-cpan-5dc5da66d9d )