Re: hideing elements of the gtktreemodel
- From: Domsodi Gergely <doome uhulinux hu>
- To: gtk-perl-list gnome org
- Subject: Re: hideing elements of the gtktreemodel
- Date: Wed, 27 Aug 2003 17:15:30 +0200
Hi!
Thanks for the solution, but I think it is not good for me because you
remove the rows from the model.
I need a solution what only changes the visibility of the rows, and
doesn't alter any other things (so the model shall remain unchanged I
think). So if i do a foreach() or an itern_nth_child() on its parent,
the hidden row shall do as if it were there.
Thanks in advance!
On Wed, 27 Aug 2003 01:48:53 +0200
Torsten Schoenfeld <kaffeetisch web de> wrote:
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
_______________________________________________
gtk-perl-list mailing list
gtk-perl-list gnome org
http://mail.gnome.org/mailman/listinfo/gtk-perl-list
--
doome
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]