From 03ebaddff5101449e020dac1301bf8c9df9446ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emysl=20Eric=20Janouch?= Date: Sat, 23 Oct 2021 00:15:48 +0200 Subject: [PATCH] sdgui: add a file open dialog to the menu And remove the selection following checkbox from Windows builds. --- src/sdgui.c | 102 ++++++++++++++++++++++++++++++++++++++------ src/stardict-view.c | 4 +- 2 files changed, 90 insertions(+), 16 deletions(-) diff --git a/src/sdgui.c b/src/sdgui.c index b5ca54e..7e43db6 100644 --- a/src/sdgui.c +++ b/src/sdgui.c @@ -230,6 +230,82 @@ on_key_press (G_GNUC_UNUSED GtkWidget *widget, GdkEvent *event, return FALSE; } +static void +init_tabs (void) +{ + for (gsize i = 0; i < g.dictionaries->len; i++) + { + Dictionary *dict = g_ptr_array_index (g.dictionaries, i); + GtkWidget *dummy = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + GtkWidget *label = gtk_label_new (dict->name); + gtk_notebook_append_page (GTK_NOTEBOOK (g.notebook), dummy, label); + } + + gtk_widget_show_all (g.notebook); + gtk_widget_grab_focus (g.entry); +} + +static gboolean +reload_dictionaries (GPtrArray *new_dictionaries) +{ + GError *error = NULL; + if (!load_dictionaries (new_dictionaries, &error)) + { + GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW (g.window), 0, + GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "%s", error->message); + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + g_error_free (error); + return FALSE; + } + + while (gtk_notebook_get_n_pages (GTK_NOTEBOOK (g.notebook))) + gtk_notebook_remove_page (GTK_NOTEBOOK (g.notebook), -1); + + g.dictionary = -1; + stardict_view_set_position (STARDICT_VIEW (g.view), NULL, 0); + g_ptr_array_free (g.dictionaries, TRUE); + g.dictionaries = new_dictionaries; + init_tabs (); + return TRUE; +} + +static void +on_open (G_GNUC_UNUSED GtkMenuItem *item, G_GNUC_UNUSED gpointer data) +{ + // The default is local-only. Paths are returned absolute. + GtkWidget *dialog = gtk_file_chooser_dialog_new (_("Open dictionary"), + GTK_WINDOW (g.window), GTK_FILE_CHOOSER_ACTION_OPEN, + _("_Cancel"), GTK_RESPONSE_CANCEL, + _("_Open"), GTK_RESPONSE_ACCEPT, NULL); + + GtkFileFilter *filter = gtk_file_filter_new (); + gtk_file_filter_add_pattern (filter, "*.ifo"); + gtk_file_filter_set_name (filter, "*.ifo"); + GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog); + gtk_file_chooser_add_filter (chooser, filter); + gtk_file_chooser_set_select_multiple (chooser, TRUE); + + GPtrArray *new_dictionaries = + g_ptr_array_new_with_free_func ((GDestroyNotify) dictionary_destroy); + if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) + { + GSList *paths = gtk_file_chooser_get_filenames (chooser); + for (GSList *iter = paths; iter; iter = iter->next) + { + Dictionary *dict = g_malloc0 (sizeof *dict); + dict->filename = iter->data; + g_ptr_array_add (new_dictionaries, dict); + + } + g_slist_free (paths); + } + + gtk_widget_destroy (dialog); + if (!new_dictionaries->len || !reload_dictionaries (new_dictionaries)) + g_ptr_array_free (new_dictionaries, TRUE); +} + static void on_destroy (G_GNUC_UNUSED GtkWidget *widget, G_GNUC_UNUSED gpointer data) { @@ -319,16 +395,22 @@ main (int argc, char *argv[]) gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); + GtkWidget *item_open = gtk_menu_item_new_with_mnemonic (_("_Open...")); + g_signal_connect (item_open, "activate", G_CALLBACK (on_open), NULL); + g.watch_selection = TRUE; - GtkWidget *item = - gtk_check_menu_item_new_with_label (_("Follow selection")); + GtkWidget *item_selection = + gtk_check_menu_item_new_with_mnemonic (_("_Follow selection")); gtk_check_menu_item_set_active - (GTK_CHECK_MENU_ITEM (item), g.watch_selection); - g_signal_connect (item, "toggled", + (GTK_CHECK_MENU_ITEM (item_selection), g.watch_selection); + g_signal_connect (item_selection, "toggled", G_CALLBACK (on_selection_watch_toggle), NULL); GtkWidget *menu = gtk_menu_new (); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item_open); +#ifndef WIN32 + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item_selection); +#endif // ! WIN32 gtk_widget_show_all (menu); g.hamburger = gtk_menu_button_new (); @@ -364,20 +446,12 @@ main (int argc, char *argv[]) g.view = stardict_view_new (); gtk_box_pack_end (GTK_BOX (superbox), g.view, TRUE, TRUE, 0); - - for (gsize i = 0; i < g.dictionaries->len; i++) - { - Dictionary *dict = g_ptr_array_index (g.dictionaries, i); - GtkWidget *dummy = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - GtkWidget *label = gtk_label_new (dict->name); - gtk_notebook_append_page (GTK_NOTEBOOK (g.notebook), dummy, label); - } + init_tabs (); GtkClipboard *clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY); g_signal_connect (clipboard, "owner-change", G_CALLBACK (on_selection), NULL); - gtk_widget_grab_focus (g.entry); gtk_widget_show_all (g.window); gtk_main (); return 0; diff --git a/src/stardict-view.c b/src/stardict-view.c index f7e12c9..1e65b0c 100644 --- a/src/stardict-view.c +++ b/src/stardict-view.c @@ -533,14 +533,14 @@ stardict_view_set_position (StardictView *self, StardictDict *dict, guint position) { g_return_if_fail (STARDICT_IS_VIEW (self)); - g_return_if_fail (STARDICT_IS_DICT (dict)); + g_return_if_fail (dict == NULL || STARDICT_IS_DICT (dict)); // Update the minimum size, if appropriate (almost never) if (!self->dict != !dict) gtk_widget_queue_resize (GTK_WIDGET (self)); g_clear_object (&self->dict); - self->dict = g_object_ref (dict); + self->dict = dict ? g_object_ref (dict) : NULL; self->top_position = position; self->top_offset = 0;