Re: How to extend Canvas Group?



On Wed, 7 Apr 2010 10:44:08 +0200
Jeffrey Ratcliffe <jeffrey ratcliffe gmail com> wrote:

Please keep the group in the loop.

2010/4/7 Xi Yang <jiandingzhe msn com>:
package My::Class;
our @isa = qw/Gnome2::Canvas::Group/;

sub myMethod {}
# is that available to use GObject as hash ref directly?
# as I would store something in object
sub myDataAccessor {
my ($self,$value) = @_;
$self->{myKey} = $value;
}

I've never used Gnome::Canvas. Perhaps someone else can answer.


Hi, I used to dabble in that, so here are examples of what Emannule Bassi
was saying.

Below are old mails discussing this, and attached is a working example
##########################################################

   1. Subclassing Gnome2::Canvas (James Muir)
   2. Re: Subclassing Gnome2::Canvas (muppet)

I am able to subclass the aliased canvas and instantiate it while 
passing a parameter, but I cannot do the same with the anti-aliased 
canvas :-( . I would have expected to be able to do this with both 
canvases. Is this a bug or, as usual, am I missing something? Here's a 
simple example:

package can;

use strict;
use Gtk2;
use Gnome2::Canvas;

use Glib::Object::Subclass
    Gnome2::Canvas::,
    properties => [
         Glib::ParamSpec->scalar('melon', 'melon', 'pass in a melon', 
'writable'),
           ]
    ;

sub INIT_INSTANCE
{
    my $self = shift(@_);

    print "INIT_INSTANCE\n";
}


package main;

use strict;
use Gtk2 '-init';
use Gnome2::Canvas;

my $window = Gtk2::Window->new();

my $scroller = Gtk2::ScrolledWindow->new();

my $canvas = can->new_aa(melon=>'x');
# my $canvas = can->new(melon=>'x');

$scroller->add($canvas);

$window->add($scroller);

my $root = $canvas->root();

my $ellipse = 
Gnome2::Canvas::Item->new($root,'Gnome2::Canvas::Ellipse',x1=>10,y1=>10,x2=>40,y2=>40,fill_color=>'red');

$window->signal_connect('destroy'=>sub { Gtk2->main_quit(); } );

$window->show_all();

Gtk2->main();


1;



Thanks for your help.

-James





------------------------------

Message: 2
Date: Tue, 8 Nov 2005 14:11:54 -0500 (EST)
From: "muppet" <scott asofyet org>
Subject: Re: Subclassing Gnome2::Canvas
To: gtk-perl-list gnome org
Message-ID:
        <58099 192 146 101 26 1131477114 squirrel webmail asofyet org>
Content-Type: text/plain;charset=iso-8859-1


James Muir said:
I am able to subclass the aliased canvas and instantiate it while
passing a parameter, but I cannot do the same with the anti-aliased
canvas :-( . I would have expected to be able to do this with both
canvases. Is this a bug or, as usual, am I missing something?

You're missing something.  :-)


Here's a simple example:
...

my $canvas = can->new_aa(melon=>'x');
# my $canvas = can->new(melon=>'x');

You have two different things going on here.  Glib::Object::Subclass aliases
yourpackage::new() to Glib::Object::new(), so the second, commented line
actually resolves to

  Glib::Object::new ('can', 'melon', 'x');

On the other hand, nothing special happens with new_aa(), so that is inherited
normally, and evaluates to this:

  Gnome2::Canvas::new_aa ('can', 'melon', 'x');

However, GNome2::Canvas::new_aa() is an xsub which binds to a non-virtual
class-static method, which takes only one parameter -- the ignored class. 
Even if you take off the extra parameters and just call it as 'can->new_aa()',
it will create a 'Gnome2::Canvas', not a 'can', because it is hardcoded to do
so.  In other words, This Is Not How You Do It.

Either:

a) create your own new_aa() method in your custom package and set it up
correctly, or

b) use the 'aa' property to set up your object, like this:

   $canvas = can->new (aa => TRUE, melon => 'x');

Hint: if you choose a), it will be implemented as b).


-- 
muppet <scott at asofyet dot org>








Attachment: canvas-object
Description: Binary data



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]