[gnome-software] Improve back button handling
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software] Improve back button handling
- Date: Sat, 31 Aug 2013 23:09:23 +0000 (UTC)
commit b491899211122a783a57df1d6cd5fe7e53726ee9
Author: Matthias Clasen <mclasen redhat com>
Date: Sat Aug 31 19:05:33 2013 -0400
Improve back button handling
Add a stack, so we can go back from an application to the category
to the overview.
src/gs-shell-category.c | 6 ++++++
src/gs-shell-category.h | 1 +
src/gs-shell.c | 36 ++++++++++++++++++++++++++++++++++--
3 files changed, 41 insertions(+), 2 deletions(-)
---
diff --git a/src/gs-shell-category.c b/src/gs-shell-category.c
index 298709c..706ce34 100644
--- a/src/gs-shell-category.c
+++ b/src/gs-shell-category.c
@@ -232,6 +232,12 @@ gs_shell_category_set_category (GsShellCategory *shell, GsCategory *category)
gs_shell_category_populate_filtered (shell, subcategory);
}
+GsCategory *
+gs_shell_category_get_category (GsShellCategory *shell)
+{
+ return shell->priv->category;
+}
+
static void
gs_shell_category_class_init (GsShellCategoryClass *klass)
{
diff --git a/src/gs-shell-category.h b/src/gs-shell-category.h
index 63416f4..d732b4c 100644
--- a/src/gs-shell-category.h
+++ b/src/gs-shell-category.h
@@ -56,6 +56,7 @@ GType gs_shell_category_get_type (void);
GsShellCategory *gs_shell_category_new (void);
void gs_shell_category_set_category (GsShellCategory *shell_category,
GsCategory *category);
+GsCategory *gs_shell_category_get_category (GsShellCategory *shell_category);
void gs_shell_category_refresh (GsShellCategory *shell_category);
void gs_shell_category_setup (GsShellCategory *shell_category,
GsShell *shell,
diff --git a/src/gs-shell.c b/src/gs-shell.c
index c089ae4..6547f77 100644
--- a/src/gs-shell.c
+++ b/src/gs-shell.c
@@ -36,6 +36,12 @@ static void gs_shell_finalize (GObject *object);
#define GS_SHELL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GS_TYPE_SHELL, GsShellPrivate))
+typedef struct {
+ GsShellMode mode;
+ GsApp *app;
+ GsCategory *category;
+} BackEntry;
+
struct GsShellPrivate
{
gboolean ignore_primary_buttons;
@@ -49,7 +55,7 @@ struct GsShellPrivate
GsShellDetails *shell_details;
GsShellCategory *shell_category;
GtkBuilder *builder;
- GsShellMode tab_back_id;
+ GSList *back_entry_stack;
};
G_DEFINE_TYPE (GsShell, gs_shell, G_TYPE_OBJECT)
@@ -151,13 +157,37 @@ gs_shell_overview_button_cb (GtkWidget *widget, GsShell *shell)
gs_shell_change_mode (shell, mode, NULL, NULL);
}
+static void
+save_back_entry (GsShell *shell)
+{
+ GsShellPrivate *priv = shell->priv;
+ BackEntry *entry;
+
+ entry = g_new0 (BackEntry, 1);
+ entry->mode = priv->mode;
+
+ if (priv->mode == GS_SHELL_MODE_CATEGORY)
+ entry->category = gs_shell_category_get_category (priv->shell_category);
+
+ priv->back_entry_stack = g_slist_prepend (priv->back_entry_stack, entry);
+}
+
/**
* gs_shell_back_button_cb:
**/
static void
gs_shell_back_button_cb (GtkWidget *widget, GsShell *shell)
{
- gs_shell_change_mode (shell, shell->priv->tab_back_id, NULL, NULL);
+ GsShellPrivate *priv = shell->priv;
+ BackEntry *entry;
+
+ g_assert (priv->back_entry_stack);
+ entry = priv->back_entry_stack->data;
+ priv->back_entry_stack = g_slist_remove (priv->back_entry_stack, entry);
+
+ gs_shell_change_mode (shell, entry->mode, entry->app, entry->category);
+
+ g_free (entry);
}
static void
@@ -420,12 +450,14 @@ gs_shell_get_mode (GsShell *shell)
void
gs_shell_show_app (GsShell *shell, GsApp *app)
{
+ save_back_entry (shell);
gs_shell_change_mode (shell, GS_SHELL_MODE_DETAILS, app, NULL);
}
void
gs_shell_show_category (GsShell *shell, GsCategory *category)
{
+ save_back_entry (shell);
gs_shell_change_mode (shell, GS_SHELL_MODE_CATEGORY, NULL, category);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]