diff --git a/shell/cc-panel-list.c b/shell/cc-panel-list.c index 67a0ac77f..e5134ac6b 100644 --- a/shell/cc-panel-list.c +++ b/shell/cc-panel-list.c @@ -1137,3 +1137,26 @@ cc_panel_list_add_sidebar_widget (CcPanelList *self, gtk_container_remove (GTK_CONTAINER (self), widget); } } + +void +cc_panel_list_set_selection_mode (CcPanelList *self, + GtkSelectionMode selection_mode) +{ + g_return_if_fail (CC_IS_PANEL_LIST (self)); + + gtk_list_box_set_selection_mode (GTK_LIST_BOX (self->main_listbox), selection_mode); + gtk_list_box_set_selection_mode (GTK_LIST_BOX (self->devices_listbox), selection_mode); + gtk_list_box_set_selection_mode (GTK_LIST_BOX (self->details_listbox), selection_mode); + + /* When selection mode changed, selection will be lost. So reselect */ + if (selection_mode == GTK_SELECTION_SINGLE && self->current_panel_id) + { + GtkWidget *listbox; + RowData *data; + + data = g_hash_table_lookup (self->id_to_data, self->current_panel_id); + listbox = gtk_widget_get_parent (data->row); + gtk_list_box_select_row (GTK_LIST_BOX (listbox), GTK_LIST_BOX_ROW (data->row)); + } +} + diff --git a/shell/cc-panel-list.h b/shell/cc-panel-list.h index 525734ea5..76995c2b8 100644 --- a/shell/cc-panel-list.h +++ b/shell/cc-panel-list.h @@ -73,6 +73,9 @@ void cc_panel_list_set_panel_visibility (CcPanelList void cc_panel_list_add_sidebar_widget (CcPanelList *self, GtkWidget *widget); +void cc_panel_list_set_selection_mode (CcPanelList *self, + GtkSelectionMode selection_mode); + G_END_DECLS #endif /* CC_PANEL_LIST_H */ diff --git a/shell/cc-window.c b/shell/cc-window.c index 6cbe22c71..8a6c6eeeb 100644 --- a/shell/cc-window.c +++ b/shell/cc-window.c @@ -536,6 +536,21 @@ notify_fold_cb (HdyLeaflet *leaflet, update_fold_state (shell); } +static void +on_main_leaflet_fold_changed_cb (CcWindow *self) +{ + GtkSelectionMode selection_mode; + + g_assert (CC_IS_WINDOW (self)); + + selection_mode = GTK_SELECTION_SINGLE; + + if (hdy_leaflet_get_fold (HDY_LEAFLET (self->main_leaflet)) == HDY_FOLD_FOLDED) + selection_mode = GTK_SELECTION_NONE; + + cc_panel_list_set_selection_mode (CC_PANEL_LIST (self->panel_list), selection_mode); +} + static void show_panel_cb (CcPanelList *panel_list, const gchar *panel_id, @@ -917,6 +932,7 @@ cc_window_class_init (CcWindowClass *klass) gtk_widget_class_bind_template_callback (widget_class, gdk_window_set_cb); gtk_widget_class_bind_template_callback (widget_class, notify_header_visible_child_cb); gtk_widget_class_bind_template_callback (widget_class, notify_fold_cb); + gtk_widget_class_bind_template_callback (widget_class, on_main_leaflet_fold_changed_cb); gtk_widget_class_bind_template_callback (widget_class, on_development_warning_dialog_responded_cb); gtk_widget_class_bind_template_callback (widget_class, previous_button_clicked_cb); gtk_widget_class_bind_template_callback (widget_class, search_entry_activate_cb); diff --git a/shell/cc-window.ui b/shell/cc-window.ui index 45f9182f1..e7b2a5d89 100644 --- a/shell/cc-window.ui +++ b/shell/cc-window.ui @@ -15,6 +15,7 @@ False slide slide + True