[Glade-users] custom handlers in libglade and gtk builder

Aha!  Well, I think I already have those in place from the old code.

On Fri, May 1, 2009 at 11:45 AM, Tristan Van Berkom
<tristan.van.berkom at gmail.com> wrote:
Oh sorry, sometimes the question is so simple that is escapes you :)

If I'm not mistaken, you are talking about set_custom_handler()
from libglade to handle custom properties in the xml... now that
you have a real type - all you need is to support object properties
in the standard way (in C that would be g_object_class_install_property()
from the class initializer).

? ? ? -Tristan

On Fri, May 1, 2009 at 11:37 AM, Gerald Britton
<gerald.britton at gmail.com> wrote:
OK. ?Thanks to your help before, I've been able to define custom
objects and use them in both glade-3 and GtkBuilder. ?Now, I'm working
on using these new types to replace the old custom widgets. ?These old
widgets make us of the set_custom_handler function. ?The custom
handler that is set by that function, in the current code, on the
value of the field "Creation Function:" in the definition of the
custom object in glade. ?So today, I have something like:

? ? ? ?<widget class="Custom" id="lon_entry">
? ? ? ? ?<property name="visible">True</property>
? ? ? ? ?<property name="creation_function">ValidatableMaskedEntry</property>
? ? ? ? ?<property name="int1">0</property>
? ? ? ? ?<property name="int2">0</property>
? ? ? ? ?<property name="last_modification_time">Fri, 23 Mar 2007
20:18:43 GMT</property>
? ? ? ?</widget>

Then, I have this code:

from gtk.glade import set_custom_handler

def get_custom_handler(glade, function_name, widget_name,
? ? ? ? ? ? ? ? ? ? ? str1, str2, int1, int2):
? ?if function_name == 'ValidatableMaskedEntry':
? ? ? ?return ValidatableMaskedEntry()
? ?if function_name == 'StyledTextEditor':
? ? ? ?return StyledTextEditor()


Which, as you can see, returns one of two possible "handlers"
depending on the value of the "creation function" field.

In my progress so far towards converting these to GtkBuilder, I've
constructed a custom widget like this:

? ? ? ? ?<object class="ValidatableMaskedEntry" id="val_mask1">
? ? ? ? ? ?<property name="visible">True</property>
? ? ? ? ? ?<property name="can_focus">True</property>
? ? ? ? ? ?<property name="invisible_char">&#x25CF;</property>
? ? ? ? ? ?<property name="text" translatable="yes">valmask</property>
? ? ? ? ?</object>

and built a python class to handle it:

import gobject
import gtk

class ValidatableMaskedEntry(gtk.Entry):
? ? ? __gtype_name__ = 'ValidatableMaskedEntry'

? ? ? def __init__(self):
? ? ? ? ? ? ? gtk.Entry.__init__(self)

After setting up the proper env vars and starting glade-3, I can use
my new custom object. ?Similarly, at run time, I include the class
definition before calling the add_from_file method on my new glade
file. ?At this point, all is well.

So, what I need to grasp is what the set_custom_handler function does
in the old gtk,glade world how to accomplish the same thing in the
GtkBuilder world, while reusing as much existing code as I can.
Unfortunately, I found the docs on set_custom_handler a little on the
terse side. ?They state:

"This gtk.glade.set_custom_handler() function allows you to override
the default behaviour when a Custom widget is found in an interface. "

which is great but where is the default behavior defined?

On Fri, May 1, 2009 at 11:07 AM, Tristan Van Berkom
<tristan.van.berkom at gmail.com> wrote:
? GtkBuilder does not support this method of inserting custom objects
in the interface, instead GTK+ now allows all widgets to be loadable
with builder and the way GtkBuilder builds your objects can be customized
using the GtkBuilder interface.

We assume here that if you are not introducing a real type, if you only
had a function that created stock widgets manually and returned that;
you can easily replace that by adding manually built widgets to a known
container in the project.

With Glade, we have for a long time supported getting your widget
types into the palette and thats been improving over the years,
the documentation is pretty up to date but its a little terse (its not
a tutorial):

Keep in mind that its possible to mimic your widget type completely
by just writing up a few lines of xml, while the docs describe lots of
things you can do with a plugin library, usually most of that is unneeded.
Also remember that if you provide the actual type at runtime to Glade
in the form of a library, Glade will introspect your custom widgets properties
and signals etc - if you fake the type in the catalog you'll have to define
properties for it manually in the Glade catalog.

? ? ? ? ?-Tristan

On Fri, May 1, 2009 at 10:36 AM, Gerald Britton
<gerald.britton at gmail.com> wrote:
Hi -- I'm converting a project from libglade to gtkbuilder and I've
run into a snag with custom objects. ?In the code I'm working on there
is the line:

? ?from gtk.glade import set_custom_handler

followed by a function definition:

? ?def get_custom_handler(glade, function_name, widget_name,
? ? ? ? ? ? ? ? ? ? ? str1, str2, int1, int2)

? ?...


? ?set_custom_handler(get_custom_handler)

I need to know how to do the same sort of thing in the gtkbuilder
world. ?So, how does one set up custom handlers in the gtk.builder

Gerald Britton
Glade-users maillist ?- ?Glade-users at lists.ximian.com

Gerald Britton

Gerald Britton

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