Gtk2::GladeXML::Simple
A clean object-oriented interface to Gtk2::GladeXML
A clean object-oriented interface to Gtk2::GladeXML
package MyApp;
use base qw( Gtk2::GladeXML::Simple );
sub new {
my $class = shift;
my $self = $class->SUPER::new( $gladefile );
return $self;
}
...
# Signal handlers are methods of your class
sub on_button_clicked {
my $self = shift;
# You have access to your widgets directly
# or using $self->get_widget( widget_name )
my $button = $self->{button1};
}
Gtk2::GladeXML::Simple is a module that provides a clean and easy interface for Gnome/Gtk2 and Glade applications using an object-oriented syntax. You just make Gtk2::GladeXML::Simple your application's base class, have your "new" call "SUPER::new", and the module will do the tedious and dirty work for you.
Gtk2::GladeXML::Simple offers:
sub on_button1_clicked {
my $self = shift; # $self always received as first parameter
...
# do anything you want in a OO fashioned way
}
my $btn = $self->{button1}; # fetch widgets as instance attributes by their names
my $window = $self->{main_window};
my $custom = $self->{custom_widget};
This class provides the following public methods:
This example shows the usage of the module by creating a small Yahoo search engine using WWW::Search::Yahoo.
package YahooApp;
use strict;
use warnings;
use Gtk2 '-init';
use Gtk2::Html2; #not part of the Gtk2 core widgets
use Gtk2::GladeXML::Simple;
use WWW::Search;
use base qw( Gtk2::GladeXML::Simple );
my $header =<<HEADER;
<html>
<meta HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8">
<header><title>Yahoo Gtk2 App</title>
<style type="text/css">
.title {font-family: Georgia; color: blue; font-size: 13px}
.description {padding-left: 3px; font-family: Georgia; font-size:10px}
.url {padding-left: 3px; font-family: Georgia; font-size:10px; color: green}
</style>
</head>
<body>
<h2 style="font-family: Georgia, Arial; font-weight: bold">
Found:
</h2>
HEADER
my $footer =<<FOOTER;
</body>
</html>
FOOTER
sub new {
my $class = shift;
#Calling our super class constructor
my $self = $class->SUPER::new( 'yahoo.glade' );
#Initialize the search engine
$self->{_yahoo} = WWW::Search->new( 'Yahoo' );
return $self;
}
sub do_search {
my $self = shift;
$self->{_yahoo}->native_query( shift );
my $buf = $header;
for( 1..10 ) {
my $rv = $self->{_yahoo}->next_result || last;
$buf .= qq{<p><div class="title">} . $rv->title;
$buf .= qq{</div><br /><div class="description">} . $rv->description;
$buf .= qq{</div><br /><div class="url">} . $rv->url . q{</div></p><br />};
}
$buf .= $footer;
$self->{buf} = $buf;
}
### Signal handlers, now they're methods of the class ###
sub on_Clear_clicked {
my $self = shift;
my $html = $self->{custom1}; #fetch widgets by their names
$html->{document}->clear;
my $statusbar = $self->{statusbar1}; #another widget
$statusbar->pop( $statusbar->get_context_id( "Yahoo" ) );
}
sub on_Search_clicked {
my $self = shift;
my $text = $self->{text_entry}->get_text;
return unless $text ne '';
my $statusbar = $self->{statusbar1};
$statusbar->push( $statusbar->get_context_id( "Yahoo" ), "Searching for: $text" );
$self->do_search( $text );
my $html = $self->{custom1};
$html->{document}->clear;
$html->{document}->open_stream( "text/html" );
$html->{document}->write_stream( $self->{buf} );
$html->{document}->close_stream;
}
### Creation function for the custom widget, method of the class as well ###
sub create_htmlview {
my $self = shift;
my $view = Gtk2::Html2::View->new;
my $document = Gtk2::Html2::Document->new;
$view->set_document( $document );
$view->{document} = $document;
$view->show_all;
return $view;
}
sub gtk_main_quit { Gtk2->main_quit }
1;
package main;
YahooApp->new->run; #Go!
1;
The yahoo.glade file needed for this example is in the examples directory, along with other example programs.
The Gtk2::GladeXML::Simple distribution includes gpsketcher, a program that generates Perl code stubs from glade XML files. The code stubs include the basic framework for Gtk2::GladeXML::Simple interaction, method signatures, and everything that describes the application itself. Developers must fill in the code stubs to add the correct functionality to the application.
Gtk2::GladeXML, Gtk2, gpsketcher
The Libglade Reference Manual at <http://developer.gnome.org/doc/API/2.0/libglade/>
The gtk2 API Reference at <http://developer.gnome.org/doc/API/2.0/gtk/index.html>
Tests.
More examples?
Add Gtk2::GladeXML::Simple::new_from_buffer()?
Support to I18N ( bindtextdomain )
Marco Antonio Manzo <marcoam@perl.org.mx>
Special thanks in no order to Scott Arrington "muppet" <scott at asofyet dot org> who provided lots of great ideas to improve this module. Sandino "tigrux" Flores <tigrux at ximian dot com> who is the author of SimpleGladeApp and the main source of this module's core idea. Sean M. Burke <sburke at cpan dot org> and Rocco Caputo <rcaputo at cpan dot org> for constantly helping me with ideas and cleaning my POD.
Copyright (C) 2005 by Marco Antonio Manzo
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.6 or, at your option, any later version of Perl 5 you may have available.