*** empty log message ***

This commit is contained in:
Andrei Zmievski
2004-01-19 00:51:58 +00:00
parent 327e7ae7b1
commit 371e18e833
29 changed files with 1016 additions and 16 deletions

29
slides/gtk/boxes.xml Normal file
View File

@@ -0,0 +1,29 @@
<slide title="Boxes" logo1="images/php-gtk.gif" navColor="#b0c2d3" navsize="1.4em">
<blurb>
A more sophisticated container is a ~box~. It allows you to place, or ~pack~,
more than one widget inside a simple container. There are horizontal
(*GtkHBox*) and vertical (*GtkVBox*) boxes that pack their widgets
correspondingly. First, create a new box:
</blurb>
<example fontsize="1.3ex"><![CDATA[<?php $box =& new GtkHBox($homogenous = false, $spacing = 0); ?>]]></example>
<blurb>
</blurb>
<blurb>
Then place some widgets into it using either %pack_start()% method (packs
left-to-right for HBox and top-to-bottom for VBox) or %pack_end()% method
(vice versa).
</blurb>
<example fontsize="1.3ex"><![CDATA[<?php
$box->pack_start($child, $expand = true, $fill = true, $padding = 0);
?>]]></example>
<blurb>
</blurb>
<blurb>
You can nest the boxes to any degree, thus creating complex containment
patterns.
</blurb>
</slide>

View File

@@ -2,14 +2,17 @@
<blurb>The user-defined signal handlers are called ~callbacks~.</blurb>
<blurb>The first parameter normally passed to callbacks is the widget that
<blurb>The first parameter the callback receives is the widget that
emitted the signal. The rest are signal-dependent. For example, the callback
for 'switch_page' signal of GtkNotebook class would look like this:</blurb>
for %switch_page% signal of *GtkNotebook* class would look like this:</blurb>
<example fontsize="1.5ex"><![CDATA[<?php function on_switch_page($notebook, $page, page_num) { } ?>]]></example>
<blurb>The low-level event callbacks receive an additional parameter object
describing the event. It has fields for event type, button number if it was a
mouse click, key code if it was a key press, etc.</blurb>
<blurb>where %$page% is the object representing the page that was switched to,
and %$page_num% is its page number.</blurb>
<blurb>The low-level event callbacks receive an additional object describing
the event. It has properties for event type, button number if it was a mouse
click, key code if it was a key press, etc.</blurb>
<blurb>It is possible to connect more than one callback to the same signal.
They will be run in the order they are connected. It is also possible to

26
slides/gtk/connecting.xml Normal file
View File

@@ -0,0 +1,26 @@
<slide title="Connecting Signals" logo1="images/php-gtk.gif" navColor="#b0c2d3" navsize="1.4em">
<blurb>
The most basic way of connecting a signal to a callback with with
%connect()% method. For example, to respond to a %'clicked'% signal on
a *GtkButton* widget, you would do this:
</blurb>
<example fontsize="1ex"><![CDATA[<?php
function on_ok_clicked($button) { }
$ok_button->connect('clicked', 'on_ok_clicked');
?>]]></example>
<blurb>
If you wanted to connect to a class method or an object method, you have to use
a special syntax for denoting that:
</blurb>
<example fontsize="1ex"><![CDATA[<?php
class A {
function on_ok_clicked($button) { }
}
$ok_button->connect('clicked', array('A', 'on_ok_clicked')); // connect to a class method
$a_obj = new A();
$ok_button->connect('clicked', array(&$a_obj, 'on_ok_clicked')); // connect to an instance method
?>]]></example>
</slide>

View File

@@ -0,0 +1,23 @@
<slide title="Connecting Signals" logo1="images/php-gtk.gif" navColor="#b0c2d3" navsize="1.4em">
<blurb>
Sometimes the callbacks needs access to program data or other information. To
avoid messing with global variables, you can pass the additional data to the
callback when you connect it.
</blurb>
<example fontsize="1.3ex"><![CDATA[<?php
function on_ok_clicked($button, $window, $my_data) { }
$ok_button->connect('clicked', 'on_ok_clicked', $window, 'some data');
?>]]></example>
<blurb>%connect()% returns an number that uniquely identifies the connection
made. This can be useful if you want to disable or remove the callback during
the execution.
</blurb>
<example fontsize="1.3ex"><![CDATA[<?php
$conn_id = $ok_button->connect('clicked', 'on_ok_clicked');
$ok_button->signal_handler_block($conn_id); // disable callback
$ok_button->signal_handler_unblock($conn_id); // re-enable callback
$ok_button->disconnect($conn_id); // remove callback
?>]]></example>
</slide>

