[gtk+] Add a way to associate numeric ids with combobox values



commit 9fb36fff367480f372745cc0f989e35602fc46b8
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Oct 22 23:33:30 2010 +0200

    Add a way to associate numeric ids with combobox values
    
    This will let us use combo boxes as property editors for
    GSettings enmerations easily.

 docs/reference/gtk/gtk3-sections.txt |    5 ++-
 gtk/gtk.symbols                      |    3 +
 gtk/gtkcombobox.c                    |   82 ++++++++++++++++++++++++++++++++-
 gtk/gtkcombobox.h                    |    3 +
 gtk/gtkcomboboxtext.c                |   83 +++++++++++++++++-----------------
 gtk/gtkcomboboxtext.h                |    4 ++
 6 files changed, 135 insertions(+), 45 deletions(-)
---
diff --git a/docs/reference/gtk/gtk3-sections.txt b/docs/reference/gtk/gtk3-sections.txt
index e420b4e..da659d1 100644
--- a/docs/reference/gtk/gtk3-sections.txt
+++ b/docs/reference/gtk/gtk3-sections.txt
@@ -804,6 +804,8 @@ gtk_combo_box_get_button_sensitivity
 gtk_combo_box_get_has_entry
 gtk_combo_box_set_entry_text_column
 gtk_combo_box_get_entry_text_column
+gtk_combo_box_set_id_column
+gtk_combo_box_get_id_column
 <SUBSECTION Standard>
 GTK_TYPE_COMBO_BOX
 GTK_COMBO_BOX
@@ -823,8 +825,9 @@ GtkComboBoxText
 gtk_combo_box_text_new
 gtk_combo_box_text_new_with_entry
 gtk_combo_box_text_append_text
-gtk_combo_box_text_insert_text
 gtk_combo_box_text_prepend_text
+gtk_combo_box_text_insert_text
+gtk_combo_box_text_insert_text_with_id
 gtk_combo_box_text_remove
 gtk_combo_box_text_remove_all
 gtk_combo_box_text_get_active_text
diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols
index c61b465..b7ac295 100644
--- a/gtk/gtk.symbols
+++ b/gtk/gtk.symbols
@@ -801,6 +801,7 @@ gtk_combo_box_get_column_span_column
 gtk_combo_box_get_entry_text_column
 gtk_combo_box_get_focus_on_click
 gtk_combo_box_get_has_entry
+gtk_combo_box_get_id_column
 gtk_combo_box_get_model
 gtk_combo_box_get_popup_accessible
 gtk_combo_box_get_popup_fixed_width
@@ -822,6 +823,7 @@ gtk_combo_box_set_add_tearoffs
 gtk_combo_box_set_column_span_column
 gtk_combo_box_set_entry_text_column
 gtk_combo_box_set_focus_on_click
+gtk_combo_box_set_id_column
 gtk_combo_box_set_model
 gtk_combo_box_set_popup_fixed_width
 gtk_combo_box_set_row_separator_func
@@ -838,6 +840,7 @@ gtk_combo_box_text_append_text
 gtk_combo_box_text_get_active_text
 gtk_combo_box_text_get_type G_GNUC_CONST
 gtk_combo_box_text_insert_text
+gtk_combo_box_text_insert_text_with_id
 gtk_combo_box_text_new
 gtk_combo_box_text_new_with_entry
 gtk_combo_box_text_prepend_text
diff --git a/gtk/gtkcombobox.c b/gtk/gtkcombobox.c
index 96bb376..6402356 100644
--- a/gtk/gtkcombobox.c
+++ b/gtk/gtkcombobox.c
@@ -143,6 +143,8 @@ struct _GtkComboBoxPrivate
   gint  text_column;
   GtkCellRenderer *text_renderer;
 
+  gint id_column;
+
   GSList *cells;
 
   guint popup_in_progress : 1;
