The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

# Copyright 2008, 2009, 2010, 2013 Kevin Ryde

# This file is part of Gtk2-Ex-DateSpinner.
#
# Gtk2-Ex-DateSpinner 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-DateSpinner 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-DateSpinner.  If not, see <http://www.gnu.org/licenses/>.


# Usage: perl cellrenderer.pl
#
# This example uses Gtk2::Ex::DateSpinner::CellRenderer to display and edit
# a date column in a TreeModel.
#
# As usual the model/view/renderer stuff is diabolically complicated, but
# assuming you've managed to display stuff, the editing is then a matter of
# enabling 'editable' in the renderer and hooking onto its 'edited' signal.
# Writing the new data back to the model, or to disk or wherever, is the
# responsibility of that handler.
#
# The code here is basically the same as you'd do for a plain
# Gtk2::CellRendererText.  But DateSpinner::CellRenderer edits with a
# DateSpinner popup.  The $newstr string passed to the 'edited' signal is
# the new ISO YYYY-MM-DD date.
#
# You can set the 'editable' on the renderer by all the usual model+viewer
# tricks, like getting it from a column or setting it with a data func
# according to the phase of the moon.  That way you can have some cells
# editable and some not.
#
# The text column added here is just for decoration, but you could make it
# editable too.  You can even have multiple renderers in the one column,
# each editable.  The choice between one column with two renderers and two
# columns with a renderer each is only really a matter of how you want stuff
# to line up, and column headings, resizing, reordering etc.
#

use 5.008;
use strict;
use warnings;
use Gtk2 '-init';
use Gtk2::Ex::DateSpinner::CellRenderer;

my $liststore = Gtk2::ListStore->new ('Glib::String', 'Glib::String');
use constant { COL_DATE => 0,
               COL_TEXT => 1 };
$liststore->set ($liststore->append,
                 COL_DATE, '2005-06-04',
                 COL_TEXT, 'Some date');
$liststore->set ($liststore->append,
                 COL_DATE, '2007-10-31',
                 COL_TEXT, 'Another date');
$liststore->set ($liststore->append,
                 COL_DATE, '2009-05-01',
                 COL_TEXT, 'And yet a third date');

my $toplevel = Gtk2::Window->new('toplevel');
$toplevel->signal_connect (destroy => sub { Gtk2->main_quit });

my $treeview = Gtk2::TreeView->new;
$treeview->set (model => $liststore,
                reorderable => 1);
$toplevel->add ($treeview);

my $datecolumn = Gtk2::TreeViewColumn->new;
$treeview->append_column ($datecolumn);

my $daterenderer = Gtk2::Ex::DateSpinner::CellRenderer->new (editable => 1);
$datecolumn->pack_start ($daterenderer, 0);
$datecolumn->add_attribute ($daterenderer, text => COL_DATE);

$daterenderer->signal_connect
  (edited => sub {
     my ($daterenderer, $pathstr, $newtext) = @_;
     my $path = Gtk2::TreePath->new_from_string ($pathstr);
     my $iter = $liststore->get_iter ($path);
     # print "set date at path $pathstr to $newtext\n";
     $liststore->set_value ($iter, 0, $newtext);
   });

my $textcolumn = Gtk2::TreeViewColumn->new;
$treeview->append_column ($textcolumn);

my $textrenderer = Gtk2::CellRendererText->new;
$textcolumn->pack_start ($textrenderer, 0);
$textcolumn->add_attribute ($textrenderer, text => COL_TEXT);

$toplevel->show_all;
Gtk2->main;
exit 0;