Gtk2::Ex::TiedListColumn - tie an array to a column of a list TreeModel
use Gtk2::Ex::TiedListColumn; # any sort of model ... my $my_model = Gtk2::ListStore->new ('Glib::String'); my @array; tie @array, 'Gtk2::Ex::TiedListColumn', $my_model, 0; my $aref = Gtk2::Ex::TiedListColumn->new ($my_model, 5);
TiedListColumn ties an array to a single column of a list-type
Gtk2::TreeModel object so that reading from the array reads from the model. If the model implements modification functions like
remove in the style of
Gtk2::ListStore then writing to the array modifies the model too.
tie things tend to be better in concept than actuality and TiedListColumn is no exception. The benefit is being able to apply generic array algorithms to data in a model, eg. a binary search, uniqifying, or perl's array slice manipulation. As a starting point it's good, but a tie is a fair slowdown and model access is not very fast anyway, so for big crunching you're likely to end up copying data out to an ordinary array anyway. (See
Gtk2::Ex::TreeModelBits for help on that).
A TreeModel has no per-row notion of "exists". If you
delete an element in the middle of the array then it's cleared to
exists is still true, unlike an ordinary perl array where
exists is false in that case. (The tied
exists method simply checks whether the given index is within the number of rows in the model.)
Deleting the endmost element of a TiedListColumn works the same as an ordinary array though. In this case the row is removed from the model, shortening it, and
exists is then false (beyond the end of the model).
TiedListColumn differs from
Gtk2::Ex::TiedList (part of
Gtk2::Ex::Simple::List) in presenting just a single column of the model, whereas TiedList gives array elements which are TiedRow objects presenting a sub-array of all the values in the row. TiedListColumn is good if your model only has one column, or only one you're interested in.
insert_with_values in various places. That function is only available for
Gtk2::ListStore in Gtk 2.6 and higher, so ensure your Gtk is new enough if you're extending a tied ListStore (
tie @var, 'Gtk2::Ex::TiedListColumn', $model
tie @var, 'Gtk2::Ex::TiedListColumn', $model, $column
Tie array variable
@var to the given
$model so it accesses the model contents in
$column. The default column is 0, which is the first column.
$model can be any Glib object implementing the
Gtk2::TreeModel interface. It's expected to be a list style model, but currently that's not enforced.
Gtk2::Ex::TiedListColumn->new ($model, $column)
Return an arrayref which is tied to
$column (default 0). For example
my $aref = Gtk2::Ex::TiedListColumn->new ($model, 6);
is the same as
tie (my @array, 'Gtk2::Ex::TiedListColumn', $model, 6); my $aref = \@array;
If you want your own
@array as such then the plain
tie is easier. If you want an arrayref to pass around to other funcs then
new saves a line of code.
The tie object associated with the array (as returned by the
tie or obtained later with
tied) has the following methods.
Return the underlying model object or column number. Eg.
my @array; tie @array, 'Gtk2::Ex::TiedListColumn', $model; ... my $tlcobj = tied(@array); print $tlcobj->column; # column 0
Or likewise through an arrayref
my $aref = Gtk2::Ex::TiedListColumn->new($model); ... my $model = tied(@$aref)->model;
Gtk2::TreeModel, Gtk2::Ex::Simple::List (for
Gtk2::Ex::Simple::TiedList), Gtk2::Ex::TiedTreePath, Gtk2::Ex::TreeModelBits
Copyright 2008, 2009, 2010 Kevin Ryde
Gtk2-Ex-TiedListColumn is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version.
Gtk2-Ex-TiedListColumn 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 General Public License for more details.
You should have received a copy of the GNU General Public License along with Gtk2-Ex-TiedListColumn. If not, see http://www.gnu.org/licenses/.