View File

@@ -1,16 +1,22 @@
<slide title="Creating and Destroying" logo1="images/php-gtk.gif" navColor="#b0c2d3" navsize="1.4em">
<blurb>
To create a widget, use %&amp;new% operator instead of %new%. Some
widgets take constructor parameters to initialize themselves to some
state.
To create a widget, use |0033aa|%&amp;new%| operator instead of
|0033aa|%new%|. Some widgets take constructor parameters to initialize
themselves to some state.
</blurb>
<example fontsize="1.5ex"><![CDATA[<?php $vbox =& new GtkVBox(false, 5); ?>]]></example>
<blurb>
To destroy a widget, use %destroy()% method. This is rarely used because all
Some widgets may be created by factories or other static methods:
</blurb>
<example fontsize="1.5ex"><![CDATA[<?php list($pixmap, $mask) = gdk::pixmap_create_from_xpm(...); ?>]]></example>
<blurb>
To destroy a widget, call its %destroy()% method. This is rarely used because all
widgets are destroyed automatically upon the application's exit.
</blurb>
<blurb>
Destroying a widget will not
Note that simply unsetting the widget variable will not work in PHP 4 due to
Zend Engine limitations.
</blurb>
</slide>

32
slides/gtk/extensions.xml Normal file
View File

@@ -0,0 +1,32 @@
<slide title="Extensions" logo1="images/php-gtk.gif" navColor="#b0c2d3" navsize="1.4em">
<blurb>
PHP-GTK is actually a mini-PHP: it provides the core functionality and API,
and a set of extensions for additional features. The Glade support is
implemented via an extension. Some other ones in the main distribution are:
</blurb>
<list fontsize="2.5ex">
<bullet>
|d04a21|gdkpixbuf| - provides image loading and rendering functionality
</bullet>
<bullet>
|d04a21|scintilla| - a source code editing widget with syntax highlighting,
code completion, and much more
</bullet>
<bullet>
|d04a21|gtkhtml| - makes HTML rendering and editing possible
</bullet>
<bullet>
|d04a21|canvas| - antialiased vector graphics rendering and manipulation
</bullet>
<bullet>
|d04a21|extra| - additional widgets for plotting, spreadsheets, etc
</bullet>
</list>
<blurb>
There are some other extensions created by users, such as GLArea (for OpenGL
rendering).
</blurb>
</slide>

25
slides/gtk/focus.xml Normal file
View File

@@ -0,0 +1,25 @@
<slide title="Focus" logo1="images/php-gtk.gif" navColor="#b0c2d3" navsize="1.4em">
<blurb>
Widgets can grab the keyboard focus if needed, but it only makes sense for
those that interact with keyboard with some way. So, *GtkEntry* will work for
example, while *GtkArrow* won't.
</blurb>
<example fontsize="1.5ex"><![CDATA[<?php $entry->grab_focus(); ?>]]></example>
<blurb>
</blurb>
<blurb>
</blurb>
<blurb>
It is possible to specify which widget should be activated when the user
presses the *Enter* key in a dialog box. Such a widget is called a ~default~
one.
</blurb>
<example fontsize="1.5ex"><![CDATA[<?php
$ok_button->can_default(TRUE);
$ok_button->grab_default();
?>]]></example>
</slide>

View File

@@ -0,0 +1,28 @@
<slide title="Containers Overview" logo1="images/php-gtk.gif" navColor="#b0c2d3" navsize="1.4em">
<blurb>
Remember that containers are widgets that can contain other widgets. The
simplest type of container is *GtkBin* - it can only hold one child widget. An
example of this container is a regular button.
</blurb>
<blurb>
To add to or remove a widget from a container:
</blurb>
<example fontsize="1ex"><![CDATA[<?php
$container->add($widget);
$container->remove($widget);
?>]]></example>
<blurb>
To obtain all the widgets in a container, use one of the following approaches.
</blurb>
<example fontsize="1ex"><![CDATA[<?php
$child_widgets = $container->children();
$child_widgets = $container->children;
?>]]></example>
<blurb>
In either case %$child_widgets% will be an array of widgets, but the second
approach lets you access a specific child directly, e.g.
%$container->children[0]%.
</blurb>
</slide>

View File

@@ -3,7 +3,7 @@
<list type="number" fontsize="2ex">
<bullet>Instantiate the widget object of the appropriate class</bullet>
</list>
<example fontsize="1ex"><![CDATA[<?php $ok = &new GtkButton('OK'); ?>]]></example>
<example fontsize="1ex"><![CDATA[<?php $ok =& new GtkButton('OK'); ?>]]></example>
<list type="number" num="2" fontsize="2ex">
<bullet>Connect the signals to callbacks</bullet>
</list>

