summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuan R. García Blanco <juanrgar@gmail.com>2015-07-25 23:12:21 +0200
committerJuan R. García Blanco <juanrgar@gmail.com>2015-07-25 23:36:21 +0200
commit1686126fcb5e226ee273aade53218354599b3b31 (patch)
tree244680b9d1bdaa8a0ab1c522fae27aa0e13cbfa6
parentc2af3ed61ab3dd10bc48f061c19e0a8a9bc401d7 (diff)
downloadgnome-dictionary-1686126fcb5e226ee273aade53218354599b3b31.tar.gz
gdict&app: Re-position the database chooser
GdictDatabaseChooser now inherits from GtkMenuButton, allowing users to attach it as a button. When clicked, it loads all databases available in the given context. In the application, the database chooser is now next to the search entry. See https://bugzilla.gnome.org/show_bug.cgi?id=334866
-rw-r--r--libgdict/gdict-database-chooser.c82
-rw-r--r--libgdict/gdict-database-chooser.h4
-rw-r--r--src/gdict-app-window.ui27
-rw-r--r--src/gdict-window.c25
-rw-r--r--src/gdict-window.h1
5 files changed, 102 insertions, 37 deletions
diff --git a/libgdict/gdict-database-chooser.c b/libgdict/gdict-database-chooser.c
index 8d2f1c3..b6838a2 100644
--- a/libgdict/gdict-database-chooser.c
+++ b/libgdict/gdict-database-chooser.c
@@ -54,6 +54,9 @@ struct _GdictDatabaseChooserPrivate
{
GtkListStore *store;
+ GtkWidget *stack;
+ GtkWidget *spinner;
+ GtkWidget *popover;
GtkWidget *treeview;
GtkWidget *clear_button;
GtkWidget *refresh_button;
@@ -72,6 +75,7 @@ struct _GdictDatabaseChooserPrivate
gchar *current_db;
guint is_searching : 1;
+ guint is_loaded : 1;
};
enum
@@ -110,7 +114,7 @@ static guint db_chooser_signals[LAST_SIGNAL] = { 0 };
G_DEFINE_TYPE (GdictDatabaseChooser,
gdict_database_chooser,
- GTK_TYPE_BOX)
+ GTK_TYPE_MENU_BUTTON)
static void
set_gdict_context (GdictDatabaseChooser *chooser,
@@ -268,6 +272,8 @@ row_activated_cb (GtkTreeView *treeview,
g_free (priv->current_db);
priv->current_db = g_strdup (db_name);
+ gtk_button_set_label (GTK_BUTTON (chooser), db_name);
+
g_signal_emit (chooser, db_chooser_signals[DATABASE_ACTIVATED], 0,
db_name, db_desc);
}
@@ -321,6 +327,7 @@ gdict_database_chooser_constructor (GType type,
GtkCellRenderer *renderer;
GtkTreeViewColumn *column;
GtkWidget *hbox;
+ GtkWidget *vbox;
parent_class = G_OBJECT_CLASS (gdict_database_chooser_parent_class);
object = parent_class->constructor (type, n_params, params);
@@ -328,6 +335,21 @@ gdict_database_chooser_constructor (GType type,
chooser = GDICT_DATABASE_CHOOSER (object);
priv = chooser->priv;
+ priv->popover = gtk_popover_new (GTK_WIDGET (chooser));
+ gtk_menu_button_set_popover (GTK_MENU_BUTTON (chooser), priv->popover);
+
+ priv->stack = gtk_stack_new ();
+ gtk_container_add (GTK_CONTAINER (priv->popover), priv->stack);
+ gtk_widget_show (priv->stack);
+
+ priv->spinner = gtk_spinner_new ();
+ gtk_stack_add_named (GTK_STACK (priv->stack), priv->spinner, "spinner");
+ gtk_widget_show (priv->spinner);
+
+ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ gtk_stack_add_named (GTK_STACK (priv->stack), vbox, "chooser");
+ gtk_widget_show (vbox);
+
sw = gtk_scrolled_window_new (NULL, NULL);
gtk_widget_set_hexpand (sw, TRUE);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
@@ -335,7 +357,7 @@ gdict_database_chooser_constructor (GType type,
GTK_POLICY_AUTOMATIC);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
GTK_SHADOW_IN);
- gtk_box_pack_start (GTK_BOX (chooser), sw, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
gtk_widget_show (sw);
renderer = gtk_cell_renderer_text_new ();
@@ -384,22 +406,53 @@ gdict_database_chooser_constructor (GType type,
gtk_widget_set_tooltip_text (priv->clear_button,
_("Clear the list of available databases"));
- gtk_box_pack_end (GTK_BOX (chooser), hbox, FALSE, FALSE, 0);
+ gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show (hbox);
+ priv->is_loaded = FALSE;
+
return object;
}
static void
+gdict_database_chooser_clicked (GtkButton *button)
+{
+ GtkButtonClass *button_class = GTK_BUTTON_CLASS (gdict_database_chooser_parent_class);
+ GdictDatabaseChooser *chooser;
+ GdictDatabaseChooserPrivate *priv;
+ GtkToggleButton *toggle;
+ gboolean active;
+
+ button_class->clicked (button);
+
+ toggle = GTK_TOGGLE_BUTTON (button);
+ active = gtk_toggle_button_get_active (toggle);
+
+ GDICT_NOTE (CHOOSER, "Button clicked: %s", active ? "active" : "inactive");
+
+ chooser = GDICT_DATABASE_CHOOSER (button);
+ priv = GDICT_DATABASE_CHOOSER_GET_PRIVATE (chooser);
+
+ if (active && !priv->is_loaded)
+ {
+ gtk_stack_set_visible_child_name (GTK_STACK (priv->stack), "spinner");
+
+ gdict_database_chooser_refresh (chooser);
+ }
+}
+
+static void
gdict_database_chooser_class_init (GdictDatabaseChooserClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GtkButtonClass *button_class = GTK_BUTTON_CLASS (klass);
gobject_class->finalize = gdict_database_chooser_finalize;
gobject_class->dispose = gdict_database_chooser_dispose;
gobject_class->set_property = gdict_database_chooser_set_property;
gobject_class->get_property = gdict_database_chooser_get_property;
gobject_class->constructor = gdict_database_chooser_constructor;
+ button_class->clicked = gdict_database_chooser_clicked;
/**
* GdictDatabaseChooser:context:
@@ -480,7 +533,8 @@ gdict_database_chooser_init (GdictDatabaseChooser *chooser)
chooser->priv = priv = GDICT_DATABASE_CHOOSER_GET_PRIVATE (chooser);
- gtk_orientable_set_orientation (GTK_ORIENTABLE (chooser), GTK_ORIENTATION_VERTICAL);
+ gtk_menu_button_set_use_popover (GTK_MENU_BUTTON (chooser), TRUE);
+ gtk_menu_button_set_direction (GTK_MENU_BUTTON (chooser), GTK_ARROW_NONE);
priv->results = -1;
priv->context = NULL;
@@ -713,6 +767,8 @@ lookup_start_cb (GdictContext *context,
if (gtk_widget_get_window (GTK_WIDGET (chooser)))
gdk_window_set_cursor (gtk_widget_get_window (GTK_WIDGET (chooser)), priv->busy_cursor);
+ gtk_spinner_start (GTK_SPINNER (priv->spinner));
+
priv->is_searching = TRUE;
}
@@ -726,6 +782,13 @@ lookup_end_cb (GdictContext *context,
if (gtk_widget_get_window (GTK_WIDGET (chooser)))
gdk_window_set_cursor (gtk_widget_get_window (GTK_WIDGET (chooser)), NULL);
+ gtk_spinner_stop (GTK_SPINNER (priv->spinner));
+ gtk_stack_set_visible_child_name (GTK_STACK (priv->stack), "chooser");
+
+ gtk_widget_set_size_request (GTK_POPOVER (priv->popover), 300, -1);
+ gtk_widget_set_vexpand (GTK_POPOVER (priv->popover), TRUE);
+
+ priv->is_loaded = TRUE;
priv->is_searching = FALSE;
}
@@ -1053,13 +1116,10 @@ gdict_database_chooser_set_current_database (GdictDatabaseChooser *chooser,
retval = data.found;
- if (data.found)
- {
- g_free (priv->current_db);
- priv->current_db = data.db_name;
- }
- else
- g_free (data.db_name);
+ g_free (priv->current_db);
+ priv->current_db = data.db_name;
+ gtk_button_set_label (GTK_BUTTON (chooser), db_name);
+ GDICT_NOTE (CHOOSER, "Set current database: `%s'", db_name);
return retval;
}
diff --git a/libgdict/gdict-database-chooser.h b/libgdict/gdict-database-chooser.h
index d4023b0..b460c00 100644
--- a/libgdict/gdict-database-chooser.h
+++ b/libgdict/gdict-database-chooser.h
@@ -43,7 +43,7 @@ typedef struct _GdictDatabaseChooserClass GdictDatabaseChooserClass;
struct _GdictDatabaseChooser
{
/*< private >*/
- GtkBox parent_instance;
+ GtkMenuButton parent_instance;
GdictDatabaseChooserPrivate *priv;
};
@@ -51,7 +51,7 @@ struct _GdictDatabaseChooser
struct _GdictDatabaseChooserClass
{
/*< private >*/
- GtkBoxClass parent_class;
+ GtkMenuButtonClass parent_class;
/*< public >*/
void (*database_activated) (GdictDatabaseChooser *chooser,
diff --git a/src/gdict-app-window.ui b/src/gdict-app-window.ui
index 45d4367..1fe4a64 100644
--- a/src/gdict-app-window.ui
+++ b/src/gdict-app-window.ui
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.18.1 -->
+<!-- Generated with glade 3.19.0 -->
<interface>
<requires lib="gtk+" version="3.16"/>
<template class="GdictWindow" parent="GtkApplicationWindow">
@@ -45,10 +45,29 @@
<placeholder/>
</child>
<child type="title">
- <object class="GtkEntry" id="entry">
+ <object class="GtkBox" id="header_box">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="max_width_chars">3</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry">
+ <property name="width_request">200</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="max_width_chars">3</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="linked"/>
+ </style>
</object>
</child>
</object>
diff --git a/src/gdict-window.c b/src/gdict-window.c
index 1eeeca6..b0995b7 100644
--- a/src/gdict-window.c
+++ b/src/gdict-window.c
@@ -48,7 +48,6 @@
/* sidebar pages logical ids */
#define GDICT_SIDEBAR_SPELLER_PAGE "speller"
-#define GDICT_SIDEBAR_DATABASES_PAGE "db-chooser"
#define GDICT_SIDEBAR_STRATEGIES_PAGE "strat-chooser"
#define GDICT_SIDEBAR_SOURCES_PAGE "source-chooser"
@@ -936,20 +935,6 @@ gdict_window_cmd_view_speller (GSimpleAction *action,
}
static void
-gdict_window_cmd_view_databases (GSimpleAction *action,
- GVariant *parameter,
- gpointer user_data)
-{
- GdictWindow *window = user_data;
-
- g_assert (GDICT_IS_WINDOW (window));
-
- gdict_sidebar_view_page (GDICT_SIDEBAR (window->sidebar),
- GDICT_SIDEBAR_DATABASES_PAGE);
- gdict_window_set_sidebar_visible (window, TRUE);
-}
-
-static void
gdict_window_cmd_view_strategies (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
@@ -1102,7 +1087,6 @@ static const GActionEntry entries[] =
gdict_window_cmd_change_view_sidebar },
{ "view-speller", gdict_window_cmd_view_speller, NULL, NULL, NULL },
{ "view-source", gdict_window_cmd_view_sources, NULL, NULL, NULL },
- { "view-db", gdict_window_cmd_view_databases, NULL, NULL, NULL },
{ "view-strat", gdict_window_cmd_view_strategies, NULL, NULL, NULL },
/* Accelerators */
@@ -1457,16 +1441,16 @@ gdict_window_constructor (GType type,
g_signal_connect (window->db_chooser, "database-activated",
G_CALLBACK (database_activated_cb),
window);
- gdict_sidebar_add_page (GDICT_SIDEBAR (window->sidebar),
- GDICT_SIDEBAR_DATABASES_PAGE,
- _("Available dictionaries"),
- window->db_chooser);
+ gtk_box_pack_start (GTK_BOX (window->header_box),
+ window->db_chooser,
+ TRUE, FALSE, 0);
gtk_widget_show (window->db_chooser);
/* bind the database property to the database setting */
g_settings_bind (window->settings, GDICT_SETTINGS_DATABASE_KEY,
window, "database",
G_SETTINGS_BIND_DEFAULT);
+ gdict_window_set_database (window, NULL);
/* Strategy chooser */
if (window->context)
@@ -1594,6 +1578,7 @@ gdict_window_class_init (GdictWindowClass *klass)
gtk_widget_class_bind_template_child (widget_class, GdictWindow, main_box);
gtk_widget_class_bind_template_child (widget_class, GdictWindow, spinner);
gtk_widget_class_bind_template_child (widget_class, GdictWindow, stack);
+ gtk_widget_class_bind_template_child (widget_class, GdictWindow, header_box);
gdict_window_properties[PROP_ACTION] =
g_param_spec_enum ("action",
diff --git a/src/gdict-window.h b/src/gdict-window.h
index 1ab2448..2bfad17 100644
--- a/src/gdict-window.h
+++ b/src/gdict-window.h
@@ -49,6 +49,7 @@ struct _GdictWindow
GtkApplicationWindow parent_instance;
GtkWidget *header_bar;
+ GtkWidget *header_box;
GtkWidget *main_box;
GtkWidget *entry;
GtkWidget *spinner;