[dia] [gtk-deprecated] ArrayProp editor now handles enum changes



commit ad3bb184e5f422bd936cb7c413f7139a29ec8c01
Author: Hans Breuer <hans breuer org>
Date:   Fri Jan 16 22:38:34 2015 +0100

    [gtk-deprecated] ArrayProp editor now handles enum changes
    
    For full functional replacement of UMLDialog with the generated GUI
    this was the last missing piece. It's not pretty though, because the
    enum values, not their text (or short representation) is shown.
    
    Added the needed change in object/UML/class.c for reference, but
    protected by #if 0 for now.

 lib/diacellrendererenum.c |   84 +++++++++++++++++++++++++++++++++++----------
 lib/diacellrendererenum.h |    6 +++-
 lib/prop_sdarray_widget.c |    6 +--
 objects/UML/class.c       |    5 +++
 4 files changed, 78 insertions(+), 23 deletions(-)
---
diff --git a/lib/diacellrendererenum.c b/lib/diacellrendererenum.c
index a2d68ce..7f2ae1a 100644
--- a/lib/diacellrendererenum.c
+++ b/lib/diacellrendererenum.c
@@ -10,33 +10,79 @@ enum
   NUM_ENUM_COLUMNS
 };
 
+/*!
+ * \brief Signal handler GtkCellRendererCombo::changed:
+ *
+ * From GTK+:
+ *
+ * @renderer: the object on which the signal is emitted
+ * @path_string: a string of the path identifying the edited cell
+ *               (relative to the tree view model)
+ * @iter: the new iter selected in the combo box
+ *            (relative to the combo box model)
+ *
+ * This signal is emitted each time after the user selected an item in
+ * the combo box, either by using the mouse or the arrow keys.  Contrary
+ * to GtkComboBox, GtkCellRendererCombo::changed is not emitted for
+ * changes made to a selected item in the entry.  The argument 'iter'
+ * corresponds to the newly selected item in the combo box and it is relative
+ * to the GtkTreeModel set via the model property on GtkCellRendererCombo.
+ *
+ * Note that as soon as you change the model displayed in the tree view,
+ * the tree view will immediately cease the editing operating.  This
+ * means that you most probably want to refrain from changing the model
+ * until the combo cell renderer emits the edited or editing_canceled signal.
+ */
 static void
-_enum_changed (GtkCellRenderer *renderer, const char *string, GtkTreeIter *iter, GtkTreeModel *model)
+_enum_changed (GtkCellRenderer *renderer,
+              const char      *path_string,
+              GtkTreeIter     *iter,
+              GtkTreeView     *tree_view)
 {
-  int val;
-  GValue value = { 0, };
+  GtkTreeModel *store = gtk_tree_view_get_model (tree_view);
+  int val, column;
+  GtkTreeModel *model;
+  GtkTreeIter store_iter;
 
+  g_object_get (G_OBJECT (renderer), "model", &model, NULL);
+  /* read the enum value from the combobox model */
   gtk_tree_model_get (model, iter, COLUMN_ENUM_VALUE, &val, -1);
-  g_value_init (&value, G_TYPE_INT);
-  g_value_set_int (&value, val);
-  g_object_set_property (G_OBJECT (renderer), "text", &value);
-  g_value_unset (&value);
-  g_print ("changed: %d - %s\n", val, string);
+  /* put it into the store model */
+  column = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (renderer), COLUMN_KEY));
+  if (gtk_tree_model_get_iter_from_string (store, &store_iter, path_string))
+      gtk_tree_store_set (GTK_TREE_STORE (store), &store_iter, column, val, -1);
+
+  g_print ("changed: %d - %s\n", val, path_string);
 }
+/*!
+ * \brief Signal handler GtkCellRendererText::edited
+ '
+ * From GTK+:
+ * This signal is emitted after @renderer has been edited.
+ *
+ * It is the responsibility of the application to update the model
+ * and store @new_text at the position indicated by @path.
+ */
 static void
