Simplify vflist_get_formatted()
[geeqie.git] / src / shortcuts.c
1 /*
2  * Copyright (C) 2004 John Ellis
3  * Copyright (C) 2008 - 2016 The Geeqie Team
4  *
5  * Author: John Ellis
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20  */
21
22 #include "main.h"
23 #include "shortcuts.h"
24
25 #include "collect.h"
26 #include "layout.h"
27 #include "utilops.h"
28 #include "ui_bookmark.h"
29 #include "ui_fileops.h"
30 #include "ui_misc.h"
31
32 typedef struct _ShortcutsData ShortcutsData;
33 struct _ShortcutsData
34 {
35         GtkWidget *vbox;
36         GtkWidget *bookmarks;
37         LayoutWindow *lw;
38
39         FileDialog *dialog;
40         GtkWidget *dialog_name_entry;
41
42         GtkWidget *add_button;
43 };
44
45 #define SHORTCUTS     "shortcuts"
46
47 static void shortcuts_bookmark_select(const gchar *path, gpointer data)
48 {
49         ShortcutsData *scd = data;
50
51         if (file_extension_match(path, GQ_COLLECTION_EXT))
52                 {
53                 collection_window_new(path);
54                 }
55         else
56                 {
57                 layout_set_path(scd->lw, path);
58                 }
59
60 }
61
62 static void shortcuts_add_close(ShortcutsData *scd)
63 {
64         if (scd->dialog) file_dialog_close(scd->dialog);
65         scd->dialog_name_entry = NULL;
66         scd->dialog = NULL;
67 }
68
69 static void shortcuts_add_ok_cb(FileDialog *fd, gpointer data)
70 {
71         ShortcutsData *scd = data;
72         const gchar *name = gtk_entry_get_text(GTK_ENTRY(scd->dialog_name_entry));
73         gboolean empty_name = (name[0] == '\0');
74
75         name = gtk_entry_get_text(GTK_ENTRY(scd->dialog_name_entry));
76
77         if (empty_name)
78                 {
79                 name = filename_from_path(fd->dest_path);
80                 }
81
82         bookmark_list_add(scd->bookmarks, name, fd->dest_path);
83
84         shortcuts_add_close(scd);
85 }
86
87 static void shortcuts_add_cancel_cb(FileDialog *fd, gpointer data)
88 {
89         ShortcutsData *scd = data;
90
91         shortcuts_add_close(scd);
92 }
93
94 static void shortcuts_add_cb(GtkWidget *button, gpointer data)
95 {
96         ShortcutsData *scd = data;
97         GtkWidget *hbox;
98         const gchar *title;
99
100         if (scd->dialog)
101                 {
102                 gtk_window_present(GTK_WINDOW(GENERIC_DIALOG(scd->dialog)->dialog));
103                 return;
104                 }
105
106         title = _("Add Shortcut");
107         scd->dialog = file_util_file_dlg(title,
108                                         "add_shortcuts", button,
109                                         shortcuts_add_cancel_cb, scd);
110         file_dialog_add_button(scd->dialog, GTK_STOCK_OK, NULL, shortcuts_add_ok_cb, TRUE);
111
112         generic_dialog_add_message(GENERIC_DIALOG(scd->dialog), NULL, title, NULL, FALSE);
113
114         file_dialog_add_path_widgets(scd->dialog, NULL, NULL, "add_shortcuts", NULL, NULL);
115
116         hbox = pref_box_new(GENERIC_DIALOG(scd->dialog)->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_GAP);
117
118         pref_label_new(hbox, _("Name:"));
119
120         scd->dialog_name_entry = gtk_entry_new();
121         gtk_box_pack_start(GTK_BOX(hbox), scd->dialog_name_entry, TRUE, TRUE, 0);
122         generic_dialog_attach_default(GENERIC_DIALOG(scd->dialog), scd->dialog_name_entry);
123         gtk_widget_show(scd->dialog_name_entry);
124
125         gtk_widget_show(GENERIC_DIALOG(scd->dialog)->dialog);
126 }
127
128 static void shortcuts_destroy(GtkWidget *widget, gpointer data)
129 {
130         ShortcutsData *scd = data;
131
132         shortcuts_add_close(scd);
133
134         g_free(scd);
135 }
136
137 static GtkWidget *shortcuts_new(LayoutWindow *lw)
138 {
139         ShortcutsData *scd;
140         GtkWidget *tbar;
141
142         if (!lw) return NULL;
143
144         scd = g_new0(ShortcutsData, 1);
145
146         scd->lw = lw;
147
148         scd->vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP);
149         g_object_set_data(G_OBJECT(scd->vbox), "shortcuts_data", scd);
150         g_signal_connect(G_OBJECT(scd->vbox), "destroy",
151                         G_CALLBACK(shortcuts_destroy), scd);
152
153         scd->bookmarks = bookmark_list_new(SHORTCUTS, shortcuts_bookmark_select, scd);
154         gtk_box_pack_start(GTK_BOX(scd->vbox), scd->bookmarks, TRUE, TRUE, 0);
155         gtk_widget_show(scd->bookmarks);
156
157         tbar = pref_toolbar_new(scd->vbox, GTK_TOOLBAR_ICONS);
158
159         scd->add_button = pref_toolbar_button(tbar, GTK_STOCK_ADD, NULL, FALSE,
160                                         _("Add Shortcut"),
161                                         G_CALLBACK(shortcuts_add_cb), scd);
162
163         return scd->vbox;
164 }
165
166 GtkWidget *shortcuts_new_from_config(LayoutWindow *lw, const gchar **attribute_names, const gchar **attribute_values)
167 {
168         GtkWidget *shortcuts_bar;
169
170         shortcuts_bar = shortcuts_new(lw);
171         gtk_widget_show(shortcuts_bar);
172
173         return shortcuts_bar;
174 }
175
176 GtkWidget *shortcuts_new_default(LayoutWindow *lw)
177 {
178         return shortcuts_new_from_config(lw, NULL, NULL);
179 }
180
181 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */