forked from AuroraMiddleware/gtk
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:
parent
54c3f05848
commit
7ae4a06d1f
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user