GtkComboBox: Improve gtk_combo_box_set_active_id

- Passing a NULL ID string should be equivalent to
  gtk_combo_box_set_active (combo_box, -1).
- Use g_strcmp0() instead of strcmp() when comparing
  ID strings to avoid a crash when an ID is NULL.
- Return a boolean indicating if the ID was found or not.

https://bugzilla.gnome.org/show_bug.cgi?id=647806
This commit is contained in:
Matthew Barnes 2011-04-26 07:59:53 -04:00 committed by Matthias Clasen
parent 54c3f05848
commit 7ae4a06d1f
2 changed files with 31 additions and 15 deletions

View File

@ -5594,15 +5594,16 @@ gtk_combo_box_get_id_column (GtkComboBox *combo_box)
* @combo_box: a #GtkComboBox * @combo_box: a #GtkComboBox
* *
* Returns the ID of the active row of @combo_box. This value is taken * Returns the ID of the active row of @combo_box. This value is taken
* from the active row and the column specified by the 'id-column' * from the active row and the column specified by the #GtkComboBox:id-column
* property of @combo_box (see gtk_combo_box_set_id_column()). * property of @combo_box (see gtk_combo_box_set_id_column()).
* *
* The returned value is an interned string which means that you can * The returned value is an interned string which means that you can
* compare the pointer by value to other interned strings and that you * compare the pointer by value to other interned strings and that you
* must not free it. * must not free it.
* *
* If the 'id-column' property of @combo_box is not set or if no row is * If the #GtkComboBox:id-column property of @combo_box is not set, or if
* selected then %NULL is returned. * no row is active, or if the active row has a %NULL ID value, then %NULL
* is returned.
* *
* Return value: the ID of the active row, or %NULL * Return value: the ID of the active row, or %NULL
* *
@ -5644,41 +5645,54 @@ gtk_combo_box_get_active_id (GtkComboBox *combo_box)
/** /**
* gtk_combo_box_set_active_id: * gtk_combo_box_set_active_id:
* @combo_box: a #GtkComboBox * @combo_box: a #GtkComboBox
* @active_id: the ID of the row to select * @active_id: (allow-none): the ID of the row to select, or %NULL
* *
* Changes the active row of @combo_box to the one that has an ID equal to @id. * Changes the active row of @combo_box to the one that has an ID equal to
* @active_id, or unsets the active row if @active_id is %NULL. Rows having
* a %NULL ID string cannot be made active by this function.
* *
* If the 'id-column' property of @combo_box is unset or if no row has * If the #GtkComboBox:id-column property of @combo_box is unset or if no
* the given ID then nothing happens. * row has the given ID then the function does nothing and returns %FALSE.
*
* Returns: %TRUE if a row with a matching ID was found. If a %NULL
* @active_id was given to unset the active row, the function
* always returns %TRUE.
* *
* Since: 3.0 * Since: 3.0
**/ **/
void gboolean
gtk_combo_box_set_active_id (GtkComboBox *combo_box, gtk_combo_box_set_active_id (GtkComboBox *combo_box,
const gchar *active_id) const gchar *active_id)
{ {
GtkTreeModel *model; GtkTreeModel *model;
GtkTreeIter iter; GtkTreeIter iter;
gboolean match = FALSE;
gint column; gint column;
g_return_if_fail (GTK_IS_COMBO_BOX (combo_box)); g_return_val_if_fail (GTK_IS_COMBO_BOX (combo_box), FALSE);
if (active_id == NULL)
{
gtk_combo_box_set_active (combo_box, -1);
return TRUE; /* active row was successfully unset */
}
column = combo_box->priv->id_column; column = combo_box->priv->id_column;
if (column < 0) if (column < 0)
return; return FALSE;
model = gtk_combo_box_get_model (combo_box); model = gtk_combo_box_get_model (combo_box);
g_return_if_fail (gtk_tree_model_get_column_type (model, column) == g_return_val_if_fail (gtk_tree_model_get_column_type (model, column) ==
G_TYPE_STRING); G_TYPE_STRING, FALSE);
if (gtk_tree_model_get_iter_first (model, &iter)) if (gtk_tree_model_get_iter_first (model, &iter))
do { do {
gboolean match;
gchar *id; gchar *id;
gtk_tree_model_get (model, &iter, column, &id, -1); gtk_tree_model_get (model, &iter, column, &id, -1);
match = strcmp (id, active_id) == 0; if (id != NULL)
match = strcmp (id, active_id) == 0;
g_free (id); g_free (id);
if (match) if (match)
@ -5687,4 +5701,6 @@ gtk_combo_box_set_active_id (GtkComboBox *combo_box,
break; break;
} }
} while (gtk_tree_model_iter_next (model, &iter)); } while (gtk_tree_model_iter_next (model, &iter));
return match;
} }

View File

@ -140,7 +140,7 @@ gint gtk_combo_box_get_id_column (GtkComboBox *combo_box);
void gtk_combo_box_set_id_column (GtkComboBox *combo_box, void gtk_combo_box_set_id_column (GtkComboBox *combo_box,
gint id_column); gint id_column);
const gchar * gtk_combo_box_get_active_id (GtkComboBox *combo_box); const gchar * gtk_combo_box_get_active_id (GtkComboBox *combo_box);
void gtk_combo_box_set_active_id (GtkComboBox *combo_box, gboolean gtk_combo_box_set_active_id (GtkComboBox *combo_box,
const gchar *active_id); const gchar *active_id);
G_END_DECLS G_END_DECLS