App-Chart
view release on metacpan or search on metacpan
maybe/TreeOfTreesModel.pm view on Meta::CPAN
" is ",
$mnum + ((defined $index ? $index : 0) * $toplen),
"\n"; }
if (defined $index) {
# sub-list row
return [ $self->{'stamp'}, $mnum + ($index * $toplen), undef, undef ];
} else {
# top-level row
return [ $self->{'stamp'}, $mnum, $self, undef ];
}
}
# return ($mnum, $index)
sub _iter_to_index {
my ($self, $iter) = @_;
if (! defined $iter) { return undef; }
if ($iter->[0] != $self->{'stamp'}) {
croak "iter is not for this ", ref($self),
" (stamp ", $iter->[0], " want ", $self->{'stamp'}, ")\n";
}
my $n = $iter->[1];
if (DEBUG >= 2) { print " _iter_to_index $n,toplen=",$self->{'toplen'},
" is ", $n % $self->{'toplen'},
" ", int ($n / $self->{'toplen'}), "\n"; }
if (defined $iter->[2]) {
# top-level row
return ($n, undef);
} else {
# sub-list row
my $toplen = $self->{'toplen'};
return ($n % $toplen, int ($n / $toplen));
}
}
# return ($mnum, $index)
sub _iterobj_to_index {
my ($self, $iterobj) = @_;
if (! defined $iterobj) { croak 'TreeOfTreesModel: iter cannot be undef'; }
return _iter_to_index ($self, $iterobj->to_arrayref ($self->{'stamp'}));
}
sub _index_to_iterobj {
my ($self, $mnum, $index) = @_;
return Gtk2::TreeIter->new_from_arrayref
(_index_to_iter ($self, $mnum, $index));
}
#------------------------------------------------------------------------------
# sub-model lookups
# return ($model, $subiter, $mnum)
sub _iter_to_subiter {
my ($self, $iter) = @_;
my ($mnum, $index) = _iter_to_index ($self, $iter);
return _index_to_subiter ($self, $index);
}
# return ($model, $subiter, $mnum)
sub _index_to_subiter {
my ($self, $index) = @_;
my ($model, $subindex, $mnum) = _index_to_subindex ($self, $index);
return ($model, $model->iter_nth_child(undef,$subindex), $mnum);
}
# return ($model, $subindex, $mnum)
sub _index_to_subindex {
my ($self, $index) = @_;
if ($index < 0) {
croak 'TreeOfTreesModel: invalid iter (negative index)';
}
my $models = $self->{'models'};
my $positions = _model_positions ($self);
if ($index >= $positions->[-1]) {
croak 'TreeOfTreesModel: invalid iter (index too big)';
}
for (my $i = $#$positions - 1; $i >= 0; $i--) {
if ($positions->[$i] <= $index) {
return ($models->[$i], $index - $positions->[$i], $i);
}
}
croak 'TreeOfTreesModel: invalid iter (no sub-models at all now)';
}
sub _no_submodels {
my ($operation) = @_;
croak "TreeOfTreesModel: no sub-models to $operation";
}
#------------------------------------------------------------------------------
# 'models' list signals
# 'row-changed' on the models list
#
sub _do_models_row_changed {
my ($model, $path, $subiter, $ref_weak_self) = @_;
my $self = $$ref_weak_self || return;
if (DEBUG) { print "TreeOfTreesModel models row_changed handler\n";}
if ($path->get_depth != 1) { return; } # ignore non-toplevel
my ($mnum) = $path->get_indices;
my $iterobj = _index_to_iterobj ($self, $mnum, undef);
$self->row_changed ($path, $iterobj);
}
# 'row-inserted' on the models list
#
sub _do_models_row_inserted {
my ($model, $path, $subiter, $ref_weak_self) = @_;
my $self = $$ref_weak_self || return;
if (DEBUG) { print "TreeOfTreesModel models row_inserted handler\n";}
if ($path->get_depth != 1) { return; } # ignore non-toplevel
_establish_shift ($self);
_establish_signals ($self);
my ($mnum) = $path->get_indices;
my $iterobj = _index_to_iterobj ($self, $mnum, undef);
$self->row_inserted ($path, $iterobj);
}
# 'row-deleted' on the models list
#
sub _do_models_row_deleted {
my ($model, $path, $ref_weak_self) = @_;
my $self = $$ref_weak_self || return;
( run in 0.822 second using v1.01-cache-2.11-cpan-2398b32b56e )