[Glade-users] custom property setter not fired on commit



Hi Tristan. Sorry to bother you again...
My function are called but my command group is not pushed on the stack

PreCommit function
  ...
  glade_command_push_group("Setting my columns on %s",
glade_widget_get_name(gwidget));
  glade_property_set(myprop, mycoldata);

What function do I have to use to adjust my property? I think about
glade_editor_property_commit but I haven't the editor property of my
property.

  g_value_init(&newvalue, MY_TYPE_COLUMN_FORMAT_LIST);
  g_value_take_boxed(&newvalue, colfmts);
  glade_editor_property_commit(eprop, &newvalue); // eprop?
  g_value_unset (&newvalue);


In PostCommit function I have only
  glade_command_pop_group ();


Thanks. Bye,
Dome


2014-03-17 16:37 GMT+01:00 Tristan Van Berkom <tristan at upstairslabs.com>:
On Mon, 2014-03-17 at 15:06 +0100, Domenico Ferrari wrote:
Ok. But how can I get the GladeEditorProperty object to connect to?
In my editor I call glade_gtk_store_create_editable and I have no
access to the property editor, I can only get the GladeProperty with
glade_widget_get_property.

Ok, I drew you one road map on doing it the "right way", or the
"modern way", i.e. you have to define the GladeEditor for your
object and *you* define the .ui which shows properties for your
widget, which means *you* provide a GladePropertyShell for the
"columns" property and thus, can connect to it's pre/post-commit
signals there.

There is another way:
  o Override ->create_eprop() (thats <create-editor-property-function>)
  o Whenever ->create_eprop() is called for the "columns" property,
    chain up to the GtkListStore adaptor to get the eprop
  o Before returning the GladeEditorProperty created by the parent
    adaptor - connect to the "commit" signal *twice*

Once with g_signal_connect(), and again with g_signal_connect_after().

The handler you connect with g_signal_connect() will be called before
the commit, the other handler will be called after, you can use those
to push / pop a group around the commit of the given GladeEditorProperty
and add additional commands to be executed before / after.

In your callback, use glade_editor_property_get_property() and
then glade_property_get_widget() to get the GladeWidget in context
of the given commit.

Cheers,
    -Tristan


Dome


2014-03-17 13:12 GMT+01:00 Tristan Van Berkom <tristan at upstairslabs.com>:
On Mon, 2014-03-17 at 12:39 +0100, Domenico Ferrari wrote:
Hi Tristan and thank you. Works like a charm.

Now I want to synchronize two properties in my GtkListStore object:
one is the original "columns" property, the other is my own property.


Hi,

Commands should never be issued in a set-property function, this will
probably cause some madness to occur (probably some ugly recursion).

What you want to do instead is connect to the "pre-commit" and
"post-commit" signals on a GladePropertyShell object that you
would declare in a custom editor for your object.

For example, like we do in the about dialog editor code[0]
and ui definition[1].

Notice what we do in this editor:
  o glade-gtk-window.c creates a GladeAboutDialogEditor for
    the "General" tab for any about dialog[2] (yeah that's
    messy, it should be done in the glade-gtk-about-dialog.c
    subclass...)
  o The GladeAboutDialogEditor declares a GladePropertyShell
    which will automatically create an editor for the "license-type"
    property, that's in it's own Glade file (as described at [1])
  o The GladeAboutDialogEditor surrounds the commits that the
    property editor for the "license-type" property will make,
    by pushing a group in "pre-commit" and popping it in "post-commit".

In short, if you want to do what you are trying, you need to catch
the commit from the source - when the property editor itself makes
the commit - while the GladeWidgetAdaptor->set_property() method is
only meant to apply a value from Glade's data model onto a runtime
object in the work space (note that even though ->set_property() is
called as a consequence of changing a property value, it is *also*
called when any change is made via Undo/Redo).

Make sense ?

Cheers,
    -Tristan