12
slides/gtk/glade.xml Normal file
View File

@@ -0,0 +1,12 @@
<slide title="Glade" logo1="images/php-gtk.gif" navColor="#b0c2d3" navsize="1.4em">
<blurb>
Building complicated interfaces by hand is tedious. Thankfully, there is
Glade. You can visually drag-n-drop widgets, set properties, connect signals,
and then just load the resulting XML file into PHP-GTK.
</blurb>
<link align="center" text="Temperature Conversion (Glade variant)" href="presentations/slides/gtk/tempconv-g.php" />
<example fontsize="1ex" filename="tempconv-g.php" />
</slide>

12
slides/gtk/mainloop.xml Normal file
View File

@@ -0,0 +1,12 @@
<slide title="Main Loop" logo1="images/php-gtk.gif" navColor="#b0c2d3" navsize="1.4em">
<blurb>
Once you set up your application, you have to give control over to Gtk's ~main loop~.
This is where all the events are processed and dispatched.
</blurb>
<example fontsize="1.3ex"><![CDATA[<?php
gtk::main(); // start the main loop
gtk::main_quit() // end the main loop
?>]]></example>
</slide>

30
slides/gtk/php-gtk-2.xml Normal file
View File

@@ -0,0 +1,30 @@
<slide title="PHP-GTK 2" logo1="images/php-gtk.gif" navColor="#b0c2d3" navsize="1.4em">
<blurb>
PHP-GTK 2 (currently under development) is based on PHP 5 and Gtk+ 2.
</blurb>
<blurb>
PHP 5 has a brand new object model that solves all the lingering technical
issues and allows for much more powerful control of the Gtk+ 2 interface.
</blurb>
<list fontsize="2.5ex">
<bullet>
objects are no longer glorified arrays - they are always passed by reference
</bullet>
<bullet>
since objects have destructors, memory is properly cleaned up
</bullet>
<bullet>
no problems with method invocation (even something like %$button->get_child()->set_text()% is possible)
</bullet>
</list>
<blurb>
PHP 5 also adds a number of features to aid OO programming: abstract classes,
interface, private and protected methods and variables, exceptions, and much
more.
</blurb>
</slide>

35
slides/gtk/php-gtk-2a.xml Normal file
View File

@@ -0,0 +1,35 @@
<slide title="PHP-GTK 2" logo1="images/php-gtk.gif" navColor="#b0c2d3" navsize="1.4em">
<blurb>
Gtk+ 2 is a substantial change from the first version.
</blurb>
<list fontsize="2.5ex">
<bullet>
generalized type system
</bullet>
<bullet>
fully internationalized, all text is UTF-8
</bullet>
<bullet>
Pango-based Text widget can render any text in any language in the same box,
and provides enough visual and navigation features to make a reasonable code editor
</bullet>
<bullet>
GdkPixbuf is integrated
</bullet>
<bullet>
GDK is no longer an orphan child, as far as objects are concerned and has
double-buffering for smoooooth rendering
</bullet>
<bullet>
Powerful new tree widget based on model-view approach
</bullet>
<bullet>
Accessibility support for disabled users
</bullet>
<bullet>
lots of cleanup and simplification
</bullet>
</list>
</slide>

42
slides/gtk/php-gtk-2b.xml Normal file
View File

@@ -0,0 +1,42 @@
<slide title="PHP-GTK 2" logo1="images/php-gtk.gif" navColor="#b0c2d3" navsize="1.4em">
<example fontsize="1ex"><![CDATA[From: Benjamin Smith
Subject: PHP5, PHP-GTK, and SQLite
Groups: php.gtk.general
Maybe I'm just a bit weird, but I just read
about (and started playing with) SQLite on PHP5 beta.
Wow.
Combine SQLite and PHP-GTK, and you have an INCREDIBLE development environment
for client-side or client-server development!
Wow.
I spent the last year putting together a 50,000 line software package, and did
it all with data arrays because using SQL would be too "heavy" and a pain to
write an installer for all the various releases of Windows, MacOS, Linux,
etc. to be supported.
So many loops, so many painful recursive functions...
foreach($clients as $key => $client)...
But, if SQLite is BUILT IN...
select clients from clienttable...
I could probably re-write this in 30k lines or less with SQL support.
Wow. PHP-GTK2, Glade, SQLite. It's like LAMP all over again, only on Windows,
OSX, Linux, Sparc, and god knows what else. This is truly a platform for
quick, powerful, multi-platform, client-side GUI development under
development...
I CAN'T WAIT UNTIL PHP-GTK2 IS OUT!!!!!!!
W00t!
-Ben
]]></example>
</slide>

