Re: Question about Gtk2-1.042/examples/customlist.pl
- From: "muppet" <scott asofyet org>
- To: gtk-perl-list gnome org
- Subject: Re: Question about Gtk2-1.042/examples/customlist.pl
- Date: Tue, 13 Apr 2004 16:24:57 -0400 (EDT)
Niel Das said:
So I began by simply adding a simple new constructor just above the
INIT_INSTANCE function, as follows:
sub new {
    my $class = shift;
    my $self = {};
    bless($self, $class);
    $self->INIT_INSTANCE();
    print "Hello there from new!\n";
    return $self;
}
You didn't create a Glib::Object!  Glib::Object derivatives are special,
because of the magic underlying that ties them to the underlying C-level
GObject.
Also, *never* call INIT_INSTANCE like that.  It is called by the real
Glib::Object constructor.
Your code should look like this:
  sub new {
      my $class = shift;
      my $self = Glib::Object::new ($class);
      return $self;
  }
Glib::Object::new() will do the actual creation work and return the object
already blessed into the descendent class.
If you look at Glib::Object::Subclass::new(), you'll see that that's about it.
 In general you don't want your constructor to do a lot of work, because that
will make it difficult to derive a new object; thus,
Glib::Object::Subclass::new() simply passes the options through to
Glib::Object::new(), which uses them the way Glib::Object::set() would.  In
fact, most of the constructors actually in the GTK+ API are really just
convenience constructors, which pass their arguments to g_object_new().
TreeModels are a slightly different story.  The TreeModel interface just
defines how to access the data, not anything else.  So, for the API you were
discussing,
my $customlist = CustomList->new($n_columns_scalar, $arrayref_column_types);
you could do that a couple of different ways...
  # suppose you have a construct-only object property columns, which
  # is a reference to an array of columns:
  sub new {
      my ($class, @columns) = @_;
      return Glib::Object::new ($class, columns => \ columns);
  }
  # or you pass some important data that only the constructor can mangle,
  # because you can't change it after the model is created.
  sub new {
      my ($class, @column_descriptors) = @_;
      my $self = Glib::Object::new ($class);
      # note that INIT_INSTANCE has already run at this point.
      $self->_mangle_descriptors_into_columns (@column_descriptors);
      return $self;
  }
Also, I was wondering if there are any additional resources are
available to refer to about implementing custom GtkTreeModels with
Gtk2-Perl besides the customrender.pl and customlist.pl examples, and
the GTK+ 2.0 Tree View Tutorial (http://scentric.net/tutorial/)?
That's the only one of which i know.
#
#  here we register our new type and its interfaces with the type system.
#  If you want to implement additional interfaces like GtkTreeSortable,
#  you will need to do it here.
#
use Glib::Object::Subclass
    Glib::Object::,
    interfaces => [ Gtk2::TreeModel:: ],
    ;
# This method of implementation does not work -- Niel comment
#use Glib::Object::Subclass (Glib::Object::);
#Gtk2::TreeModel->add_interface(__PACKAGE__);
That was an experimental method that was abandoned before the GInterface stuff
stabilized.  The "interfaces" key to Glib::Type::register_object() and
Glib::Object::Subclass is the officially-sanctioned way to do that.
-- 
muppet <scott at asofyet dot org>
[
Date Prev][
Date Next]   [
Thread Prev][
Thread Next]   
[
Thread Index]
[
Date Index]
[
Author Index]