# Tree View/Editable Cells
#
# This demo demonstrates the use of editable cells in a GtkTreeView. If
# you're new to the GtkTreeView widgets and associates, look into
# the GtkListStore example first.
#
#
package editable_cells;
use Glib qw(TRUE FALSE);
use Gtk2;
my $window = undef;
#typedef struct
#{
# gint number;
# gchar *product;
# gboolean editable;
#}
#Item;
use constant COLUMN_NUMBER => 0;
use constant COLUMN_PRODUCT => 1;
use constant COLUMN_EDITABLE => 2;
use constant NUM_COLUMNS => 3;
my @articles = ();
sub add_items {
push @articles,
{ number => 3, product => "bottles of coke", editable => TRUE, },
{ number => 5, product => "packages of noodles", editable => TRUE, },
{ number => 2, product => "packages of chocolate chip cookies", editable => TRUE, },
{ number => 1, product => "can vanilla ice cream", editable => TRUE, },
{ number => 6, product => "eggs", editable => TRUE, },
;
}
sub create_model {
# create array
add_items ();
# create list store
my $model = Gtk2::ListStore->new (qw/Glib::Int Glib::String Glib::Boolean/);
# add items
foreach my $a (@articles) {
my $iter = $model->append;
$model->set ($iter,
COLUMN_NUMBER, $a->{number},
COLUMN_PRODUCT, $a->{product},
COLUMN_EDITABLE, $a->{editable});
}
return $model;
}
sub add_item {
my ($button, $model) = @_;
push @articles, {
number => 0,
product => "Description here",
editable => TRUE,
};
my $iter = $model->append;
$model->set ($iter,
COLUMN_NUMBER, $articles[-1]{number},
COLUMN_PRODUCT, $articles[-1]{product},
COLUMN_EDITABLE, $articles[-1]{editable});
}
sub remove_item {
my ($widget, $treeview) = @_;
my $model = $treeview->get_model;
my $selection = $treeview->get_selection;
my $iter = $selection->get_selected;
if ($iter) {
my $path = $model->get_path ($iter);
my $i = ($path->get_indices)[0];
$model->remove ($iter);
splice @articles, $i;
}
}
sub cell_edited {
my ($cell, $path_string, $new_text, $model) = @_;
my $path = Gtk2::TreePath->new_from_string ($path_string);
my $column = $cell->get_data ("column");
my $iter = $model->get_iter ($path);
if ($column == COLUMN_NUMBER) {
my $i = ($path->get_indices)[0];
$articles[$i]{number} = $new_text;
$model->set ($iter, $column, $articles[$i]{number});
} elsif ($column == COLUMN_PRODUCT) {
my $i = ($path->get_indices)[0];
$articles[$i]{product} = $new_text;
$model->set ($iter, $column, $articles[$i]{product});
}
}
sub add_columns {
my $treeview = shift;
my $model = $treeview->get_model;
# number column
my $renderer = Gtk2::CellRendererText->new;
$renderer->signal_connect (edited => \&cell_edited, $model);
$renderer->set_data (column => COLUMN_NUMBER);
$treeview->insert_column_with_attributes (-1, "Number", $renderer,
text => COLUMN_NUMBER,
editable => COLUMN_EDITABLE);
# product column
$renderer = Gtk2::CellRendererText->new;
$renderer->signal_connect (edited => \&cell_edited, $model);
$renderer->set_data (column => COLUMN_PRODUCT);
$treeview->insert_column_with_attributes (-1, "Product", $renderer,
text => COLUMN_PRODUCT,
editable => COLUMN_EDITABLE);
}
sub do {
if (!$window) {
# create window, etc
$window = Gtk2::Window->new;
$window->set_title ("Shopping list");
$window->set_border_width (5);
$window->signal_connect (destroy => sub { $window = undef; 1 });
my $vbox = Gtk2::VBox->new (FALSE, 5);
$window->add ($vbox);
$vbox->pack_start (Gtk2::Label->new ("Shopping list (you can edit the cells!)"),
FALSE, FALSE, 0);
my $sw = Gtk2::ScrolledWindow->new;
$sw->set_shadow_type ('etched-in');
$sw->set_policy ('automatic', 'automatic');
$vbox->pack_start ($sw, TRUE, TRUE, 0);
# create model
my $model = create_model ();
# create tree view
my $treeview = Gtk2::TreeView->new_with_model ($model);
## g_object_unref (model);
$treeview->set_rules_hint (TRUE);
$treeview->get_selection->set_mode ('single');
add_columns ($treeview);
$sw->add ($treeview);
# some buttons
my $hbox = Gtk2::HBox->new (TRUE, 4);
$vbox->pack_start ($hbox, FALSE, FALSE, 0);
my $button = Gtk2::Button->new ("Add item");
$button->signal_connect (clicked => \&add_item, $model);
$hbox->pack_start ($button, TRUE, TRUE, 0);
$button = Gtk2::Button->new ("Remove item");
$button->signal_connect (clicked => \&remove_item, $treeview);
$hbox->pack_start ($button, TRUE, TRUE, 0);
$window->set_default_size (320, 200);
}
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.