diff options
author | Juan R. García Blanco <juanrgar@gmail.com> | 2015-07-25 23:12:21 +0200 |
---|---|---|
committer | Juan R. García Blanco <juanrgar@gmail.com> | 2015-07-25 23:36:21 +0200 |
commit | 1686126fcb5e226ee273aade53218354599b3b31 (patch) | |
tree | 244680b9d1bdaa8a0ab1c522fae27aa0e13cbfa6 | |
parent | c2af3ed61ab3dd10bc48f061c19e0a8a9bc401d7 (diff) | |
download | gnome-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.c | 82 | ||||
-rw-r--r-- | libgdict/gdict-database-chooser.h | 4 | ||||
-rw-r--r-- | src/gdict-app-window.ui | 27 | ||||
-rw-r--r-- | src/gdict-window.c | 25 | ||||
-rw-r--r-- | src/gdict-window.h | 1 |
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; |