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 )