Mercurial > geeqie.yaz
annotate src/collect-dlg.c @ 1149:c4fcf8001574
Implement preliminary support for XDG Base Directory Specification.
See http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html.
This feature was requested for a long time (feature requests #1950978 and #2289481).
For now, it is disabled since it breaks compatibility with previous versions.
To be able to test it, you have to enable it by defining USE_XDG to 1 in main.h.
geeqierc and other conf files are going to:
$XDG_CONFIG_HOME/geeqie/ (default to $HOME/.config/geeqie/).
metadata and thumbnails cache (if std is not used) are going to:
$XDG_CACHE_HOME/geeqie/metadata/ (default to $HOME/.cache/geeqie/metadata/)
and $XDG_CACHE_HOME/geeqie/thumbnails/ (default to $HOME/.cache/geeqie/thumbnails/)
collections are going to:
$XDG_DATA_HOME/geeqie/collections/ (default to $HOME/.local/share/geeqie/collections/)
Please test and report any issue.
author | zas_ |
---|---|
date | Sat, 15 Nov 2008 20:17:14 +0000 |
parents | 3a7af6a8cd5f |
children | 0bea79d87065 |
rev | line source |
---|---|
9 | 1 /* |
196 | 2 * Geeqie |
9 | 3 * (C) 2004 John Ellis |
475 | 4 * Copyright (C) 2008 The Geeqie Team |
9 | 5 * |
6 * Author: John Ellis | |
7 * | |
8 * This software is released under the GNU General Public License (GNU GPL). | |
9 * Please read the included file COPYING for more information. | |
10 * This software comes with no warranty of any kind, use at your own risk! | |
11 */ | |
12 | |
13 | |
281 | 14 #include "main.h" |
9 | 15 #include "collect.h" |
16 #include "collect-dlg.h" | |
17 | |
18 #include "collect-io.h" | |
19 #include "utilops.h" | |
20 #include "ui_fileops.h" | |
21 #include "ui_tabcomp.h" | |
22 #include "ui_utildlg.h" | |
23 | |
24 | |
25 enum { | |
26 DIALOG_SAVE, | |
27 DIALOG_SAVE_CLOSE, | |
28 DIALOG_LOAD, | |
29 DIALOG_APPEND | |
30 }; | |
31 | |
32 | |
33 static gint collection_save_confirmed(FileDialog *fd, gint overwrite, CollectionData *cd); | |
34 | |
35 | |
36 static void collection_confirm_ok_cb(GenericDialog *gd, gpointer data) | |
37 { | |
38 FileDialog *fd = data; | |
39 CollectionData *cd = GENERIC_DIALOG(fd)->data; | |
40 | |
41 if (!collection_save_confirmed(fd, TRUE, cd)) | |
42 { | |
43 collection_unref(cd); | |
44 file_dialog_close(fd); | |
45 } | |
46 } | |
47 | |
48 static void collection_confirm_cancel_cb(GenericDialog *gd, gpointer data) | |
49 { | |
50 /* this is a no-op, so the cancel button is added */ | |
51 } | |
52 | |
53 static gint collection_save_confirmed(FileDialog *fd, gint overwrite, CollectionData *cd) | |
54 { | |
55 gchar *buf; | |
56 | |
57 if (isdir(fd->dest_path)) | |
58 { | |
59 buf = g_strdup_printf(_("Specified path:\n%s\nis a folder, collections are files"), fd->dest_path); | |
60 file_util_warning_dialog(_("Invalid filename"), buf, GTK_STOCK_DIALOG_INFO, GENERIC_DIALOG(fd)->dialog); | |
61 g_free(buf); | |
62 return FALSE; | |
63 } | |
64 | |
65 if (!overwrite && isfile(fd->dest_path)) | |
66 { | |
67 GenericDialog *gd; | |
68 | |
254
9faf34f047b1
Make the wmclass value unique among the code by defining
zas_
parents:
196
diff
changeset
|
69 gd = file_util_gen_dlg(_("Overwrite File"), GQ_WMCLASS, "dlg_confirm", |
9 | 70 GENERIC_DIALOG(fd)->dialog, TRUE, |
71 collection_confirm_cancel_cb, fd); | |
72 | |
73 generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, | |
74 _("Overwrite existing file?"), fd->dest_path); | |
75 | |
76 generic_dialog_add_button(gd, GTK_STOCK_OK, _("_Overwrite"), collection_confirm_ok_cb, TRUE); | |
77 | |
78 gtk_widget_show(gd->dialog); | |
79 | |
80 return TRUE; | |
81 } | |
82 | |
83 if (!collection_save(cd, fd->dest_path)) | |
84 { | |
85 buf = g_strdup_printf(_("Failed to save the collection:\n%s"), fd->dest_path); | |
86 file_util_warning_dialog(_("Save Failed"), buf, GTK_STOCK_DIALOG_ERROR, GENERIC_DIALOG(fd)->dialog); | |
87 g_free(buf); | |
88 } | |
89 | |
90 collection_unref(cd); | |
91 file_dialog_sync_history(fd, TRUE); | |
92 | |
93 if (fd->type == DIALOG_SAVE_CLOSE) collection_window_close_by_collection(cd); | |
94 file_dialog_close(fd); | |
95 | |
96 return TRUE; | |
97 } | |
98 | |
99 static void collection_save_cb(FileDialog *fd, gpointer data) | |
100 { | |
101 CollectionData *cd = data; | |
102 const gchar *path; | |
103 | |
104 path = fd->dest_path; | |
442 | 105 |
605
651ae2be1031
Use g_ascii_strncasecmp() instead of strncasecmp() where applicable.
zas_
parents:
475
diff
changeset
|
106 /* FIXME: utf8 */ |
781
2d2cca2bceb0
Replace hardcoded collection filename extension by a macro (GQ_COLLECTION_EXT).
zas_
parents:
711
diff
changeset
|
107 if (!file_extension_match(path, GQ_COLLECTION_EXT)) |
9 | 108 { |
109 gchar *buf; | |
781
2d2cca2bceb0
Replace hardcoded collection filename extension by a macro (GQ_COLLECTION_EXT).
zas_
parents:
711
diff
changeset
|
110 buf = g_strconcat(path, GQ_COLLECTION_EXT, NULL); |
9 | 111 gtk_entry_set_text(GTK_ENTRY(fd->entry), buf); |
112 g_free(buf); | |
113 } | |
114 | |
115 collection_save_confirmed(fd, FALSE, cd); | |
116 } | |
117 | |
118 static void real_collection_button_pressed(FileDialog *fd, gpointer data, gint append) | |
119 { | |
120 CollectionData *cd = data; | |
121 | |
122 if (!fd->dest_path || isdir(fd->dest_path)) return; | |
123 | |
124 if (append) | |
125 { | |
126 collection_load(cd, fd->dest_path, TRUE); | |
127 collection_unref(cd); | |
128 } | |
129 else | |
130 { | |
131 collection_window_new(fd->dest_path); | |
132 } | |
133 | |
134 file_dialog_sync_history(fd, TRUE); | |
135 file_dialog_close(fd); | |
136 } | |
137 | |
138 static void collection_load_cb(FileDialog *fd, gpointer data) | |
139 { | |
140 real_collection_button_pressed(fd, data, FALSE); | |
141 } | |
142 | |
143 static void collection_append_cb(FileDialog *fd, gpointer data) | |
144 { | |
145 real_collection_button_pressed(fd, data, TRUE); | |
146 } | |
147 | |
148 static void collection_save_or_load_dialog_close_cb(FileDialog *fd, gpointer data) | |
149 { | |
150 CollectionData *cd = data; | |
151 | |
152 if (cd) collection_unref(cd); | |
153 file_dialog_close(fd); | |
154 } | |
155 | |
156 static void collection_save_or_load_dialog(const gchar *path, | |
157 gint type, CollectionData *cd) | |
158 { | |
159 FileDialog *fd; | |
160 GtkWidget *parent = NULL; | |
161 CollectWindow *cw; | |
162 const gchar *title; | |
163 const gchar *btntext; | |
1002 | 164 gpointer btnfunc; |
9 | 165 const gchar *stock_id; |
166 | |
167 if (type == DIALOG_SAVE || type == DIALOG_SAVE_CLOSE) | |
168 { | |
169 if (!cd) return; | |
170 title = _("Save collection"); | |
171 btntext = NULL; | |
172 btnfunc = collection_save_cb; | |
173 stock_id = GTK_STOCK_SAVE; | |
174 } | |
175 else if (type == DIALOG_LOAD) | |
176 { | |
177 title = _("Open collection"); | |
178 btntext = NULL; | |
179 btnfunc = collection_load_cb; | |
180 stock_id = GTK_STOCK_OPEN; | |
181 } | |
182 else | |
183 { | |
184 if (!cd) return; | |
185 title = _("Append collection"); | |
186 btntext = _("_Append"); | |
187 btnfunc = collection_append_cb; | |
188 stock_id = GTK_STOCK_ADD; | |
189 } | |
190 | |
191 if (cd) collection_ref(cd); | |
192 | |
193 cw = collection_window_find(cd); | |
194 if (cw) parent = cw->window; | |
195 | |
254
9faf34f047b1
Make the wmclass value unique among the code by defining
zas_
parents:
196
diff
changeset
|
196 fd = file_util_file_dlg(title, GQ_WMCLASS, "dlg_collection", parent, |
9 | 197 collection_save_or_load_dialog_close_cb, cd); |
198 | |
199 generic_dialog_add_message(GENERIC_DIALOG(fd), NULL, title, NULL); | |
200 file_dialog_add_button(fd, stock_id, btntext, btnfunc, TRUE); | |
201 | |
1145
3a7af6a8cd5f
Use functions to return directories instead of constants.
zas_
parents:
1055
diff
changeset
|
202 file_dialog_add_path_widgets(fd, get_collections_dir(), path, |
781
2d2cca2bceb0
Replace hardcoded collection filename extension by a macro (GQ_COLLECTION_EXT).
zas_
parents:
711
diff
changeset
|
203 "collection_load_save", GQ_COLLECTION_EXT, _("Collection Files")); |
9 | 204 |
205 fd->type = type; | |
206 | |
207 gtk_widget_show(GENERIC_DIALOG(fd)->dialog); | |
208 } | |
209 | |
210 void collection_dialog_save_as(gchar *path, CollectionData *cd) | |
211 { | |
212 #if 0 | |
213 if (!cd->list) | |
214 { | |
215 GtkWidget *parent = NULL; | |
216 CollectWindow *cw; | |
217 | |
218 cw = collection_window_find(cd); | |
219 if (cw) parent = cw->window; | |
220 file_util_warning_dialog(_("Collection empty"), | |
221 _("The current collection is empty, save aborted."), | |
222 GTK_STOCK_DIALOG_INFO, parent); | |
223 return; | |
224 } | |
225 #endif | |
226 | |
227 if (!path) path = cd->path; | |
228 if (!path) path = cd->name; | |
229 | |
230 collection_save_or_load_dialog(path, DIALOG_SAVE, cd); | |
231 } | |
232 | |
233 void collection_dialog_save_close(gchar *path, CollectionData *cd) | |
234 { | |
235 if (!path) path = cd->path; | |
236 if (!path) path = cd->name; | |
237 | |
238 collection_save_or_load_dialog(path, DIALOG_SAVE_CLOSE, cd); | |
239 } | |
240 | |
241 void collection_dialog_load(gchar *path) | |
242 { | |
243 collection_save_or_load_dialog(path, DIALOG_LOAD, NULL); | |
244 } | |
245 | |
246 void collection_dialog_append(gchar *path, CollectionData *cd) | |
247 { | |
248 collection_save_or_load_dialog(path, DIALOG_APPEND, cd); | |
249 } | |
1055
1646720364cf
Adding a vim modeline to all files - patch by Klaus Ethgen
nadvornik
parents:
1002
diff
changeset
|
250 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */ |