Sort Manager - Folder Mode
authorColin Clark <[email protected]>
Thu, 13 Mar 2025 13:25:00 +0000 (13:25 +0000)
committerColin Clark <[email protected]>
Thu, 13 Mar 2025 13:25:00 +0000 (13:25 +0000)
Use the system default file chooser dialog.

src/bar-sort.cc

index 7ef96912668b4d24ebd3a6d78d33fc287da99abc..b4e512c21cd28f13862d1a15b131f4913de5389f 100644 (file)
@@ -530,6 +530,47 @@ static void bar_sort_add_ok_cb(FileDialog *fd, gpointer data)
        bar_sort_add_close(sd);
 }
 
+static void bar_sort_add_response_cb(GtkFileChooser *chooser, gint response_id, gpointer data)
+{
+       auto sd = static_cast<SortData *>(data);
+
+       if (response_id == GTK_RESPONSE_ACCEPT)
+               {
+               if (sd->mode == BAR_SORT_MODE_FOLDER)
+                       {
+                       GList *list = gtk_container_get_children(GTK_CONTAINER(gtk_file_chooser_get_extra_widget(chooser)));
+
+                       GList *work = list;
+                       g_autofree gchar *name = nullptr;
+
+                       while (work)
+                               {
+                               if (GTK_IS_ENTRY(work->data))
+                                       {
+                                       name = g_strdup(gtk_entry_get_text(GTK_ENTRY(work->data)));
+                                       break;
+                                       }
+
+                               work = work->next;
+                               }
+
+                       g_list_free(list);
+
+                       g_autofree gchar *selected_directory = gtk_file_chooser_get_filename(chooser);
+
+                       if (strlen(name) == 0)
+                               {
+                               name = g_strdup(filename_from_path(selected_directory));
+                               }
+
+                       bookmark_list_add(sd->bookmarks, name, selected_directory);
+                       }
+               }
+
+       gq_gtk_widget_destroy(GTK_WIDGET(chooser));
+       bar_sort_add_close(sd);
+}
+
 static void bar_sort_add_cancel_cb(FileDialog *, gpointer data)
 {
        auto sd = static_cast<SortData *>(data);
@@ -551,40 +592,59 @@ static void bar_sort_add_cb(GtkWidget *button, gpointer data)
 
        if (sd->mode == BAR_SORT_MODE_FOLDER)
                {
-               title = _("Add Bookmark");
+               GtkFileChooserDialog *dialog;
+               GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER;
+
+               dialog = GTK_FILE_CHOOSER_DIALOG(gtk_file_chooser_dialog_new(_("Add Bookmark - Geeqie"), nullptr, action, _("_Cancel"), GTK_RESPONSE_CANCEL, _("Add"), GTK_RESPONSE_ACCEPT, nullptr));
+
+               GtkWidget *name_widget_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, PREF_PAD_GAP);
+
+               GtkWidget *name_label = gtk_label_new(_("Bookmark name (optional):"));
+               gq_gtk_box_pack_start(GTK_BOX(name_widget_box), name_label, FALSE, FALSE, 0);
+               gtk_widget_set_tooltip_text(name_label, _("If none given, the basename of the folder is used"));
+
+               GtkWidget *entry = gtk_entry_new();
+               gq_gtk_box_pack_start(GTK_BOX(name_widget_box), entry, FALSE, FALSE, 0);
+               gtk_widget_set_tooltip_text(entry, _("If none given, the basename of the folder is used"));
+
+               gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(dialog), name_widget_box);
+
+               g_signal_connect(dialog, "response", G_CALLBACK(bar_sort_add_response_cb), sd);
+
+               gq_gtk_widget_show_all(GTK_WIDGET(dialog));
                }
        else
                {
                title = _("Add Collection");
-               }
 
-       sd->dialog = file_util_file_dlg(title,
-                                      "add_bookmark", button,
-                                      bar_sort_add_cancel_cb, sd);
-       file_dialog_add_button(sd->dialog, GQ_ICON_OK, "OK", bar_sort_add_ok_cb, TRUE);
+               sd->dialog = file_util_file_dlg(title,
+                                               "add_bookmark", button,
+                                               bar_sort_add_cancel_cb, sd);
+               file_dialog_add_button(sd->dialog, GQ_ICON_OK, "OK", bar_sort_add_ok_cb, TRUE);
 
-       generic_dialog_add_message(GENERIC_DIALOG(sd->dialog), nullptr, title, nullptr, FALSE);
+               generic_dialog_add_message(GENERIC_DIALOG(sd->dialog), nullptr, title, nullptr, FALSE);
 
-       if (sd->mode == BAR_SORT_MODE_FOLDER)
-               {
-               file_dialog_add_path_widgets(sd->dialog, nullptr, nullptr, "add_bookmark", nullptr, nullptr);
-               }
+               if (sd->mode == BAR_SORT_MODE_FOLDER)
+                       {
+                       file_dialog_add_path_widgets(sd->dialog, nullptr, nullptr, "add_bookmark", nullptr, nullptr);
+                       }
 
-       hbox = pref_box_new(GENERIC_DIALOG(sd->dialog)->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_GAP);
+               hbox = pref_box_new(GENERIC_DIALOG(sd->dialog)->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_GAP);
 
-       pref_label_new(hbox, _("Name:"));
+               pref_label_new(hbox, _("Name:"));
 
-       sd->dialog_name_entry = gtk_entry_new();
-       gq_gtk_box_pack_start(GTK_BOX(hbox), sd->dialog_name_entry, TRUE, TRUE, 0);
-       generic_dialog_attach_default(GENERIC_DIALOG(sd->dialog), sd->dialog_name_entry);
-       gtk_widget_show(sd->dialog_name_entry);
+               sd->dialog_name_entry = gtk_entry_new();
+               gq_gtk_box_pack_start(GTK_BOX(hbox), sd->dialog_name_entry, TRUE, TRUE, 0);
+               generic_dialog_attach_default(GENERIC_DIALOG(sd->dialog), sd->dialog_name_entry);
+               gtk_widget_show(sd->dialog_name_entry);
 
-       if (sd->mode == BAR_SORT_MODE_COLLECTION)
-               {
-               gtk_widget_grab_focus(sd->dialog_name_entry);
-               }
+               if (sd->mode == BAR_SORT_MODE_COLLECTION)
+                       {
+                       gtk_widget_grab_focus(sd->dialog_name_entry);
+                       }
 
-       gtk_widget_show(GENERIC_DIALOG(sd->dialog)->dialog);
+               gtk_widget_show(GENERIC_DIALOG(sd->dialog)->dialog);
+               }
 }
 
 void bar_sort_close(GtkWidget *bar)