Mercurial > geeqie
comparison src/preferences.c @ 9:d907d608745f
Sync to GQview 1.5.9 release.
########
DO NOT BASE ENHANCEMENTS OR TRANSLATION UPDATES ON CODE IN THIS CVS!
This CVS is never up to date with current development and is provided
solely for reference purposes, please use the latest official release
package when making any changes or translation updates.
########
author | gqview |
---|---|
date | Sat, 26 Feb 2005 00:13:35 +0000 |
parents | |
children | 25335c62cd9b |
comparison
equal
deleted
inserted
replaced
8:e0d0593d519e | 9:d907d608745f |
---|---|
1 /* | |
2 * GQview | |
3 * (C) 2004 John Ellis | |
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 | |
12 | |
13 #include "gqview.h" | |
14 #include "preferences.h" | |
15 | |
16 #include "cache_maint.h" | |
17 #include "editors.h" | |
18 #include "filelist.h" | |
19 #include "fullscreen.h" | |
20 #include "img-view.h" | |
21 #include "layout_config.h" | |
22 #include "layout_util.h" | |
23 #include "pixbuf_util.h" | |
24 #include "slideshow.h" | |
25 #include "utilops.h" | |
26 #include "ui_fileops.h" | |
27 #include "ui_misc.h" | |
28 #include "ui_tabcomp.h" | |
29 #include "ui_utildlg.h" | |
30 | |
31 #include "icons/config.xpm" | |
32 | |
33 #include <math.h> | |
34 | |
35 | |
36 #define EDITOR_NAME_MAX_LENGTH 32 | |
37 #define EDITOR_COMMAND_MAX_LENGTH 1024 | |
38 | |
39 | |
40 typedef struct _ThumbSize ThumbSize; | |
41 struct _ThumbSize | |
42 { | |
43 gint w; | |
44 gint h; | |
45 }; | |
46 | |
47 static ThumbSize thumb_size_list[] = | |
48 { | |
49 { 24, 24 }, | |
50 { 32, 32 }, | |
51 { 48, 48 }, | |
52 { 64, 64 }, | |
53 { 96, 72 }, | |
54 { 96, 96 }, | |
55 { 128, 96 }, | |
56 { 128, 128 }, | |
57 { 160, 120 }, | |
58 { 160, 160 }, | |
59 { 192, 144 }, | |
60 { 192, 192 }, | |
61 { 256, 192 }, | |
62 { 256, 256 } | |
63 }; | |
64 | |
65 enum { | |
66 FE_ENABLE, | |
67 FE_EXTENSION, | |
68 FE_DESCRIPTION | |
69 }; | |
70 | |
71 /* config memory values */ | |
72 static gint startup_path_enable_c; | |
73 static gint confirm_delete_c; | |
74 static gint enable_delete_key_c; | |
75 static gint safe_delete_enable_c; | |
76 static gint safe_delete_size_c; | |
77 static gint restore_tool_c; | |
78 static gint save_window_positions_c; | |
79 static gint zoom_mode_c; | |
80 static gint two_pass_zoom_c; | |
81 static gint fit_window_c; | |
82 static gint limit_window_size_c; | |
83 static gint zoom_to_fit_expands_c; | |
84 static gint max_window_size_c; | |
85 static gint progressive_key_scrolling_c; | |
86 static gint thumb_max_width_c; | |
87 static gint thumb_max_height_c; | |
88 static gint enable_thumb_caching_c; | |
89 static gint enable_thumb_dirs_c; | |
90 static gint use_xvpics_thumbnails_c; | |
91 static gint thumbnail_spec_standard_c; | |
92 static gint enable_metadata_dirs_c; | |
93 static gint show_dot_files_c; | |
94 static gint file_filter_disable_c; | |
95 static gint file_sort_case_sensitive_c; | |
96 static gint slideshow_delay_c; | |
97 static gint slideshow_random_c; | |
98 static gint slideshow_repeat_c; | |
99 | |
100 static gint mousewheel_scrolls_c; | |
101 | |
102 static gint enable_in_place_rename_c; | |
103 | |
104 static gint collection_rectangular_selection_c; | |
105 | |
106 static gint tile_cache_max_c; | |
107 | |
108 static gint thumbnail_quality_c; | |
109 static gint zoom_quality_c; | |
110 | |
111 static gint zoom_increment_c; | |
112 | |
113 static gint enable_read_ahead_c; | |
114 | |
115 static gint black_window_background_c; | |
116 | |
117 static gint fullscreen_screen_c; | |
118 static gint fullscreen_clean_flip_c; | |
119 static gint fullscreen_disable_saver_c; | |
120 static gint fullscreen_above_c; | |
121 | |
122 static gint dupe_custom_threshold_c; | |
123 | |
124 static GtkWidget *configwindow = NULL; | |
125 static GtkWidget *startup_path_entry; | |
126 static GtkListStore *filter_store = NULL; | |
127 static GtkWidget *editor_name_entry[GQVIEW_EDITOR_SLOTS]; | |
128 static GtkWidget *editor_command_entry[GQVIEW_EDITOR_SLOTS]; | |
129 | |
130 static GtkWidget *layout_widget; | |
131 | |
132 static GtkWidget *safe_delete_path_entry; | |
133 | |
134 static gint tree_descend_subdirs_c; | |
135 | |
136 static gint update_on_time_change_c; | |
137 static gint exif_rotate_enable_c; | |
138 | |
139 | |
140 /* | |
141 *----------------------------------------------------------------------------- | |
142 * option widget callbacks (private) | |
143 *----------------------------------------------------------------------------- | |
144 */ | |
145 | |
146 static void startup_path_set_current(GtkWidget *widget, gpointer data) | |
147 { | |
148 gtk_entry_set_text(GTK_ENTRY(startup_path_entry), layout_get_path(NULL)); | |
149 } | |
150 | |
151 static void zoom_mode_original_cb(GtkWidget *widget, gpointer data) | |
152 { | |
153 if (GTK_TOGGLE_BUTTON (widget)->active) | |
154 zoom_mode_c = ZOOM_RESET_ORIGINAL; | |
155 } | |
156 | |
157 static void zoom_mode_fit_cb(GtkWidget *widget, gpointer data) | |
158 { | |
159 if (GTK_TOGGLE_BUTTON (widget)->active) | |
160 zoom_mode_c = ZOOM_RESET_FIT_WINDOW; | |
161 } | |
162 | |
163 static void zoom_mode_none_cb(GtkWidget *widget, gpointer data) | |
164 { | |
165 if (GTK_TOGGLE_BUTTON (widget)->active) | |
166 zoom_mode_c = ZOOM_RESET_NONE; | |
167 } | |
168 | |
169 static void zoom_increment_cb(GtkWidget *spin, gpointer data) | |
170 { | |
171 zoom_increment_c = (gint)(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin)) * 10.0 + 0.01); | |
172 } | |
173 | |
174 static void slideshow_delay_cb(GtkWidget *spin, gpointer data) | |
175 { | |
176 slideshow_delay_c = (gint)(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin)) * | |
177 (double)SLIDESHOW_SUBSECOND_PRECISION + 0.01); | |
178 } | |
179 | |
180 /* | |
181 *----------------------------------------------------------------------------- | |
182 * sync progam to config window routine (private) | |
183 *----------------------------------------------------------------------------- | |
184 */ | |
185 | |
186 static void config_window_apply(void) | |
187 { | |
188 const gchar *buf; | |
189 gchar *l_conf; | |
190 gint new_style; | |
191 gint i; | |
192 gint refresh = FALSE; | |
193 | |
194 for(i = 0; i < GQVIEW_EDITOR_SLOTS; i++) | |
195 { | |
196 g_free(editor_name[i]); | |
197 editor_name[i] = NULL; | |
198 buf = gtk_entry_get_text(GTK_ENTRY(editor_name_entry[i])); | |
199 if (buf && strlen(buf) > 0) editor_name[i] = g_strdup(buf); | |
200 | |
201 g_free(editor_command[i]); | |
202 editor_command[i] = NULL; | |
203 buf = gtk_entry_get_text(GTK_ENTRY(editor_command_entry[i])); | |
204 if (buf && strlen(buf) > 0) editor_command[i] = g_strdup(buf); | |
205 } | |
206 layout_edit_update_all(); | |
207 | |
208 g_free(startup_path); | |
209 startup_path = NULL; | |
210 buf = gtk_entry_get_text(GTK_ENTRY(startup_path_entry)); | |
211 if (buf && strlen(buf) > 0) startup_path = remove_trailing_slash(buf); | |
212 | |
213 g_free(safe_delete_path); | |
214 safe_delete_path = NULL; | |
215 buf = gtk_entry_get_text(GTK_ENTRY(safe_delete_path_entry)); | |
216 if (buf && strlen(buf) > 0) safe_delete_path = remove_trailing_slash(buf); | |
217 | |
218 if (show_dot_files != show_dot_files_c) refresh = TRUE; | |
219 if (file_sort_case_sensitive != file_sort_case_sensitive_c) refresh = TRUE; | |
220 if (file_filter_disable != file_filter_disable_c) refresh = TRUE; | |
221 | |
222 startup_path_enable = startup_path_enable_c; | |
223 confirm_delete = confirm_delete_c; | |
224 enable_delete_key = enable_delete_key_c; | |
225 safe_delete_enable = safe_delete_enable_c; | |
226 safe_delete_size = safe_delete_size_c; | |
227 restore_tool = restore_tool_c; | |
228 save_window_positions = save_window_positions_c; | |
229 zoom_mode = zoom_mode_c; | |
230 two_pass_zoom = two_pass_zoom_c; | |
231 fit_window = fit_window_c; | |
232 limit_window_size = limit_window_size_c; | |
233 zoom_to_fit_expands = zoom_to_fit_expands_c; | |
234 max_window_size = max_window_size_c; | |
235 progressive_key_scrolling = progressive_key_scrolling_c; | |
236 thumb_max_width = thumb_max_width_c; | |
237 thumb_max_height = thumb_max_height_c; | |
238 enable_thumb_caching = enable_thumb_caching_c; | |
239 enable_thumb_dirs = enable_thumb_dirs_c; | |
240 use_xvpics_thumbnails = use_xvpics_thumbnails_c; | |
241 thumbnail_spec_standard = thumbnail_spec_standard_c; | |
242 enable_metadata_dirs = enable_metadata_dirs_c; | |
243 show_dot_files = show_dot_files_c; | |
244 file_sort_case_sensitive = file_sort_case_sensitive_c; | |
245 file_filter_disable = file_filter_disable_c; | |
246 | |
247 slideshow_random = slideshow_random_c; | |
248 slideshow_repeat = slideshow_repeat_c; | |
249 slideshow_delay = slideshow_delay_c; | |
250 | |
251 mousewheel_scrolls = mousewheel_scrolls_c; | |
252 | |
253 enable_in_place_rename = enable_in_place_rename_c; | |
254 | |
255 collection_rectangular_selection = collection_rectangular_selection_c; | |
256 | |
257 tile_cache_max = tile_cache_max_c; | |
258 | |
259 thumbnail_quality = thumbnail_quality_c; | |
260 zoom_quality = zoom_quality_c; | |
261 | |
262 zoom_increment = zoom_increment_c; | |
263 | |
264 enable_read_ahead = enable_read_ahead_c; | |
265 | |
266 if (black_window_background != black_window_background_c) | |
267 { | |
268 black_window_background = black_window_background_c; | |
269 | |
270 layout_colors_update(); | |
271 view_window_colors_update(); | |
272 } | |
273 | |
274 fullscreen_screen = fullscreen_screen_c; | |
275 fullscreen_clean_flip = fullscreen_clean_flip_c; | |
276 fullscreen_disable_saver = fullscreen_disable_saver_c; | |
277 fullscreen_above = fullscreen_above_c; | |
278 | |
279 update_on_time_change = update_on_time_change_c; | |
280 exif_rotate_enable = exif_rotate_enable_c; | |
281 | |
282 dupe_custom_threshold = dupe_custom_threshold_c; | |
283 | |
284 tree_descend_subdirs = tree_descend_subdirs_c; | |
285 | |
286 l_conf = layout_config_get(layout_widget, &new_style); | |
287 | |
288 if (new_style != layout_style || | |
289 (l_conf == NULL) != (layout_order == NULL) || | |
290 !layout_order || | |
291 strcmp(buf, layout_order) != 0) | |
292 { | |
293 if (refresh) filter_rebuild(); | |
294 refresh = FALSE; | |
295 | |
296 g_free(layout_order); | |
297 layout_order = l_conf; | |
298 l_conf = NULL; | |
299 | |
300 layout_style = new_style; | |
301 | |
302 layout_styles_update(); | |
303 } | |
304 | |
305 g_free(l_conf); | |
306 | |
307 if (refresh) | |
308 { | |
309 filter_rebuild(); | |
310 layout_refresh(NULL); | |
311 } | |
312 } | |
313 | |
314 /* | |
315 *----------------------------------------------------------------------------- | |
316 * config window main button callbacks (private) | |
317 *----------------------------------------------------------------------------- | |
318 */ | |
319 | |
320 static void config_window_close_cb(GtkWidget *widget, gpointer data) | |
321 { | |
322 gtk_widget_destroy(configwindow); | |
323 configwindow = NULL; | |
324 filter_store = NULL; | |
325 } | |
326 | |
327 static gint config_window_delete(GtkWidget *w, GdkEventAny *event, gpointer data) | |
328 { | |
329 config_window_close_cb(NULL, NULL); | |
330 return TRUE; | |
331 } | |
332 | |
333 static void config_window_ok_cb(GtkWidget *widget, gpointer data) | |
334 { | |
335 config_window_apply(); | |
336 config_window_close_cb(NULL, NULL); | |
337 } | |
338 | |
339 static void config_window_apply_cb(GtkWidget *widget, gpointer data) | |
340 { | |
341 config_window_apply(); | |
342 } | |
343 | |
344 /* | |
345 *----------------------------------------------------------------------------- | |
346 * config window setup (private) | |
347 *----------------------------------------------------------------------------- | |
348 */ | |
349 | |
350 static void quality_menu_cb(GtkWidget *combo, gpointer data) | |
351 { | |
352 gint *option = data; | |
353 | |
354 switch (gtk_combo_box_get_active(GTK_COMBO_BOX(combo))) | |
355 { | |
356 case 0: | |
357 default: | |
358 *option = GDK_INTERP_NEAREST; | |
359 break; | |
360 case 1: | |
361 *option = GDK_INTERP_TILES; | |
362 break; | |
363 case 2: | |
364 *option = GDK_INTERP_BILINEAR; | |
365 break; | |
366 case 3: | |
367 *option = GDK_INTERP_HYPER; | |
368 break; | |
369 } | |
370 } | |
371 | |
372 static void add_quality_menu(GtkWidget *table, gint column, gint row, const gchar *text, | |
373 gint option, gint *option_c) | |
374 { | |
375 GtkWidget *combo; | |
376 gint current = 0; | |
377 | |
378 *option_c = option; | |
379 | |
380 pref_table_label(table, column, row, text, 0.0); | |
381 | |
382 combo = gtk_combo_box_new_text(); | |
383 | |
384 gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Nearest (worst, but fastest)")); | |
385 if (option == GDK_INTERP_NEAREST) current = 0; | |
386 gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Tiles")); | |
387 if (option == GDK_INTERP_TILES) current = 1; | |
388 gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Bilinear")); | |
389 if (option == GDK_INTERP_BILINEAR) current = 2; | |
390 gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Hyper (best, but slowest)")); | |
391 if (option == GDK_INTERP_HYPER) current = 3; | |
392 | |
393 gtk_combo_box_set_active(GTK_COMBO_BOX(combo), current); | |
394 | |
395 g_signal_connect(G_OBJECT(combo), "changed", | |
396 G_CALLBACK(quality_menu_cb), option_c); | |
397 | |
398 gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1, | |
399 GTK_EXPAND | GTK_FILL, FALSE, 0, 0); | |
400 gtk_widget_show(combo); | |
401 } | |
402 | |
403 #if 0 | |
404 static void add_dither_menu(gint option, gint *option_c, gchar *text, GtkWidget *box) | |
405 { | |
406 GtkWidget *hbox; | |
407 GtkWidget *omenu; | |
408 GtkWidget *menu; | |
409 | |
410 *option_c = option; | |
411 | |
412 hbox = pref_box_new(box, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE); | |
413 pref_label_new(hbox, text); | |
414 | |
415 omenu = gtk_option_menu_new(); | |
416 menu = gtk_menu_new(); | |
417 | |
418 add_menu_item(menu, _("None"), option_c, (gint)GDK_RGB_DITHER_NONE); | |
419 add_menu_item(menu, _("Normal"), option_c, (gint)GDK_RGB_DITHER_NORMAL); | |
420 add_menu_item(menu, _("Best"), option_c, (gint)GDK_RGB_DITHER_MAX); | |
421 | |
422 gtk_option_menu_set_menu(GTK_OPTION_MENU(omenu), menu); | |
423 gtk_option_menu_set_history(GTK_OPTION_MENU(omenu), *option_c); | |
424 | |
425 gtk_box_pack_start(GTK_BOX(hbox), omenu, FALSE, FALSE, 0); | |
426 gtk_widget_show(omenu); | |
427 } | |
428 #endif | |
429 | |
430 static void thumb_size_menu_cb(GtkWidget *combo, gpointer data) | |
431 { | |
432 gint n; | |
433 | |
434 n = gtk_combo_box_get_active(GTK_COMBO_BOX(combo)); | |
435 | |
436 if (n >= 0 && n < sizeof(thumb_size_list) / sizeof(ThumbSize)) | |
437 { | |
438 thumb_max_width_c = thumb_size_list[n].w; | |
439 thumb_max_height_c = thumb_size_list[n].h; | |
440 } | |
441 else if (n > 0) | |
442 { | |
443 thumb_max_width_c = thumb_max_width; | |
444 thumb_max_height_c = thumb_max_height; | |
445 } | |
446 } | |
447 | |
448 static void add_thumb_size_menu(GtkWidget *table, gint column, gint row, gchar *text) | |
449 { | |
450 GtkWidget *combo; | |
451 gint current; | |
452 gint last_w, last_h; | |
453 gint i; | |
454 gint c; | |
455 | |
456 thumb_max_width_c = thumb_max_width; | |
457 thumb_max_height_c = thumb_max_height; | |
458 | |
459 pref_table_label(table, column, row, text, 0.0); | |
460 | |
461 combo = gtk_combo_box_new_text(); | |
462 | |
463 last_w = last_h = 0; | |
464 current = -1; | |
465 i = 0; | |
466 c = TRUE; | |
467 while (c) | |
468 { | |
469 gint w, h; | |
470 | |
471 w = thumb_size_list[i].w; | |
472 h = thumb_size_list[i].h; | |
473 | |
474 if ( w > 0 && h > 0) | |
475 { | |
476 gchar *buf; | |
477 | |
478 buf = g_strdup_printf("%d x %d", w, h); | |
479 gtk_combo_box_append_text(GTK_COMBO_BOX(combo), buf); | |
480 g_free(buf); | |
481 | |
482 if (w == thumb_max_width && h == thumb_max_height) current = i; | |
483 | |
484 last_w = w; | |
485 last_h = h; | |
486 } | |
487 else | |
488 { | |
489 c = FALSE; | |
490 } | |
491 i++; | |
492 } | |
493 | |
494 if (current == -1) | |
495 { | |
496 gchar *buf; | |
497 | |
498 buf = g_strdup_printf("%s %d x %d", _("Custom"), thumb_max_width, thumb_max_height); | |
499 gtk_combo_box_append_text(GTK_COMBO_BOX(combo), buf); | |
500 g_free(buf); | |
501 | |
502 current = i - 1; | |
503 } | |
504 | |
505 gtk_combo_box_set_active(GTK_COMBO_BOX(combo), current); | |
506 g_signal_connect(G_OBJECT(combo), "changed", | |
507 G_CALLBACK(thumb_size_menu_cb), NULL); | |
508 | |
509 gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1, | |
510 GTK_EXPAND | GTK_FILL, FALSE, 0, 0); | |
511 gtk_widget_show(combo); | |
512 } | |
513 | |
514 static void filter_store_populate(void) | |
515 { | |
516 GList *work; | |
517 | |
518 if (!filter_store) return; | |
519 | |
520 gtk_list_store_clear(filter_store); | |
521 | |
522 work = filter_get_list(); | |
523 while (work) | |
524 { | |
525 FilterEntry *fe; | |
526 GtkTreeIter iter; | |
527 | |
528 fe = work->data; | |
529 work = work->next; | |
530 | |
531 gtk_list_store_append(filter_store, &iter); | |
532 gtk_list_store_set(filter_store, &iter, 0, fe, -1); | |
533 } | |
534 } | |
535 | |
536 static void filter_store_ext_edit_cb(GtkCellRendererText *cell, gchar *path_str, | |
537 gchar *new_text, gpointer data) | |
538 { | |
539 GtkWidget *model = data; | |
540 FilterEntry *fe = data; | |
541 GtkTreePath *tpath; | |
542 GtkTreeIter iter; | |
543 | |
544 if (!new_text || strlen(new_text) < 1) return; | |
545 | |
546 tpath = gtk_tree_path_new_from_string(path_str); | |
547 gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, tpath); | |
548 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &fe, -1); | |
549 | |
550 g_free(fe->extensions); | |
551 fe->extensions = g_strdup(new_text); | |
552 | |
553 gtk_tree_path_free(tpath); | |
554 filter_rebuild(); | |
555 } | |
556 | |
557 static void filter_store_desc_edit_cb(GtkCellRendererText *cell, gchar *path_str, | |
558 gchar *new_text, gpointer data) | |
559 { | |
560 GtkWidget *model = data; | |
561 FilterEntry *fe; | |
562 GtkTreePath *tpath; | |
563 GtkTreeIter iter; | |
564 | |
565 if (!new_text || strlen(new_text) < 1) return; | |
566 | |
567 tpath = gtk_tree_path_new_from_string(path_str); | |
568 gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, tpath); | |
569 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &fe, -1); | |
570 | |
571 g_free(fe->description); | |
572 fe->description = g_strdup(new_text); | |
573 | |
574 gtk_tree_path_free(tpath); | |
575 } | |
576 | |
577 static void filter_store_enable_cb(GtkCellRendererToggle *renderer, | |
578 gchar *path_str, gpointer data) | |
579 { | |
580 GtkWidget *model = data; | |
581 FilterEntry *fe; | |
582 GtkTreePath *tpath; | |
583 GtkTreeIter iter; | |
584 | |
585 tpath = gtk_tree_path_new_from_string(path_str); | |
586 gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, tpath); | |
587 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &fe, -1); | |
588 | |
589 fe->enabled = !fe->enabled; | |
590 | |
591 gtk_tree_path_free(tpath); | |
592 filter_rebuild(); | |
593 } | |
594 | |
595 static void filter_set_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, | |
596 GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data) | |
597 { | |
598 FilterEntry *fe; | |
599 | |
600 gtk_tree_model_get(tree_model, iter, 0, &fe, -1); | |
601 | |
602 switch(GPOINTER_TO_INT(data)) | |
603 { | |
604 case FE_ENABLE: | |
605 g_object_set(GTK_CELL_RENDERER(cell), | |
606 "active", fe->enabled, NULL); | |
607 break; | |
608 case FE_EXTENSION: | |
609 g_object_set(GTK_CELL_RENDERER(cell), | |
610 "text", fe->extensions, NULL); | |
611 break; | |
612 case FE_DESCRIPTION: | |
613 g_object_set(GTK_CELL_RENDERER(cell), | |
614 "text", fe->description, NULL); | |
615 break; | |
616 } | |
617 } | |
618 | |
619 static void filter_add_cb(GtkWidget *widget, gpointer data) | |
620 { | |
621 filter_add_unique("description", ".new", TRUE); | |
622 filter_store_populate(); | |
623 | |
624 /* FIXME: implement the scroll to/select row stuff for tree view */ | |
625 } | |
626 | |
627 static void filter_remove_cb(GtkWidget *widget, gpointer data) | |
628 { | |
629 GtkWidget *filter_view = data; | |
630 GtkTreeSelection *selection; | |
631 GtkTreeIter iter; | |
632 FilterEntry *fe; | |
633 | |
634 if (!filter_store) return; | |
635 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(filter_view)); | |
636 if (!gtk_tree_selection_get_selected(selection, NULL, &iter)) return; | |
637 gtk_tree_model_get(GTK_TREE_MODEL(filter_store), &iter, 0, &fe, -1); | |
638 if (!fe) return; | |
639 | |
640 filter_remove_entry(fe); | |
641 filter_rebuild(); | |
642 filter_store_populate(); | |
643 } | |
644 | |
645 static void filter_default_ok_cb(GenericDialog *gd, gpointer data) | |
646 { | |
647 filter_reset(); | |
648 filter_add_defaults(); | |
649 filter_rebuild(); | |
650 filter_store_populate(); | |
651 } | |
652 | |
653 static void dummy_cancel_cb(GenericDialog *gd, gpointer data) | |
654 { | |
655 /* no op, only so cancel button appears */ | |
656 } | |
657 | |
658 static void filter_default_cb(GtkWidget *widget, gpointer data) | |
659 { | |
660 GenericDialog *gd; | |
661 | |
662 gd = generic_dialog_new(_("Reset filters"), | |
663 "GQview", "reset_filter", widget, TRUE, | |
664 dummy_cancel_cb, NULL); | |
665 generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Reset filters"), | |
666 _("This will reset the file filters to the defaults.\nContinue?")); | |
667 generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, filter_default_ok_cb, TRUE); | |
668 gtk_widget_show(gd->dialog); | |
669 } | |
670 | |
671 static void filter_disable_cb(GtkWidget* widget, gpointer data) | |
672 { | |
673 GtkWidget *frame = data; | |
674 | |
675 gtk_widget_set_sensitive(frame, | |
676 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))); | |
677 } | |
678 | |
679 static void editor_default_ok_cb(GenericDialog *gd, gpointer data) | |
680 { | |
681 gint i; | |
682 | |
683 editor_reset_defaults(); | |
684 if (!configwindow) return; | |
685 | |
686 for (i = 0; i < GQVIEW_EDITOR_SLOTS; i++) | |
687 { | |
688 gtk_entry_set_text(GTK_ENTRY(editor_name_entry[i]), | |
689 (editor_name[i]) ? editor_name[i] : ""); | |
690 gtk_entry_set_text(GTK_ENTRY(editor_command_entry[i]), | |
691 (editor_command[i]) ? editor_command[i] : ""); | |
692 } | |
693 } | |
694 | |
695 static void editor_default_cb(GtkWidget *widget, gpointer data) | |
696 { | |
697 GenericDialog *gd; | |
698 | |
699 gd = generic_dialog_new(_("Reset editors"), | |
700 "GQview", "reset_filter", widget, TRUE, | |
701 dummy_cancel_cb, NULL); | |
702 generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Reset editors"), | |
703 _("This will reset the edit commands to the defaults.\nContinue?")); | |
704 generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, editor_default_ok_cb, TRUE); | |
705 gtk_widget_show(gd->dialog); | |
706 } | |
707 | |
708 static void editor_help_cb(GtkWidget *widget, gpointer data) | |
709 { | |
710 help_window_show("editors"); | |
711 } | |
712 | |
713 static void safe_delete_view_cb(GtkWidget* widget, gpointer data) | |
714 { | |
715 layout_set_path(NULL, gtk_entry_get_text(GTK_ENTRY(safe_delete_path_entry))); | |
716 } | |
717 | |
718 static void safe_delete_clear_ok_cb(GenericDialog *gd, gpointer data) | |
719 { | |
720 file_util_trash_clear(); | |
721 } | |
722 | |
723 static void safe_delete_clear_cb(GtkWidget* widget, gpointer data) | |
724 { | |
725 GenericDialog *gd; | |
726 GtkWidget *entry; | |
727 gd = generic_dialog_new(_("Clear trash"), | |
728 "GQview", "clear_trash", widget, TRUE, | |
729 dummy_cancel_cb, NULL); | |
730 generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Clear trash"), | |
731 _("This will remove the trash contents.")); | |
732 generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, safe_delete_clear_ok_cb, TRUE); | |
733 entry = gtk_entry_new(); | |
734 GTK_WIDGET_UNSET_FLAGS(entry, GTK_CAN_FOCUS); | |
735 gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE); | |
736 if (safe_delete_path) gtk_entry_set_text(GTK_ENTRY(entry), safe_delete_path); | |
737 gtk_box_pack_start(GTK_BOX(gd->vbox), entry, FALSE, FALSE, 0); | |
738 gtk_widget_show(entry); | |
739 gtk_widget_show(gd->dialog); | |
740 } | |
741 | |
742 static void config_window_create(void) | |
743 { | |
744 GtkWidget *win_vbox; | |
745 GtkWidget *hbox; | |
746 GtkWidget *notebook; | |
747 GtkWidget *frame; | |
748 GtkWidget *label; | |
749 GtkWidget *vbox; | |
750 GtkWidget *group; | |
751 GtkWidget *subgroup; | |
752 GtkWidget *button; | |
753 GtkWidget *tabcomp; | |
754 GtkWidget *ct_button; | |
755 GtkWidget *table; | |
756 GtkWidget *spin; | |
757 GtkWidget *scrolled; | |
758 GtkWidget *viewport; | |
759 GtkWidget *filter_view; | |
760 GtkCellRenderer *renderer; | |
761 GtkTreeSelection *selection; | |
762 GtkTreeViewColumn *column; | |
763 gint i; | |
764 | |
765 configwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
766 gtk_window_set_type_hint(GTK_WINDOW(configwindow), GDK_WINDOW_TYPE_HINT_DIALOG); | |
767 g_signal_connect(G_OBJECT (configwindow), "delete_event", | |
768 G_CALLBACK(config_window_delete), NULL); | |
769 gtk_window_set_resizable(GTK_WINDOW(configwindow), FALSE); | |
770 gtk_window_set_title(GTK_WINDOW(configwindow), _("GQview Preferences")); | |
771 gtk_window_set_wmclass(GTK_WINDOW(configwindow), "config", "GQview"); | |
772 gtk_container_set_border_width(GTK_CONTAINER(configwindow), PREF_PAD_BORDER); | |
773 | |
774 window_set_icon(configwindow, (const gchar **)config_xpm, NULL); | |
775 | |
776 win_vbox = gtk_vbox_new(FALSE, PREF_PAD_SPACE); | |
777 gtk_container_add(GTK_CONTAINER(configwindow), win_vbox); | |
778 gtk_widget_show(win_vbox); | |
779 | |
780 hbox = gtk_hbutton_box_new(); | |
781 gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END); | |
782 gtk_box_set_spacing(GTK_BOX(hbox), PREF_PAD_BUTTON_GAP); | |
783 gtk_box_pack_end(GTK_BOX(win_vbox), hbox, FALSE, FALSE, 0); | |
784 gtk_widget_show(hbox); | |
785 | |
786 button = pref_button_new(NULL, GTK_STOCK_OK, NULL, FALSE, | |
787 G_CALLBACK(config_window_ok_cb), NULL); | |
788 gtk_container_add(GTK_CONTAINER(hbox), button); | |
789 GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); | |
790 gtk_widget_grab_default(button); | |
791 gtk_widget_show(button); | |
792 | |
793 ct_button = button; | |
794 | |
795 button = pref_button_new(NULL, GTK_STOCK_APPLY, NULL, FALSE, | |
796 G_CALLBACK(config_window_apply_cb), NULL); | |
797 gtk_container_add(GTK_CONTAINER(hbox), button); | |
798 GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); | |
799 gtk_widget_show(button); | |
800 | |
801 button = pref_button_new(NULL, GTK_STOCK_CANCEL, NULL, FALSE, | |
802 G_CALLBACK(config_window_close_cb), NULL); | |
803 gtk_container_add(GTK_CONTAINER(hbox), button); | |
804 GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); | |
805 gtk_widget_show(button); | |
806 | |
807 if (!generic_dialog_get_alternative_button_order(configwindow)) | |
808 { | |
809 gtk_box_reorder_child(GTK_BOX(hbox), ct_button, -1); | |
810 } | |
811 | |
812 notebook = gtk_notebook_new(); | |
813 gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook), GTK_POS_TOP); | |
814 gtk_box_pack_start(GTK_BOX(win_vbox), notebook, TRUE, TRUE, 0); | |
815 | |
816 /* general options tab */ | |
817 | |
818 vbox = gtk_vbox_new(FALSE, 0); | |
819 gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER); | |
820 gtk_widget_show(vbox); | |
821 label = gtk_label_new(_("General")); | |
822 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, label); | |
823 | |
824 group = pref_group_new(vbox, FALSE, _("Startup"), GTK_ORIENTATION_VERTICAL); | |
825 | |
826 button = pref_checkbox_new_int(group, _("Change to folder:"), | |
827 startup_path_enable, &startup_path_enable_c); | |
828 | |
829 hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE); | |
830 pref_checkbox_link_sensitivity(button, hbox); | |
831 | |
832 tabcomp = tab_completion_new(&startup_path_entry, startup_path, NULL, NULL); | |
833 tab_completion_add_select_button(startup_path_entry, NULL, TRUE); | |
834 gtk_box_pack_start(GTK_BOX(hbox), tabcomp, TRUE, TRUE, 0); | |
835 gtk_widget_show(tabcomp); | |
836 | |
837 button = pref_button_new(hbox, NULL, _("Use current"), FALSE, | |
838 G_CALLBACK(startup_path_set_current), NULL); | |
839 | |
840 group = pref_group_new(vbox, FALSE, _("Thumbnails"), GTK_ORIENTATION_VERTICAL); | |
841 | |
842 table = pref_table_new(group, 2, 2, FALSE, FALSE); | |
843 add_thumb_size_menu(table, 0, 0, _("Size:")); | |
844 add_quality_menu(table, 0, 1, _("Quality:"), thumbnail_quality, &thumbnail_quality_c); | |
845 | |
846 ct_button = pref_checkbox_new_int(group, _("Cache thumbnails"), | |
847 enable_thumb_caching, &enable_thumb_caching_c); | |
848 | |
849 subgroup = pref_box_new(group, FALSE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP); | |
850 pref_checkbox_link_sensitivity(ct_button, subgroup); | |
851 | |
852 button = pref_checkbox_new_int(subgroup, _("Use shared thumbnail cache"), | |
853 thumbnail_spec_standard, &thumbnail_spec_standard_c); | |
854 | |
855 subgroup = pref_box_new(subgroup, FALSE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP); | |
856 pref_checkbox_link_sensitivity_swap(button, subgroup); | |
857 | |
858 button = pref_checkbox_new_int(subgroup, _("Cache thumbnails into .thumbnails"), | |
859 enable_thumb_dirs, &enable_thumb_dirs_c); | |
860 | |
861 button = pref_checkbox_new_int(subgroup, _("Use xvpics thumbnails when found (read only)"), | |
862 use_xvpics_thumbnails, &use_xvpics_thumbnails_c); | |
863 | |
864 group = pref_group_new(vbox, FALSE, _("Slide show"), GTK_ORIENTATION_VERTICAL); | |
865 | |
866 slideshow_delay_c = slideshow_delay; | |
867 spin = pref_spin_new(group, _("Delay between image change:"), _("seconds"), | |
868 SLIDESHOW_MIN_SECONDS, SLIDESHOW_MAX_SECONDS, 1.0, 1, | |
869 slideshow_delay ? (double)slideshow_delay / SLIDESHOW_SUBSECOND_PRECISION : 10.0, | |
870 G_CALLBACK(slideshow_delay_cb), NULL); | |
871 gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(spin), GTK_UPDATE_ALWAYS); | |
872 | |
873 pref_checkbox_new_int(group, _("Random"), slideshow_random, &slideshow_random_c); | |
874 pref_checkbox_new_int(group, _("Repeat"), slideshow_repeat, &slideshow_repeat_c); | |
875 | |
876 /* image tab */ | |
877 | |
878 vbox = gtk_vbox_new(FALSE, 0); | |
879 gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER); | |
880 gtk_widget_show(vbox); | |
881 label = gtk_label_new(_("Image")); | |
882 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); | |
883 | |
884 group = pref_group_new(vbox, FALSE, _("Zoom"), GTK_ORIENTATION_VERTICAL); | |
885 | |
886 #if 0 | |
887 add_dither_menu(dither_quality, &dither_quality_c, _("Dithering method:"), group); | |
888 #endif | |
889 table = pref_table_new(group, 2, 1, FALSE, FALSE); | |
890 add_quality_menu(table, 0, 0, _("Quality:"), zoom_quality, &zoom_quality_c); | |
891 | |
892 pref_checkbox_new_int(group, _("Two pass zooming"), | |
893 two_pass_zoom, &two_pass_zoom_c); | |
894 | |
895 pref_checkbox_new_int(group, _("Allow enlargement of image for zoom to fit."), | |
896 zoom_to_fit_expands, &zoom_to_fit_expands_c); | |
897 | |
898 zoom_increment_c = zoom_increment; | |
899 spin = pref_spin_new(group, _("Zoom increment:"), NULL, | |
900 0.1, 4.0, 1.0, 1, (float)zoom_increment / 10.0, | |
901 G_CALLBACK(zoom_increment_cb), NULL); | |
902 gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(spin), GTK_UPDATE_ALWAYS); | |
903 | |
904 group = pref_group_new(vbox, FALSE, _("When new image is selected:"), GTK_ORIENTATION_VERTICAL); | |
905 | |
906 zoom_mode_c = zoom_mode; | |
907 button = pref_radiobutton_new(group, NULL, _("Zoom to original size"), | |
908 (zoom_mode == ZOOM_RESET_ORIGINAL), | |
909 G_CALLBACK(zoom_mode_original_cb), NULL); | |
910 button = pref_radiobutton_new(group, button, _("Fit image to window"), | |
911 (zoom_mode == ZOOM_RESET_FIT_WINDOW), | |
912 G_CALLBACK(zoom_mode_fit_cb), NULL); | |
913 button = pref_radiobutton_new(group, button, _("Leave Zoom at previous setting"), | |
914 (zoom_mode == ZOOM_RESET_NONE), | |
915 G_CALLBACK(zoom_mode_none_cb), NULL); | |
916 | |
917 group = pref_group_new(vbox, FALSE, _("Appearance"), GTK_ORIENTATION_VERTICAL); | |
918 | |
919 pref_checkbox_new_int(group, _("Black background"), | |
920 black_window_background, &black_window_background_c); | |
921 | |
922 group = pref_group_new(vbox, FALSE, _("Convenience"), GTK_ORIENTATION_VERTICAL); | |
923 | |
924 pref_checkbox_new_int(group, _("Refresh on file change"), | |
925 update_on_time_change, &update_on_time_change_c); | |
926 pref_checkbox_new_int(group, _("Preload next image"), | |
927 enable_read_ahead, &enable_read_ahead_c); | |
928 pref_checkbox_new_int(group, _("Auto rotate image using Exif information"), | |
929 exif_rotate_enable, &exif_rotate_enable_c); | |
930 | |
931 | |
932 /* window tab */ | |
933 | |
934 vbox = gtk_vbox_new(FALSE, 0); | |
935 gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER); | |
936 gtk_widget_show(vbox); | |
937 label = gtk_label_new(_("Windows")); | |
938 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label); | |
939 | |
940 group = pref_group_new(vbox, FALSE, _("State"), GTK_ORIENTATION_VERTICAL); | |
941 | |
942 pref_checkbox_new_int(group, _("Remember window positions"), | |
943 save_window_positions, &save_window_positions_c); | |
944 pref_checkbox_new_int(group, _("Remember tool state (float/hidden)"), | |
945 restore_tool, &restore_tool_c); | |
946 | |
947 group = pref_group_new(vbox, FALSE, _("Size"), GTK_ORIENTATION_VERTICAL); | |
948 | |
949 pref_checkbox_new_int(group, _("Fit window to image when tools are hidden/floating"), | |
950 fit_window, &fit_window_c); | |
951 | |
952 hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE); | |
953 ct_button = pref_checkbox_new_int(hbox, _("Limit size when auto-sizing window (%):"), | |
954 limit_window_size, &limit_window_size_c); | |
955 spin = pref_spin_new_int(hbox, NULL, NULL, | |
956 10, 150, 1, | |
957 max_window_size, &max_window_size_c); | |
958 pref_checkbox_link_sensitivity(ct_button, spin); | |
959 | |
960 group = pref_group_new(vbox, FALSE, _("Layout"), GTK_ORIENTATION_VERTICAL); | |
961 | |
962 layout_widget = layout_config_new(); | |
963 layout_config_set(layout_widget, layout_style, layout_order); | |
964 gtk_box_pack_start(GTK_BOX(group), layout_widget, FALSE, FALSE, 0); | |
965 gtk_widget_show(layout_widget); | |
966 | |
967 | |
968 /* filtering tab */ | |
969 | |
970 vbox = gtk_vbox_new(FALSE, 0); | |
971 gtk_container_set_border_width(GTK_CONTAINER (vbox), PREF_PAD_BORDER); | |
972 gtk_widget_show(vbox); | |
973 label = gtk_label_new(_("Filtering")); | |
974 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label); | |
975 | |
976 group = pref_box_new(vbox, FALSE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP); | |
977 | |
978 pref_checkbox_new_int(group, _("Show entries that begin with a dot"), | |
979 show_dot_files, &show_dot_files_c); | |
980 pref_checkbox_new_int(group, _("Case sensitive sort"), | |
981 file_sort_case_sensitive, &file_sort_case_sensitive_c); | |
982 | |
983 ct_button = pref_checkbox_new_int(group, _("Disable File Filtering"), | |
984 file_filter_disable, &file_filter_disable_c); | |
985 | |
986 group = pref_group_new(vbox, TRUE, _("File types"), GTK_ORIENTATION_VERTICAL); | |
987 | |
988 frame = pref_group_parent(group); | |
989 g_signal_connect(G_OBJECT(ct_button), "toggled", | |
990 G_CALLBACK(filter_disable_cb), frame); | |
991 gtk_widget_set_sensitive(frame, !file_filter_disable); | |
992 | |
993 scrolled = gtk_scrolled_window_new(NULL, NULL); | |
994 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN); | |
995 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); | |
996 gtk_box_pack_start(GTK_BOX(group), scrolled, TRUE, TRUE, 0); | |
997 gtk_widget_show(scrolled); | |
998 | |
999 filter_store = gtk_list_store_new(1, G_TYPE_POINTER); | |
1000 filter_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(filter_store)); | |
1001 g_object_unref(filter_store); | |
1002 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(filter_view)); | |
1003 gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_SINGLE); | |
1004 | |
1005 gtk_tree_view_set_enable_search(GTK_TREE_VIEW(filter_view), FALSE); | |
1006 | |
1007 column = gtk_tree_view_column_new(); | |
1008 gtk_tree_view_column_set_title(column, _("Filter")); | |
1009 gtk_tree_view_column_set_resizable(column, TRUE); | |
1010 | |
1011 renderer = gtk_cell_renderer_toggle_new(); | |
1012 g_signal_connect(G_OBJECT(renderer), "toggled", | |
1013 G_CALLBACK(filter_store_enable_cb), filter_store); | |
1014 gtk_tree_view_column_pack_start(column, renderer, FALSE); | |
1015 gtk_tree_view_column_set_cell_data_func(column, renderer, filter_set_func, | |
1016 GINT_TO_POINTER(FE_ENABLE), NULL); | |
1017 | |
1018 renderer = gtk_cell_renderer_text_new(); | |
1019 g_signal_connect(G_OBJECT(renderer), "edited", | |
1020 G_CALLBACK(filter_store_ext_edit_cb), filter_store); | |
1021 gtk_tree_view_column_pack_start(column, renderer, TRUE); | |
1022 g_object_set(G_OBJECT(renderer), "editable", (gboolean)TRUE, NULL); | |
1023 gtk_tree_view_column_set_cell_data_func(column, renderer, filter_set_func, | |
1024 GINT_TO_POINTER(FE_EXTENSION), NULL); | |
1025 gtk_tree_view_append_column(GTK_TREE_VIEW(filter_view), column); | |
1026 | |
1027 column = gtk_tree_view_column_new(); | |
1028 gtk_tree_view_column_set_title(column, _("Description")); | |
1029 gtk_tree_view_column_set_resizable(column, TRUE); | |
1030 renderer = gtk_cell_renderer_text_new(); | |
1031 g_signal_connect(G_OBJECT(renderer), "edited", | |
1032 G_CALLBACK(filter_store_desc_edit_cb), filter_store); | |
1033 g_object_set(G_OBJECT(renderer), "editable", (gboolean)TRUE, NULL); | |
1034 gtk_tree_view_column_pack_start(column, renderer, FALSE); | |
1035 gtk_tree_view_column_set_cell_data_func(column, renderer, filter_set_func, | |
1036 GINT_TO_POINTER(FE_DESCRIPTION), NULL); | |
1037 gtk_tree_view_append_column(GTK_TREE_VIEW(filter_view), column); | |
1038 | |
1039 filter_store_populate(); | |
1040 gtk_container_add(GTK_CONTAINER(scrolled), filter_view); | |
1041 gtk_widget_show(filter_view); | |
1042 | |
1043 hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_BUTTON_GAP); | |
1044 | |
1045 button = pref_button_new(NULL, NULL, _("Defaults"), FALSE, | |
1046 G_CALLBACK(filter_default_cb), NULL); | |
1047 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
1048 gtk_widget_show(button); | |
1049 | |
1050 button = pref_button_new(NULL, GTK_STOCK_REMOVE, NULL, FALSE, | |
1051 G_CALLBACK(filter_remove_cb), filter_view); | |
1052 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
1053 gtk_widget_show(button); | |
1054 | |
1055 button = pref_button_new(NULL, GTK_STOCK_ADD, NULL, FALSE, | |
1056 G_CALLBACK(filter_add_cb), NULL); | |
1057 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
1058 gtk_widget_show(button); | |
1059 | |
1060 | |
1061 /* editor entry tab */ | |
1062 | |
1063 vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP); | |
1064 gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER); | |
1065 gtk_widget_show(vbox); | |
1066 label = gtk_label_new(_("Editors")); | |
1067 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label); | |
1068 | |
1069 table = pref_table_new(vbox, 3, 9, FALSE, FALSE); | |
1070 gtk_table_set_col_spacings(GTK_TABLE(table), PREF_PAD_GAP); | |
1071 | |
1072 label = pref_table_label(table, 0, 0, _("#"), 1.0); | |
1073 pref_label_bold(label, TRUE, FALSE); | |
1074 | |
1075 label = pref_table_label(table, 1, 0, _("Menu name"), 0.0); | |
1076 pref_label_bold(label, TRUE, FALSE); | |
1077 | |
1078 label = pref_table_label(table, 2, 0, ("Command Line"), 0.0); | |
1079 pref_label_bold(label, TRUE, FALSE); | |
1080 | |
1081 for (i = 0; i < GQVIEW_EDITOR_SLOTS; i++) | |
1082 { | |
1083 gchar *buf; | |
1084 | |
1085 buf = g_strdup_printf("%d", i+1); | |
1086 pref_table_label(table, 0, i+1, buf, 1.0); | |
1087 g_free(buf); | |
1088 | |
1089 editor_name_entry[i] = gtk_entry_new(); | |
1090 gtk_entry_set_max_length(GTK_ENTRY(editor_name_entry[i]), EDITOR_NAME_MAX_LENGTH); | |
1091 gtk_widget_set_size_request(editor_name_entry[i],80,-1); | |
1092 if (editor_name[i]) gtk_entry_set_text(GTK_ENTRY(editor_name_entry[i]),editor_name[i]); | |
1093 gtk_table_attach(GTK_TABLE (table),editor_name_entry[i],1,2,i+1,i+2, | |
1094 GTK_FILL | GTK_EXPAND, FALSE, 0, 0); | |
1095 gtk_widget_show(editor_name_entry[i]); | |
1096 | |
1097 editor_command_entry[i] = gtk_entry_new(); | |
1098 gtk_entry_set_max_length(GTK_ENTRY(editor_command_entry[i]), EDITOR_COMMAND_MAX_LENGTH); | |
1099 gtk_widget_set_size_request(editor_command_entry[i],160,-1); | |
1100 tab_completion_add_to_entry(editor_command_entry[i], NULL, NULL); | |
1101 if (editor_command[i]) gtk_entry_set_text(GTK_ENTRY(editor_command_entry[i]), editor_command[i]); | |
1102 gtk_table_attach(GTK_TABLE (table),editor_command_entry[i],2,3,i+1,i+2, | |
1103 GTK_FILL | GTK_EXPAND, FALSE, 0, 0); | |
1104 gtk_widget_show(editor_command_entry[i]); | |
1105 } | |
1106 | |
1107 hbox = pref_box_new(vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_BUTTON_GAP); | |
1108 | |
1109 button = pref_button_new(NULL, NULL, _("Defaults"), FALSE, | |
1110 G_CALLBACK(editor_default_cb), NULL); | |
1111 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
1112 gtk_widget_show(button); | |
1113 | |
1114 button = pref_button_new(NULL, GTK_STOCK_HELP, NULL, FALSE, | |
1115 G_CALLBACK(editor_help_cb), NULL); | |
1116 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
1117 gtk_widget_show(button); | |
1118 | |
1119 /* advanced entry tab */ | |
1120 | |
1121 scrolled = gtk_scrolled_window_new(NULL, NULL); | |
1122 gtk_container_set_border_width(GTK_CONTAINER(scrolled), PREF_PAD_BORDER); | |
1123 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), | |
1124 GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); | |
1125 label = gtk_label_new(_("Advanced")); | |
1126 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), scrolled, label); | |
1127 gtk_widget_show(scrolled); | |
1128 | |
1129 viewport = gtk_viewport_new(NULL, NULL); | |
1130 gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE); | |
1131 gtk_container_add(GTK_CONTAINER(scrolled), viewport); | |
1132 gtk_widget_show(viewport); | |
1133 | |
1134 vbox = gtk_vbox_new(FALSE, 0); | |
1135 gtk_container_add(GTK_CONTAINER(viewport), vbox); | |
1136 gtk_widget_show(vbox); | |
1137 | |
1138 group = pref_group_new(vbox, FALSE, _("Full screen"), GTK_ORIENTATION_VERTICAL); | |
1139 | |
1140 fullscreen_screen_c = fullscreen_screen; | |
1141 fullscreen_above_c = fullscreen_above; | |
1142 hbox = fullscreen_prefs_selection_new(_("Location:"), &fullscreen_screen_c, &fullscreen_above_c); | |
1143 gtk_box_pack_start(GTK_BOX(group), hbox, FALSE, FALSE, 0); | |
1144 gtk_widget_show(hbox); | |
1145 | |
1146 pref_checkbox_new_int(group, _("Smooth image flip"), | |
1147 fullscreen_clean_flip, &fullscreen_clean_flip_c); | |
1148 pref_checkbox_new_int(group, _("Disable screen saver"), | |
1149 fullscreen_disable_saver, &fullscreen_disable_saver_c); | |
1150 | |
1151 group = pref_group_new(vbox, FALSE, _("Delete"), GTK_ORIENTATION_VERTICAL); | |
1152 | |
1153 pref_checkbox_new_int(group, _("Confirm file delete"), | |
1154 confirm_delete, &confirm_delete_c); | |
1155 pref_checkbox_new_int(group, _("Enable Delete key"), | |
1156 enable_delete_key, &enable_delete_key_c); | |
1157 | |
1158 ct_button = pref_checkbox_new_int(group, _("Safe delete"), | |
1159 safe_delete_enable, &safe_delete_enable_c); | |
1160 | |
1161 hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE); | |
1162 pref_checkbox_link_sensitivity(ct_button, hbox); | |
1163 | |
1164 pref_spacer(hbox, PREF_PAD_INDENT - PREF_PAD_SPACE); | |
1165 pref_label_new(hbox, _("Folder:")); | |
1166 | |
1167 tabcomp = tab_completion_new(&safe_delete_path_entry, safe_delete_path, NULL, NULL); | |
1168 tab_completion_add_select_button(safe_delete_path_entry, NULL, TRUE); | |
1169 gtk_box_pack_start(GTK_BOX(hbox), tabcomp, TRUE, TRUE, 0); | |
1170 gtk_widget_show(tabcomp); | |
1171 | |
1172 hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_BUTTON_GAP); | |
1173 pref_checkbox_link_sensitivity(ct_button, hbox); | |
1174 | |
1175 pref_spacer(hbox, PREF_PAD_INDENT - PREF_PAD_GAP); | |
1176 pref_spin_new_int(hbox, _("Maximum size:"), _("MB"), | |
1177 1, 500, 1, safe_delete_size, &safe_delete_size_c); | |
1178 | |
1179 button = pref_button_new(NULL, NULL, _("View"), FALSE, | |
1180 G_CALLBACK(safe_delete_view_cb), NULL); | |
1181 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
1182 gtk_widget_show(button); | |
1183 | |
1184 button = pref_button_new(NULL, GTK_STOCK_CLEAR, NULL, FALSE, | |
1185 G_CALLBACK(safe_delete_clear_cb), NULL); | |
1186 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
1187 gtk_widget_show(button); | |
1188 | |
1189 group = pref_group_new(vbox, FALSE, _("Behavior"), GTK_ORIENTATION_VERTICAL); | |
1190 | |
1191 pref_checkbox_new_int(group, _("Rectangular selection in icon view"), | |
1192 collection_rectangular_selection, &collection_rectangular_selection_c); | |
1193 | |
1194 pref_checkbox_new_int(group, _("Descend folders in tree view"), | |
1195 tree_descend_subdirs, &tree_descend_subdirs_c); | |
1196 | |
1197 pref_checkbox_new_int(group, _("In place renaming"), | |
1198 enable_in_place_rename, &enable_in_place_rename_c); | |
1199 | |
1200 group = pref_group_new(vbox, FALSE, _("Navigation"), GTK_ORIENTATION_VERTICAL); | |
1201 | |
1202 pref_checkbox_new_int(group, _("Progressive keyboard scrolling"), | |
1203 progressive_key_scrolling, &progressive_key_scrolling_c); | |
1204 pref_checkbox_new_int(group, _("Mouse wheel scrolls image"), | |
1205 mousewheel_scrolls, &mousewheel_scrolls_c); | |
1206 | |
1207 group = pref_group_new(vbox, FALSE, _("Miscellaneous"), GTK_ORIENTATION_VERTICAL); | |
1208 | |
1209 pref_checkbox_new_int(group, _("Store keywords and comments local to source images"), | |
1210 enable_metadata_dirs, &enable_metadata_dirs_c); | |
1211 | |
1212 pref_spin_new_int(group, _("Custom similarity threshold:"), NULL, | |
1213 0, 100, 1, dupe_custom_threshold, &dupe_custom_threshold_c); | |
1214 | |
1215 pref_spin_new_int(group, _("Offscreen cache size (Mb per image):"), NULL, | |
1216 0, 128, 1, tile_cache_max, &tile_cache_max_c); | |
1217 | |
1218 gtk_widget_show(notebook); | |
1219 | |
1220 gtk_widget_show(configwindow); | |
1221 } | |
1222 | |
1223 /* | |
1224 *----------------------------------------------------------------------------- | |
1225 * config window show (public) | |
1226 *----------------------------------------------------------------------------- | |
1227 */ | |
1228 | |
1229 void show_config_window(void) | |
1230 { | |
1231 if (configwindow) | |
1232 { | |
1233 gtk_window_present(GTK_WINDOW(configwindow)); | |
1234 return; | |
1235 } | |
1236 | |
1237 config_window_create(); | |
1238 } | |
1239 | |
1240 /* | |
1241 *----------------- | |
1242 * about window | |
1243 *----------------- | |
1244 */ | |
1245 | |
1246 static GtkWidget *about = NULL; | |
1247 | |
1248 static gint about_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data) | |
1249 { | |
1250 gtk_widget_destroy(about); | |
1251 about = NULL; | |
1252 | |
1253 return TRUE; | |
1254 } | |
1255 | |
1256 static void about_window_close(GtkWidget *widget, gpointer data) | |
1257 { | |
1258 if (!about) return; | |
1259 | |
1260 gtk_widget_destroy(about); | |
1261 about = NULL; | |
1262 } | |
1263 | |
1264 static void about_credits_cb(GtkWidget *widget, gpointer data) | |
1265 { | |
1266 help_window_show("credits"); | |
1267 } | |
1268 | |
1269 void show_about_window(void) | |
1270 { | |
1271 GtkWidget *vbox; | |
1272 GtkWidget *hbox; | |
1273 GtkWidget *label; | |
1274 GtkWidget *button; | |
1275 GdkPixbuf *pixbuf; | |
1276 | |
1277 gchar *buf; | |
1278 | |
1279 if (about) | |
1280 { | |
1281 gtk_window_present(GTK_WINDOW(about)); | |
1282 return; | |
1283 } | |
1284 | |
1285 about = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
1286 gtk_window_set_type_hint(GTK_WINDOW(about), GDK_WINDOW_TYPE_HINT_DIALOG); | |
1287 gtk_window_set_wmclass(GTK_WINDOW(about), "about", "GQview"); | |
1288 g_signal_connect(G_OBJECT(about), "delete_event", | |
1289 G_CALLBACK(about_delete_cb), NULL); | |
1290 | |
1291 gtk_window_set_title(GTK_WINDOW(about), _("About - GQview")); | |
1292 gtk_container_set_border_width(GTK_CONTAINER(about), PREF_PAD_BORDER); | |
1293 | |
1294 vbox = gtk_vbox_new(FALSE, PREF_PAD_SPACE); | |
1295 gtk_container_add(GTK_CONTAINER(about), vbox); | |
1296 gtk_widget_show(vbox); | |
1297 | |
1298 pixbuf = pixbuf_inline(PIXBUF_INLINE_LOGO); | |
1299 button = gtk_image_new_from_pixbuf(pixbuf); | |
1300 g_object_unref(pixbuf); | |
1301 gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0); | |
1302 gtk_widget_show(button); | |
1303 | |
1304 buf = g_strdup_printf(_("GQview %s\n\nCopyright (c) %s John Ellis\nwebsite: %s\nemail: %s\n\nReleased under the GNU General Public License"), | |
1305 VERSION, | |
1306 "2005", | |
1307 "gqview.sourceforge.net", | |
1308 "gqview@users.sourceforge.net"); | |
1309 label = gtk_label_new(buf); | |
1310 g_free(buf); | |
1311 | |
1312 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER); | |
1313 gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); | |
1314 gtk_widget_show(label); | |
1315 | |
1316 hbox = gtk_hbutton_box_new(); | |
1317 gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END); | |
1318 gtk_box_set_spacing(GTK_BOX(hbox), PREF_PAD_BUTTON_GAP); | |
1319 gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
1320 gtk_widget_show(hbox); | |
1321 | |
1322 button = pref_button_new(NULL, NULL, _("Credits..."), FALSE, | |
1323 G_CALLBACK(about_credits_cb), NULL); | |
1324 gtk_container_add(GTK_CONTAINER(hbox), button); | |
1325 GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); | |
1326 gtk_widget_show(button); | |
1327 | |
1328 button = pref_button_new(NULL, GTK_STOCK_CLOSE, NULL, FALSE, | |
1329 G_CALLBACK(about_window_close), NULL); | |
1330 gtk_container_add(GTK_CONTAINER(hbox), button); | |
1331 GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); | |
1332 gtk_widget_grab_default(button); | |
1333 gtk_widget_show(button); | |
1334 | |
1335 window_set_icon(about, NULL, NULL); | |
1336 gtk_widget_show(about); | |
1337 } | |
1338 |