From: Graciliano M. P. <gmp...@te...> - 2004-08-28 20:35:21
|
Hello folks, I was out of the wxPerl world for a while, but I'm working with it again due a new project here. In this new project we started to make a simple OO framework, that I called Wxtra, to declare easier the classes that inherit from Wx* classes, specially Frames, the App, etc... We did that because we think that the OO of wxWidgets, that bourn in a C++ enverioment, was not good for the Perl world and can be easier, since we are writting Perl code and not C/C++, so, some things can be striped off. In this framework we used the syntax of Class::HPLOO, where we can use the popular class Foo extends Bar { ...} style to declare a Perl OO package. Also we have created some stufs to avoid the import of each constant and event. So, we can get any constant using: my $flag = &WXF::VERTICAL ; my $flag_group = WX::F(" VERTICAL | TOP ") ; And for events: WXE::CLOSE( $frame , \&on_close ) ; Finally we have extended the classes of some controls to can accept simplier arguments and to treat events with the overload of methods, or setting methods. So, to define the close event for a frame we can do: class MyFrame extends Wxtra::Frame { sub OnClose {...} } Or without extend a class: my $frame = new Wxtra::Frame(...) ; $frame->set_OnClose( sub {...} ) ; And now we don't need to care about the event table and etc... So, I present in the end of the msg the beta beta beta version, just to show the syntax (that works very well). Note that this syntax to declare classes was extensive tested here in other projects, we are just reusing it for wxPerl. I will appreciate any type of feedback, since I need them a lot before turn this into a Perl module at CPAN! ;-P Regards, Graciliano M. P. Here's the sample, that I think that have a cleanner OO declaration than any other wxPerl app declaration: ------------------------------------------ use Wxtra ; ## Enable the class{} syntax and Wxtra::* modules. class App extends Wxtra.App { use MainFrame ; sub OnInit { my $frame = MainFrame->new('Test' , [100,100] , [100,100] , "DEFAULT_FRAME_STYLE | STAY_ON_TOP") ; $this->SetTopWindow( $frame ) ; $frame->Show( 1 ) ; 1; } } class MainFrame extends Wxtra.Frame { sub MainFrame ($title , $pos , $size , $flag) { $this = SUPER($title , $pos , $size , $flag , { icon => 'wx.ico' } ) ; my $button = Wxtra::Button->new($this,"test") ; $button->set_OnClick( sub { my $self = shift ; my $id = $self->GetId() ; print "CLICK[$id]\n" ; } ) ; my $sz = Wxtra::BoxSizer->new('VERTICAL') ; $sz->Add($button , 2) ; $sz->Add( Wxtra::Button->new($this,"test2") , 1 ) ; $sz->SetParent($this) ; return $this ; } sub OnActive { print "ACTIVE\n" ; } sub OnLeave { print "LEAVE\n" ; } sub OnClose { print "CLOSE\n" ; } } my $app = App->new() ; $app->MainLoop() ; |