[0]:https://git.gnome.org/browse/glade/tree/plugins/gtk
+/glade-about-dialog-editor.c#n129
[1]:https://git.gnome.org/browse/glade/tree/plugins/gtk
+/glade-about-dialog-editor.ui#n123
[2]:https://git.gnome.org/browse/glade/tree/plugins/gtk
+/glade-gtk-window.c#n156

E.g.
columns prop (type, name values)
gint, intcol
gchar, charcol

my columns prop (name, note values)
intcol, "note on intcol"
charcol, "i'm a note"

Note: on "my columns" prop the user can change only the note value, no
change on the number of columns or the names, they are taken from the
original "columns" prop.

Now, I want to keep my property synchronized to the main property.
My coding behave as expected if I use glade_property_set but I have a
problem with the undo/redo stack... again :(

I tried a change in my code but with no success.

Here's a snippet of my set-property function that overrides the
original GtkListStore call.

if(strcmp(property_name, "columns")==0)
{
    ...

    gwidget=glade_widget_get_from_gobject(object);
    property = glade_widget_get_property(gwidget, "my-columns");
    glade_property_get(property, &colfmts);

... change colfmt to reflect "columns"

    glade_command_push_group("Setting columns on %s",
glade_widget_get_name(gwidget));

    g_value_init (&newvalue, MY_TYPE_COLUMN_FORMAT_LIST);
    g_value_take_boxed (&newvalue, colfmts);
    glade_editor_property_commit (eprop, &newvalue);
    g_value_unset (&newvalue);

    /* Chain Up */
    glade_gtk_store_set_property(adaptor, object, property_name, value);
    glade_command_pop_group ();
}

Thank you. Cheers,
Dome


2014-03-15 6:10 GMT+01:00 Tristan Van Berkom <tristan.van.berkom at gmail.com>:
If your custom property is of some unknown GType, like a boxed type
you introduced for example, you will need to provide a
GladeStringFromValue function[0] in your widget adaptor definition.

The string it generates must be unique per possible value that your
GType can have, without this Glade has no way to compare your value
with another value and cannot tell if the value actually changed or
not (and thus needs to be updated in the workspace).

As with all other GladeWidgetAdaptor methods, the string_from_value()
method should chain up to the adaptor implementing the parent widget
type if that is appropriate, here is an example of how we handle it
for the custom "items" property of GtkComboBoxText[1], GtkListStore[2]
also does this for the "columns" property.

Cheers,
    -Tristan

[0]:https://developer.gnome.org/gladeui/unstable/gladeui-glade-widget-adaptor.html#GladeStringFromValueFunc
[1]:https://git.gnome.org/browse/glade/tree/plugins/gtk+/glade-gtk-combo-box-text.c#n82
[2]:https://git.gnome.org/browse/glade/tree/plugins/gtk+/glade-gtk-list-store.c#n243


On Fri, Mar 14, 2014 at 11:12 PM, Domenico Ferrari <domfe at tiscali.it> wrote:
Hi.
I'm doing a new plugin for my widget...
It has a property editable with a TreeView, like "columns" on
GtkListStore object.
In my callback function on "edited" signal I have the following code

  g_value_init (&value, MY_TYPE_COLUMN_FORMAT_LIST);
  g_value_take_boxed (&value, colfmt);
  glade_editor_property_commit (eprop, &value);

but my custom property setter is not fired. If I use
glade_property_set it is correctly called but I miss the undo/redo
stack.
Can I have some help?

Thanks!
_______________________________________________
Glade-users maillist  -  Glade-users at lists.ximian.com
http://lists.ximian.com/mailman/listinfo/glade-users
_______________________________________________
Glade-users maillist  -  Glade-users at lists.ximian.com
http://lists.ximian.com/mailman/listinfo/glade-users


_______________________________________________
Glade-users maillist  -  Glade-users at lists.ximian.com
http://lists.ximian.com/mailman/listinfo/glade-users






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