[gtk+] Add a way to associate numeric ids with combobox values
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] Add a way to associate numeric ids with combobox values
- Date: Sat, 23 Oct 2010 00:32:27 +0000 (UTC)
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]