Gtk2-Ex-DateSpinner

 view release on metacpan or  search on metacpan

lib/Gtk2/Ex/DateSpinner/PopupForEntry.pm  view on Meta::CPAN

  my $ok = Gtk2::Button->new_from_stock ('gtk-ok');
  $ok->set_flags('can-default');
  $ok->signal_connect (clicked => \&_do_activate);
  $hbox->pack_start ($ok, 0,0,0);

  my $cancel = Gtk2::Button->new_from_stock ('gtk-cancel');
  $cancel->signal_connect (clicked => \&_do_cancel_button);
  $hbox->pack_start ($cancel, 0,0,0);

  my $accelgroup = Gtk2::AccelGroup->new;
  $self->add_accel_group ($accelgroup);
  $accelgroup->connect (Gtk2::Gdk->keyval_from_name('Escape'), [], [],
                        \&_do_accel_cancel);

  $datespinner->{'day'}->grab_focus;
  $hbox->show_all;

  # {
  #   ### year flag: $datespinner->{'year'}->flags
  #   ### ok flags : $ok->flags
  #   ### cancel flags: $cancel->flags
  #   $self->signal_connect ('notify::visible' => sub {
  #                            print "PopupForEntry: notify:visible changed\n";
  #                          });
  #   $self->signal_connect (map => sub {
  #                            print "PopupForEntry: map (request)\n";
  #                          });
  #   $self->signal_connect (map_event => sub {
  #                            print "PopupForEntry: map_event\n";
  #                            return 0; # Gtk2::EVENT_PROPAGATE
  #                          });
  # }
}

# DEBUG
# {
#   no warnings 'once';
#   *FINALIZE_INSTANCE = sub {
#     print "PopupForEntry FINALIZE_INSTANCE\n";
#   };
# }

# A 'border' decoration is probably worthwhile, but $toplevel->move doesn't
# seem to be based on window frame position in fvwm.  Dunno who's at fault,
# but no decoration is easier to get right in all wm's.
#
#  signals => { realize => \&_do_realize },
# sub _do_realize {
#   my ($self) = @_;
#   $self->signal_chain_from_overridden;
#   $self->window->set_decorations (['border']);
# }

sub SET_PROPERTY {
  my ($self, $pspec, $newval) = @_;
  my $pname = $pspec->get_name;
  $self->{$pname} = $newval;

  if ($pname eq 'entry') {
    my $entry = $newval;
    Scalar::Util::weaken ($self->{'entry'});

    $self->{'entry_ids'} = $entry && do {
      require Scalar::Util;
      my $ref_weak_self = \$self;
      Scalar::Util::weaken ($ref_weak_self);

      require Glib::Ex::SignalIds;
      Glib::Ex::SignalIds->new
          ($entry,
           $entry->signal_connect (size_allocate => \&_do_position,
                                   $ref_weak_self),
           $entry->signal_connect (changed => \&_do_entry_changed,
                                   $ref_weak_self),
           $entry->signal_connect (editing_done => \&_do_entry_editing_done,
                                   $ref_weak_self),
           $entry->signal_connect (destroy => \&_do_entry_destroy,
                                   $ref_weak_self))
        };
  }
}

sub _do_entry_destroy {
  my ($entry, $ref_weak_self) = @_;
  my $self = $$ref_weak_self || return;
  ### PopupForEntry _do_entry_destroy(), destroy self too ...
  $self->destroy;
}

sub _do_entry_changed {
  my ($entry, $ref_weak_self) = @_;
  ### PopupForEntry _do_entry_changed() ...
  my $self = $$ref_weak_self || return;
  if ($self->{'change_in_progress'}) { return; }

  local $self->{'change_in_progress'} = 1;
  my $value = $entry->get_text;
  if ($value =~ /^[0-9]+-[0-9]+-[0-9]+$/) {
    my $datespinner = $self->{'datespinner'};
    $datespinner->set (value => $value);
  }
}
sub _do_datespinner_changed {
  my ($datespinner,  $pspec) = @_;
  my $self = $datespinner->get_toplevel;
  ### PopupForEntry _do_datespinner_value() to: "$self->{'entry'}"
  if ($self->{'change_in_progress'}) { return; }
  my $entry = $self->{'entry'} || return;

  local $self->{'change_in_progress'} = 1;
  $entry->set_text ($datespinner->get_value);
}

sub _do_entry_editing_done {
  my ($entry, $ref_weak_self) = @_;
  my $self = $$ref_weak_self || return;
  ### PopupForEntry: _do_entry_editing_done(), hide popup ...
  $self->hide;
}

# 'activate' on the spin buttons
# 'clicked' on the 'gtk-ok' button
#
sub _do_activate {
  my ($widget) = @_;
  ### PopupForEntry _do_activate() ...



( run in 0.988 second using v1.01-cache-2.11-cpan-5a3173703d6 )