[gnome-control-center] shell: Make the "home" button act as a "previous" button
- From: Bastien Nocera <hadess src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center] shell: Make the "home" button act as a "previous" button
- Date: Tue, 19 Feb 2013 10:27:34 +0000 (UTC)
commit 6cb6404e7e6973762f2e6d9f9050d427299863ff
Author: Bastien Nocera <hadess hadess net>
Date: Tue Feb 19 11:18:46 2013 +0100
shell: Make the "home" button act as a "previous" button
Keep history of the visited panels, when navigating between
them through links, or activated through the shell's menu items,
and go back to the overview when the history is empty.
https://bugzilla.gnome.org/show_bug.cgi?id=643322
shell/cc-window.c | 86 +++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 71 insertions(+), 15 deletions(-)
---
diff --git a/shell/cc-window.c b/shell/cc-window.c
index edfefe6..c9ae400 100644
--- a/shell/cc-window.c
+++ b/shell/cc-window.c
@@ -73,13 +73,14 @@ struct _CcWindowPrivate
GtkWidget *main_vbox;
GtkWidget *scrolled_window;
GtkWidget *search_scrolled;
- GtkWidget *home_button;
+ GtkWidget *previous_button;
GtkWidget *top_right_box;
GtkWidget *search_entry;
GtkWidget *lock_button;
GtkWidget *current_panel_box;
GtkWidget *current_panel;
char *current_panel_id;
+ GQueue *previous_panels;
GPtrArray *custom_widgets;
@@ -101,6 +102,11 @@ enum
PROP_ACTIVE_PANEL
};
+static gboolean cc_window_set_active_panel_from_id (CcShell *shell,
+ const gchar *start_id,
+ const gchar **argv,
+ GError **err);
+
/* Notebook helpers */
static GtkWidget *
notebook_get_selected_page (GtkWidget *notebook)
@@ -241,6 +247,24 @@ _shell_remove_all_custom_widgets (CcWindowPrivate *priv)
}
static void
+add_current_panel_to_history (CcShell *shell,
+ const char *start_id)
+{
+ CcWindowPrivate *priv;
+
+ g_return_if_fail (start_id != NULL);
+
+ priv = CC_WINDOW (shell)->priv;
+
+ if (!priv->current_panel_id ||
+ g_strcmp0 (priv->current_panel_id, start_id) == 0)
+ return;
+
+ g_queue_push_head (priv->previous_panels, g_strdup (priv->current_panel_id));
+ g_debug ("Added '%s' to the previous panels", priv->current_panel_id);
+}
+
+static void
shell_show_overview_page (CcWindow *self)
{
CcWindowPrivate *priv = self->priv;
@@ -253,6 +277,10 @@ shell_show_overview_page (CcWindow *self)
priv->current_panel_box = NULL;
g_clear_pointer (&priv->current_panel_id, g_free);
+ /* Clear the panel history */
+ g_queue_free_full (self->priv->previous_panels, g_free);
+ self->priv->previous_panels = g_queue_new ();
+
/* clear the search text */
g_free (priv->filter_string);
priv->filter_string = g_strdup ("");
@@ -294,7 +322,7 @@ item_activated_cb (CcShellCategoryView *view,
gchar *id,
CcWindow *shell)
{
- cc_shell_set_active_panel_from_id (CC_SHELL (shell), id, NULL, NULL);
+ cc_window_set_active_panel_from_id (CC_SHELL (shell), id, NULL, NULL);
}
static gboolean
@@ -695,7 +723,7 @@ on_search_row_activated (GtkTreeView *treeview,
-1);
if (id)
- cc_shell_set_active_panel_from_id (CC_SHELL (shell), id, NULL, NULL);
+ cc_window_set_active_panel_from_id (CC_SHELL (shell), id, NULL, NULL);
gtk_tree_selection_unselect_all (selection);
@@ -876,10 +904,20 @@ setup_model (CcWindow *shell)
}
static void
-home_button_clicked_cb (GtkButton *button,
- CcWindow *shell)
+previous_button_clicked_cb (GtkButton *button,
+ CcWindow *shell)
{
- shell_show_overview_page (shell);
+ g_debug ("Num previous panels? %d", g_queue_get_length (shell->priv->previous_panels));
+ if (g_queue_is_empty (shell->priv->previous_panels)) {
+ shell_show_overview_page (shell);
+ } else {
+ char *panel_name;
+
+ panel_name = g_queue_pop_head (shell->priv->previous_panels);
+ g_debug ("About to go to previous panel '%s'", panel_name);
+ cc_window_set_active_panel_from_id (CC_SHELL (shell), panel_name, NULL, NULL);
+ g_free (panel_name);
+ }
}
static void
@@ -897,7 +935,7 @@ notebook_page_notify_cb (GtkNotebook *notebook,
if (child == priv->scrolled_window || child == priv->search_scrolled)
{
- gtk_widget_hide (priv->home_button);
+ gtk_widget_hide (priv->previous_button);
gtk_widget_show (priv->search_entry);
gtk_widget_hide (priv->lock_button);
@@ -908,7 +946,7 @@ notebook_page_notify_cb (GtkNotebook *notebook,
}
else
{
- gtk_widget_show (priv->home_button);
+ gtk_widget_show (priv->previous_button);
gtk_widget_hide (priv->search_entry);
/* set the scrolled window small so that it doesn't force
the window to be larger than this panel */
@@ -935,10 +973,10 @@ _shell_embed_widget_in_header (CcShell *shell,
/* CcShell implementation */
static gboolean
-_shell_set_active_panel_from_id (CcShell *shell,
- const gchar *start_id,
- const gchar **argv,
- GError **err)
+cc_window_set_active_panel_from_id (CcShell *shell,
+ const gchar *start_id,
+ const gchar **argv,
+ GError **err)
{
GtkTreeIter iter;
gboolean iter_valid;
@@ -1021,6 +1059,16 @@ _shell_set_active_panel_from_id (CcShell *shell,
return TRUE;
}
+static gboolean
+_shell_set_active_panel_from_id (CcShell *shell,
+ const gchar *start_id,
+ const gchar **argv,
+ GError **err)
+{
+ add_current_panel_to_history (shell, start_id);
+ return cc_window_set_active_panel_from_id (shell, start_id, argv, err);
+}
+
static GtkWidget *
_shell_get_toplevel (CcShell *shell)
{
@@ -1103,6 +1151,12 @@ cc_window_dispose (GObject *object)
g_clear_object (&priv->search_filter);
g_clear_object (&priv->active_panel);
+ if (priv->previous_panels)
+ {
+ g_queue_free_full (priv->previous_panels, g_free);
+ priv->previous_panels = NULL;
+ }
+
G_OBJECT_CLASS (cc_window_parent_class)->dispose (object);
}
@@ -1378,14 +1432,14 @@ create_header (CcWindow *self)
image = gtk_image_new_from_icon_name ("go-previous-symbolic", GTK_ICON_SIZE_MENU);
gtk_widget_show (image);
- priv->home_button = button = gtk_button_new ();
+ priv->previous_button = button = gtk_button_new ();
gtk_button_set_image (GTK_BUTTON (button), image);
gtk_widget_set_no_show_all (button, TRUE);
accessible = gtk_widget_get_accessible (button);
atk_object_set_name (accessible, _("All Settings"));
gd_header_bar_pack_start (GD_HEADER_BAR (priv->header), button);
- g_signal_connect (button, "clicked", G_CALLBACK (home_button_clicked_cb), self);
- context = gtk_widget_get_style_context (priv->home_button);
+ g_signal_connect (button, "clicked", G_CALLBACK (previous_button_clicked_cb), self);
+ context = gtk_widget_get_style_context (priv->previous_button);
gtk_style_context_add_class (context, "image-button");
priv->top_right_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
@@ -1451,6 +1505,8 @@ cc_window_init (CcWindow *self)
create_window (self);
+ self->priv->previous_panels = g_queue_new ();
+
/* keep a list of custom widgets to unload on panel change */
priv->custom_widgets = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]