[gnome-software] Simplify the mode changing and back button handling
- From: Richard Hughes <rhughes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software] Simplify the mode changing and back button handling
- Date: Thu, 9 Jun 2016 08:59:38 +0000 (UTC)
commit e4daaf79f1c00619380f27780866bb870266e0b6
Author: Richard Hughes <richard hughsie com>
Date: Thu Jun 9 09:16:31 2016 +0100
Simplify the mode changing and back button handling
Don't use the GtkEntry as a data store when we can just use the existing 'data'
parameter, and we never pass a GsCategory *and* GsApp so we can just use data
for that too.
This fixes oddness when searching and showing the button box after returning
from the search results.
src/gs-shell-extras.c | 2 +-
src/gs-shell-search.c | 10 ++++-
src/gs-shell-search.h | 1 +
src/gs-shell.c | 113 ++++++++++++++++++++++++++++---------------------
src/gs-shell.h | 1 -
5 files changed, 75 insertions(+), 52 deletions(-)
---
diff --git a/src/gs-shell-extras.c b/src/gs-shell-extras.c
index 938999e..3dc5893 100644
--- a/src/gs-shell-extras.c
+++ b/src/gs-shell-extras.c
@@ -499,7 +499,7 @@ show_search_results (GsShellExtras *self)
/* switch directly to details view */
g_debug ("extras: found one result, showing in details view");
app = gs_app_row_get_app (GS_APP_ROW (list->data));
- gs_shell_change_mode (self->shell, GS_SHELL_MODE_DETAILS, app, NULL, TRUE);
+ gs_shell_change_mode (self->shell, GS_SHELL_MODE_DETAILS, app, TRUE);
} else {
/* show what we got */
g_debug ("extras: got %d search results, showing", n_children);
diff --git a/src/gs-shell-search.c b/src/gs-shell-search.c
index 349959d..7632ee7 100644
--- a/src/gs-shell-search.c
+++ b/src/gs-shell-search.c
@@ -225,9 +225,17 @@ gs_shell_search_set_appid_to_show (GsShellSearch *self, const gchar *appid)
self->appid_to_show = g_strdup (appid);
}
+const gchar *
+gs_shell_search_get_text (GsShellSearch *self)
+{
+ return self->value;
+}
+
void
gs_shell_search_set_text (GsShellSearch *self, const gchar *value)
{
+ if (value == self->value)
+ return;
g_free (self->value);
self->value = g_strdup (value);
}
@@ -395,7 +403,7 @@ gs_shell_search_search_button_cb (GtkButton *button, GsShellSearch *self)
{
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)))
return;
- gs_shell_change_mode (self->shell, GS_SHELL_MODE_OVERVIEW, NULL, NULL, TRUE);
+ gs_shell_change_mode (self->shell, GS_SHELL_MODE_OVERVIEW, NULL, TRUE);
}
/**
diff --git a/src/gs-shell-search.h b/src/gs-shell-search.h
index ecf69d9..1b10a7c 100644
--- a/src/gs-shell-search.h
+++ b/src/gs-shell-search.h
@@ -38,6 +38,7 @@ G_DECLARE_FINAL_TYPE (GsShellSearch, gs_shell_search, GS, SHELL_SEARCH, GsPage)
GsShellSearch *gs_shell_search_new (void);
void gs_shell_search_set_appid_to_show (GsShellSearch *self,
const gchar *appid);
+const gchar *gs_shell_search_get_text (GsShellSearch *self);
void gs_shell_search_set_text (GsShellSearch *self,
const gchar *value);
void gs_shell_search_reload (GsShellSearch *self);
diff --git a/src/gs-shell.c b/src/gs-shell.c
index eca3e79..17ed6f2 100644
--- a/src/gs-shell.c
+++ b/src/gs-shell.c
@@ -58,6 +58,7 @@ typedef struct {
GtkWidget *focus;
GsApp *app;
GsCategory *category;
+ gchar *search;
} BackEntry;
typedef struct
@@ -80,7 +81,6 @@ typedef struct
GtkBuilder *builder;
GtkWindow *main_window;
GQueue *back_entry_stack;
- gboolean ignore_next_search_changed_signal;
GPtrArray *modal_dialogs;
} GsShellPrivate;
@@ -217,14 +217,12 @@ gs_shell_set_header_end_widget (GsShell *shell, GtkWidget *widget)
void
gs_shell_change_mode (GsShell *shell,
GsShellMode mode,
- GsApp *app,
gpointer data,
gboolean scroll_up)
{
GsShellPrivate *priv = gs_shell_get_instance_private (shell);
GsPage *new_page;
GtkWidget *widget;
- const gchar *text;
GtkStyleContext *context;
if (priv->ignore_primary_buttons)
@@ -293,18 +291,16 @@ gs_shell_change_mode (GsShell *shell,
new_page = GS_PAGE (priv->shell_loading);
break;
case GS_SHELL_MODE_SEARCH:
- widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "entry_search"));
- text = gtk_entry_get_text (GTK_ENTRY (widget));
- gs_shell_search_set_text (priv->shell_search, text);
+ gs_shell_search_set_text (priv->shell_search, data);
new_page = GS_PAGE (priv->shell_search);
break;
case GS_SHELL_MODE_UPDATES:
new_page = GS_PAGE (priv->shell_updates);
break;
case GS_SHELL_MODE_DETAILS:
- if (app != NULL)
- gs_shell_details_set_app (priv->shell_details, app);
- if (data != NULL)
+ if (GS_IS_APP (data))
+ gs_shell_details_set_app (priv->shell_details, data);
+ else
gs_shell_details_set_filename (priv->shell_details, data);
new_page = GS_PAGE (priv->shell_details);
break;
@@ -343,7 +339,7 @@ gs_shell_overview_button_cb (GtkWidget *widget, GsShell *shell)
GsShellMode mode;
mode = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (widget),
"gnome-software::overview-mode"));
- gs_shell_change_mode (shell, mode, NULL, NULL, TRUE);
+ gs_shell_change_mode (shell, mode, NULL, TRUE);
}
static void
@@ -360,13 +356,29 @@ save_back_entry (GsShell *shell)
g_object_add_weak_pointer (G_OBJECT (entry->focus),
(gpointer *) &entry->focus);
- if (priv->mode == GS_SHELL_MODE_CATEGORY) {
+ switch (priv->mode) {
+ case GS_SHELL_MODE_CATEGORY:
entry->category = gs_shell_category_get_category (priv->shell_category);
g_object_ref (entry->category);
- }
- else if (priv->mode == GS_SHELL_MODE_DETAILS) {
+ g_debug ("pushing back entry for %s with %s",
+ page_name[entry->mode],
+ gs_category_get_id (entry->category));
+ break;
+ case GS_SHELL_MODE_DETAILS:
entry->app = gs_shell_details_get_app (priv->shell_details);
g_object_ref (entry->app);
+ g_debug ("pushing back entry for %s with %s",
+ page_name[entry->mode],
+ gs_app_get_id (entry->app));
+ break;
+ case GS_SHELL_MODE_SEARCH:
+ entry->search = g_strdup (gs_shell_search_get_text (priv->shell_search));
+ g_debug ("pushing back entry for %s with %s",
+ page_name[entry->mode], entry->search);
+ break;
+ default:
+ g_debug ("pushing back entry for %s", page_name[entry->mode]);
+ break;
}
g_queue_push_head (priv->back_entry_stack, entry);
@@ -380,6 +392,7 @@ free_back_entry (BackEntry *entry)
(gpointer *) &entry->focus);
g_clear_object (&entry->category);
g_clear_object (&entry->app);
+ g_free (entry->search);
g_free (entry);
}
@@ -396,7 +409,33 @@ gs_shell_back_button_cb (GtkWidget *widget, GsShell *shell)
entry = g_queue_pop_head (priv->back_entry_stack);
- gs_shell_change_mode (shell, entry->mode, entry->app, entry->category, FALSE);
+ switch (entry->mode) {
+ case GS_SHELL_MODE_UNKNOWN:
+ /* only happens when the user does --search foobar */
+ g_debug ("popping back entry for %s", page_name[entry->mode]);
+ gs_shell_change_mode (shell, GS_SHELL_MODE_OVERVIEW, NULL, FALSE);
+ break;
+ case GS_SHELL_MODE_CATEGORY:
+ g_debug ("popping back entry for %s with %s",
+ page_name[entry->mode],
+ gs_category_get_id (entry->category));
+ gs_shell_change_mode (shell, entry->mode, entry->category, FALSE);
+ break;
+ case GS_SHELL_MODE_DETAILS:
+ g_debug ("popping back entry for %s with %p",
+ page_name[entry->mode], entry->app);
+ gs_shell_change_mode (shell, entry->mode, entry->app, FALSE);
+ break;
+ case GS_SHELL_MODE_SEARCH:
+ g_debug ("popping back entry for %s with %s",
+ page_name[entry->mode], entry->search);
+ gs_shell_change_mode (shell, entry->mode, entry->search, FALSE);
+ break;
+ default:
+ g_debug ("popping back entry for %s", page_name[entry->mode]);
+ gs_shell_change_mode (shell, entry->mode, NULL, FALSE);
+ break;
+ }
if (entry->focus != NULL)
gtk_widget_grab_focus (entry->focus);
@@ -433,21 +472,10 @@ search_changed_handler (GObject *entry, GsShell *shell)
GsShellPrivate *priv = gs_shell_get_instance_private (shell);
const gchar *text;
- if (priv->ignore_next_search_changed_signal) {
- priv->ignore_next_search_changed_signal = FALSE;
- return;
- }
-
text = gtk_entry_get_text (GTK_ENTRY (entry));
-
- if (text[0] == '\0' && gs_shell_get_mode (shell) == GS_SHELL_MODE_SEARCH) {
- gs_shell_change_mode (shell, GS_SHELL_MODE_OVERVIEW, NULL, NULL, TRUE);
- return;
- }
-
- if (strlen(text) > 2) {
+ if (strlen (text) > 2) {
if (gs_shell_get_mode (shell) != GS_SHELL_MODE_SEARCH) {
- gs_shell_change_mode (shell, GS_SHELL_MODE_SEARCH, NULL, NULL, TRUE);
+ gs_shell_change_mode (shell, GS_SHELL_MODE_SEARCH, text, TRUE);
} else {
gs_shell_search_set_text (priv->shell_search, text);
gs_page_switch_to (GS_PAGE (priv->shell_search), TRUE);
@@ -729,7 +757,7 @@ gs_shell_set_mode (GsShell *shell, GsShellMode mode)
if (matched > 0)
g_signal_emit (shell, signals[SIGNAL_LOADED], 0);
}
- gs_shell_change_mode (shell, mode, NULL, NULL, TRUE);
+ gs_shell_change_mode (shell, mode, NULL, TRUE);
}
GsShellMode
@@ -782,7 +810,7 @@ void
gs_shell_show_app (GsShell *shell, GsApp *app)
{
save_back_entry (shell);
- gs_shell_change_mode (shell, GS_SHELL_MODE_DETAILS, app, NULL, TRUE);
+ gs_shell_change_mode (shell, GS_SHELL_MODE_DETAILS, app, TRUE);
gs_shell_activate (shell);
}
@@ -790,35 +818,29 @@ void
gs_shell_show_category (GsShell *shell, GsCategory *category)
{
save_back_entry (shell);
- gs_shell_change_mode (shell, GS_SHELL_MODE_CATEGORY, NULL, category, TRUE);
+ gs_shell_change_mode (shell, GS_SHELL_MODE_CATEGORY, category, TRUE);
}
void gs_shell_show_extras_search (GsShell *shell, const gchar *mode, gchar **resources)
{
GsShellPrivate *priv = gs_shell_get_instance_private (shell);
-
- save_back_entry (shell);
gs_shell_extras_search (priv->shell_extras, mode, resources);
- gs_shell_change_mode (shell, GS_SHELL_MODE_EXTRAS, NULL, NULL, TRUE);
+ gs_shell_change_mode (shell, GS_SHELL_MODE_EXTRAS, NULL, TRUE);
gs_shell_activate (shell);
}
void
gs_shell_show_search (GsShell *shell, const gchar *search)
{
- GsShellPrivate *priv = gs_shell_get_instance_private (shell);
- GtkWidget *widget;
-
- widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "entry_search"));
- gtk_entry_set_text (GTK_ENTRY (widget), search);
- gs_shell_change_mode (shell, GS_SHELL_MODE_SEARCH, NULL, NULL, TRUE);
+ save_back_entry (shell);
+ gs_shell_change_mode (shell, GS_SHELL_MODE_SEARCH, search, TRUE);
}
void
gs_shell_show_filename (GsShell *shell, const gchar *filename)
{
save_back_entry (shell);
- gs_shell_change_mode (shell, GS_SHELL_MODE_DETAILS, NULL, (gpointer) filename, TRUE);
+ gs_shell_change_mode (shell, GS_SHELL_MODE_DETAILS, (gpointer) filename, TRUE);
gs_shell_activate (shell);
}
@@ -826,17 +848,10 @@ void
gs_shell_show_search_result (GsShell *shell, const gchar *id, const gchar *search)
{
GsShellPrivate *priv = gs_shell_get_instance_private (shell);
- GtkWidget *widget;
-
- widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "entry_search"));
-
- /* ignore next "search-changed" signal to avoid getting a callback
- * after 150 ms and messing up the state */
- priv->ignore_next_search_changed_signal = TRUE;
- gtk_entry_set_text (GTK_ENTRY (widget), search);
+ save_back_entry (shell);
gs_shell_search_set_appid_to_show (priv->shell_search, id);
- gs_shell_change_mode (shell, GS_SHELL_MODE_SEARCH, NULL, NULL, TRUE);
+ gs_shell_change_mode (shell, GS_SHELL_MODE_SEARCH, search, TRUE);
}
/**
diff --git a/src/gs-shell.h b/src/gs-shell.h
index 82baae6..6052ddb 100644
--- a/src/gs-shell.h
+++ b/src/gs-shell.h
@@ -62,7 +62,6 @@ void gs_shell_refresh (GsShell *shell,
GCancellable *cancellable);
void gs_shell_change_mode (GsShell *shell,
GsShellMode mode,
- GsApp *app,
gpointer data,
gboolean scroll_up);
void gs_shell_set_mode (GsShell *shell,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]