Mercurial > geeqie
annotate src/layout.c @ 368:95fe470440ad
New Go to directory view feature that permits to find and display the directory
corresponding to an image view.
For example, when you open an image in new window from collection, right clicking on
the newly displayed image will let you choose Go to directory view, which would open
a new window, with image and directory list.
If current directory is the one of the image, menu item is disabled.
author | zas_ |
---|---|
date | Tue, 15 Apr 2008 06:56:25 +0000 |
parents | 77103f3f2cb1 |
children | 5afe77bb563a |
rev | line source |
---|---|
9 | 1 /* |
196 | 2 * Geeqie |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
3 * (C) 2006 John Ellis |
9 | 4 * |
5 * Author: John Ellis | |
6 * | |
7 * This software is released under the GNU General Public License (GNU GPL). | |
8 * Please read the included file COPYING for more information. | |
9 * This software comes with no warranty of any kind, use at your own risk! | |
10 */ | |
11 | |
281 | 12 #include "main.h" |
9 | 13 #include "layout.h" |
14 | |
15 #include "image.h" | |
16 #include "layout_config.h" | |
17 #include "layout_image.h" | |
18 #include "layout_util.h" | |
19 #include "menu.h" | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
20 #include "pixbuf-renderer.h" |
9 | 21 #include "pixbuf_util.h" |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
22 #include "utilops.h" |
9 | 23 #include "view_dir_list.h" |
24 #include "view_dir_tree.h" | |
25 #include "view_file_list.h" | |
26 #include "view_file_icon.h" | |
27 #include "ui_bookmark.h" | |
28 #include "ui_fileops.h" | |
29 #include "ui_menu.h" | |
30 #include "ui_misc.h" | |
31 #include "ui_tabcomp.h" | |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
270
diff
changeset
|
32 #include "histogram.h" |
9 | 33 |
34 | |
41
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
23
diff
changeset
|
35 #define MAINWINDOW_DEF_WIDTH 700 |
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
23
diff
changeset
|
36 #define MAINWINDOW_DEF_HEIGHT 500 |
9 | 37 |
41
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
23
diff
changeset
|
38 #define MAIN_WINDOW_DIV_HPOS 270 |
9 | 39 #define MAIN_WINDOW_DIV_VPOS 200 |
40 | |
41 #define TOOLWINDOW_DEF_WIDTH 260 | |
42 #define TOOLWINDOW_DEF_HEIGHT 450 | |
43 #define PROGRESS_WIDTH 150 | |
44 #define ZOOM_LABEL_WIDTH 64 | |
45 | |
46 #define PANE_DIVIDER_SIZE 10 | |
47 | |
48 | |
49 GList *layout_window_list = NULL; | |
50 | |
51 | |
52 static void layout_list_scroll_to_subpart(LayoutWindow *lw, const gchar *needle); | |
53 | |
54 | |
55 /* | |
56 *----------------------------------------------------------------------------- | |
57 * misc | |
58 *----------------------------------------------------------------------------- | |
59 */ | |
60 | |
61 gint layout_valid(LayoutWindow **lw) | |
62 { | |
63 if (*lw == NULL) | |
64 { | |
65 if (layout_window_list) *lw = layout_window_list->data; | |
66 return (*lw != NULL); | |
67 } | |
68 | |
69 return (g_list_find(layout_window_list, *lw) != NULL); | |
70 } | |
71 | |
72 LayoutWindow *layout_find_by_image(ImageWindow *imd) | |
73 { | |
74 GList *work; | |
75 | |
76 work = layout_window_list; | |
77 while (work) | |
78 { | |
79 LayoutWindow *lw = work->data; | |
80 work = work->next; | |
81 | |
82 if (lw->image == imd) return lw; | |
83 } | |
84 | |
85 return NULL; | |
86 } | |
87 | |
368
95fe470440ad
New Go to directory view feature that permits to find and display the directory
zas_
parents:
340
diff
changeset
|
88 LayoutWindow *layout_find_by_image_fd(ImageWindow *imd) |
95fe470440ad
New Go to directory view feature that permits to find and display the directory
zas_
parents:
340
diff
changeset
|
89 { |
95fe470440ad
New Go to directory view feature that permits to find and display the directory
zas_
parents:
340
diff
changeset
|
90 GList *work; |
95fe470440ad
New Go to directory view feature that permits to find and display the directory
zas_
parents:
340
diff
changeset
|
91 |
95fe470440ad
New Go to directory view feature that permits to find and display the directory
zas_
parents:
340
diff
changeset
|
92 work = layout_window_list; |
95fe470440ad
New Go to directory view feature that permits to find and display the directory
zas_
parents:
340
diff
changeset
|
93 while (work) |
95fe470440ad
New Go to directory view feature that permits to find and display the directory
zas_
parents:
340
diff
changeset
|
94 { |
95fe470440ad
New Go to directory view feature that permits to find and display the directory
zas_
parents:
340
diff
changeset
|
95 LayoutWindow *lw = work->data; |
95fe470440ad
New Go to directory view feature that permits to find and display the directory
zas_
parents:
340
diff
changeset
|
96 work = work->next; |
95fe470440ad
New Go to directory view feature that permits to find and display the directory
zas_
parents:
340
diff
changeset
|
97 if (lw->image->image_fd == imd->image_fd) |
95fe470440ad
New Go to directory view feature that permits to find and display the directory
zas_
parents:
340
diff
changeset
|
98 return lw; |
95fe470440ad
New Go to directory view feature that permits to find and display the directory
zas_
parents:
340
diff
changeset
|
99 |
95fe470440ad
New Go to directory view feature that permits to find and display the directory
zas_
parents:
340
diff
changeset
|
100 } |
95fe470440ad
New Go to directory view feature that permits to find and display the directory
zas_
parents:
340
diff
changeset
|
101 |
95fe470440ad
New Go to directory view feature that permits to find and display the directory
zas_
parents:
340
diff
changeset
|
102 return NULL; |
95fe470440ad
New Go to directory view feature that permits to find and display the directory
zas_
parents:
340
diff
changeset
|
103 } |
95fe470440ad
New Go to directory view feature that permits to find and display the directory
zas_
parents:
340
diff
changeset
|
104 |
9 | 105 /* |
106 *----------------------------------------------------------------------------- | |
107 * menu, toolbar, and dir view | |
108 *----------------------------------------------------------------------------- | |
109 */ | |
110 | |
111 static void layout_path_entry_changed_cb(GtkWidget *widget, gpointer data) | |
112 { | |
113 LayoutWindow *lw = data; | |
114 gchar *buf; | |
115 | |
116 if (gtk_combo_box_get_active(GTK_COMBO_BOX(widget)) < 0) return; | |
117 | |
118 buf = g_strdup(gtk_entry_get_text(GTK_ENTRY(lw->path_entry))); | |
119 if (!buf || (lw->path && strcmp(buf, lw->path) == 0)) | |
120 { | |
121 g_free(buf); | |
122 return; | |
123 } | |
124 | |
125 layout_set_path(lw, buf); | |
126 | |
127 g_free(buf); | |
128 } | |
129 | |
130 static void layout_path_entry_tab_cb(const gchar *path, gpointer data) | |
131 { | |
132 LayoutWindow *lw = data; | |
133 gchar *buf; | |
134 gchar *base; | |
135 | |
136 buf = g_strdup(path); | |
137 parse_out_relatives(buf); | |
138 base = remove_level_from_path(buf); | |
139 | |
140 if (isdir(buf)) | |
141 { | |
142 if ((!lw->path || strcmp(lw->path, buf) != 0) && layout_set_path(lw, buf)) | |
143 { | |
144 gint pos = -1; | |
145 /* put the '/' back, if we are in tab completion for a dir and result was path change */ | |
146 gtk_editable_insert_text(GTK_EDITABLE(lw->path_entry), "/", -1, &pos); | |
147 gtk_editable_set_position(GTK_EDITABLE(lw->path_entry), | |
148 strlen(gtk_entry_get_text(GTK_ENTRY(lw->path_entry)))); | |
149 } | |
150 } | |
151 else if (lw->path && strcmp(lw->path, base) == 0) | |
152 { | |
153 layout_list_scroll_to_subpart(lw, filename_from_path(buf)); | |
154 } | |
155 | |
156 g_free(base); | |
157 g_free(buf); | |
158 } | |
159 | |
160 static void layout_path_entry_cb(const gchar *path, gpointer data) | |
161 { | |
162 LayoutWindow *lw = data; | |
163 gchar *buf; | |
164 | |
165 buf = g_strdup(path); | |
166 parse_out_relatives(buf); | |
167 | |
168 layout_set_path(lw, buf); | |
169 | |
170 g_free(buf); | |
171 } | |
172 | |
173 static void layout_vdlist_select_cb(ViewDirList *vdl, const gchar *path, gpointer data) | |
174 { | |
175 LayoutWindow *lw = data; | |
176 | |
177 layout_set_path(lw, path); | |
178 } | |
179 | |
180 static void layout_vdtree_select_cb(ViewDirTree *vdt, const gchar *path, gpointer data) | |
181 { | |
182 LayoutWindow *lw = data; | |
183 | |
184 layout_set_path(lw, path); | |
185 } | |
186 | |
187 static GtkWidget *layout_tool_setup(LayoutWindow *lw) | |
188 { | |
189 GtkWidget *box; | |
190 GtkWidget *menu_bar; | |
191 GtkWidget *tabcomp; | |
192 | |
193 box = gtk_vbox_new(FALSE, 0); | |
194 | |
195 menu_bar = layout_actions_menu_bar(lw); | |
196 gtk_box_pack_start(GTK_BOX(box), menu_bar, FALSE, FALSE, 0); | |
197 gtk_widget_show(menu_bar); | |
198 | |
199 lw->toolbar = layout_button_bar(lw); | |
200 gtk_box_pack_start(GTK_BOX(box), lw->toolbar, FALSE, FALSE, 0); | |
201 if (!lw->toolbar_hidden) gtk_widget_show(lw->toolbar); | |
202 | |
203 tabcomp = tab_completion_new_with_history(&lw->path_entry, NULL, "path_list", -1, | |
204 layout_path_entry_cb, lw); | |
205 tab_completion_add_tab_func(lw->path_entry, layout_path_entry_tab_cb, lw); | |
206 gtk_box_pack_start(GTK_BOX(box), tabcomp, FALSE, FALSE, 0); | |
207 gtk_widget_show(tabcomp); | |
208 | |
209 g_signal_connect(G_OBJECT(lw->path_entry->parent), "changed", | |
210 G_CALLBACK(layout_path_entry_changed_cb), lw); | |
211 | |
212 if (lw->tree_view) | |
213 { | |
214 lw->vdt = vdtree_new(lw->path, TRUE); | |
215 vdtree_set_layout(lw->vdt, lw); | |
216 vdtree_set_select_func(lw->vdt, layout_vdtree_select_cb, lw); | |
217 | |
218 lw->dir_view = lw->vdt->widget; | |
219 } | |
220 else | |
221 { | |
222 lw->vdl = vdlist_new(lw->path); | |
223 vdlist_set_layout(lw->vdl, lw); | |
224 vdlist_set_select_func(lw->vdl, layout_vdlist_select_cb, lw); | |
225 | |
226 lw->dir_view = lw->vdl->widget; | |
227 } | |
228 | |
229 gtk_box_pack_start(GTK_BOX(box), lw->dir_view, TRUE, TRUE, 0); | |
230 gtk_widget_show(lw->dir_view); | |
231 | |
232 gtk_widget_show(box); | |
233 | |
234 return box; | |
235 } | |
236 | |
237 /* | |
238 *----------------------------------------------------------------------------- | |
239 * sort button (and menu) | |
240 *----------------------------------------------------------------------------- | |
241 */ | |
242 | |
243 static void layout_sort_menu_cb(GtkWidget *widget, gpointer data) | |
244 { | |
245 LayoutWindow *lw; | |
246 SortType type; | |
247 | |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
248 if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) return; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
249 |
9 | 250 lw = submenu_item_get_data(widget); |
251 if (!lw) return; | |
252 | |
253 type = (SortType)GPOINTER_TO_INT(data); | |
254 | |
255 layout_sort_set(lw, type, lw->sort_ascend); | |
256 } | |
257 | |
258 static void layout_sort_menu_ascend_cb(GtkWidget *widget, gpointer data) | |
259 { | |
260 LayoutWindow *lw = data; | |
261 | |
262 layout_sort_set(lw, lw->sort_method, !lw->sort_ascend); | |
263 } | |
264 | |
265 static void layout_sort_menu_hide_cb(GtkWidget *widget, gpointer data) | |
266 { | |
267 /* destroy the menu */ | |
268 gtk_widget_unref(GTK_WIDGET(widget)); | |
269 } | |
270 | |
271 static void layout_sort_button_press_cb(GtkWidget *widget, gpointer data) | |
272 { | |
273 LayoutWindow *lw = data; | |
274 GtkWidget *menu; | |
275 GdkEvent *event; | |
276 guint32 etime; | |
277 | |
278 menu = submenu_add_sort(NULL, G_CALLBACK(layout_sort_menu_cb), lw, FALSE, FALSE, TRUE, lw->sort_method); | |
279 | |
88
2099ee3f9a8d
Fri Oct 27 19:45:32 2006 John Ellis <johne@verizon.net>
gqview
parents:
81
diff
changeset
|
280 /* take ownership of menu */ |
2099ee3f9a8d
Fri Oct 27 19:45:32 2006 John Ellis <johne@verizon.net>
gqview
parents:
81
diff
changeset
|
281 #ifdef GTK_OBJECT_FLOATING |
2099ee3f9a8d
Fri Oct 27 19:45:32 2006 John Ellis <johne@verizon.net>
gqview
parents:
81
diff
changeset
|
282 /* GTK+ < 2.10 */ |
9 | 283 g_object_ref(G_OBJECT(menu)); |
284 gtk_object_sink(GTK_OBJECT(menu)); | |
88
2099ee3f9a8d
Fri Oct 27 19:45:32 2006 John Ellis <johne@verizon.net>
gqview
parents:
81
diff
changeset
|
285 #else |
2099ee3f9a8d
Fri Oct 27 19:45:32 2006 John Ellis <johne@verizon.net>
gqview
parents:
81
diff
changeset
|
286 /* GTK+ >= 2.10 */ |
2099ee3f9a8d
Fri Oct 27 19:45:32 2006 John Ellis <johne@verizon.net>
gqview
parents:
81
diff
changeset
|
287 g_object_ref_sink(G_OBJECT(menu)); |
2099ee3f9a8d
Fri Oct 27 19:45:32 2006 John Ellis <johne@verizon.net>
gqview
parents:
81
diff
changeset
|
288 #endif |
9 | 289 |
290 /* ascending option */ | |
291 menu_item_add_divider(menu); | |
292 menu_item_add_check(menu, _("Ascending"), lw->sort_ascend, G_CALLBACK(layout_sort_menu_ascend_cb), lw); | |
293 | |
294 g_signal_connect(G_OBJECT(menu), "selection_done", | |
295 G_CALLBACK(layout_sort_menu_hide_cb), NULL); | |
296 | |
297 event = gtk_get_current_event(); | |
298 if (event) | |
299 { | |
300 etime = gdk_event_get_time(event); | |
301 gdk_event_free(event); | |
302 } | |
303 else | |
304 { | |
305 etime = 0; | |
306 } | |
307 | |
308 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, etime); | |
309 } | |
310 | |
311 static GtkWidget *layout_sort_button(LayoutWindow *lw) | |
312 { | |
313 GtkWidget *button; | |
314 | |
315 button = gtk_button_new_with_label(sort_type_get_text(lw->sort_method)); | |
316 g_signal_connect(G_OBJECT(button), "clicked", | |
317 G_CALLBACK(layout_sort_button_press_cb), lw); | |
318 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); | |
319 | |
320 return button; | |
321 } | |
322 | |
323 /* | |
324 *----------------------------------------------------------------------------- | |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
325 * color profile button (and menu) |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
326 *----------------------------------------------------------------------------- |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
327 */ |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
328 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
329 static void layout_color_menu_enable_cb(GtkWidget *widget, gpointer data) |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
330 { |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
331 LayoutWindow *lw = data; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
332 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
333 layout_image_color_profile_set_use(lw, (!layout_image_color_profile_get_use(lw))); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
334 layout_image_refresh(lw); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
335 } |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
336 |
114
50fc73e08550
Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents:
113
diff
changeset
|
337 static void layout_color_menu_use_image_cb(GtkWidget *widget, gpointer data) |
50fc73e08550
Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents:
113
diff
changeset
|
338 { |
50fc73e08550
Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents:
113
diff
changeset
|
339 LayoutWindow *lw = data; |
50fc73e08550
Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents:
113
diff
changeset
|
340 gint input, screen, use_image; |
50fc73e08550
Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents:
113
diff
changeset
|
341 |
50fc73e08550
Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents:
113
diff
changeset
|
342 if (!layout_image_color_profile_get(lw, &input, &screen, &use_image)) return; |
50fc73e08550
Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents:
113
diff
changeset
|
343 layout_image_color_profile_set(lw, input, screen, !use_image); |
50fc73e08550
Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents:
113
diff
changeset
|
344 layout_image_refresh(lw); |
50fc73e08550
Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents:
113
diff
changeset
|
345 } |
50fc73e08550
Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents:
113
diff
changeset
|
346 |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
347 #define COLOR_MENU_KEY "color_menu_key" |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
348 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
349 static void layout_color_menu_input_cb(GtkWidget *widget, gpointer data) |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
350 { |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
351 LayoutWindow *lw = data; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
352 gint type; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
353 gint input, screen, use_image; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
354 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
355 if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) return; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
356 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
357 type = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), COLOR_MENU_KEY)); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
358 if (type < 0 || type > COLOR_PROFILE_INPUTS) return; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
359 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
360 if (!layout_image_color_profile_get(lw, &input, &screen, &use_image)) return; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
361 if (type == input) return; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
362 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
363 layout_image_color_profile_set(lw, type, screen, use_image); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
364 layout_image_refresh(lw); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
365 } |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
366 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
367 static void layout_color_menu_screen_cb(GtkWidget *widget, gpointer data) |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
368 { |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
369 LayoutWindow *lw = data; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
370 gint type; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
371 gint input, screen, use_image; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
372 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
373 if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) return; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
374 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
375 type = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), COLOR_MENU_KEY)); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
376 if (type < 0 || type > 1) return; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
377 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
378 if (!layout_image_color_profile_get(lw, &input, &screen, &use_image)) return; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
379 if (type == screen) return; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
380 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
381 layout_image_color_profile_set(lw, input, type, use_image); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
382 layout_image_refresh(lw); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
383 } |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
384 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
385 static gchar *layout_color_name_parse(const gchar *name) |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
386 { |
269
dca6c0b9f862
Simplify layout_color_name_parse() using g_strdelimit().
zas_
parents:
268
diff
changeset
|
387 if (!name) return g_strdup(_("Empty")); |
dca6c0b9f862
Simplify layout_color_name_parse() using g_strdelimit().
zas_
parents:
268
diff
changeset
|
388 return g_strdelimit(g_strdup(name), "_", '-'); |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
389 } |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
390 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
391 static void layout_color_button_press_cb(GtkWidget *widget, gpointer data) |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
392 { |
288
d1f74154463e
Replace occurences of Geeqie / geeqie by constants defined in main.h.
zas_
parents:
281
diff
changeset
|
393 #ifndef HAVE_LCMS |
d1f74154463e
Replace occurences of Geeqie / geeqie by constants defined in main.h.
zas_
parents:
281
diff
changeset
|
394 gchar *msg = g_strdup_printf(_("This installation of %s was not built with support for color profiles."), GQ_APPNAME); |
d1f74154463e
Replace occurences of Geeqie / geeqie by constants defined in main.h.
zas_
parents:
281
diff
changeset
|
395 file_util_warning_dialog(_("Color profiles not supported"), |
d1f74154463e
Replace occurences of Geeqie / geeqie by constants defined in main.h.
zas_
parents:
281
diff
changeset
|
396 msg, |
d1f74154463e
Replace occurences of Geeqie / geeqie by constants defined in main.h.
zas_
parents:
281
diff
changeset
|
397 GTK_STOCK_DIALOG_INFO, widget); |
d1f74154463e
Replace occurences of Geeqie / geeqie by constants defined in main.h.
zas_
parents:
281
diff
changeset
|
398 g_free(msg); |
d1f74154463e
Replace occurences of Geeqie / geeqie by constants defined in main.h.
zas_
parents:
281
diff
changeset
|
399 return; |
d1f74154463e
Replace occurences of Geeqie / geeqie by constants defined in main.h.
zas_
parents:
281
diff
changeset
|
400 #else |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
401 LayoutWindow *lw = data; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
402 GtkWidget *menu; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
403 GtkWidget *item; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
404 gchar *buf; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
405 gchar *front; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
406 gchar *end; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
407 gint active; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
408 gint input = 0; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
409 gint screen = 0; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
410 gint use_image = 0; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
411 gint i; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
412 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
413 if (!layout_image_color_profile_get(lw, &input, &screen, &use_image)) return; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
414 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
415 menu = popup_menu_short_lived(); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
416 |
270 | 417 active = layout_image_color_profile_get_use(lw); |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
418 menu_item_add_check(menu, _("Use _color profiles"), active, |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
419 G_CALLBACK(layout_color_menu_enable_cb), lw); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
420 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
421 menu_item_add_divider(menu); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
422 |
114
50fc73e08550
Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents:
113
diff
changeset
|
423 item = menu_item_add_check(menu, _("Use profile from _image"), use_image, |
50fc73e08550
Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents:
113
diff
changeset
|
424 G_CALLBACK(layout_color_menu_use_image_cb), lw); |
50fc73e08550
Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents:
113
diff
changeset
|
425 gtk_widget_set_sensitive(item, active); |
50fc73e08550
Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents:
113
diff
changeset
|
426 |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
427 front = g_strdup_printf(_("Input _%d:"), 0); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
428 buf = g_strdup_printf("%s %s", front, "sRGB"); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
429 g_free(front); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
430 item = menu_item_add_radio(menu, NULL, |
327 | 431 buf, (options->color_profile.input_type == 0), |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
432 G_CALLBACK(layout_color_menu_input_cb), lw); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
433 g_free(buf); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
434 g_object_set_data(G_OBJECT(item), COLOR_MENU_KEY, GINT_TO_POINTER(0)); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
435 gtk_widget_set_sensitive(item, active); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
436 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
437 for (i = 0; i < COLOR_PROFILE_INPUTS; i++) |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
438 { |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
439 const gchar *name; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
440 |
327 | 441 name = options->color_profile.input_name[i]; |
442 if (!name) name = filename_from_path(options->color_profile.input_file[i]); | |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
443 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
444 front = g_strdup_printf(_("Input _%d:"), i + 1); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
445 end = layout_color_name_parse(name); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
446 buf = g_strdup_printf("%s %s", front, end); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
447 g_free(front); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
448 g_free(end); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
449 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
450 item = menu_item_add_radio(menu, item, |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
451 buf, (i + 1 == input), |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
452 G_CALLBACK(layout_color_menu_input_cb), lw); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
453 g_free(buf); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
454 g_object_set_data(G_OBJECT(item), COLOR_MENU_KEY, GINT_TO_POINTER(i + 1)); |
327 | 455 gtk_widget_set_sensitive(item, active && options->color_profile.input_file[i]); |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
456 } |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
457 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
458 menu_item_add_divider(menu); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
459 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
460 buf = g_strdup_printf("%s sRGB", _("Screen")); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
461 item = menu_item_add_radio(menu, NULL, |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
462 buf, (screen == 0), |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
463 G_CALLBACK(layout_color_menu_screen_cb), lw); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
464 g_free(buf); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
465 g_object_set_data(G_OBJECT(item), COLOR_MENU_KEY, GINT_TO_POINTER(0)); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
466 gtk_widget_set_sensitive(item, active); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
467 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
468 item = menu_item_add_radio(menu, item, |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
469 _("_Screen profile"), (screen == 1), |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
470 G_CALLBACK(layout_color_menu_screen_cb), lw); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
471 g_object_set_data(G_OBJECT(item), COLOR_MENU_KEY, GINT_TO_POINTER(1)); |
327 | 472 gtk_widget_set_sensitive(item, active && options->color_profile.screen_file); |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
473 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
474 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, GDK_CURRENT_TIME); |
288
d1f74154463e
Replace occurences of Geeqie / geeqie by constants defined in main.h.
zas_
parents:
281
diff
changeset
|
475 #endif /* HAVE_LCMS */ |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
476 } |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
477 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
478 static GtkWidget *layout_color_button(LayoutWindow *lw) |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
479 { |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
480 GtkWidget *button; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
481 GtkWidget *image; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
482 gint enable; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
483 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
484 button = gtk_button_new(); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
485 image = gtk_image_new_from_stock(GTK_STOCK_SELECT_COLOR, GTK_ICON_SIZE_MENU); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
486 gtk_container_add(GTK_CONTAINER(button), image); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
487 gtk_widget_show(image); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
488 g_signal_connect(G_OBJECT(button), "clicked", |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
489 G_CALLBACK(layout_color_button_press_cb), lw); |
268 | 490 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
491 |
268 | 492 #ifdef HAVE_LCMS |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
493 enable = (lw->image) ? lw->image->color_profile_enable : FALSE; |
268 | 494 #else |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
495 enable = FALSE; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
496 #endif |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
497 gtk_widget_set_sensitive(image, enable); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
498 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
499 return button; |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
500 } |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
501 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
502 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
503 /* |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
504 *----------------------------------------------------------------------------- |
9 | 505 * status bar |
506 *----------------------------------------------------------------------------- | |
507 */ | |
508 | |
509 void layout_status_update_progress(LayoutWindow *lw, gdouble val, const gchar *text) | |
510 { | |
511 if (!layout_valid(&lw)) return; | |
512 if (!lw->info_progress_bar) return; | |
513 | |
514 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(lw->info_progress_bar), val); | |
515 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(lw->info_progress_bar), (text) ? text : " "); | |
516 } | |
517 | |
518 void layout_status_update_info(LayoutWindow *lw, const gchar *text) | |
519 { | |
520 gchar *buf = NULL; | |
521 | |
522 if (!layout_valid(&lw)) return; | |
523 | |
524 if (!text) | |
525 { | |
526 gint n; | |
527 gint64 n_bytes = 0; | |
528 gint s; | |
529 gint64 s_bytes = 0; | |
530 const gchar *ss; | |
531 | |
532 if (layout_image_slideshow_active(lw)) | |
533 { | |
534 if (!layout_image_slideshow_paused(lw)) | |
535 { | |
536 ss = _(" Slideshow"); | |
537 } | |
538 else | |
539 { | |
540 ss = _(" Paused"); | |
541 } | |
542 } | |
543 else | |
544 { | |
545 ss = ""; | |
546 } | |
547 | |
548 n = layout_list_count(lw, &n_bytes); | |
549 s = layout_selection_count(lw, &s_bytes); | |
550 | |
551 layout_bars_new_selection(lw, s); | |
552 | |
553 if (s > 0) | |
554 { | |
268 | 555 gchar *b = text_from_size_abrev(n_bytes); |
556 gchar *sb = text_from_size_abrev(s_bytes); | |
9 | 557 buf = g_strdup_printf(_("%s, %d files (%s, %d)%s"), b, n, sb, s, ss); |
558 g_free(b); | |
559 g_free(sb); | |
560 } | |
561 else if (n > 0) | |
562 { | |
268 | 563 gchar *b = text_from_size_abrev(n_bytes); |
9 | 564 buf = g_strdup_printf(_("%s, %d files%s"), b, n, ss); |
565 g_free(b); | |
566 } | |
567 else | |
568 { | |
569 buf = g_strdup_printf(_("%d files%s"), n, ss); | |
570 } | |
571 | |
572 text = buf; | |
573 | |
574 layout_image_overlay_update(lw); | |
575 } | |
576 | |
577 gtk_label_set_text(GTK_LABEL(lw->info_status), text); | |
578 g_free(buf); | |
579 } | |
580 | |
581 void layout_status_update_image(LayoutWindow *lw) | |
582 { | |
583 gchar *text; | |
584 gchar *b; | |
585 | |
586 if (!layout_valid(&lw) || !lw->image) return; | |
587 | |
588 text = image_zoom_get_as_text(lw->image); | |
589 gtk_label_set_text(GTK_LABEL(lw->info_zoom), text); | |
590 g_free(text); | |
591 | |
592 b = text_from_size(lw->image->size); | |
593 | |
594 if (lw->image->unknown) | |
595 { | |
596 if (image_get_path(lw->image) && !access_file(image_get_path(lw->image), R_OK)) | |
597 { | |
598 text = g_strdup_printf(_("(no read permission) %s bytes"), b); | |
599 } | |
600 else | |
601 { | |
602 text = g_strdup_printf(_("( ? x ? ) %s bytes"), b); | |
603 } | |
604 } | |
605 else | |
606 { | |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
607 gint width, height; |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
608 |
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
609 pixbuf_renderer_get_image_size(PIXBUF_RENDERER(lw->image->pr), &width, &height); |
9 | 610 text = g_strdup_printf(_("( %d x %d ) %s bytes"), |
23
17acca639a86
##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents:
9
diff
changeset
|
611 width, height, b); |
9 | 612 } |
613 | |
614 gtk_label_set_text(GTK_LABEL(lw->info_details), text); | |
615 | |
616 g_free(b); | |
617 g_free(text); | |
618 } | |
619 | |
620 void layout_status_update_all(LayoutWindow *lw) | |
621 { | |
622 layout_status_update_progress(lw, 0.0, NULL); | |
623 layout_status_update_info(lw, NULL); | |
624 layout_status_update_image(lw); | |
625 } | |
626 | |
627 static GtkWidget *layout_status_label(gchar *text, GtkWidget *box, gint start, gint size, gint expand) | |
628 { | |
629 GtkWidget *label; | |
630 GtkWidget *frame; | |
631 | |
632 frame = gtk_frame_new(NULL); | |
633 if (size) gtk_widget_set_size_request(frame, size, -1); | |
634 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); | |
635 if (start) | |
636 { | |
637 gtk_box_pack_start(GTK_BOX(box), frame, expand, expand, 0); | |
638 } | |
639 else | |
640 { | |
641 gtk_box_pack_end(GTK_BOX(box), frame, expand, expand, 0); | |
642 } | |
643 gtk_widget_show(frame); | |
644 | |
645 label = gtk_label_new(text ? text : ""); | |
646 gtk_container_add(GTK_CONTAINER(frame), label); | |
647 gtk_widget_show(label); | |
648 | |
649 return label; | |
650 } | |
651 | |
652 static void layout_status_setup(LayoutWindow *lw, GtkWidget *box, gint small_format) | |
653 { | |
654 GtkWidget *hbox; | |
655 | |
656 if (lw->info_box) return; | |
657 | |
658 if (small_format) | |
659 { | |
660 lw->info_box = gtk_vbox_new(FALSE, 0); | |
661 } | |
662 else | |
663 { | |
664 lw->info_box = gtk_hbox_new(FALSE, 0); | |
665 } | |
666 gtk_box_pack_end(GTK_BOX(box), lw->info_box, FALSE, FALSE, 0); | |
667 gtk_widget_show(lw->info_box); | |
668 | |
669 if (small_format) | |
670 { | |
671 hbox = gtk_hbox_new(FALSE, 0); | |
672 gtk_box_pack_start(GTK_BOX(lw->info_box), hbox, FALSE, FALSE, 0); | |
673 gtk_widget_show(hbox); | |
674 } | |
675 else | |
676 { | |
677 hbox = lw->info_box; | |
678 } | |
679 lw->info_progress_bar = gtk_progress_bar_new(); | |
680 gtk_widget_set_size_request(lw->info_progress_bar, PROGRESS_WIDTH, -1); | |
681 gtk_box_pack_start(GTK_BOX(hbox), lw->info_progress_bar, FALSE, FALSE, 0); | |
682 gtk_widget_show(lw->info_progress_bar); | |
683 | |
684 lw->info_sort = layout_sort_button(lw); | |
685 gtk_box_pack_start(GTK_BOX(hbox), lw->info_sort, FALSE, FALSE, 0); | |
686 gtk_widget_show(lw->info_sort); | |
687 | |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
688 lw->info_color = layout_color_button(lw); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
689 gtk_widget_show(lw->info_color); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
690 |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
691 if (small_format) gtk_box_pack_end(GTK_BOX(hbox), lw->info_color, FALSE, FALSE, 0); |
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
692 |
9 | 693 lw->info_status = layout_status_label(NULL, lw->info_box, TRUE, 0, (!small_format)); |
694 | |
695 if (small_format) | |
696 { | |
697 hbox = gtk_hbox_new(FALSE, 0); | |
698 gtk_box_pack_start(GTK_BOX(lw->info_box), hbox, FALSE, FALSE, 0); | |
699 gtk_widget_show(hbox); | |
700 } | |
701 else | |
702 { | |
703 hbox = lw->info_box; | |
704 } | |
705 lw->info_details = layout_status_label(NULL, hbox, TRUE, 0, TRUE); | |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
706 if (!small_format) gtk_box_pack_start(GTK_BOX(hbox), lw->info_color, FALSE, FALSE, 0); |
9 | 707 lw->info_zoom = layout_status_label(NULL, hbox, FALSE, ZOOM_LABEL_WIDTH, FALSE); |
708 } | |
709 | |
710 /* | |
711 *----------------------------------------------------------------------------- | |
712 * views | |
713 *----------------------------------------------------------------------------- | |
714 */ | |
715 | |
716 static GtkWidget *layout_tools_new(LayoutWindow *lw) | |
717 { | |
718 lw->dir_view = layout_tool_setup(lw); | |
719 return lw->dir_view; | |
720 } | |
721 | |
722 static void layout_list_status_cb(ViewFileList *vfl, gpointer data) | |
723 { | |
724 LayoutWindow *lw = data; | |
725 | |
726 layout_status_update_info(lw, NULL); | |
727 } | |
728 | |
729 static void layout_list_thumb_cb(ViewFileList *vfl, gdouble val, const gchar *text, gpointer data) | |
730 { | |
731 LayoutWindow *lw = data; | |
732 | |
733 layout_status_update_progress(lw, val, text); | |
734 } | |
735 | |
736 static void layout_icon_status_cb(ViewFileIcon *vfi, gpointer data) | |
737 { | |
268 | 738 LayoutWindow *lw = data; |
9 | 739 |
268 | 740 layout_status_update_info(lw, NULL); |
9 | 741 } |
742 | |
743 static void layout_icon_thumb_cb(ViewFileIcon *vfi, gdouble val, const gchar *text, gpointer data) | |
744 { | |
268 | 745 LayoutWindow *lw = data; |
9 | 746 |
268 | 747 layout_status_update_progress(lw, val, text); |
9 | 748 } |
749 | |
750 static GtkWidget *layout_list_new(LayoutWindow *lw) | |
751 { | |
752 if (lw->icon_view) | |
753 { | |
754 lw->vfi = vficon_new(NULL); | |
755 vficon_set_layout(lw->vfi, lw); | |
756 | |
757 vficon_set_status_func(lw->vfi, layout_icon_status_cb, lw); | |
758 vficon_set_thumb_status_func(lw->vfi, layout_icon_thumb_cb, lw); | |
166 | 759 /* FIXME vficon_marks_set(lw->vfi, lw->marks_enabled); */ |
9 | 760 |
761 return lw->vfi->widget; | |
762 } | |
763 | |
764 lw->vfl = vflist_new(NULL, lw->thumbs_enabled); | |
765 vflist_set_layout(lw->vfl, lw); | |
766 | |
767 vflist_set_status_func(lw->vfl, layout_list_status_cb, lw); | |
768 vflist_set_thumb_status_func(lw->vfl, layout_list_thumb_cb, lw); | |
769 | |
166 | 770 vflist_marks_set(lw->vfl, lw->marks_enabled); |
771 | |
9 | 772 return lw->vfl->widget; |
773 } | |
774 | |
775 static void layout_list_sync_thumb(LayoutWindow *lw) | |
776 { | |
777 if (lw->vfl) vflist_thumb_set(lw->vfl, lw->thumbs_enabled); | |
778 } | |
779 | |
132 | 780 static void layout_list_sync_marks(LayoutWindow *lw) |
781 { | |
782 if (lw->vfl) vflist_marks_set(lw->vfl, lw->marks_enabled); | |
783 } | |
784 | |
9 | 785 static void layout_list_scroll_to_subpart(LayoutWindow *lw, const gchar *needle) |
786 { | |
787 if (!lw) return; | |
788 #if 0 | |
789 if (lw->vfl) vflist_scroll_to_subpart(lw->vfl, needle); | |
790 if (lw->vfi) vficon_scroll_to_subpart(lw->vfi, needle); | |
791 #endif | |
792 } | |
793 | |
794 GList *layout_list(LayoutWindow *lw) | |
795 { | |
796 if (!layout_valid(&lw)) return NULL; | |
797 | |
798 if (lw->vfl) return vflist_get_list(lw->vfl); | |
799 if (lw->vfi) return vficon_get_list(lw->vfi); | |
800 | |
801 return NULL; | |
802 } | |
803 | |
804 gint layout_list_count(LayoutWindow *lw, gint64 *bytes) | |
805 { | |
806 if (!layout_valid(&lw)) return 0; | |
807 | |
808 if (lw->vfl) return vflist_count(lw->vfl, bytes); | |
809 if (lw->vfi) return vficon_count(lw->vfi, bytes); | |
810 | |
811 return 0; | |
812 } | |
813 | |
814 const gchar *layout_list_get_path(LayoutWindow *lw, gint index) | |
815 { | |
816 if (!layout_valid(&lw)) return NULL; | |
817 | |
818 if (lw->vfl) return vflist_index_get_path(lw->vfl, index); | |
819 if (lw->vfi) return vficon_index_get_path(lw->vfi, index); | |
820 | |
821 return NULL; | |
822 } | |
823 | |
138 | 824 FileData *layout_list_get_fd(LayoutWindow *lw, gint index) |
825 { | |
826 if (!layout_valid(&lw)) return NULL; | |
827 | |
828 if (lw->vfl) return vflist_index_get_data(lw->vfl, index); | |
829 if (lw->vfi) return vficon_index_get_data(lw->vfi, index); | |
830 | |
831 return NULL; | |
832 } | |
833 | |
9 | 834 gint layout_list_get_index(LayoutWindow *lw, const gchar *path) |
835 { | |
836 if (!layout_valid(&lw)) return -1; | |
837 | |
838 if (lw->vfl) return vflist_index_by_path(lw->vfl, path); | |
839 if (lw->vfi) return vficon_index_by_path(lw->vfi, path); | |
840 | |
841 return -1; | |
842 } | |
843 | |
138 | 844 void layout_list_sync_fd(LayoutWindow *lw, FileData *fd) |
9 | 845 { |
846 if (!layout_valid(&lw)) return; | |
847 | |
138 | 848 if (lw->vfl) vflist_select_by_fd(lw->vfl, fd); |
849 if (lw->vfi) vficon_select_by_fd(lw->vfi, fd); | |
9 | 850 } |
851 | |
852 static void layout_list_sync_sort(LayoutWindow *lw) | |
853 { | |
854 if (!layout_valid(&lw)) return; | |
855 | |
856 if (lw->vfl) vflist_sort_set(lw->vfl, lw->sort_method, lw->sort_ascend); | |
857 if (lw->vfi) vficon_sort_set(lw->vfi, lw->sort_method, lw->sort_ascend); | |
858 } | |
859 | |
860 GList *layout_selection_list(LayoutWindow *lw) | |
861 { | |
862 if (!layout_valid(&lw)) return NULL; | |
863 | |
864 if (layout_image_get_collection(lw, NULL)) | |
865 { | |
138 | 866 FileData *fd; |
9 | 867 |
138 | 868 fd = layout_image_get_fd(lw); |
869 if (fd) return g_list_append(NULL, file_data_ref(fd)); | |
9 | 870 return NULL; |
871 } | |
872 | |
873 if (lw->vfl) return vflist_selection_get_list(lw->vfl); | |
874 if (lw->vfi) return vficon_selection_get_list(lw->vfi); | |
875 | |
876 return NULL; | |
877 } | |
878 | |
879 GList *layout_selection_list_by_index(LayoutWindow *lw) | |
880 { | |
881 if (!layout_valid(&lw)) return NULL; | |
882 | |
883 if (lw->vfl) return vflist_selection_get_list_by_index(lw->vfl); | |
884 if (lw->vfi) return vficon_selection_get_list_by_index(lw->vfi); | |
885 | |
886 return NULL; | |
887 } | |
888 | |
889 gint layout_selection_count(LayoutWindow *lw, gint64 *bytes) | |
890 { | |
891 if (!layout_valid(&lw)) return 0; | |
892 | |
893 if (lw->vfl) return vflist_selection_count(lw->vfl, bytes); | |
894 if (lw->vfi) return vficon_selection_count(lw->vfi, bytes); | |
895 | |
896 return 0; | |
897 } | |
898 | |
899 void layout_select_all(LayoutWindow *lw) | |
900 { | |
901 if (!layout_valid(&lw)) return; | |
902 | |
903 if (lw->vfl) vflist_select_all(lw->vfl); | |
904 if (lw->vfi) vficon_select_all(lw->vfi); | |
905 } | |
906 | |
907 void layout_select_none(LayoutWindow *lw) | |
908 { | |
909 if (!layout_valid(&lw)) return; | |
910 | |
911 if (lw->vfl) vflist_select_none(lw->vfl); | |
912 if (lw->vfi) vficon_select_none(lw->vfi); | |
913 } | |
914 | |
162
1a42a2451575
created menu "Select" with selection and marks operations
nadvornik
parents:
138
diff
changeset
|
915 void layout_mark_to_selection(LayoutWindow *lw, gint mark, MarkToSelectionMode mode) |
1a42a2451575
created menu "Select" with selection and marks operations
nadvornik
parents:
138
diff
changeset
|
916 { |
1a42a2451575
created menu "Select" with selection and marks operations
nadvornik
parents:
138
diff
changeset
|
917 if (!layout_valid(&lw)) return; |
1a42a2451575
created menu "Select" with selection and marks operations
nadvornik
parents:
138
diff
changeset
|
918 |
1a42a2451575
created menu "Select" with selection and marks operations
nadvornik
parents:
138
diff
changeset
|
919 if (lw->vfl) vflist_mark_to_selection(lw->vfl, mark, mode); |
165 | 920 if (lw->vfi) vficon_mark_to_selection(lw->vfi, mark, mode); |
162
1a42a2451575
created menu "Select" with selection and marks operations
nadvornik
parents:
138
diff
changeset
|
921 } |
1a42a2451575
created menu "Select" with selection and marks operations
nadvornik
parents:
138
diff
changeset
|
922 |
1a42a2451575
created menu "Select" with selection and marks operations
nadvornik
parents:
138
diff
changeset
|
923 void layout_selection_to_mark(LayoutWindow *lw, gint mark, SelectionToMarkMode mode) |
1a42a2451575
created menu "Select" with selection and marks operations
nadvornik
parents:
138
diff
changeset
|
924 { |
1a42a2451575
created menu "Select" with selection and marks operations
nadvornik
parents:
138
diff
changeset
|
925 if (!layout_valid(&lw)) return; |
1a42a2451575
created menu "Select" with selection and marks operations
nadvornik
parents:
138
diff
changeset
|
926 |
1a42a2451575
created menu "Select" with selection and marks operations
nadvornik
parents:
138
diff
changeset
|
927 if (lw->vfl) vflist_selection_to_mark(lw->vfl, mark, mode); |
165 | 928 if (lw->vfi) vficon_selection_to_mark(lw->vfi, mark, mode); |
162
1a42a2451575
created menu "Select" with selection and marks operations
nadvornik
parents:
138
diff
changeset
|
929 |
1a42a2451575
created menu "Select" with selection and marks operations
nadvornik
parents:
138
diff
changeset
|
930 layout_status_update_info(lw, NULL); /* osd in fullscreen mode */ |
1a42a2451575
created menu "Select" with selection and marks operations
nadvornik
parents:
138
diff
changeset
|
931 } |
1a42a2451575
created menu "Select" with selection and marks operations
nadvornik
parents:
138
diff
changeset
|
932 |
9 | 933 /* |
934 *----------------------------------------------------------------------------- | |
935 * access | |
936 *----------------------------------------------------------------------------- | |
937 */ | |
938 | |
939 const gchar *layout_get_path(LayoutWindow *lw) | |
940 { | |
941 if (!layout_valid(&lw)) return NULL; | |
942 return lw->path; | |
943 } | |
944 | |
945 static void layout_sync_path(LayoutWindow *lw) | |
946 { | |
947 if (!lw->path) return; | |
948 | |
949 lw->last_time = filetime(lw->path); | |
950 | |
951 gtk_entry_set_text(GTK_ENTRY(lw->path_entry), lw->path); | |
952 if (lw->vdl) vdlist_set_path(lw->vdl, lw->path); | |
953 if (lw->vdt) vdtree_set_path(lw->vdt, lw->path); | |
954 | |
955 if (lw->vfl) vflist_set_path(lw->vfl, lw->path); | |
956 if (lw->vfi) vficon_set_path(lw->vfi, lw->path); | |
957 } | |
958 | |
959 gint layout_set_path(LayoutWindow *lw, const gchar *path) | |
960 { | |
961 gint have_file = FALSE; | |
962 | |
963 if (!layout_valid(&lw)) return FALSE; | |
964 | |
965 if (!path || !isname(path)) return FALSE; | |
966 if (lw->path && path && strcmp(path, lw->path) == 0) | |
967 { | |
968 return TRUE; | |
969 } | |
970 | |
971 if (isdir(path)) | |
972 { | |
973 g_free(lw->path); | |
974 lw->path = g_strdup(path); | |
975 } | |
976 else | |
977 { | |
978 gchar *base; | |
979 | |
980 base = remove_level_from_path(path); | |
981 if (lw->path && strcmp(lw->path, base) == 0) | |
982 { | |
983 g_free(base); | |
984 } | |
985 else if (isdir(base)) | |
986 { | |
987 g_free(lw->path); | |
988 lw->path = base; | |
989 } | |
990 else | |
991 { | |
992 g_free(base); | |
993 return FALSE; | |
994 } | |
995 if (isfile(path)) have_file = TRUE; | |
996 } | |
997 | |
998 if (lw->path_entry) tab_completion_append_to_history(lw->path_entry, lw->path); | |
999 layout_sync_path(lw); | |
1000 | |
1001 if (have_file) | |
1002 { | |
1003 gint row; | |
1004 | |
1005 row = layout_list_get_index(lw, path); | |
1006 if (row >= 0) | |
1007 { | |
1008 layout_image_set_index(lw, row); | |
1009 } | |
1010 else | |
1011 { | |
138 | 1012 layout_image_set_fd(lw, file_data_new_simple(path)); |
9 | 1013 } |
1014 } | |
320 | 1015 else if (!options->lazy_image_sync) |
9 | 1016 { |
1017 layout_image_set_index(lw, 0); | |
1018 } | |
1019 | |
1020 return TRUE; | |
1021 } | |
1022 | |
1023 static void layout_refresh_lists(LayoutWindow *lw) | |
1024 { | |
1025 if (lw->path) lw->last_time = filetime(lw->path); | |
1026 | |
1027 if (lw->vdl) vdlist_refresh(lw->vdl); | |
1028 if (lw->vdt) vdtree_refresh(lw->vdt); | |
1029 | |
1030 if (lw->vfl) vflist_refresh(lw->vfl); | |
1031 if (lw->vfi) vficon_refresh(lw->vfi); | |
1032 } | |
1033 | |
1034 static void layout_refresh_by_time(LayoutWindow *lw) | |
1035 { | |
1036 layout_refresh_lists(lw); | |
1037 | |
1038 if (lw->image && filetime(layout_image_get_path(lw)) >= lw->last_time) | |
1039 { | |
1040 layout_image_refresh(lw); | |
1041 } | |
1042 } | |
1043 | |
1044 void layout_refresh(LayoutWindow *lw) | |
1045 { | |
1046 if (!layout_valid(&lw)) return; | |
1047 | |
1048 if (debug) printf("layout refresh\n"); | |
1049 | |
1050 layout_refresh_lists(lw); | |
1051 | |
1052 if (lw->image) layout_image_refresh(lw); | |
1053 } | |
1054 | |
1055 static gint layout_check_for_update_cb(gpointer data) | |
1056 { | |
1057 LayoutWindow *lw = data; | |
1058 | |
320 | 1059 if (!options->update_on_time_change) return TRUE; |
9 | 1060 |
1061 if (lw->path) | |
1062 { | |
1063 time_t new_time; | |
1064 | |
1065 new_time = filetime(lw->path); | |
1066 | |
1067 if (new_time > 0 && new_time > lw->last_time) | |
1068 { | |
1069 if (debug) printf("layout path time changed, refreshing...\n"); | |
1070 layout_refresh_by_time(lw); | |
1071 } | |
1072 } | |
1073 | |
1074 return TRUE; | |
1075 } | |
1076 | |
1077 void layout_thumb_set(LayoutWindow *lw, gint enable) | |
1078 { | |
1079 if (!layout_valid(&lw)) return; | |
1080 | |
1081 if (lw->thumbs_enabled == enable) return; | |
1082 | |
1083 lw->thumbs_enabled = enable; | |
1084 | |
1085 layout_util_sync_thumb(lw); | |
1086 layout_list_sync_thumb(lw); | |
1087 } | |
1088 | |
132 | 1089 void layout_marks_set(LayoutWindow *lw, gint enable) |
1090 { | |
1091 if (!layout_valid(&lw)) return; | |
1092 | |
1093 if (lw->marks_enabled == enable) return; | |
1094 | |
1095 lw->marks_enabled = enable; | |
1096 | |
268 | 1097 // layout_util_sync_marks(lw); |
1098 layout_list_sync_marks(lw); | |
132 | 1099 } |
1100 | |
9 | 1101 gint layout_thumb_get(LayoutWindow *lw) |
1102 { | |
1103 if (!layout_valid(&lw)) return FALSE; | |
1104 | |
1105 return lw->thumbs_enabled; | |
1106 } | |
1107 | |
1108 void layout_sort_set(LayoutWindow *lw, SortType type, gint ascend) | |
1109 { | |
1110 if (!layout_valid(&lw)) return; | |
1111 if (lw->sort_method == type && lw->sort_ascend == ascend) return; | |
1112 | |
1113 lw->sort_method = type; | |
1114 lw->sort_ascend = ascend; | |
1115 | |
1116 if (lw->info_sort) gtk_label_set_text(GTK_LABEL(GTK_BIN(lw->info_sort)->child), | |
1117 sort_type_get_text(type)); | |
1118 layout_list_sync_sort(lw); | |
1119 } | |
1120 | |
1121 gint layout_sort_get(LayoutWindow *lw, SortType *type, gint *ascend) | |
1122 { | |
1123 if (!layout_valid(&lw)) return FALSE; | |
1124 | |
1125 if (type) *type = lw->sort_method; | |
1126 if (ascend) *ascend = lw->sort_ascend; | |
1127 | |
1128 return TRUE; | |
1129 } | |
1130 | |
1131 gint layout_geometry_get(LayoutWindow *lw, gint *x, gint *y, gint *w, gint *h) | |
1132 { | |
1133 if (!layout_valid(&lw)) return FALSE; | |
1134 | |
1135 gdk_window_get_root_origin(lw->window->window, x, y); | |
1136 gdk_drawable_get_size(lw->window->window, w, h); | |
1137 | |
1138 return TRUE; | |
1139 } | |
1140 | |
1141 gint layout_geometry_get_dividers(LayoutWindow *lw, gint *h, gint *v) | |
1142 { | |
1143 if (!layout_valid(&lw)) return FALSE; | |
1144 | |
1145 if (lw->h_pane && GTK_PANED(lw->h_pane)->child1->allocation.x >= 0) | |
1146 { | |
1147 *h = GTK_PANED(lw->h_pane)->child1->allocation.width; | |
1148 } | |
1149 else if (h != &lw->div_h) | |
1150 { | |
1151 *h = lw->div_h; | |
1152 } | |
1153 | |
1154 if (lw->v_pane && GTK_PANED(lw->v_pane)->child1->allocation.x >= 0) | |
1155 { | |
1156 *v = GTK_PANED(lw->v_pane)->child1->allocation.height; | |
1157 } | |
1158 else if (v != &lw->div_v) | |
1159 { | |
1160 *v = lw->div_v; | |
1161 } | |
1162 | |
1163 return TRUE; | |
1164 } | |
1165 | |
1166 void layout_views_set(LayoutWindow *lw, gint tree, gint icons) | |
1167 { | |
1168 if (!layout_valid(&lw)) return; | |
1169 | |
1170 if (lw->tree_view == tree && lw->icon_view == icons) return; | |
1171 | |
1172 lw->tree_view = tree; | |
1173 lw->icon_view = icons; | |
1174 | |
1175 layout_style_set(lw, -1, NULL); | |
1176 } | |
1177 | |
1178 gint layout_views_get(LayoutWindow *lw, gint *tree, gint *icons) | |
1179 { | |
1180 if (!layout_valid(&lw)) return FALSE; | |
1181 | |
1182 *tree = lw->tree_view; | |
1183 *icons = lw->icon_view; | |
1184 | |
1185 return TRUE; | |
1186 } | |
1187 | |
1188 /* | |
1189 *----------------------------------------------------------------------------- | |
1190 * location utils | |
1191 *----------------------------------------------------------------------------- | |
1192 */ | |
1193 | |
1194 static gint layout_location_single(LayoutLocation l) | |
1195 { | |
1196 return (l == LAYOUT_LEFT || | |
1197 l == LAYOUT_RIGHT || | |
1198 l == LAYOUT_TOP || | |
1199 l == LAYOUT_BOTTOM); | |
1200 } | |
1201 | |
1202 static gint layout_location_vertical(LayoutLocation l) | |
1203 { | |
1204 return (l & LAYOUT_TOP || | |
1205 l & LAYOUT_BOTTOM); | |
1206 } | |
1207 | |
1208 static gint layout_location_first(LayoutLocation l) | |
1209 { | |
1210 return (l & LAYOUT_TOP || | |
1211 l & LAYOUT_LEFT); | |
1212 } | |
1213 | |
1214 static LayoutLocation layout_grid_compass(LayoutWindow *lw) | |
1215 { | |
1216 if (layout_location_single(lw->dir_location)) return lw->dir_location; | |
1217 if (layout_location_single(lw->file_location)) return lw->file_location; | |
1218 return lw->image_location; | |
1219 } | |
1220 | |
1221 static void layout_location_compute(LayoutLocation l1, LayoutLocation l2, | |
1222 GtkWidget *s1, GtkWidget *s2, | |
1223 GtkWidget **d1, GtkWidget **d2) | |
1224 { | |
1225 LayoutLocation l; | |
1226 | |
1227 l = l1 & l2; /* get common compass direction */ | |
1228 l = l1 - l; /* remove it */ | |
1229 | |
1230 if (layout_location_first(l)) | |
1231 { | |
1232 *d1 = s1; | |
1233 *d2 = s2; | |
1234 } | |
1235 else | |
1236 { | |
1237 *d1 = s2; | |
1238 *d2 = s1; | |
1239 } | |
1240 } | |
1241 | |
1242 /* | |
1243 *----------------------------------------------------------------------------- | |
1244 * tools window (for floating/hidden) | |
1245 *----------------------------------------------------------------------------- | |
1246 */ | |
1247 | |
1248 gint layout_geometry_get_tools(LayoutWindow *lw, gint *x, gint *y, gint *w, gint *h, gint *divider_pos) | |
1249 { | |
1250 if (!layout_valid(&lw)) return FALSE; | |
1251 | |
1252 if (!lw->tools || !GTK_WIDGET_VISIBLE(lw->tools)) | |
1253 { | |
1254 /* use the stored values (sort of breaks success return value) */ | |
1255 | |
1256 *divider_pos = lw->div_float; | |
1257 | |
1258 return FALSE; | |
1259 } | |
1260 | |
1261 gdk_window_get_root_origin(lw->tools->window, x, y); | |
1262 gdk_drawable_get_size(lw->tools->window, w, h); | |
1263 | |
1264 if (GTK_IS_VPANED(lw->tools_pane)) | |
1265 { | |
1266 *divider_pos = GTK_PANED(lw->tools_pane)->child1->allocation.height; | |
1267 } | |
1268 else | |
1269 { | |
1270 *divider_pos = GTK_PANED(lw->tools_pane)->child1->allocation.width; | |
1271 } | |
1272 | |
1273 return TRUE; | |
1274 } | |
1275 | |
1276 static void layout_tools_geometry_sync(LayoutWindow *lw) | |
1277 { | |
338
41c3cb73120f
Rename window options (moved to layout) and re-order rc file.
zas_
parents:
333
diff
changeset
|
1278 layout_geometry_get_tools(lw, &options->layout.float_window.x, &options->layout.float_window.x, |
41c3cb73120f
Rename window options (moved to layout) and re-order rc file.
zas_
parents:
333
diff
changeset
|
1279 &options->layout.float_window.w, &options->layout.float_window.h, &lw->div_float); |
9 | 1280 } |
1281 | |
1282 static void layout_tools_hide(LayoutWindow *lw, gint hide) | |
1283 { | |
1284 if (!lw->tools) return; | |
1285 | |
1286 if (hide) | |
1287 { | |
1288 if (GTK_WIDGET_VISIBLE(lw->tools)) | |
1289 { | |
1290 layout_tools_geometry_sync(lw); | |
1291 gtk_widget_hide(lw->tools); | |
1292 } | |
1293 } | |
1294 else | |
1295 { | |
1296 if (!GTK_WIDGET_VISIBLE(lw->tools)) | |
1297 { | |
1298 gtk_widget_show(lw->tools); | |
1299 if (lw->vfi) vficon_refresh(lw->vfi); | |
1300 } | |
1301 } | |
1302 | |
1303 lw->tools_hidden = hide; | |
1304 } | |
1305 | |
1306 static gint layout_tools_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data) | |
1307 { | |
1308 LayoutWindow *lw = data; | |
1309 | |
1310 layout_tools_float_toggle(lw); | |
1311 | |
1312 return TRUE; | |
1313 } | |
1314 | |
1315 static void layout_tools_setup(LayoutWindow *lw, GtkWidget *tools, GtkWidget *files) | |
1316 { | |
1317 GtkWidget *vbox; | |
1318 GtkWidget *w1, *w2; | |
1319 gint vertical; | |
1320 gint new_window = FALSE; | |
1321 | |
1322 vertical = (layout_location_single(lw->image_location) && !layout_location_vertical(lw->image_location)) || | |
1323 (!layout_location_single(lw->image_location) && layout_location_vertical(layout_grid_compass(lw))); | |
1324 #if 0 | |
1325 layout_location_compute(lw->dir_location, lw->file_location, | |
1326 tools, files, &w1, &w2); | |
1327 #endif | |
1328 /* for now, tools/dir are always first in order */ | |
1329 w1 = tools; | |
1330 w2 = files; | |
1331 | |
1332 if (!lw->tools) | |
1333 { | |
1334 GdkGeometry geometry; | |
1335 GdkWindowHints hints; | |
1336 | |
289
6a7298988a7a
Simplify and unify gtk_window creation with the help of
zas_
parents:
288
diff
changeset
|
1337 lw->tools = window_new(GTK_WINDOW_TOPLEVEL, "tools", PIXBUF_INLINE_ICON_TOOLS, NULL, _("Tools")); |
9 | 1338 g_signal_connect(G_OBJECT(lw->tools), "delete_event", |
1339 G_CALLBACK(layout_tools_delete_cb), lw); | |
1340 layout_keyboard_init(lw, lw->tools); | |
1341 | |
338
41c3cb73120f
Rename window options (moved to layout) and re-order rc file.
zas_
parents:
333
diff
changeset
|
1342 if (options->layout.save_window_positions) |
9 | 1343 { |
41
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
23
diff
changeset
|
1344 hints = GDK_HINT_USER_POS; |
9 | 1345 } |
1346 else | |
1347 { | |
1348 hints = 0; | |
1349 } | |
1350 | |
1351 geometry.min_width = 32; | |
1352 geometry.min_height = 32; | |
1353 geometry.base_width = TOOLWINDOW_DEF_WIDTH; | |
1354 geometry.base_height = TOOLWINDOW_DEF_HEIGHT; | |
1355 gtk_window_set_geometry_hints(GTK_WINDOW(lw->tools), NULL, &geometry, | |
1356 GDK_HINT_MIN_SIZE | GDK_HINT_BASE_SIZE | hints); | |
1357 | |
1358 | |
268 | 1359 gtk_window_set_resizable(GTK_WINDOW(lw->tools), TRUE); |
1360 gtk_container_set_border_width(GTK_CONTAINER(lw->tools), 0); | |
289
6a7298988a7a
Simplify and unify gtk_window creation with the help of
zas_
parents:
288
diff
changeset
|
1361 |
9 | 1362 new_window = TRUE; |
1363 } | |
1364 else | |
1365 { | |
1366 layout_tools_geometry_sync(lw); | |
1367 /* dump the contents */ | |
1368 gtk_widget_destroy(GTK_BIN(lw->tools)->child); | |
1369 } | |
1370 | |
1371 layout_actions_add_window(lw, lw->tools); | |
1372 | |
1373 vbox = gtk_vbox_new(FALSE, 0); | |
1374 gtk_container_add(GTK_CONTAINER(lw->tools), vbox); | |
1375 gtk_widget_show(vbox); | |
1376 | |
1377 layout_status_setup(lw, vbox, TRUE); | |
1378 | |
1379 if (vertical) | |
1380 { | |
1381 lw->tools_pane = gtk_vpaned_new(); | |
1382 } | |
1383 else | |
1384 { | |
1385 lw->tools_pane = gtk_hpaned_new(); | |
1386 } | |
1387 gtk_box_pack_start(GTK_BOX(vbox), lw->tools_pane, TRUE, TRUE, 0); | |
1388 gtk_widget_show(lw->tools_pane); | |
1389 | |
1390 gtk_paned_pack1(GTK_PANED(lw->tools_pane), w1, FALSE, TRUE); | |
1391 gtk_paned_pack2(GTK_PANED(lw->tools_pane), w2, TRUE, TRUE); | |
1392 | |
1393 gtk_widget_show(tools); | |
1394 gtk_widget_show(files); | |
1395 | |
1396 if (new_window) | |
1397 { | |
338
41c3cb73120f
Rename window options (moved to layout) and re-order rc file.
zas_
parents:
333
diff
changeset
|
1398 if (options->layout.save_window_positions) |
9 | 1399 { |
338
41c3cb73120f
Rename window options (moved to layout) and re-order rc file.
zas_
parents:
333
diff
changeset
|
1400 gtk_window_set_default_size(GTK_WINDOW(lw->tools), options->layout.float_window.w, options->layout.float_window.h); |
41c3cb73120f
Rename window options (moved to layout) and re-order rc file.
zas_
parents:
333
diff
changeset
|
1401 gtk_window_move(GTK_WINDOW(lw->tools), options->layout.float_window.x, options->layout.float_window.y); |
268 | 1402 } |
9 | 1403 else |
1404 { | |
1405 if (vertical) | |
1406 { | |
1407 gtk_window_set_default_size(GTK_WINDOW(lw->tools), | |
1408 TOOLWINDOW_DEF_WIDTH, TOOLWINDOW_DEF_HEIGHT); | |
1409 } | |
1410 else | |
1411 { | |
1412 gtk_window_set_default_size(GTK_WINDOW(lw->tools), | |
1413 TOOLWINDOW_DEF_HEIGHT, TOOLWINDOW_DEF_WIDTH); | |
1414 } | |
1415 } | |
1416 } | |
1417 | |
338
41c3cb73120f
Rename window options (moved to layout) and re-order rc file.
zas_
parents:
333
diff
changeset
|
1418 if (!options->layout.save_window_positions) |
9 | 1419 { |
1420 if (vertical) | |
1421 { | |
1422 lw->div_float = MAIN_WINDOW_DIV_VPOS; | |
1423 } | |
1424 else | |
1425 { | |
1426 lw->div_float = MAIN_WINDOW_DIV_HPOS; | |
1427 } | |
1428 } | |
1429 | |
1430 gtk_paned_set_position(GTK_PANED(lw->tools_pane), lw->div_float); | |
1431 } | |
1432 | |
1433 /* | |
1434 *----------------------------------------------------------------------------- | |
1435 * glue (layout arrangement) | |
1436 *----------------------------------------------------------------------------- | |
1437 */ | |
1438 | |
1439 static void layout_grid_compute(LayoutWindow *lw, | |
1440 GtkWidget *image, GtkWidget *tools, GtkWidget *files, | |
1441 GtkWidget **w1, GtkWidget **w2, GtkWidget **w3) | |
1442 { | |
1443 /* heh, this was fun */ | |
1444 | |
1445 if (layout_location_single(lw->dir_location)) | |
1446 { | |
1447 if (layout_location_first(lw->dir_location)) | |
1448 { | |
1449 *w1 = tools; | |
1450 layout_location_compute(lw->file_location, lw->image_location, files, image, w2, w3); | |
1451 } | |
1452 else | |
1453 { | |
1454 *w3 = tools; | |
1455 layout_location_compute(lw->file_location, lw->image_location, files, image, w1, w2); | |
1456 } | |
1457 } | |
1458 else if (layout_location_single(lw->file_location)) | |
1459 { | |
1460 if (layout_location_first(lw->file_location)) | |
1461 { | |
1462 *w1 = files; | |
1463 layout_location_compute(lw->dir_location, lw->image_location, tools, image, w2, w3); | |
1464 } | |
1465 else | |
1466 { | |
1467 *w3 = files; | |
1468 layout_location_compute(lw->dir_location, lw->image_location, tools, image, w1, w2); | |
1469 } | |
1470 } | |
1471 else | |
1472 { | |
1473 /* image */ | |
1474 if (layout_location_first(lw->image_location)) | |
1475 { | |
1476 *w1 = image; | |
1477 layout_location_compute(lw->file_location, lw->dir_location, files, tools, w2, w3); | |
1478 } | |
1479 else | |
1480 { | |
1481 *w3 = image; | |
1482 layout_location_compute(lw->file_location, lw->dir_location, files, tools, w1, w2); | |
1483 } | |
1484 } | |
1485 } | |
1486 | |
127 | 1487 void layout_split_change(LayoutWindow *lw, ImageSplitMode mode) |
1488 { | |
1489 GtkWidget *image; | |
1490 gint i; | |
268 | 1491 |
1492 for (i = 0; i < MAX_SPLIT_IMAGES; i++) | |
127 | 1493 { |
1494 if (lw->split_images[i]) | |
1495 { | |
1496 gtk_widget_hide(lw->split_images[i]->widget); | |
1497 if (lw->split_images[i]->widget->parent != lw->utility_box) | |
1498 gtk_container_remove(GTK_CONTAINER(lw->split_images[i]->widget->parent), lw->split_images[i]->widget); | |
1499 } | |
1500 } | |
1501 gtk_container_remove(GTK_CONTAINER(lw->utility_box), lw->split_image_widget); | |
1502 | |
1503 image = layout_image_setup_split(lw, mode); | |
1504 | |
1505 gtk_box_pack_start(GTK_BOX(lw->utility_box), image, TRUE, TRUE, 0); | |
1506 gtk_box_reorder_child(GTK_BOX(lw->utility_box), image, 0); | |
1507 gtk_widget_show(image); | |
1508 } | |
1509 | |
9 | 1510 static void layout_grid_setup(LayoutWindow *lw) |
1511 { | |
1512 gint priority_location; | |
1513 GtkWidget *h; | |
1514 GtkWidget *v; | |
1515 GtkWidget *w1, *w2, *w3; | |
1516 | |
1517 GtkWidget *image; | |
1518 GtkWidget *tools; | |
1519 GtkWidget *files; | |
1520 | |
1521 layout_actions_setup(lw); | |
1522 layout_actions_add_window(lw, lw->window); | |
1523 | |
1524 lw->group_box = gtk_vbox_new(FALSE, 0); | |
1525 gtk_box_pack_start(GTK_BOX(lw->main_box), lw->group_box, TRUE, TRUE, 0); | |
1526 gtk_widget_show(lw->group_box); | |
1527 | |
1528 priority_location = layout_grid_compass(lw); | |
1529 | |
127 | 1530 image = layout_image_setup_split(lw, lw->split_mode); |
1531 | |
9 | 1532 tools = layout_tools_new(lw); |
1533 files = layout_list_new(lw); | |
1534 | |
1535 image = layout_bars_prepare(lw, image); | |
1536 | |
1537 if (lw->tools_float || lw->tools_hidden) | |
1538 { | |
1539 gtk_box_pack_start(GTK_BOX(lw->group_box), image, TRUE, TRUE, 0); | |
1540 gtk_widget_show(image); | |
1541 | |
1542 layout_tools_setup(lw, tools, files); | |
1543 | |
1544 gtk_widget_grab_focus(lw->image->widget); | |
1545 | |
1546 return; | |
1547 } | |
1548 else if (lw->tools) | |
1549 { | |
1550 layout_tools_geometry_sync(lw); | |
1551 gtk_widget_destroy(lw->tools); | |
1552 lw->tools = NULL; | |
1553 lw->tools_pane = NULL; | |
1554 } | |
1555 | |
1556 layout_status_setup(lw, lw->group_box, FALSE); | |
1557 | |
1558 layout_grid_compute(lw, image, tools, files, &w1, &w2, &w3); | |
1559 | |
1560 v = lw->v_pane = gtk_vpaned_new(); | |
1561 | |
1562 h = lw->h_pane = gtk_hpaned_new(); | |
1563 | |
1564 if (!layout_location_vertical(priority_location)) | |
1565 { | |
1566 GtkWidget *tmp; | |
1567 | |
1568 tmp = v; | |
1569 v = h; | |
1570 h = tmp; | |
1571 } | |
1572 | |
1573 gtk_box_pack_start(GTK_BOX(lw->group_box), v, TRUE, TRUE, 0); | |
1574 | |
1575 if (!layout_location_first(priority_location)) | |
1576 { | |
1577 gtk_paned_pack1(GTK_PANED(v), h, FALSE, TRUE); | |
1578 gtk_paned_pack2(GTK_PANED(v), w3, TRUE, TRUE); | |
1579 | |
1580 gtk_paned_pack1(GTK_PANED(h), w1, FALSE, TRUE); | |
1581 gtk_paned_pack2(GTK_PANED(h), w2, TRUE, TRUE); | |
1582 } | |
1583 else | |
1584 { | |
1585 gtk_paned_pack1(GTK_PANED(v), w1, FALSE, TRUE); | |
1586 gtk_paned_pack2(GTK_PANED(v), h, TRUE, TRUE); | |
1587 | |
1588 gtk_paned_pack1(GTK_PANED(h), w2, FALSE, TRUE); | |
1589 gtk_paned_pack2(GTK_PANED(h), w3, TRUE, TRUE); | |
1590 } | |
1591 | |
1592 gtk_widget_show(image); | |
1593 gtk_widget_show(tools); | |
1594 gtk_widget_show(files); | |
1595 | |
1596 gtk_widget_show(v); | |
1597 gtk_widget_show(h); | |
1598 | |
1599 /* fix to have image pane visible when it is left and priority widget */ | |
1600 if (lw->div_h == -1 && | |
1601 w1 == image && | |
1602 !layout_location_vertical(priority_location) && | |
1603 layout_location_first(priority_location)) | |
1604 { | |
1605 gtk_widget_set_size_request(image, 200, -1); | |
1606 } | |
1607 | |
1608 gtk_paned_set_position(GTK_PANED(lw->h_pane), lw->div_h); | |
1609 gtk_paned_set_position(GTK_PANED(lw->v_pane), lw->div_v); | |
1610 | |
1611 gtk_widget_grab_focus(lw->image->widget); | |
1612 } | |
1613 | |
1614 void layout_style_set(LayoutWindow *lw, gint style, const gchar *order) | |
1615 { | |
1616 gchar *path; | |
127 | 1617 gint i; |
9 | 1618 |
1619 if (!layout_valid(&lw)) return; | |
1620 | |
1621 if (style != -1) | |
1622 { | |
1623 LayoutLocation d, f, i; | |
1624 | |
1625 layout_config_parse(style, order, &d, &f, &i); | |
1626 | |
1627 if (lw->dir_location == d && | |
1628 lw->file_location == f && | |
1629 lw->image_location == i) return; | |
1630 | |
1631 lw->dir_location = d; | |
1632 lw->file_location = f; | |
1633 lw->image_location = i; | |
1634 } | |
1635 | |
1636 /* remember state */ | |
1637 | |
1638 layout_image_slideshow_stop(lw); | |
1639 layout_image_full_screen_stop(lw); | |
1640 | |
1641 path = lw->path; | |
1642 lw->path = NULL; | |
1643 lw->image = NULL; | |
1644 lw->utility_box = NULL; | |
1645 | |
1646 layout_geometry_get_dividers(lw, &lw->div_h, &lw->div_v); | |
1647 | |
1648 /* clear it all */ | |
1649 | |
268 | 1650 for (i = 0; i < MAX_SPLIT_IMAGES; i++) |
127 | 1651 { |
1652 if (lw->split_images[i]) | |
1653 { | |
1654 gtk_widget_hide(lw->split_images[i]->widget); | |
1655 gtk_container_remove(GTK_CONTAINER(lw->split_images[i]->widget->parent), lw->split_images[i]->widget); | |
1656 } | |
1657 } | |
9 | 1658 |
1659 lw->h_pane = NULL; | |
1660 lw->v_pane = NULL; | |
1661 | |
1662 lw->toolbar = NULL; | |
1663 lw->thumb_button = NULL; | |
1664 lw->path_entry = NULL; | |
1665 lw->dir_view = NULL; | |
1666 lw->vdl = NULL; | |
1667 lw->vdt = NULL; | |
1668 | |
1669 lw->file_view = NULL; | |
1670 lw->vfl = NULL; | |
1671 lw->vfi = NULL; | |
1672 | |
1673 lw->info_box = NULL; | |
1674 lw->info_progress_bar = NULL; | |
1675 lw->info_sort = NULL; | |
113
55166d93498d
Fri Nov 24 21:37:01 2006 John Ellis <johne@verizon.net>
gqview
parents:
91
diff
changeset
|
1676 lw->info_color = NULL; |
9 | 1677 lw->info_status = NULL; |
1678 lw->info_details = NULL; | |
1679 lw->info_zoom = NULL; | |
1680 | |
1681 if (lw->ui_manager) g_object_unref(lw->ui_manager); | |
1682 lw->ui_manager = NULL; | |
1683 lw->action_group = NULL; | |
1684 | |
1685 gtk_container_remove(GTK_CONTAINER(lw->main_box), lw->group_box); | |
1686 lw->group_box = NULL; | |
1687 | |
1688 /* re-fill */ | |
1689 | |
1690 layout_grid_setup(lw); | |
1691 layout_tools_hide(lw, lw->tools_hidden); | |
1692 | |
1693 layout_list_sync_sort(lw); | |
1694 layout_util_sync(lw); | |
1695 layout_status_update_all(lw); | |
1696 | |
1697 /* sync */ | |
1698 | |
127 | 1699 if (image_get_path(lw->image)) |
9 | 1700 { |
127 | 1701 layout_set_path(lw, image_get_path(lw->image)); |
9 | 1702 } |
1703 else | |
1704 { | |
1705 layout_set_path(lw, path); | |
1706 } | |
1707 image_top_window_set_sync(lw->image, (lw->tools_float || lw->tools_hidden)); | |
1708 | |
1709 /* clean up */ | |
1710 | |
1711 g_free(path); | |
1712 } | |
1713 | |
1714 void layout_styles_update(void) | |
1715 { | |
1716 GList *work; | |
1717 | |
1718 work = layout_window_list; | |
1719 while (work) | |
1720 { | |
1721 LayoutWindow *lw = work->data; | |
1722 work = work->next; | |
1723 | |
327 | 1724 layout_style_set(lw, options->layout.style, options->layout.order); |
9 | 1725 } |
1726 } | |
1727 | |
1728 void layout_colors_update(void) | |
1729 { | |
1730 GList *work; | |
1731 | |
1732 work = layout_window_list; | |
1733 while (work) | |
1734 { | |
1735 LayoutWindow *lw = work->data; | |
1736 work = work->next; | |
208
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
196
diff
changeset
|
1737 |
fa0e05f985c3
set user-defined color as image background - patch by Laurent MONIN
nadvornik
parents:
196
diff
changeset
|
1738 if (!lw->image) continue; |
339
de1c2cd06fce
Rename user_specified_window_background and window_background_color
zas_
parents:
338
diff
changeset
|
1739 image_background_set_color(lw->image, options->image.use_custom_border_color ? &options->image.border_color : NULL); |
9 | 1740 } |
1741 } | |
1742 | |
1743 void layout_tools_float_toggle(LayoutWindow *lw) | |
1744 { | |
1745 gint popped; | |
1746 | |
1747 if (!lw) return; | |
1748 | |
1749 if (!lw->tools_hidden) | |
1750 { | |
1751 popped = !lw->tools_float; | |
1752 } | |
1753 else | |
1754 { | |
1755 popped = TRUE; | |
1756 } | |
1757 | |
1758 if (lw->tools_float == popped) | |
1759 { | |
1760 if (popped && lw->tools_hidden) | |
1761 { | |
1762 layout_tools_float_set(lw, popped, FALSE); | |
1763 } | |
1764 } | |
1765 else | |
1766 { | |
1767 if (lw->tools_float) | |
1768 { | |
1769 layout_tools_float_set(lw, FALSE, FALSE); | |
1770 } | |
1771 else | |
1772 { | |
1773 layout_tools_float_set(lw, TRUE, FALSE); | |
1774 } | |
1775 } | |
1776 } | |
1777 | |
1778 void layout_tools_hide_toggle(LayoutWindow *lw) | |
1779 { | |
1780 if (!lw) return; | |
1781 | |
1782 layout_tools_float_set(lw, lw->tools_float, !lw->tools_hidden); | |
1783 } | |
1784 | |
1785 void layout_tools_float_set(LayoutWindow *lw, gint popped, gint hidden) | |
1786 { | |
1787 if (!layout_valid(&lw)) return; | |
1788 | |
1789 if (lw->tools_float == popped && lw->tools_hidden == hidden) return; | |
1790 | |
1791 if (lw->tools_float == popped && lw->tools_float && lw->tools) | |
1792 { | |
1793 layout_tools_hide(lw, hidden); | |
1794 return; | |
1795 } | |
1796 | |
1797 lw->tools_float = popped; | |
1798 lw->tools_hidden = hidden; | |
1799 | |
1800 layout_style_set(lw, -1, NULL); | |
1801 } | |
1802 | |
1803 gint layout_tools_float_get(LayoutWindow *lw, gint *popped, gint *hidden) | |
1804 { | |
1805 if (!layout_valid(&lw)) return FALSE; | |
1806 | |
1807 *popped = lw->tools_float; | |
1808 *hidden = lw->tools_hidden; | |
1809 | |
1810 return TRUE; | |
1811 } | |
1812 | |
1813 void layout_toolbar_toggle(LayoutWindow *lw) | |
1814 { | |
1815 if (!layout_valid(&lw)) return; | |
1816 if (!lw->toolbar) return; | |
1817 | |
1818 lw->toolbar_hidden = !lw->toolbar_hidden; | |
1819 | |
1820 if (lw->toolbar_hidden) | |
1821 { | |
1822 if (GTK_WIDGET_VISIBLE(lw->toolbar)) gtk_widget_hide(lw->toolbar); | |
1823 } | |
1824 else | |
1825 { | |
1826 if (!GTK_WIDGET_VISIBLE(lw->toolbar)) gtk_widget_show(lw->toolbar); | |
1827 } | |
1828 } | |
1829 | |
1830 gint layout_toolbar_hidden(LayoutWindow *lw) | |
1831 { | |
1832 if (!layout_valid(&lw)) return TRUE; | |
1833 | |
1834 return lw->toolbar_hidden; | |
1835 } | |
1836 | |
1837 /* | |
1838 *----------------------------------------------------------------------------- | |
1839 * base | |
1840 *----------------------------------------------------------------------------- | |
1841 */ | |
1842 | |
1843 void layout_close(LayoutWindow *lw) | |
1844 { | |
1845 if (layout_window_list && layout_window_list->next) | |
1846 { | |
1847 layout_free(lw); | |
1848 } | |
1849 else | |
1850 { | |
278 | 1851 exit_program(); |
9 | 1852 } |
1853 } | |
1854 | |
1855 void layout_free(LayoutWindow *lw) | |
1856 { | |
1857 if (!lw) return; | |
1858 | |
1859 layout_window_list = g_list_remove(layout_window_list, lw); | |
1860 | |
1861 if (lw->last_time_id != -1) | |
1862 { | |
1863 g_source_remove(lw->last_time_id); | |
1864 } | |
1865 | |
1866 layout_bars_close(lw); | |
1867 | |
1868 gtk_widget_destroy(lw->window); | |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
270
diff
changeset
|
1869 |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
270
diff
changeset
|
1870 histogram_free(lw->histogram); |
9 | 1871 |
1872 g_free(lw->path); | |
1873 | |
1874 g_free(lw); | |
1875 } | |
1876 | |
1877 static gint layout_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data) | |
1878 { | |
1879 LayoutWindow *lw = data; | |
1880 | |
1881 layout_close(lw); | |
1882 return TRUE; | |
1883 } | |
1884 | |
1885 LayoutWindow *layout_new(const gchar *path, gint popped, gint hidden) | |
1886 { | |
81
0ef72a64930b
Thu Oct 19 09:35:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
1887 return layout_new_with_geometry(path, popped, hidden, NULL); |
0ef72a64930b
Thu Oct 19 09:35:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
1888 } |
0ef72a64930b
Thu Oct 19 09:35:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
1889 |
0ef72a64930b
Thu Oct 19 09:35:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
1890 LayoutWindow *layout_new_with_geometry(const gchar *path, gint popped, gint hidden, |
0ef72a64930b
Thu Oct 19 09:35:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
1891 const gchar *geometry) |
0ef72a64930b
Thu Oct 19 09:35:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
1892 { |
9 | 1893 LayoutWindow *lw; |
81
0ef72a64930b
Thu Oct 19 09:35:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
1894 GdkGeometry hint; |
0ef72a64930b
Thu Oct 19 09:35:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
1895 GdkWindowHints hint_mask; |
9 | 1896 |
1897 lw = g_new0(LayoutWindow, 1); | |
1898 | |
340
77103f3f2cb1
Rename option thumbnails.enabled to layout.show_thumbnails as it makes
zas_
parents:
339
diff
changeset
|
1899 lw->thumbs_enabled = options->layout.show_thumbnails; |
9 | 1900 lw->sort_method = SORT_NAME; |
1901 lw->sort_ascend = TRUE; | |
1902 | |
1903 lw->tools_float = popped; | |
1904 lw->tools_hidden = hidden; | |
1905 | |
338
41c3cb73120f
Rename window options (moved to layout) and re-order rc file.
zas_
parents:
333
diff
changeset
|
1906 lw->toolbar_hidden = options->layout.toolbar_hidden; |
9 | 1907 |
1908 lw->utility_box = NULL; | |
1909 lw->bar_sort = NULL; | |
1910 lw->bar_sort_enabled = FALSE; | |
1911 lw->bar_exif = NULL; | |
1912 lw->bar_exif_enabled = FALSE; | |
1913 lw->bar_exif_size = -1; | |
1914 lw->bar_exif_advanced = FALSE; | |
1915 | |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
270
diff
changeset
|
1916 lw->histogram_enabled = FALSE; |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
270
diff
changeset
|
1917 |
9 | 1918 /* default layout */ |
1919 | |
327 | 1920 layout_config_parse(options->layout.style, options->layout.order, |
9 | 1921 &lw->dir_location, &lw->file_location, &lw->image_location); |
327 | 1922 lw->tree_view = options->layout.view_as_tree; |
1923 lw->icon_view = options->layout.view_as_icons; | |
9 | 1924 |
1925 /* divider positions */ | |
1926 | |
338
41c3cb73120f
Rename window options (moved to layout) and re-order rc file.
zas_
parents:
333
diff
changeset
|
1927 if (options->layout.save_window_positions) |
9 | 1928 { |
338
41c3cb73120f
Rename window options (moved to layout) and re-order rc file.
zas_
parents:
333
diff
changeset
|
1929 lw->div_h = options->layout.main_window.hdivider_pos; |
41c3cb73120f
Rename window options (moved to layout) and re-order rc file.
zas_
parents:
333
diff
changeset
|
1930 lw->div_v = options->layout.main_window.vdivider_pos; |
41c3cb73120f
Rename window options (moved to layout) and re-order rc file.
zas_
parents:
333
diff
changeset
|
1931 lw->div_float = options->layout.float_window.vdivider_pos; |
9 | 1932 } |
1933 else | |
1934 { | |
1935 lw->div_h = MAIN_WINDOW_DIV_HPOS; | |
1936 lw->div_v = MAIN_WINDOW_DIV_VPOS; | |
1937 lw->div_float = MAIN_WINDOW_DIV_VPOS; | |
1938 } | |
1939 | |
1940 /* window */ | |
1941 | |
289
6a7298988a7a
Simplify and unify gtk_window creation with the help of
zas_
parents:
288
diff
changeset
|
1942 lw->window = window_new(GTK_WINDOW_TOPLEVEL, GQ_WMCLASS, NULL, NULL, NULL); |
9 | 1943 gtk_window_set_resizable(GTK_WINDOW(lw->window), TRUE); |
1944 gtk_container_set_border_width(GTK_CONTAINER(lw->window), 0); | |
1945 | |
338
41c3cb73120f
Rename window options (moved to layout) and re-order rc file.
zas_
parents:
333
diff
changeset
|
1946 if (options->layout.save_window_positions) |
9 | 1947 { |
81
0ef72a64930b
Thu Oct 19 09:35:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
1948 hint_mask = GDK_HINT_USER_POS; |
9 | 1949 } |
1950 else | |
1951 { | |
81
0ef72a64930b
Thu Oct 19 09:35:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
1952 hint_mask = 0; |
9 | 1953 } |
1954 | |
81
0ef72a64930b
Thu Oct 19 09:35:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
1955 hint.min_width = 32; |
0ef72a64930b
Thu Oct 19 09:35:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
1956 hint.min_height = 32; |
0ef72a64930b
Thu Oct 19 09:35:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
1957 hint.base_width = 0; |
0ef72a64930b
Thu Oct 19 09:35:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
1958 hint.base_height = 0; |
0ef72a64930b
Thu Oct 19 09:35:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
1959 gtk_window_set_geometry_hints(GTK_WINDOW(lw->window), NULL, &hint, |
0ef72a64930b
Thu Oct 19 09:35:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
1960 GDK_HINT_MIN_SIZE | GDK_HINT_BASE_SIZE | hint_mask); |
9 | 1961 |
338
41c3cb73120f
Rename window options (moved to layout) and re-order rc file.
zas_
parents:
333
diff
changeset
|
1962 if (options->layout.save_window_positions) |
9 | 1963 { |
338
41c3cb73120f
Rename window options (moved to layout) and re-order rc file.
zas_
parents:
333
diff
changeset
|
1964 gtk_window_set_default_size(GTK_WINDOW(lw->window), options->layout.main_window.w, options->layout.main_window.h); |
9 | 1965 if (!layout_window_list) |
1966 { | |
338
41c3cb73120f
Rename window options (moved to layout) and re-order rc file.
zas_
parents:
333
diff
changeset
|
1967 gtk_window_move(GTK_WINDOW(lw->window), options->layout.main_window.x, options->layout.main_window.y); |
41c3cb73120f
Rename window options (moved to layout) and re-order rc file.
zas_
parents:
333
diff
changeset
|
1968 if (options->layout.main_window.maximized) gtk_window_maximize(GTK_WINDOW(lw->window)); |
9 | 1969 } |
1970 } | |
1971 else | |
1972 { | |
1973 gtk_window_set_default_size(GTK_WINDOW(lw->window), MAINWINDOW_DEF_WIDTH, MAINWINDOW_DEF_HEIGHT); | |
1974 } | |
1975 | |
1976 g_signal_connect(G_OBJECT(lw->window), "delete_event", | |
1977 G_CALLBACK(layout_delete_cb), lw); | |
1978 | |
1979 layout_keyboard_init(lw, lw->window); | |
1980 | |
1981 lw->main_box = gtk_vbox_new(FALSE, 0); | |
1982 gtk_container_add(GTK_CONTAINER(lw->window), lw->main_box); | |
1983 gtk_widget_show(lw->main_box); | |
1984 | |
1985 layout_grid_setup(lw); | |
1986 image_top_window_set_sync(lw->image, (lw->tools_float || lw->tools_hidden)); | |
1987 | |
1988 layout_util_sync(lw); | |
1989 layout_status_update_all(lw); | |
1990 | |
1991 if (path) | |
1992 { | |
1993 layout_set_path(lw, path); | |
1994 } | |
1995 else | |
1996 { | |
1997 GdkPixbuf *pixbuf; | |
1998 | |
1999 pixbuf = pixbuf_inline(PIXBUF_INLINE_LOGO); | |
2000 image_change_pixbuf(lw->image, pixbuf, 1.0); | |
2001 gdk_pixbuf_unref(pixbuf); | |
2002 } | |
2003 | |
2004 /* set up the time stat timeout */ | |
2005 lw->last_time = 0; | |
2006 lw->last_time_id = g_timeout_add(5000, layout_check_for_update_cb, lw); | |
2007 | |
81
0ef72a64930b
Thu Oct 19 09:35:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
2008 if (geometry) |
0ef72a64930b
Thu Oct 19 09:35:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
2009 { |
0ef72a64930b
Thu Oct 19 09:35:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
2010 if (!gtk_window_parse_geometry(GTK_WINDOW(lw->window), geometry)) |
0ef72a64930b
Thu Oct 19 09:35:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
2011 { |
0ef72a64930b
Thu Oct 19 09:35:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
2012 print_term(_("Invalid geometry\n")); |
0ef72a64930b
Thu Oct 19 09:35:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
2013 } |
0ef72a64930b
Thu Oct 19 09:35:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
2014 } |
0ef72a64930b
Thu Oct 19 09:35:18 2006 John Ellis <johne@verizon.net>
gqview
parents:
41
diff
changeset
|
2015 |
9 | 2016 gtk_widget_show(lw->window); |
2017 layout_tools_hide(lw, lw->tools_hidden); | |
2018 | |
2019 layout_window_list = g_list_append(layout_window_list, lw); | |
2020 | |
2021 return lw; | |
2022 } | |
2023 | |
2024 /* | |
2025 *----------------------------------------------------------------------------- | |
2026 * maintenance (for rename, move, remove) | |
2027 *----------------------------------------------------------------------------- | |
2028 */ | |
2029 | |
2030 static void layout_real_time_update(LayoutWindow *lw) | |
2031 { | |
2032 /* this resets the last time stamp of path so that a refresh does not occur | |
2033 * from an internal file operation. | |
2034 */ | |
2035 | |
2036 if (lw->path) lw->last_time = filetime(lw->path); | |
2037 } | |
2038 | |
138 | 2039 static void layout_real_renamed(LayoutWindow *lw, FileData *fd) |
9 | 2040 { |
2041 gint update = FALSE; | |
2042 | |
138 | 2043 if (lw->image) layout_image_maint_renamed(lw, fd); |
9 | 2044 |
138 | 2045 if (lw->vfl) update |= vflist_maint_renamed(lw->vfl, fd); |
2046 if (lw->vfi) update |= vficon_maint_renamed(lw->vfi, fd); | |
9 | 2047 |
2048 if (update) layout_real_time_update(lw); | |
2049 } | |
2050 | |
138 | 2051 static void layout_real_removed(LayoutWindow *lw, FileData *fd, GList *ignore_list) |
9 | 2052 { |
2053 gint update = FALSE; | |
2054 | |
138 | 2055 if (lw->image) layout_image_maint_removed(lw, fd); |
9 | 2056 |
138 | 2057 if (lw->vfl) update |= vflist_maint_removed(lw->vfl, fd, ignore_list); |
2058 if (lw->vfi) update |= vficon_maint_removed(lw->vfi, fd, ignore_list); | |
9 | 2059 |
2060 if (update) layout_real_time_update(lw); | |
2061 } | |
2062 | |
138 | 2063 static void layout_real_moved(LayoutWindow *lw, FileData *fd, GList *ignore_list) |
9 | 2064 { |
2065 gint update = FALSE; | |
2066 | |
138 | 2067 if (lw->image) layout_image_maint_moved(lw, fd); |
9 | 2068 |
138 | 2069 if (lw->vfl) update |= vflist_maint_moved(lw->vfl, fd, ignore_list); |
2070 if (lw->vfi) update |= vficon_maint_moved(lw->vfi, fd, ignore_list); | |
9 | 2071 |
2072 if (update) layout_real_time_update(lw); | |
2073 } | |
2074 | |
138 | 2075 void layout_maint_renamed(FileData *fd) |
9 | 2076 { |
2077 GList *work = layout_window_list; | |
2078 while (work) | |
2079 { | |
2080 LayoutWindow *lw = work->data; | |
2081 work = work->next; | |
2082 | |
138 | 2083 layout_real_renamed(lw, fd); |
9 | 2084 } |
2085 } | |
2086 | |
138 | 2087 void layout_maint_removed(FileData *fd, GList *ignore_list) |
9 | 2088 { |
2089 GList *work = layout_window_list; | |
2090 while (work) | |
2091 { | |
2092 LayoutWindow *lw = work->data; | |
2093 work = work->next; | |
2094 | |
138 | 2095 layout_real_removed(lw, fd, ignore_list); |
9 | 2096 } |
2097 } | |
2098 | |
138 | 2099 void layout_maint_moved(FileData *fd, GList *ignore_list) |
9 | 2100 { |
2101 GList *work = layout_window_list; | |
2102 while (work) | |
2103 { | |
2104 LayoutWindow *lw = work->data; | |
2105 work = work->next; | |
2106 | |
138 | 2107 layout_real_moved(lw, fd, ignore_list); |
9 | 2108 } |
2109 } |