# Tree View/List Store # # The GtkListStore is used to store data in list form, to be used # later on by a GtkTreeView to display it. This demo builds a # simple GtkListStore and displays it. See the Stock Browser # demo for a more advanced example. # # package list_store; use Glib qw(TRUE FALSE); use Gtk2; use constant COLUMN_FIXED => 0; use constant COLUMN_NUMBER => 1; use constant COLUMN_SEVERITY => 2; use constant COLUMN_DESCRIPTION => 3; use constant NUM_COLUMNS => 4; my @data = ( { fixed => FALSE, number => 60482, severity => "Normal", description => "scrollable notebooks and hidden tabs" }, { fixed => FALSE, number => 60620, severity => "Critical", description => "gdk_window_clear_area (gdkwindow-win32.c) is not thread-safe" }, { fixed => FALSE, number => 50214, severity => "Major", description => "Xft support does not clean up correctly" }, { fixed => TRUE, number => 52877, severity => "Major", description => "GtkFileSelection needs a refresh method. " }, { fixed => FALSE, number => 56070, severity => "Normal", description => "Can't click button after setting in sensitive" }, { fixed => TRUE, number => 56355, severity => "Normal", description => "GtkLabel - Not all changes propagate correctly" }, { fixed => FALSE, number => 50055, severity => "Normal", description => "Rework width/height computations for TreeView" }, { fixed => FALSE, number => 58278, severity => "Normal", description => "gtk_dialog_set_response_sensitive () doesn't work" }, { fixed => FALSE, number => 55767, severity => "Normal", description => "Getters for all setters" }, { fixed => FALSE, number => 56925, severity => "Normal", description => "Gtkcalender size" }, { fixed => FALSE, number => 56221, severity => "Normal", description => "Selectable label needs right-click copy menu" }, { fixed => TRUE, number => 50939, severity => "Normal", description => "Add shift clicking to GtkTextView" }, { fixed => FALSE, number => 6112, severity => "Enhancement",description => "netscape-like collapsable toolbars" }, { fixed => FALSE, number => 1, severity => "Normal", description => "First bug :=)" }, ); sub create_model { # create list store my $store = Gtk2::ListStore->new ('Glib::Boolean', # => G_TYPE_BOOLEAN 'Glib::Uint', # => G_TYPE_UINT 'Glib::String', # => G_TYPE_STRING 'Glib::String'); # you get the idea # add data to the list store foreach my $d (@data) { my $iter = $store->append; $store->set ($iter, COLUMN_FIXED, $d->{fixed}, COLUMN_NUMBER, $d->{number}, COLUMN_SEVERITY, $d->{severity}, COLUMN_DESCRIPTION, $d->{description}, ); } return $store; } sub fixed_toggled { my ($cell, $path_str, $model) = @_; # my $path = Gtk2::TreePath->new_from_string ($path_str); my $path = Gtk2::TreePath->new ($path_str); # get toggled iter my $iter = $model->get_iter ($path); my ($fixed) = $model->get ($iter, COLUMN_FIXED); # do something with the value $fixed ^= 1; # set new value $model->set ($iter, COLUMN_FIXED, $fixed); } sub add_columns { my $treeview = shift; my $model = $treeview->get_model; # column for fixed toggles my $renderer = Gtk2::CellRendererToggle->new; $renderer->signal_connect (toggled => \&fixed_toggled, $model); my $column = Gtk2::TreeViewColumn->new_with_attributes ("Fixed?", $renderer, active => COLUMN_FIXED); # set this column to a fixed sizing (of 50 pixels) $column->set_sizing ('fixed'); $column->set_fixed_width (50); $treeview->append_column ($column); # column for bug numbers $renderer = Gtk2::CellRendererText->new; $column = Gtk2::TreeViewColumn->new_with_attributes ("Bug number", $renderer, text => COLUMN_NUMBER); $column->set_sort_column_id (COLUMN_NUMBER); $treeview->append_column ($column); # column for severities $renderer = Gtk2::CellRendererText->new; $column = Gtk2::TreeViewColumn->new_with_attributes ("Severity", $renderer, text => COLUMN_SEVERITY); $column->set_sort_column_id (COLUMN_SEVERITY); $treeview->append_column ($column); # column for description $renderer = Gtk2::CellRendererText->new; $column = Gtk2::TreeViewColumn->new_with_attributes ("Description", $renderer, text => COLUMN_DESCRIPTION); $column->set_sort_column_id (COLUMN_DESCRIPTION); $treeview->append_column ($column); } sub do { if (!$window) { # create window, etc $window = Gtk2::Window->new ('toplevel'); $window->set_title ('GtkListStore demo'); $window->signal_connect (destroy => sub { $window = undef }); $window->set_border_width (8); my $vbox = Gtk2::VBox->new (FALSE, 8); $window->add ($vbox); my $label = Gtk2::Label->new ("This is the bug list (note: not based on real data, it would be nice to have a nice ODBC interface to bugzilla or so, though)."); $vbox->pack_start ($label, FALSE, FALSE, 0); my $sw = Gtk2::ScrolledWindow->new (undef, undef); $sw->set_shadow_type ('etched-in'); $sw->set_policy ('never', 'automatic'); $vbox->pack_start ($sw, TRUE, TRUE, 0); # create tree model my $model = create_model (); # create tree view my $treeview = Gtk2::TreeView->new ($model); $treeview->set_rules_hint (TRUE); $treeview->set_search_column (COLUMN_DESCRIPTION); $sw->add ($treeview); # add columns to the tree view add_columns ($treeview); # finish & show $window->set_default_size (280, 250); } if (!$window->visible) { $window->show_all; } else { $window->destroy; $window = undef; } return $window; } 1; __END__ Copyright (C) 2003 by the gtk2-perl team (see the file AUTHORS for the full list) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307 USA.