41
slides/gtk/problems.xml Normal file
View File

@@ -0,0 +1,41 @@
<slide title="What's bad?" logo1="images/php-gtk.gif" navColor="#b0c2d3" navsize="1.4em">
<blurb>
Due to limitations of Zend Engine in PHP 4, PHP-GTK has some problematic
issues.
</blurb>
<list fontsize="2.5ex">
<bullet>
byref constructor (using %&amp;new% instead of %new%, and not consistently at that)
</bullet>
<bullet>
method invocation on properties (%$button->child->set_text()% will not work)
</bullet>
<bullet>
memory deallocation (object destructors are never called)
</bullet>
<bullet>
a couple of other minor ones
</bullet>
</list>
<blurb>
Since it is such a large codebase and API, the documentation is lagging. We
only have one active person working on the English version of documentation
and a couple of translators for other languages.
</blurb>
<blurb>
The applications have to be distributed with their source code, which may be
beneficial or disadvantageous depending on your point of view. Some attemps
have been made to encode the source, but the solution is not quite there yet.
</blurb>
<blurb>
Finally, it would be nice to have a better way to install PHP-GTK applications
on the desktop. There are some custom installers but a standard, professional
one is still needed.
</blurb>
</slide>

64
slides/gtk/resources.xml Normal file
View File

@@ -0,0 +1,64 @@
<slide title="Resources" logo1="images/php-gtk.gif" navColor="#b0c2d3" navsize="1.4em">
<blurb fontsize="2ex">|006699|Sites|</blurb>
<list fontsize="1.8ex">
<bullet>
http://gtk.php.net/
</bullet>
<bullet>
http://wiki.gtk.php.net/
</bullet>
<bullet>
http://www.gtk.org/
</bullet>
<bullet>
http://www.kromann.info/php4-gtk.php
</bullet>
<bullet>
http://www.cweiske.de/phpgtk.htm
</bullet>
<bullet>
http://binary.gamer.net.nz/
</bullet>
<bullet>
http://www.akbkhome.com/Projects/
</bullet>
</list>
<blurb fontsize="2ex">|006699|Documentation|</blurb>
<list fontsize="1.8ex">
<bullet>
http://gtk.php.net/manual
</bullet>
<bullet>
http://www.gtk.org/api
</bullet>
<bullet>
http://www.gtk.org/tutorial1.2/
</bullet>
</list>
<blurb fontsize="2ex">|006699|Articles|</blurb>
<list fontsize="1.8ex">
<bullet>
http://www.sitepoint.com/article/697
</bullet>
<bullet>
http://www.sitepoint.com/article/839
</bullet>
</list>
<blurb fontsize="2ex">|006699|Mailing Lists|</blurb>
<list fontsize="1.8ex">
<bullet>
General: http://news.php.net/group.php?group=php.gtk.general
</bullet>
<bullet>
PHP-GTK internals: http://news.php.net/group.php?group=php.gtk.dev
</bullet>
<bullet>
http://www.php.net/mailing-lists.php
</bullet>
</list>
</slide>

View File

@@ -0,0 +1,22 @@
<slide title="Sensitivity" logo1="images/php-gtk.gif" navColor="#b0c2d3" navsize="1.4em">
<blurb>
A disabled, or ~insensitive~, widget does not respond to input and has a
different visual appearance in order to indicate such state. To enable or
disable a widget:
</blurb>
<example fontsize="1.5ex"><![CDATA[<?php $button->set_sensitive($state); ?>]]></example>
<blurb>
where %$state% is %TRUE% or %FALSE%. If the widget is enabled, but its parent
is not, then it is considered disabled as well. To test a widget's state:
</blurb>
<example fontsize="1.5ex"><![CDATA[<?php
$state = $button->sensitive();
$state = $button->is_sensitive();
?>]]></example>
<blurb>
The first method tests just the widget itself, while the second one takes into
account its parent's state as well.
</blurb>
</slide>

26
slides/gtk/showing.xml Normal file
View File

@@ -0,0 +1,26 @@
<slide title="Visibility" logo1="images/php-gtk.gif" navColor="#b0c2d3" navsize="1.4em">
<blurb>Creating a widget is not enough. You also have to make it appear on the
screen. In order to do this use the %show()% or %show_all()% methods. There is
a difference between these methods if the widget is a container.
</blurb>
<blurb>
This will display the window, but not any of its contained children:
</blurb>
<example fontsize="1.5ex"><![CDATA[<?php $window->show(); ?>]]></example>
<blurb>
This will display the window and all of its contained children:
</blurb>
<example fontsize="1.5ex"><![CDATA[<?php $window->show_all(); ?>]]></example>
<blurb>
If a widget is inside a container and you call %show()% on it, it will not
appear on screen until the container itself has been shown.
</blurb>
<blurb>
Corresponding functions for hiding a widget are %hide()% and %hide_all()%.
</blurb>
</slide>