@@ -245,7 +247,8 @@ enum {
   PROP_EDITING_CANCELED,
   PROP_HAS_ENTRY,
   PROP_ENTRY_TEXT_COLUMN,
-  PROP_POPUP_FIXED_WIDTH
+  PROP_POPUP_FIXED_WIDTH,
+  PROP_ID_COLUMN
 };
 
 static guint combo_box_signals[LAST_SIGNAL] = {0,};
@@ -949,6 +952,23 @@ gtk_combo_box_class_init (GtkComboBoxClass *klass)
 						      GTK_PARAM_READWRITE));
 
    /**
+    * GtkComboBox:id-column:
+    *
+    * The column in the combo box's model that provides numeric
+    * IDs for the values in the model, if != -1.
+    *
+    * Since: 3.0
+    */
+   g_object_class_install_property (object_class,
+                                    PROP_ID_COLUMN,
+                                    g_param_spec_int ("id-column",
+                                                      P_("ID Column"),
+                                                      P_("The column in the combo box's model that provides "
+                                                      "numeric IDs for the values in the model"),
+                                                      -1, G_MAXINT, -1,
+                                                      GTK_PARAM_READWRITE));
+
+   /**
     * GtkComboBox:popup-fixed-width:
     *
     * Whether the popup's width should be a fixed width matching the
@@ -1077,6 +1097,7 @@ gtk_combo_box_init (GtkComboBox *combo_box)
 
   priv->text_column = -1;
   priv->text_renderer = NULL;
+  priv->id_column = -1;
 
   gtk_combo_box_check_appearance (combo_box);
 }
@@ -1168,6 +1189,10 @@ gtk_combo_box_set_property (GObject      *object,
       gtk_combo_box_set_entry_text_column (combo_box, g_value_get_int (value));
       break;
 
+    case PROP_ID_COLUMN:
+      gtk_combo_box_set_id_column (combo_box, g_value_get_int (value));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -1245,6 +1270,10 @@ gtk_combo_box_get_property (GObject    *object,
 	g_value_set_int (value, priv->text_column);
 	break;
 
+      case PROP_ID_COLUMN:
+        g_value_set_int (value, priv->id_column);
+        break;
+
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
         break;
@@ -6544,14 +6573,14 @@ gtk_combo_box_get_preferred_height_for_width (GtkWidget *widget,
 
 	  xpad = 2 * (border_width + cell_style->xthickness);
 	  ypad = 2 * (border_width + cell_style->ythickness);
-	}
+        }
 
       size -= but_width;
       size -= 2 * focus_width;
       size -= xpad;
 
       gtk_combo_box_measure_height_for_width (combo_box, size, &min_height, &nat_height);
-	  
+
       min_height = MAX (min_height, but_height);
       nat_height = MAX (nat_height, but_height);
 
@@ -6573,3 +6602,50 @@ gtk_combo_box_get_preferred_height_for_width (GtkWidget *widget,
   if (natural_size)
     *natural_size = nat_height;
 }
+
+/**
+ * gtk_combo_box_set_id_column:
+ * @combo_box: A #GtkComboBox
+ * @id_column: A column in @model to get numeric IDs for values from
+ *
+ * Sets the model column which @combo_box should use to get numeric IDs
+ * for values from. The column @id_column in the model of @combo_box
+ * must be of type %G_TYPE_INT.
+ *
+ * Since: 3.0
+ */
+void
+gtk_combo_box_set_id_column (GtkComboBox *combo_box,
+                             gint         id_column)
+{
+  GtkComboBoxPrivate *priv = combo_box->priv;
+  GtkTreeModel *model;
+
+  g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
+
+  model = gtk_combo_box_get_model (combo_box);
+
+  g_return_if_fail (id_column >= 0);
+  g_return_if_fail (model == NULL || id_column < gtk_tree_model_get_n_columns (model));
+
+  priv->id_column = id_column;
+}
+
+/**
+ * gtk_combo_box_get_id_column:
+ * @combo_box: A #GtkComboBox
+ *
+ * Returns the column which @combo_box is using to get numeric IDs
+ * for values from.
+ *
+ * Return value: A column in the data source model of @combo_box.
+ *
+ * Since: 3.0
+ */
+gint
+gtk_combo_box_get_id_column (GtkComboBox *combo_box)
+{
+  g_return_val_if_fail (GTK_IS_COMBO_BOX (combo_box), 0);
+
+  return combo_box->priv->id_column;
+}
diff --git a/gtk/gtkcombobox.h b/gtk/gtkcombobox.h
index c5b6a3c..ac256a7 100644
--- a/gtk/gtkcombobox.h
+++ b/gtk/gtkcombobox.h
@@ -133,6 +133,9 @@ void          gtk_combo_box_popup_for_device (GtkComboBox     *combo_box,
 void          gtk_combo_box_popdown          (GtkComboBox     *combo_box);
 AtkObject*    gtk_combo_box_get_popup_accessible (GtkComboBox *combo_box);
 
+gint          gtk_combo_box_get_id_column        (GtkComboBox *combo_box);
+void          gtk_combo_box_set_id_column        (GtkComboBox *combo_box,
+                                                  gint         id_column);
 
 G_END_DECLS
 
diff --git a/gtk/gtkcomboboxtext.c b/gtk/gtkcomboboxtext.c
index 25400de..46767d9 100644
--- a/gtk/gtkcomboboxtext.c
+++ b/gtk/gtkcomboboxtext.c
@@ -72,7 +72,7 @@ gtk_combo_box_text_init (GtkComboBoxText *combo_box)
 {
   GtkListStore *store;
 
-  store = gtk_list_store_new (1, G_TYPE_STRING);
+  store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT);
   gtk_combo_box_set_model (GTK_COMBO_BOX (combo_box), GTK_TREE_MODEL (store));
   g_object_unref (store);
 }
