{
GtkDropDown *self = data;
guint selected;
- gpointer item;
GtkFilter *filter;
selected = gtk_single_selection_get_selected (GTK_SINGLE_SELECTION (self->selection));
- item = gtk_single_selection_get_selected_item (GTK_SINGLE_SELECTION (self->selection));
if (selected == GTK_INVALID_LIST_POSITION)
{
else
{
gtk_stack_set_visible_child_name (GTK_STACK (self->button_stack), "item");
- gtk_list_item_widget_update (GTK_LIST_ITEM_WIDGET (self->button_item), selected, item, FALSE);
+ }
+
+ if (selected != gtk_list_item_widget_get_position (GTK_LIST_ITEM_WIDGET (self->button_item)))
+ {
+ gtk_list_item_widget_update (GTK_LIST_ITEM_WIDGET (self->button_item),
+ selected,
+ gtk_single_selection_get_selected_item (GTK_SINGLE_SELECTION (self->selection)),
+ FALSE);
}
/* reset the filter so positions are 1-1 */
gtk_single_selection_set_selected (GTK_SINGLE_SELECTION (self->popup_selection), selected);
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SELECTED]);
+}
+
+static void
+selection_item_changed (GtkSingleSelection *selection,
+ GParamSpec *pspec,
+ gpointer data)
+{
+ GtkDropDown *self = data;
+ gpointer item;
+
+ item = gtk_single_selection_get_selected_item (GTK_SINGLE_SELECTION (self->selection));
+
+ if (item != gtk_list_item_widget_get_item (GTK_LIST_ITEM_WIDGET (self->button_item)))
+ {
+ gtk_list_item_widget_update (GTK_LIST_ITEM_WIDGET (self->button_item),
+ gtk_single_selection_get_selected (GTK_SINGLE_SELECTION (self->selection)),
+ item,
+ FALSE);
+ }
+
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SELECTED_ITEM]);
}
g_clear_object (&self->model);
if (self->selection)
- g_signal_handlers_disconnect_by_func (self->selection, selection_changed, self);
+ {
+ g_signal_handlers_disconnect_by_func (self->selection, selection_changed, self);
+ g_signal_handlers_disconnect_by_func (self->selection, selection_item_changed, self);
+ }
g_clear_object (&self->filter_model);
g_clear_pointer (&self->expression, gtk_expression_unref);
g_clear_object (&self->selection);
gtk_list_view_set_model (GTK_LIST_VIEW (self->popup_list), NULL);
if (self->selection)
- g_signal_handlers_disconnect_by_func (self->selection, selection_changed, self);
+ {
+ g_signal_handlers_disconnect_by_func (self->selection, selection_changed, self);
+ g_signal_handlers_disconnect_by_func (self->selection, selection_item_changed, self);
+ }
g_clear_object (&self->selection);
g_clear_object (&self->filter_model);
g_object_unref (selection);
g_signal_connect (self->selection, "notify::selected", G_CALLBACK (selection_changed), self);
+ g_signal_connect (self->selection, "notify::selected-item", G_CALLBACK (selection_item_changed), self);
selection_changed (GTK_SINGLE_SELECTION (self->selection), NULL, self);
+ selection_item_changed (GTK_SINGLE_SELECTION (self->selection), NULL, self);
}
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MODEL]);