#!/usr/bin/perl -w use strict; use Glib qw(TRUE FALSE); use Gtk2 -init; my $index_threshold = 10; # a simple ListStore... my $model = Gtk2::ListStore->new ('Glib::Int', 'Glib::String'); foreach (1..20) { my $str = join "", map { chr (rand(26)+ord("a")) } 1..6; $model->set ($model->append, 0, $_, 1, $str); } # filtered... my $filter = Gtk2::TreeModelFilter->new ($model); $filter->set_visible_func (\&is_visible); # and sorted. my $sort = Gtk2::TreeModelSort->new_with_model ($filter); $sort->set_sort_column_id (1, 'ascending'); # and now, a view with two click-to-sort columns. my $treeview = Gtk2::TreeView->new ($sort); foreach (["Index", 0], ["Junk", 1]) { my $column = Gtk2::TreeViewColumn->new_with_attributes ($_->[0], Gtk2::CellRendererText->new, text => $_->[1]); $column->set_sort_column_id ($_->[1]); $treeview->append_column ($column); } $treeview->set_headers_clickable (TRUE); # boilerplate to show the treeview... my $window = Gtk2::Window->new; my $hbox = Gtk2::HBox->new; $window->add ($hbox); $hbox->add ($treeview); my $vbox = Gtk2::VBox->new; $hbox->pack_start ($vbox, FALSE, FALSE, 0); # a primitive way to modify the filter. $vbox->pack_start (left_label ('Index Threshold'), FALSE, FALSE, 0); our $index_spinner = Gtk2::SpinButton->new_with_range (0, 20, 1); $index_spinner->set_digits (0); $index_spinner->set_value ($index_threshold); $index_spinner->signal_connect (changed => sub { $index_threshold = $index_spinner->get_value; $filter->refilter; # update for changed threshold! }); $vbox->pack_start ($index_spinner, FALSE, FALSE, 0); $window->signal_connect (destroy => sub {Gtk2->main_quit}); $window->show_all; Gtk2->main; sub is_visible { my ($liststore, $iter) = @_; my $index = $liststore->get ($iter, 0); return $index < $index_threshold; } sub left_label { my $label = Gtk2::Label->new (shift); $label->set_alignment (0.0, 0.5); return $label; }