@@ -102,6 +102,7 @@ gtk_combo_box_text_new (void)
 {
   return g_object_new (GTK_TYPE_COMBO_BOX_TEXT,
                        "entry-text-column", 0,
+                       "id-column", 1,
                        NULL);
 }
 
@@ -121,6 +122,7 @@ gtk_combo_box_text_new_with_entry (void)
   return g_object_new (GTK_TYPE_COMBO_BOX_TEXT,
                        "has-entry", TRUE,
                        "entry-text-column", 0,
+                       "id-column", 1,
                        NULL);
 }
 
@@ -137,22 +139,23 @@ void
 gtk_combo_box_text_append_text (GtkComboBoxText *combo_box,
                                 const gchar     *text)
 {
-  GtkListStore *store;
-  GtkTreeIter iter;
-  gint text_column;
-  gint column_type;
-
-  g_return_if_fail (GTK_IS_COMBO_BOX_TEXT (combo_box));
-  g_return_if_fail (text != NULL);
-
-  store = GTK_LIST_STORE (gtk_combo_box_get_model (GTK_COMBO_BOX (combo_box)));
-  g_return_if_fail (GTK_IS_LIST_STORE (store));
-  text_column = gtk_combo_box_get_entry_text_column (GTK_COMBO_BOX (combo_box));
-  column_type = gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), text_column);
-  g_return_if_fail (column_type == G_TYPE_STRING);
+  gtk_combo_box_text_insert_text (combo_box, G_MAXINT, text);
+}
 