View File

@@ -7,7 +7,9 @@
<blurb>The passing of control is implemented via ~signals~. When a widget
experiences an event, it ~emits~ a signal. Every signal is uniquely
identified by name, but two different widgets may have the signal of the
same name but different meaning.</blurb>
same name but different meaning. Signals are inherited by widgets from up the
widget hierarchy, i.e. *GtkButton* will have all the signals that *GtkWidget*
has.</blurb>
<blurb>Signals present a way to customize application's behavior according
to the developer's needs and user's actions. Each signal has a default

21
slides/gtk/sizepos.xml Normal file
View File

@@ -0,0 +1,21 @@
<slide title="Size/Position" logo1="images/php-gtk.gif" navColor="#b0c2d3" navsize="1.4em">
<blurb>
In a majority of cases, it is not advisable to set the size or position of the
widget explicitly. The reason is that this disregards any external constraints
that might be imposed on a widget, such as user's preference for the font
size, resizing of the dialog box, the length of the button label in another
language. It is best to let the containers chooise the sizing and placement of
their children.
</blurb>
<blurb>
That said, a few widgets should have their size and position set manually.
This includes *GtkWindow*, *GtkCTree*, *GtkCList*, and a couple of others.
To accomplish this, use these methods:
</blurb>
<example fontsize="1.5ex"><![CDATA[<?php
$window->set_usize($width, $height);
$window->set_uposition($x, $y);
?>]]></example>
</slide>

60
slides/gtk/tempconv-g.php Normal file
View File

@@ -0,0 +1,60 @@
<?php
dl('php_gtk.so');
$interface =& new GladeXML(dirname(__FILE__).'/tempconv.glade');
$interface->signal_autoconnect();
/* start the main loop */
gtk::main();
function on_celsius_clicked($button)
{
global $interface;
$t_entry = $interface->get_widget('input_temp');
$res_label = $interface->get_widget('result');
/* get contents of the entry field */
$chars = $t_entry->get_chars(0, -1);
if (empty($chars) || !is_numeric($chars)) {
/* if invalid contents, indicate so, reselect entry field and focus on it */
$res_label->set_text('Invalid input');
} else {
/* if valid contents, perform conversion and output result */
$temp = (((int)$chars)-32)/1.8;
$res_label->set_text(sprintf("$chars Fahrenheit is %.1f Celsius", $temp));
}
$t_entry->select_region(0, -1);
$t_entry->grab_focus();
}
function on_fahr_clicked($button)
{
global $interface;
$t_entry = $interface->get_widget('input_temp');
$res_label = $interface->get_widget('result');
$chars = $t_entry->get_chars(0, -1);
if (empty($chars) || !is_numeric($chars)) {
/* if invalid contents, indicate so, reselect entry field and focus on it */
$res_label->set_text('Invalid input');
} else {
/* if valid contents, perform conversion and output result */
$temp = ((int)$chars)*1.8+32;
$res_label->set_text(sprintf("$chars Celsius is %.1f Fahrenheit", $temp));
}
$t_entry->select_region(0, -1);
$t_entry->grab_focus();
}
function on_exit_clicked($button)
{
/* exit the main loop */
gtk::main_quit();
}
?>

161
slides/gtk/tempconv.glade Normal file
View File

