Re: hideing elements of the gtktreemodel
- From: Torsten Schoenfeld <kaffeetisch web de>
- To: gtk-perl-list gnome org
- Subject: Re: hideing elements of the gtktreemodel
- Date: Wed, 27 Aug 2003 01:48:53 +0200
On Tue, 26 Aug 2003 14:37:17 +0200, Domsodi Gergely wrote:
What are the possibilities of showing just a part of the model, not the
whole one?
I use the following to achieve something similiar: hide rows of a list
store if they don't match a given pattern. I'm sure you can modify it to
work on trees.
sub filter {
my ($filter_name, $filter_home, $filter_mobile) = @_;
# first, re-add all hidden rows so that they're processed again.
# automatic sorting is assumed.
foreach (@{$model -> { _hidden }}) {
$model -> set(
$model -> append(),
COLUMN_NAME, $_ -> [0],
COLUMN_HOME, $_ -> [1] || "",
COLUMN_MOBILE, $_ -> [2] || "");
}
$model -> { _hidden } = [];
my @victims = ();
# at least one filter has to be defined.
if ($filter_name ne "" || $filter_home ne "" || $filter_mobile ne "") {
# iterate over every row.
$model -> foreach(sub {
my ($model, $path, $iterator) = @_;
my ($value_name,
$value_home,
$value_mobile) = ($model -> get($iterator, COLUMN_NAME),
$model -> get($iterator, COLUMN_HOME),
$model -> get($iterator, COLUMN_MOBILE));
# see if the values match the patterns; a simple substring match
# in this case.
unless (index($value_name, $filter_name) > -1 &&
index($value_home, $filter_home) > -1 &&
index($value_mobile, $filter_mobile) > -1) {
# if the row doesn't match all criteria, add its values to the
# list of hidden rows.
push(@{$model -> { _hidden }}, [$value_name, $value_home, $value_mobile]);
# and store a row reference to it in the victims array for later
# removal. you can't just use the path or an iterator here
# because the store may change further. row references listen to
# all relevant signals and adjust themselves accordingly so that
# they're still valid when we need them.
# you also can't just remove the row at this point as this would
# totally confuse $model -> foreach() and make all your iterators
# invalid.
push(@victims, Gtk2::TreeRowReference -> new($model, $path));
}
# make sure to return zero here to make $model -> foreach() go on.
return 0;
});
# all that's left now is to remove the matching rows.
foreach (@victims) {
$model -> remove($model -> get_iter($_ -> get_path()));
}
}
return 1;
}
I thought about submitting this as a FAQ or a recipe but am unsure
whether it's relevant.
HTH,
-Torsten
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]