-  gtk_list_store_append (store, &iter);
-  gtk_list_store_set (store, &iter, text_column, text, -1);
+/**
+ * gtk_combo_box_text_prepend_text:
+ * @combo_box: A #GtkComboBox
+ * @text: A string
+ *
+ * Prepends @string to the list of strings stored in @combo_box.
+ *
+ * Since: 2.24
+ */
+void
+gtk_combo_box_text_prepend_text (GtkComboBoxText *combo_box,
+                                 const gchar     *text)
+{
+  gtk_combo_box_text_insert_text (combo_box, 0, text);
 }
 
 /**
@@ -170,44 +173,35 @@ gtk_combo_box_text_insert_text (GtkComboBoxText *combo_box,
                                 gint             position,
                                 const gchar     *text)
 {
-  GtkListStore *store;
-  GtkTreeIter iter;
-  gint text_column;
-  gint column_type;
-
-  g_return_if_fail (GTK_IS_COMBO_BOX_TEXT (combo_box));
-  g_return_if_fail (position >= 0);
-  g_return_if_fail (text != NULL);
-
-  store = GTK_LIST_STORE (gtk_combo_box_get_model (GTK_COMBO_BOX (combo_box)));
-  g_return_if_fail (GTK_IS_LIST_STORE (store));
-  text_column = gtk_combo_box_get_entry_text_column (GTK_COMBO_BOX (combo_box));
-  column_type = gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), text_column);
-  g_return_if_fail (column_type == G_TYPE_STRING);
-
-  gtk_list_store_insert (store, &iter, position);
-  gtk_list_store_set (store, &iter, text_column, text, -1);
+  gtk_combo_box_text_insert_text_with_id (combo_box, position, text, 0);
 }
 
 /**
- * gtk_combo_box_text_prepend_text:
- * @combo_box: A #GtkComboBox
+ * gtk_combo_box_text_insert_text_with_id:
+ * @combo_box: A #GtkComboBoxText
+ * @position: An index to insert @text
  * @text: A string
+ * @id: a numeric ID for this value
  *
- * Prepends @string to the list of strings stored in @combo_box.
+ * Inserts @string at @position in the list of strings stored in @combo_box,
+ * and sets its numeric ID to @id. See #GtkComboBox::id-column.
  *
- * Since: 2.24
+ * Since: 3.0
  */
 void
-gtk_combo_box_text_prepend_text (GtkComboBoxText *combo_box,
-                                 const gchar     *text)
+gtk_combo_box_text_insert_text_with_id (GtkComboBoxText *combo_box,
+                                        gint             position,
+                                        const gchar     *text,
+                                        gint             id)
 {
   GtkListStore *store;
   GtkTreeIter iter;
   gint text_column;
+  gint id_column;
   gint column_type;
 
   g_return_if_fail (GTK_IS_COMBO_BOX_TEXT (combo_box));
+  g_return_if_fail (position >= 0);
   g_return_if_fail (text != NULL);
 
   store = GTK_LIST_STORE (gtk_combo_box_get_model (GTK_COMBO_BOX (combo_box)));
@@ -215,11 +209,18 @@ gtk_combo_box_text_prepend_text (GtkComboBoxText *combo_box,
   text_column = gtk_combo_box_get_entry_text_column (GTK_COMBO_BOX (combo_box));
   column_type = gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), text_column);
   g_return_if_fail (column_type == G_TYPE_STRING);
+  id_column = gtk_combo_box_get_id_column (GTK_COMBO_BOX (combo_box));
+  if (id_column != -1)
+    {
+      column_type = gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), id_column);
+      g_return_if_fail (column_type == G_TYPE_INT);
+    }
 
-  gtk_list_store_prepend (store, &iter);
-  gtk_list_store_set (store, &iter, text_column, text, -1);
+  gtk_list_store_insert (store, &iter, position);
+  gtk_list_store_set (store, &iter, text_column, text, id_column, id, -1);
 }
 
+
 /**
  * gtk_combo_box_text_remove:
  * @combo_box: A #GtkComboBox
diff --git a/gtk/gtkcomboboxtext.h b/gtk/gtkcomboboxtext.h
index 50ebcb5..7322e45 100644
--- a/gtk/gtkcomboboxtext.h
+++ b/gtk/gtkcomboboxtext.h
@@ -72,6 +72,10 @@ void          gtk_combo_box_text_remove          (GtkComboBoxText     *combo_box
 void          gtk_combo_box_text_remove_all      (GtkComboBoxText     *combo_box);
 gchar        *gtk_combo_box_text_get_active_text (GtkComboBoxText     *combo_box);
 
+void          gtk_combo_box_text_insert_text_with_id (GtkComboBoxText     *combo_box,
+                                                      gint                 position,
+                                                      const gchar         *text,
+                                                      gint                 id);
 
 G_END_DECLS
 



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