@@ -0,0 +1,161 @@
<?xml version="1.0"?>
<GTK-Interface>
<project>
<directory></directory>
<source_directory>src</source_directory>
<pixmaps_directory>pixmaps</pixmaps_directory>
<language>C</language>
<gnome_support>True</gnome_support>
<gettext_support>True</gettext_support>
</project>
<widget>
<class>GtkWindow</class>
<name>window</name>
<border_width>5</border_width>
<title>Temperature Conversion</title>
<type>GTK_WINDOW_TOPLEVEL</type>
<position>GTK_WIN_POS_CENTER</position>
<modal>False</modal>
<allow_shrink>False</allow_shrink>
<allow_grow>True</allow_grow>
<auto_shrink>False</auto_shrink>
<widget>
<class>GtkVBox</class>
<name>vbox</name>
<homogeneous>False</homogeneous>
<spacing>5</spacing>
<widget>
<class>GtkHBox</class>
<name>hbox1</name>
<homogeneous>False</homogeneous>
<spacing>5</spacing>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
<widget>
<class>GtkLabel</class>
<name>label1</name>
<label>Enter temperature:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0.5</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
</widget>
<widget>
<class>GtkEntry</class>
<name>input_temp</name>
<can_focus>True</can_focus>
<has_focus>True</has_focus>
<editable>True</editable>
<text_visible>True</text_visible>
<text_max_length>0</text_max_length>
<text></text>
<child>
<padding>0</padding>
<expand>True</expand>
<fill>True</fill>
</child>
</widget>
</widget>
<widget>
<class>GtkLabel</class>
<name>result</name>
<label></label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0.5</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<child>
<padding>0</padding>
<expand>True</expand>
<fill>True</fill>
</child>
</widget>
<widget>
<class>GtkHBox</class>
<name>hbox2</name>
<homogeneous>True</homogeneous>
<spacing>5</spacing>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
<widget>
<class>GtkButton</class>
<name>to_celsius</name>
<can_focus>True</can_focus>
<signal>
<name>clicked</name>
<handler>on_celsius_clicked</handler>
<last_modification_time>Sun, 18 Jan 2004 22:47:40 GMT</last_modification_time>
</signal>
<label>To Celsius</label>
<relief>GTK_RELIEF_NORMAL</relief>
<child>
<padding>0</padding>
<expand>True</expand>
<fill>True</fill>
</child>
</widget>
<widget>
<class>GtkButton</class>
<name>to_fahr</name>
<can_focus>True</can_focus>
<signal>
<name>clicked</name>
<handler>on_fahr_clicked</handler>
<last_modification_time>Sun, 18 Jan 2004 22:47:31 GMT</last_modification_time>
</signal>
<label>To Fahrenheit</label>
<relief>GTK_RELIEF_NORMAL</relief>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>True</fill>
</child>
</widget>
<widget>
<class>GtkButton</class>
<name>exit</name>
<can_focus>True</can_focus>
<signal>
<name>clicked</name>
<handler>on_exit_clicked</handler>
<last_modification_time>Sun, 18 Jan 2004 22:39:49 GMT</last_modification_time>
</signal>
<label>Exit</label>
<relief>GTK_RELIEF_NORMAL</relief>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>True</fill>
</child>
</widget>
</widget>
</widget>
</widget>
</GTK-Interface>

101
slides/gtk/tempconv.php Normal file
View File

@@ -0,0 +1,101 @@
<?php
dl('php_gtk.so');
/* set up main window */
$window =& new GtkWindow();
$window->set_title('Temperature Conversion');
$window->set_policy(false, true, false);
$window->set_border_width(5);
$window->set_position(GTK_WIN_POS_CENTER);
/* create main vertical box */
$vbox =& new GtkVBox(false, 5);
/* create first row box */
$hbox =& new GtkHBox(false, 5);
/* add label */
$hbox->pack_start(new GtkLabel('Enter temperature:'), false);
/* add an entry field */
$t_entry =& new GtkEntry();
$hbox->pack_start($t_entry, true, true);
/* put first row box into vertical one */
$vbox->pack_start($hbox, false);
/* create an empty label and add to vertical box */
$res_label =& new GtkLabel();
$vbox->pack_start($res_label);
/* create third row box */
$hbox =& new GtkHBox(true, 5);
/* create buttons and connect signals */
$celsius_b =& new GtkButton('To Celcius');
$celsius_b->connect('clicked', 'on_celsius_clicked', $t_entry, $res_label);
$fahr_b =& new GtkButton('To Fahrenheit');
$fahr_b->connect('clicked', 'on_fahr_clicked', $t_entry, $res_label);
$exit_b =& new GtkButton('Exit');
$exit_b->connect('clicked', 'on_exit_clicked');
/* add buttons to third row box */
$hbox->pack_start($celsius_b);
$hbox->pack_start($fahr_b);
$hbox->pack_start($exit_b);
/* add third row box to vertical one */
$vbox->pack_start($hbox, false);
/* add vertical box to main window */
$window->add($vbox);
/* show window and all contained widgets */
$window->show_all();
/* have entry field grab keyboard focus */
$t_entry->grab_focus();
/* start the main loop */
gtk::main();
function on_celsius_clicked($button, $t_entry, $res_label)
{
/* get contents of the entry field */
$chars = $t_entry->get_chars(0, -1);
if (empty($chars) || !is_numeric($chars)) {
/* if invalid contents, indicate so, reselect entry field and focus on it */
$res_label->set_text('Invalid input');
} else {
/* if valid contents, perform conversion and output result */
$temp = (((int)$chars)-32)/1.8;
$res_label->set_text(sprintf("$chars Fahrenheit is %.1f Celsius", $temp));
}
$t_entry->select_region(0, -1);
$t_entry->grab_focus();
}
function on_fahr_clicked($button, $t_entry, $res_label)
{
$chars = $t_entry->get_chars(0, -1);
if (empty($chars) || !is_numeric($chars)) {
/* if invalid contents, indicate so, reselect entry field and focus on it */
$res_label->set_text('Invalid input');
} else {
/* if valid contents, perform conversion and output result */
$temp = ((int)$chars)*1.8+32;
$res_label->set_text(sprintf("$chars Celsius is %.1f Fahrenheit", $temp));
}
$t_entry->select_region(0, -1);
$t_entry->grab_focus();
}
function on_exit_clicked($button)
{
/* exit the main loop */
gtk::main_quit();
}
?>