-_enum_edited (GtkCellRenderer *renderer, const char *path, const char *new_string, GtkTreeModel *model)
+_enum_edited (GtkCellRenderer *renderer,
+             const char      *path_string,
+             const char      *new_string,
+             GtkTreeView     *tree_view)
 {
-  GtkTreeIter iter;
-  int val;
+  GtkTreeModel *store = gtk_tree_view_get_model (tree_view);
+  /* Despite the comment for _enum_changed we have changed the model already
+   * there. Changing it here would involve some caching of the value there
+   * or translating new_string back to the enumv we need for the store.
+   * But we have to mark the store to be modified otherwise only the UI state
+   * would change without transferring back in _arrayprop_set_from_widget()
+   */
+  g_object_set_data (G_OBJECT (store), "modified", GINT_TO_POINTER (1));
 
-  if (gtk_tree_model_get_iter_from_string (model, &iter, path)) {
-    gtk_tree_model_get (model, &iter, COLUMN_ENUM_VALUE, &val, -1);
-    g_print ("edited: %d - %s\n", val, new_string);
-  }
+  g_print ("edited: %d - %s\n", new_string);
 }
 
 GtkCellRenderer *
-dia_cell_renderer_enum_new (const PropEnumData *enum_data)
+dia_cell_renderer_enum_new (const PropEnumData *enum_data, GtkTreeView *tree_view)
 {
   /* The combo-renderer should be customized for better rendering,
    * e.g. using a shorter name like visible_char[]={ '+', '-', '#', ' ' } instead of
@@ -67,8 +113,10 @@ dia_cell_renderer_enum_new (const PropEnumData *enum_data)
                 "editable", TRUE,
                 NULL);
 
-  g_signal_connect (G_OBJECT (cell_renderer), "changed", G_CALLBACK (_enum_changed), model); 
-  g_signal_connect (G_OBJECT (cell_renderer), "edited", G_CALLBACK (_enum_edited), model); 
+  g_signal_connect (G_OBJECT (cell_renderer), "changed",
+                   G_CALLBACK (_enum_changed), tree_view);
+  g_signal_connect (G_OBJECT (cell_renderer), "edited",
+                   G_CALLBACK (_enum_edited), tree_view);
 
   return cell_renderer;
 }
diff --git a/lib/diacellrendererenum.h b/lib/diacellrendererenum.h
index cffcb52..7b263a4 100644
--- a/lib/diacellrendererenum.h
+++ b/lib/diacellrendererenum.h
@@ -4,6 +4,10 @@
 #include <gtk/gtk.h>
 #include "diatypes.h"
 
-GtkCellRenderer *dia_cell_renderer_enum_new (const PropEnumData *enum_data);
+/* Found no built-in way to get to the column in the callback ... */
+#define COLUMN_KEY "column-key"
+
+GtkCellRenderer *dia_cell_renderer_enum_new (const PropEnumData *enum_data,
+                                            GtkTreeView        *tree_view);
 
 #endif
diff --git a/lib/prop_sdarray_widget.c b/lib/prop_sdarray_widget.c
index 9ea7d6f..683aab3 100644
--- a/lib/prop_sdarray_widget.c
+++ b/lib/prop_sdarray_widget.c
@@ -64,11 +64,11 @@
 
 /** A small wrapper to connect to the model */
 static GtkCellRenderer *
-_cell_renderer_enum_new (const Property *p)
+_cell_renderer_enum_new (const Property *p, GtkTreeView *tree_view)
 {
   const EnumProperty *prop = (const EnumProperty *)p;
   PropEnumData *enumdata = prop->common.descr->extra_data;
-  GtkCellRenderer *cren = dia_cell_renderer_enum_new (enumdata);
+  GtkCellRenderer *cren = dia_cell_renderer_enum_new (enumdata, tree_view);
 
   return cren;
 }
@@ -91,8 +91,6 @@ _cell_renderer_real_new (const Property *p)
 
   return cren;
 }
-/* Found no built-in way to get to the column in the callback ... */
-#define COLUMN_KEY "column-key"
 /** Make it editable, connect signals */
 static void
 _toggle_callback (GtkCellRendererToggle *renderer,
diff --git a/objects/UML/class.c b/objects/UML/class.c
index 596ba07..5cd7cdb 100644
--- a/objects/UML/class.c
+++ b/objects/UML/class.c
@@ -114,8 +114,13 @@ static ObjectOps umlclass_ops = {
   (CopyFunc)            umlclass_copy,
   (MoveFunc)            umlclass_move,
   (MoveHandleFunc)      umlclass_move_handle,
+#if 1
   (GetPropertiesFunc)   umlclass_get_properties,
   (ApplyPropertiesDialogFunc) _umlclass_apply_props_from_dialog,
+#else
+  (GetPropertiesFunc)   object_create_props_dialog,
+  (ApplyPropertiesDialogFunc) object_apply_props_from_dialog,
+#endif
   (ObjectMenuFunc)      umlclass_object_menu,
   (DescribePropsFunc)   umlclass_describe_props,
   (GetPropsFunc)        umlclass_get_props,


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