Gtk2-Ex-History

 view release on metacpan or  search on metacpan

lib/Gtk2/Ex/History.pm  view on Meta::CPAN

                 return_type   => 'Glib::String',
                 flags         => ['run-last'],
                 class_closure => \&_default_place_to_text,
                 accumulator   => \&Glib::Ex::SignalBits::accumulator_first_defined },

               'place-equal' =>
               { param_types   => ['Glib::Scalar', 'Glib::Scalar'],
                 return_type   => 'Glib::Boolean',
                 flags         => ['run-last'],
                 class_closure => \&_default_place_equal,
                 accumulator   => \&Glib::Ex::SignalBits::accumulator_first },
             },

  properties => [ Glib::ParamSpec->scalar
                  ('current',
                   'Current place object',
                   'Current place object in the history.',
                   Glib::G_PARAM_READWRITE),

                  Glib::ParamSpec->int
                  ('max-history',
                   'Maximum history count',
                   'The maximum number of places to keep in the history (backwards and forwards counted separately currently).',
                   0,                  # min
                   POSIX::INT_MAX(),   # max
                   40,                 # default
                   Glib::G_PARAM_READWRITE),

                  # this one not documented yet ...
                  Glib::ParamSpec->boolean
                  ('use-markup',
                   'Use markup',
                   'Blurb.',
                   0,  # default
                   Glib::G_PARAM_READWRITE),
                ];

BEGIN {
  Glib::Type->register_enum ('Gtk2::Ex::History::Way',
                             back    => 0,
                             forward => 1);
}

#------------------------------------------------------------------------------

sub INIT_INSTANCE {
  my ($self) = @_;

  $self->{'current'} = undef;

  require Gtk2::Ex::History::ListStore;
  my $back_model = $self->{'back_model'}
    = Gtk2::Ex::History::ListStore->new;

  my $forward_model = $self->{'forward_model'}
    = Gtk2::Ex::History::ListStore->new;

  my $current_model = $self->{'current_model'}
    = Gtk2::Ex::History::ListStore->new;
  $current_model->{'current'} = 1; # flag for ListStore drag/drop
  Scalar::Util::weaken ($current_model->{'history'} = $self);

  foreach my $aref ($back_model   ->{'others'} = [ $forward_model ],
                    $forward_model->{'others'} = [ $back_model ],
                    $current_model->{'others'} = [ $back_model, $forward_model ]) {
    foreach (@$aref) {
      Scalar::Util::weaken ($_);
    }
  }
  ### models: { back => $back_model, forward => $forward_model, current => $current_model }
}

sub SET_PROPERTY {
  my ($self, $pspec, $newval) = @_;
  my $pname = $pspec->get_name;
  if ($pname eq 'current') {
    $self->goto ($newval);
  } else {
    $self->{$pname} = $newval;
  }
}

sub _default_place_to_text {
  my ($self, $place) = @_;
  return "$place";
}
sub _default_place_equal {
  my ($self, $k1, $k2) = @_;
  ### _default_place_equal(): ($k1 eq $k2)
  if (defined $k1) {
    return (defined $k2 && $k1 eq $k2);
  } else {
    return (! defined $k2);
  }
}

#-----------------------------------------------------------------------------

# this one not documented yet
sub model {
  my ($self, $way) = @_;
  return $self->{"${way}_model"};
}

sub remove {
  my ($self, $place) = @_;
  require Gtk2::Ex::TreeModelBits;
  Gtk2::Ex::TreeModelBits->VERSION(16); # for extra remove args
  foreach my $model ($self->{'back_model'}, $self->{'forward_model'}) {
    Gtk2::Ex::TreeModelBits::remove_matching_rows
        ($model, \&_do_remove_match, [$self, $place]);
  }
}
sub _do_remove_match {
  my ($model, $iter, $userdata) = @_;
  my ($self, $place) = @$userdata;
  return $self->signal_emit ('place-equal',
                             $place,
                             $model->get_value ($iter, $model->COL_PLACE));
}

#-----------------------------------------------------------------------------

sub _set_current {
  my ($self, $place) = @_;
  my $model = $self->{'current_model'};
  my $iter = $model->get_iter_first || $model->append;



( run in 0.603 second using v1.01-cache-2.11-cpan-a49fcb8fa48 )