11
slides/gtk/tempconv.xml Normal file
View File

@@ -0,0 +1,11 @@
<slide title="Small Example" logo1="images/php-gtk.gif" navColor="#b0c2d3" navsize="1.4em">
<blurb>
"Hello, World" programs are boring. Let's do something a little more useful
that also bridges the gap between cultures.
</blurb>
<link align="center" text="Temperature Conversion" href="presentations/slides/gtk/tempconv.php" />
<example fontsize="1ex" filename="tempconv.php" />
</slide>

7
slides/gtk/thankyou.xml Normal file
View File

@@ -0,0 +1,7 @@
<slide title="Thank You!" logo1="images/php-gtk.gif" navColor="#b0c2d3" navsize="1.4em">
<blurb align="center">
Questions?
</blurb>
</slide>

View File

@@ -0,0 +1,102 @@
<slide title="Widget Hierarchy" logo1="images/php-gtk.gif" navColor="#b0c2d3" navsize="1.4em">
<blurb>
Gtk toolkit has an extensive widget class hierarchy. Each widget class
inherits its parents methods, properties, signals, etc.
</blurb>
<example fontsize="1ex"><![CDATA[GtkObject
+GtkWidget
| +GtkMisc
| | +GtkLabel
| | | +GtkAccelLabel
| | | `GtkTipsQuery
| | +GtkArrow
| | +GtkImage
| | `GtkPixmap
| +GtkContainer
| | +GtkBin
| | | +GtkAlignment
| | | +GtkFrame
| | | | `GtkAspectFrame
| | | +GtkButton
| | | | +GtkToggleButton
| | | | | `GtkCheckButton
| | | | | `GtkRadioButton
| | | | `GtkOptionMenu
| | | +GtkItem
| | | | +GtkMenuItem
| | | | | +GtkCheckMenuItem
| | | | | | `GtkRadioMenuItem
| | | | | `GtkTearoffMenuItem
| | | | +GtkListItem
| | | | `GtkTreeItem
| | | +GtkWindow
| | | | +GtkColorSelectionDialog
| | | | +GtkDialog
| | | | | `GtkInputDialog
| | | | +GtkDrawWindow
| | | | +GtkFileSelection
| | | | +GtkFontSelectionDialog
| | | | `GtkPlug
| | | +GtkEventBox
| | | +GtkHandleBox
| | | +GtkScrolledWindow
| | | `GtkViewport
| | +GtkBox
| | | +GtkButtonBox
| | | | +GtkHButtonBox
| | | | `GtkVButtonBox
| | | +GtkVBox
| | | | +GtkColorSelection
| | | | `GtkGammaCurve
| | | `GtkHBox
| | | +GtkCombo
| | | `GtkStatusbar
| | +GtkCList
| | | `GtkCTree
| | +GtkFixed
| | +GtkNotebook
| | | `GtkFontSelection
| | +GtkPaned
| | | +GtkHPaned
| | | `GtkVPaned
| | +GtkLayout
| | +GtkList
| | +GtkMenuShell
| | | +GtkMenuBar
| | | `GtkMenu
| | +GtkPacker
| | +GtkSocket
| | +GtkTable
| | +GtkToolbar
| | `GtkTree
| +GtkCalendar
| +GtkDrawingArea
| | `GtkCurve
| +GtkEditable
| | +GtkEntry
| | | `GtkSpinButton
| | `GtkText
| +GtkRuler
| | +GtkHRuler
| | `GtkVRuler
| +GtkRange
| | +GtkScale
| | | +GtkHScale
| | | `GtkVScale
| | `GtkScrollbar
| | +GtkHScrollbar
| | `GtkVScrollbar
| +GtkSeparator
| | +GtkHSeparator
| | `GtkVSeparator
| +GtkPreview
| `GtkProgress
| `GtkProgressBar
+GtkData
| +GtkAdjustment
| `GtkTooltips
`GtkItemFactory
]]></example>
</slide>

31
slides/gtk/windows.xml Normal file
View File

@@ -0,0 +1,31 @@
<slide title="Windows" logo1="images/php-gtk.gif" navColor="#b0c2d3" navsize="1.4em">
<blurb fontsize="2ex">
~Windows~ are toplevel container widgets that are affected by the window manager
parameters, e.g. dialog boxes, popups, application windows, etc.
</blurb>
<blurb fontsize="2ex">
To set a window's title:
</blurb>
<example fontsize="1ex"><![CDATA[<?php $window->set_title('My App'); ?>]]></example>
<blurb fontsize="2ex">
To set the focus widget in the window:
</blurb>
<example fontsize="1ex"><![CDATA[<?php $window->set_focus($name_entry); ?>]]></example>
<blurb fontsize="2ex">
To set the default widget in the window (note that the widget has to call
%can_default()% first):
</blurb>
<example fontsize="1ex"><![CDATA[<?php $window->set_default($ok_button); ?>]]></example>
<blurb fontsize="2ex">
To inhibit interaction with other windows in the same app, make it ~modal~,
disallow lowering it below the parent window, and run a new main loop:
</blurb>
<example fontsize="1ex"><![CDATA[<?php
$dialog->set_modal(true);
$dialog->set_transient_for($parent);
gtk::main();
?>]]></example>
</slide>

30
slides/gtk/windows2.xml Normal file
View File

@@ -0,0 +1,30 @@
<slide title="Windows" logo1="images/php-gtk.gif" navColor="#b0c2d3" navsize="1.4em">
<blurb fontsize="2ex">
You can set a window's default size with:
</blurb>
<example fontsize="1ex"><![CDATA[<?php $window->set_default_size($width, $height); ?>]]></example>
<blurb fontsize="2ex">
And to set a window's initial position:
</blurb>
<example fontsize="1ex"><![CDATA[<?php $window->set_position($position); ?>]]></example>
<blurb fontsize="2ex">
Where %$position% can be %'center'% (center of screen), %'mouse'% (under the
cursor), or %'none'% (let window manager place it).
</blurb>
<blurb fontsize="2ex">
If you want to make window respond to resizing in a certain way, you have to
set its ~policy~.
</blurb>
<example fontsize="1ex"><![CDATA[<?php $window->set_policy($allow_shrink, $allow_grow, $auto_shrink); ?>]]></example>
<blurb fontsize="2ex">
While each argument is a boolean, there are only two useful combinations of
them: one to allow the window to be resized by a user, and one to disallow
resizing.
</blurb>
<example fontsize="1ex"><![CDATA[<?php
$window->set_policy(false, true, false); // allow user resizing
$window->set_policy(false, false, true); // disallow user resizing
?>]]></example>
</slide>

View File

@@ -16,6 +16,7 @@
<slide>slides/gtk/phpmole.xml</slide>
<slide>slides/gtk/agata.xml</slide>
<slide>slides/gtk/widget-hierarchy.xml</slide>
<slide>slides/gtk/widgets.xml</slide>
<slide>slides/gtk/containers.xml</slide>
<slide>slides/gtk/signals.xml</slide>
@@ -24,7 +25,6 @@
<slide>slides/gtk/gensteps.xml</slide>
<slide>slides/gtk/creating.xml</slide>
<!--
<slide>slides/gtk/showing.xml</slide>
<slide>slides/gtk/focus.xml</slide>
<slide>slides/gtk/sensitivity.xml</slide>
@@ -33,10 +33,28 @@
<slide>slides/gtk/gencontainer.xml</slide>
<slide>slides/gtk/boxes.xml</slide>
<slide>slides/gtk/windows.xml</slide>
<slide>slides/gtk/windows2.xml</slide>
<slide>slides/gtk/connecting.xml</slide>
<slide>slides/gtk/disconnecting.xml</slide>
<slide>slides/gtk/disabling.xml</slide>
-->
<slide>slides/gtk/connecting2.xml</slide>
<slide>slides/gtk/mainloop.xml</slide>
<slide>slides/gtk/mainloop.xml</slide>
<slide>slides/gtk/tempconv.xml</slide>
<slide>slides/gtk/glade.xml</slide>
<slide>slides/gtk/extensions.xml</slide>
<slide>slides/gtk/problems.xml</slide>
<slide>slides/gtk/php-gtk-2.xml</slide>
<slide>slides/gtk/php-gtk-2a.xml</slide>
<slide>slides/gtk/php-gtk-2b.xml</slide>
<slide>slides/gtk/resources.xml</slide>
<slide>slides/gtk/thankyou.xml</slide>
</presentation>