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!
13 #include "cache_maint.h"
18 #include "thumb_standard.h"
19 #include "ui_fileops.h"
21 #include "ui_spinner.h"
22 #include "ui_tabcomp.h"
23 #include "ui_utildlg.h"
26 typedef struct _CMData CMData;
35 GtkWidget *button_stop;
36 GtkWidget *button_close;
41 #define PURGE_DIALOG_WIDTH 400
45 *-------------------------------------------------------------------
47 *-------------------------------------------------------------------
50 static gint extension_truncate(gchar *path, const gchar *ext)
55 if (!path || !ext) return FALSE;
60 if (l < el || strcmp(path + (l - el), ext) != 0) return FALSE;
67 static gchar *extension_find_dot(gchar *path)
71 if (!path || *path == '\0') return NULL;
74 while (*ptr != '\0') ptr++;
76 while (ptr > path && *ptr != '.') ptr--;
78 if (ptr == path) return NULL;
83 static gint isempty(const gchar *path)
89 pathl = path_from_utf8(path);
92 if (!dp) return FALSE;
94 while ((dir = readdir(dp)) != NULL)
96 gchar *name = dir->d_name;
98 if (!(name[0] == '.' && (name[1] == '\0' || (name[1] == '.' && name[2] == '\0'))) )
109 static void cache_maintain_home_close(CMData *cm)
111 if (cm->idle_id != -1) g_source_remove(cm->idle_id);
112 if (cm->gd) generic_dialog_close(cm->gd);
113 path_list_free(cm->list);
114 g_list_free(cm->done_list);
118 static void cache_maintain_home_stop(CMData *cm)
120 if (cm->idle_id != -1)
122 g_source_remove(cm->idle_id);
126 gtk_entry_set_text(GTK_ENTRY(cm->entry), _("done"));
127 spinner_set_interval(cm->spinner, -1);
129 gtk_widget_set_sensitive(cm->button_stop, FALSE);
130 gtk_widget_set_sensitive(cm->button_close, TRUE);
133 static gint cache_maintain_home_cb(gpointer data)
139 gint just_done = FALSE;
140 gint still_have_a_file = TRUE;
142 const gchar *cache_folder;
146 cache_folder = GQVIEW_CACHE_RC_METADATA;
150 cache_folder = GQVIEW_CACHE_RC_THUMB;
153 base_length = strlen(homedir()) + strlen("/") + strlen(cache_folder);
157 if (debug) printf("purge chk done.\n");
159 cache_maintain_home_stop(cm);
163 path = cm->list->data;
165 if (debug) printf("purge chk (%d) \"%s\"\n", (cm->clear && !cm->metadata), path);
167 if (g_list_find(cm->done_list, path) == NULL)
169 cm->done_list = g_list_prepend(cm->done_list, path);
171 if (path_list(path, &list, &dlist))
176 still_have_a_file = FALSE;
181 gchar *path_buf = work->data;
184 dot = extension_find_dot(path_buf);
186 if (dot) *dot = '\0';
187 if ((!cm->metadata && cm->clear) ||
188 (strlen(path_buf) > base_length && !isfile(path_buf + base_length)) )
191 if (!unlink_file(path_buf)) printf("failed to delete:%s\n", path_buf);
195 still_have_a_file = TRUE;
201 path_list_free(list);
203 cm->list = g_list_concat(dlist, cm->list);
205 if (cm->list && g_list_find(cm->done_list, cm->list->data) != NULL)
207 /* check if the dir is empty */
209 if (cm->list->data == path && just_done)
211 if (!still_have_a_file && !dlist && cm->list->next && !rmdir_utf8(path))
213 printf("Unable to delete dir: %s\n", path);
218 /* must re-check for an empty dir */
219 if (isempty(path) && cm->list->next && !rmdir_utf8(path))
221 printf("Unable to delete dir: %s\n", path);
225 path = cm->list->data;
226 cm->done_list = g_list_remove(cm->done_list, path);
227 cm->list = g_list_remove(cm->list, path);
235 path = cm->list->data;
236 if (strlen(path) > base_length)
238 buf = path + base_length;
244 gtk_entry_set_text(GTK_ENTRY(cm->entry), buf);
250 static void cache_maintain_home_close_cb(GenericDialog *gd, gpointer data)
254 if (!GTK_WIDGET_SENSITIVE(cm->button_close)) return;
256 cache_maintain_home_close(cm);
259 static void cache_maintain_home_stop_cb(GenericDialog *gd, gpointer data)
263 cache_maintain_home_stop(cm);
266 /* sorry for complexity (cm->done_list), but need it to remove empty dirs */
267 void cache_maintain_home(gint metadata, gint clear, GtkWidget *parent)
273 const gchar *cache_folder;
278 cache_folder = GQVIEW_CACHE_RC_METADATA;
282 cache_folder = GQVIEW_CACHE_RC_THUMB;
285 base = g_strconcat(homedir(), "/", cache_folder, NULL);
287 if (!path_list(base, NULL, &dlist))
293 dlist = g_list_append(dlist, base);
295 cm = g_new0(CMData, 1);
297 cm->done_list = NULL;
299 cm->metadata = metadata;
303 msg = _("Removing old metadata...");
307 msg = _("Clearing cached thumbnails...");
311 msg = _("Removing old thumbnails...");
314 cm->gd = generic_dialog_new(_("Maintenance"),
315 "GQview", "gqview_maintenance",
318 cm->gd->cancel_cb = cache_maintain_home_close_cb;
319 cm->button_close = generic_dialog_add_button(cm->gd, GTK_STOCK_CLOSE, NULL,
320 cache_maintain_home_close_cb, FALSE);
321 gtk_widget_set_sensitive(cm->button_close, FALSE);
322 cm->button_stop = generic_dialog_add_button(cm->gd, GTK_STOCK_STOP, NULL,
323 cache_maintain_home_stop_cb, FALSE);
325 generic_dialog_add_message(cm->gd, NULL, msg, NULL);
326 gtk_window_set_default_size(GTK_WINDOW(cm->gd->dialog), PURGE_DIALOG_WIDTH, -1);
328 hbox = gtk_hbox_new(FALSE, 0);
329 gtk_box_pack_start(GTK_BOX(cm->gd->vbox), hbox, FALSE, FALSE, 5);
330 gtk_widget_show(hbox);
332 cm->entry = gtk_entry_new();
333 GTK_WIDGET_UNSET_FLAGS(cm->entry, GTK_CAN_FOCUS);
334 gtk_editable_set_editable(GTK_EDITABLE(cm->entry), FALSE);
335 gtk_box_pack_start(GTK_BOX(hbox), cm->entry, TRUE, TRUE, 0);
336 gtk_widget_show(cm->entry);
338 cm->spinner = spinner_new(NULL, SPINNER_SPEED);
339 gtk_box_pack_start(GTK_BOX(hbox), cm->spinner, FALSE, FALSE, 0);
340 gtk_widget_show(cm->spinner);
342 gtk_widget_show(cm->gd->dialog);
344 cm->idle_id = g_idle_add(cache_maintain_home_cb, cm);
347 /* This checks all files in ~/.gqview/thumbnails and
348 * removes them if thay have no source counterpart.
349 * (this assumes all cache files have an extension of 4 chars including '.')
351 gint cache_maintain_home_dir(const gchar *dir, gint recursive, gint clear)
357 gint still_have_a_file = FALSE;
359 if (debug) printf("maintainance check: %s\n", dir);
361 base_length = strlen(homedir()) + strlen("/") + strlen(GQVIEW_CACHE_RC_THUMB);
362 base = g_strconcat(homedir(), "/", GQVIEW_CACHE_RC_THUMB, dir, NULL);
364 if (path_list(base, &flist, &dlist))
371 gchar *path = work->data;
372 if (recursive && strlen(path) > base_length &&
373 !cache_maintain_home_dir(path + base_length, recursive, clear))
375 if (debug) printf("Deleting thumb dir: %s\n", path);
376 if (!rmdir_utf8(path))
378 printf("Unable to delete dir: %s\n", path);
383 still_have_a_file = TRUE;
391 gchar *path = work->data;
394 dot = extension_find_dot(path);
396 if (dot) *dot = '\0';
398 (strlen(path) > base_length && !isfile(path + base_length)) )
401 if (!unlink_file(path)) printf("failed to delete:%s\n", path);
405 still_have_a_file = TRUE;
412 path_list_free(dlist);
413 path_list_free(flist);
416 return still_have_a_file;
419 /* This checks relative caches in dir/.thumbnails and
420 * removes them if they have no source counterpart.
422 gint cache_maintain_dir(const gchar *dir, gint recursive, gint clear)
426 gint still_have_a_file = FALSE;
429 cachedir = g_strconcat(dir, "/", GQVIEW_CACHE_LOCAL_THUMB, NULL);
431 path_list(cachedir, &list, NULL);
442 source = g_strconcat(dir, "/", filename_from_path(path), NULL);
445 extension_truncate(source, GQVIEW_CACHE_EXT_THUMB) ||
446 extension_truncate(source, GQVIEW_CACHE_EXT_SIM))
448 if (!clear && isfile(source))
450 still_have_a_file = TRUE;
454 if (!unlink_file(path))
456 if (debug) printf("Failed to remove cache file %s\n", path);
457 still_have_a_file = TRUE;
463 still_have_a_file = TRUE;
468 path_list_free(list);
475 path_list(dir, NULL, &list);
479 const gchar *path = work->data;
482 still_have_a_file |= cache_maintain_dir(path, recursive, clear);
485 path_list_free(list);
488 return still_have_a_file;
491 static void cache_file_move(const gchar *src, const gchar *dest)
493 if (!dest || !src || !isfile(src)) return;
495 if (!move_file(src, dest))
497 if (debug) printf("Failed to move cache file %s\nto %s\n", src, dest);
498 /* we remove it anyway - it's stale */
503 void cache_maint_moved(const gchar *src, const gchar *dest)
508 if (!src || !dest) return;
510 base = cache_get_location(CACHE_TYPE_THUMB, dest, FALSE, &mode);
511 if (cache_ensure_dir_exists(base, mode))
516 buf = cache_find_location(CACHE_TYPE_THUMB, src);
517 d = cache_get_location(CACHE_TYPE_THUMB, dest, TRUE, NULL);
518 cache_file_move(buf, d);
522 buf = cache_find_location(CACHE_TYPE_SIM, src);
523 d = cache_get_location(CACHE_TYPE_SIM, dest, TRUE, NULL);
524 cache_file_move(buf, d);
530 printf("Failed to create cache dir for move %s\n", base);
534 base = cache_get_location(CACHE_TYPE_METADATA, dest, FALSE, &mode);
535 if (cache_ensure_dir_exists(base, mode))
540 buf = cache_find_location(CACHE_TYPE_METADATA, src);
541 d = cache_get_location(CACHE_TYPE_METADATA, dest, TRUE, NULL);
542 cache_file_move(buf, d);
548 if (enable_thumb_caching && thumbnail_spec_standard) thumb_std_maint_moved(src, dest);
551 static void cache_file_remove(const gchar *path)
553 if (path && isfile(path) && !unlink_file(path))
555 if (debug) printf("Failed to remove cache file %s\n", path);
559 void cache_maint_removed(const gchar *source)
563 buf = cache_find_location(CACHE_TYPE_THUMB, source);
564 cache_file_remove(buf);
567 buf = cache_find_location(CACHE_TYPE_SIM, source);
568 cache_file_remove(buf);
571 buf = cache_find_location(CACHE_TYPE_METADATA, source);
572 cache_file_remove(buf);
575 if (enable_thumb_caching && thumbnail_spec_standard) thumb_std_maint_removed(source);
578 void cache_maint_copied(const gchar *src, const gchar *dest)
584 src_cache = cache_find_location(CACHE_TYPE_METADATA, src);
585 if (!src_cache) return;
587 dest_base = cache_get_location(CACHE_TYPE_METADATA, dest, FALSE, &mode);
588 if (cache_ensure_dir_exists(dest_base, mode))
592 path = cache_get_location(CACHE_TYPE_METADATA, dest, TRUE, NULL);
593 if (!copy_file(src_cache, path))
595 if (debug) printf("failed to copy metadata %s to %s\n", src_cache, path);
605 *-------------------------------------------------------------------
606 * new cache maintenance utilities
607 *-------------------------------------------------------------------
610 typedef struct _CacheManager CacheManager;
613 GenericDialog *dialog;
614 GtkWidget *folder_entry;
623 typedef struct _CleanData CleanData;
635 GtkWidget *button_close;
636 GtkWidget *button_stop;
637 GtkWidget *button_start;
653 static void cache_manager_render_reset(CleanData *cd)
655 path_list_free(cd->list);
658 path_list_free(cd->list_dir);
661 thumb_loader_free((ThumbLoader *)cd->tl);
665 static void cache_manager_render_close_cb(GenericDialog *fd, gpointer data)
667 CleanData *cd = data;
669 if (!GTK_WIDGET_SENSITIVE(cd->button_close)) return;
671 cache_manager_render_reset(cd);
672 generic_dialog_close(cd->gd);
676 static void cache_manager_render_finish(CleanData *cd)
678 cache_manager_render_reset(cd);
680 gtk_entry_set_text(GTK_ENTRY(cd->progress), _("done"));
681 spinner_set_interval(cd->spinner, -1);
683 gtk_widget_set_sensitive(cd->group, TRUE);
684 gtk_widget_set_sensitive(cd->button_start, TRUE);
685 gtk_widget_set_sensitive(cd->button_stop, FALSE);
686 gtk_widget_set_sensitive(cd->button_close, TRUE);
689 static void cache_manager_render_stop_cb(GenericDialog *fd, gpointer data)
691 CleanData *cd = data;
693 cache_manager_render_finish(cd);
696 static void cache_manager_render_folder(CleanData *cd, const gchar *path)
698 GList *list_d = NULL;
699 GList *list_f = NULL;
703 path_list(path, &list_f, &list_d);
707 path_list(path, &list_f, NULL);
710 list_f = path_list_filter(list_f, FALSE);
711 list_d = path_list_filter(list_d, TRUE);
713 cd->list = g_list_concat(list_f, cd->list);
714 cd->list_dir = g_list_concat(list_d, cd->list_dir);
717 static gint cache_manager_render_file(CleanData *cd);
719 static void cache_manager_render_thumb_done_cb(ThumbLoader *tl, gpointer data)
721 CleanData *cd = data;
723 thumb_loader_free((ThumbLoader *)cd->tl);
726 while (cache_manager_render_file(cd));
729 static gint cache_manager_render_file(CleanData *cd)
736 path = cd->list->data;
737 cd->list = g_list_remove(cd->list, path);
739 cd->tl = (ThumbLoaderStd *)thumb_loader_new(thumb_max_width, thumb_max_height);
740 thumb_loader_set_callbacks((ThumbLoader *)cd->tl,
741 cache_manager_render_thumb_done_cb,
742 cache_manager_render_thumb_done_cb,
744 thumb_loader_set_cache((ThumbLoader *)cd->tl, TRUE, cd->local, TRUE);
745 success = thumb_loader_start((ThumbLoader *)cd->tl, path);
748 gtk_entry_set_text(GTK_ENTRY(cd->progress), path);
752 thumb_loader_free((ThumbLoader *)cd->tl);
760 else if (cd->list_dir)
764 path = cd->list_dir->data;
765 cd->list_dir = g_list_remove(cd->list_dir, path);
767 cache_manager_render_folder(cd, path);
774 cache_manager_render_finish(cd);
779 static void cache_manager_render_start_cb(GenericDialog *fd, gpointer data)
781 CleanData *cd = data;
784 if (cd->list || !GTK_WIDGET_SENSITIVE(cd->button_start)) return;
786 path = remove_trailing_slash((gtk_entry_get_text(GTK_ENTRY(cd->entry))));
787 parse_out_relatives(path);
791 warning_dialog(_("Invalid folder"),
792 _("The specified folder can not be found."),
793 GTK_STOCK_DIALOG_WARNING, cd->gd->dialog);
797 gtk_widget_set_sensitive(cd->group, FALSE);
798 gtk_widget_set_sensitive(cd->button_start, FALSE);
799 gtk_widget_set_sensitive(cd->button_stop, TRUE);
800 gtk_widget_set_sensitive(cd->button_close, FALSE);
802 spinner_set_interval(cd->spinner, SPINNER_SPEED);
804 cache_manager_render_folder(cd, path);
805 while (cache_manager_render_file(cd));
811 static void cache_manager_render_dialog(GtkWidget *widget, const gchar *path)
818 cd = g_new0(CleanData, 1);
820 cd->gd = generic_dialog_new(_("Create thumbnails"),
821 "GQview", "create_thumbnails",
824 gtk_window_set_default_size(GTK_WINDOW(cd->gd->dialog), PURGE_DIALOG_WIDTH, -1);
825 cd->gd->cancel_cb = cache_manager_render_close_cb;
826 cd->button_close = generic_dialog_add_button(cd->gd, GTK_STOCK_CLOSE, NULL,
827 cache_manager_render_close_cb, FALSE);
828 cd->button_start = generic_dialog_add_button(cd->gd, GTK_STOCK_OK, _("S_tart"),
829 cache_manager_render_start_cb, FALSE);
830 cd->button_stop = generic_dialog_add_button(cd->gd, GTK_STOCK_STOP, NULL,
831 cache_manager_render_stop_cb, FALSE);
832 gtk_widget_set_sensitive(cd->button_stop, FALSE);
834 generic_dialog_add_message(cd->gd, NULL, _("Create thumbnails"), NULL);
836 hbox = pref_box_new(cd->gd->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, 0);
837 pref_spacer(hbox, PREF_PAD_INDENT);
838 cd->group = pref_box_new(hbox, TRUE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
840 hbox = pref_box_new(cd->group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
841 pref_label_new(hbox, _("Folder:"));
843 label = tab_completion_new(&cd->entry, path, NULL, NULL);
844 tab_completion_add_select_button(cd->entry,_("Select folder") , TRUE);
845 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
846 gtk_widget_show(label);
848 pref_checkbox_new_int(cd->group, _("Include subfolders"), FALSE, &cd->recurse);
849 button = pref_checkbox_new_int(cd->group, _("Store thumbnails local to source images"), FALSE, &cd->local);
850 gtk_widget_set_sensitive(button, thumbnail_spec_standard);
852 pref_line(cd->gd->vbox, PREF_PAD_SPACE);
853 hbox = pref_box_new(cd->gd->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
855 cd->progress = gtk_entry_new();
856 GTK_WIDGET_UNSET_FLAGS(cd->progress, GTK_CAN_FOCUS);
857 gtk_editable_set_editable(GTK_EDITABLE(cd->progress), FALSE);
858 gtk_entry_set_text(GTK_ENTRY(cd->progress), _("click start to begin"));
859 gtk_box_pack_start(GTK_BOX(hbox), cd->progress, TRUE, TRUE, 0);
860 gtk_widget_show(cd->progress);
862 cd->spinner = spinner_new(NULL, -1);
863 gtk_box_pack_start(GTK_BOX(hbox), cd->spinner, FALSE, FALSE, 0);
864 gtk_widget_show(cd->spinner);
868 gtk_widget_show(cd->gd->dialog);
874 static void cache_manager_standard_clean_close_cb(GenericDialog *gd, gpointer data)
876 CleanData *cd = data;
878 if (!GTK_WIDGET_SENSITIVE(cd->button_close)) return;
880 generic_dialog_close(cd->gd);
882 thumb_loader_std_thumb_file_validate_cancel(cd->tl);
883 path_list_free(cd->list);
887 static void cache_manager_standard_clean_done(CleanData *cd)
889 gtk_widget_set_sensitive(cd->button_stop, FALSE);
890 gtk_widget_set_sensitive(cd->button_close, TRUE);
892 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(cd->progress), 1.0);
893 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(cd->progress), _("done"));
895 if (cd->idle_id != -1)
897 g_source_remove(cd->idle_id);
901 thumb_loader_std_thumb_file_validate_cancel(cd->tl);
904 path_list_free(cd->list);
908 static void cache_manager_standard_clean_stop_cb(GenericDialog *gd, gpointer data)
910 CleanData *cd = data;
912 cache_manager_standard_clean_done(cd);
915 static gint cache_manager_standard_clean_clear_cb(gpointer data)
917 CleanData *cd = data;
923 next_path = cd->list->data;
924 cd->list = g_list_remove(cd->list, next_path);
926 if (debug) printf("thumb removed: %s\n", next_path);
928 unlink_file(next_path);
932 if (cd->count_total != 0)
934 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(cd->progress),
935 (gdouble)cd->count_done / cd->count_total);
942 cache_manager_standard_clean_done(cd);
946 static void cache_manager_standard_clean_valid_cb(const gchar *path, gint valid, gpointer data)
948 CleanData *cd = data;
954 if (debug) printf("thumb cleaned: %s\n", path);
959 if (cd->count_total != 0)
961 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(cd->progress),
962 (gdouble)cd->count_done / cd->count_total);
971 next_path = cd->list->data;
972 cd->list = g_list_remove(cd->list, next_path);
974 cd->tl = thumb_loader_std_thumb_file_validate(next_path, cd->days,
975 cache_manager_standard_clean_valid_cb, cd);
980 cache_manager_standard_clean_done(cd);
984 static void cache_manager_standard_clean_start_cb(GenericDialog *gd, gpointer data)
986 CleanData *cd = data;
990 if (cd->list || !GTK_WIDGET_SENSITIVE(cd->button_start)) return;
992 gtk_widget_set_sensitive(cd->button_start, FALSE);
993 gtk_widget_set_sensitive(cd->button_stop, TRUE);
994 gtk_widget_set_sensitive(cd->button_close, FALSE);
996 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(cd->progress), _("running..."));
998 path = g_strconcat(homedir(), "/", THUMB_FOLDER, "/", THUMB_FOLDER_NORMAL, NULL);
1000 path_list(path, &list, NULL);
1004 path = g_strconcat(homedir(), "/", THUMB_FOLDER, "/", THUMB_FOLDER_LARGE, NULL);
1006 path_list(path, &list, NULL);
1007 cd->list = g_list_concat(cd->list, list);
1010 path = g_strconcat(homedir(), "/", THUMB_FOLDER, "/", THUMB_FOLDER_FAIL, NULL);
1012 path_list(path, &list, NULL);
1013 cd->list = g_list_concat(cd->list, list);
1016 cd->count_total = g_list_length(cd->list);
1019 /* start iterating */
1022 cd->idle_id = g_idle_add(cache_manager_standard_clean_clear_cb, cd);
1026 cache_manager_standard_clean_valid_cb(NULL, TRUE, cd);
1030 static void cache_manager_standard_process(GtkWidget *widget, gint clear)
1033 const gchar *stock_id;
1036 cd = g_new0(CleanData, 1);
1041 stock_id = GTK_STOCK_DELETE;
1042 msg = _("Clearing thumbnails...");
1046 stock_id = GTK_STOCK_CLEAR;
1047 msg = _("Removing old thumbnails...");
1050 cd->gd = generic_dialog_new(_("Maintenance"),
1051 "GQview", "standard_maintenance",
1054 cd->gd->cancel_cb = cache_manager_standard_clean_close_cb;
1055 cd->button_close = generic_dialog_add_button(cd->gd, GTK_STOCK_CLOSE, NULL,
1056 cache_manager_standard_clean_close_cb, FALSE);
1057 cd->button_start = generic_dialog_add_button(cd->gd, GTK_STOCK_OK, _("S_tart"),
1058 cache_manager_standard_clean_start_cb, FALSE);
1059 cd->button_stop = generic_dialog_add_button(cd->gd, GTK_STOCK_STOP, NULL,
1060 cache_manager_standard_clean_stop_cb, FALSE);
1061 gtk_widget_set_sensitive(cd->button_stop, FALSE);
1063 generic_dialog_add_message(cd->gd, stock_id, msg, NULL);
1065 cd->progress = gtk_progress_bar_new();
1066 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(cd->progress), _("click start to begin"));
1067 gtk_box_pack_start(GTK_BOX(cd->gd->vbox), cd->progress, FALSE, FALSE, 0);
1068 gtk_widget_show(cd->progress);
1074 gtk_widget_show(cd->gd->dialog);
1077 static void cache_manager_standard_clean_cb(GtkWidget *widget, gpointer data)
1079 cache_manager_standard_process(widget, FALSE);
1082 static void cache_manager_standard_clear_cb(GtkWidget *widget, gpointer data)
1084 cache_manager_standard_process(widget, TRUE);
1088 static void cache_manager_gqview_clean_cb(GtkWidget *widget, gpointer data)
1090 cache_maintain_home(FALSE, FALSE, widget);
1094 static void dummy_cancel_cb(GenericDialog *gd, gpointer data)
1096 /* no op, only so cancel button appears */
1099 static void cache_manager_gqview_clear_ok_cb(GenericDialog *gd, gpointer data)
1101 cache_maintain_home(FALSE, TRUE, NULL);
1104 void cache_manager_gqview_clear_confirm(GtkWidget *parent)
1108 gd = generic_dialog_new(_("Clear cache"),
1109 "GQview", "clear_cache", parent, TRUE,
1110 dummy_cancel_cb, NULL);
1111 generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Clear cache"),
1112 _("This will remove all thumbnails that have\nbeen saved to disk, continue?"));
1113 generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, cache_manager_gqview_clear_ok_cb, TRUE);
1115 gtk_widget_show(gd->dialog);
1118 static void cache_manager_gqview_clear_cb(GtkWidget *widget, gpointer data)
1120 cache_manager_gqview_clear_confirm(widget);
1123 static void cache_manager_render_cb(GtkWidget *widget, gpointer data)
1125 cache_manager_render_dialog(widget, homedir());
1128 static void cache_manager_metadata_clean_cb(GtkWidget *widget, gpointer data)
1130 cache_maintain_home(TRUE, FALSE, widget);
1134 static CacheManager *cache_manager = NULL;
1136 static void cache_manager_close_cb(GenericDialog *gd, gpointer data)
1138 generic_dialog_close(gd);
1140 g_free(cache_manager);
1141 cache_manager = NULL;
1144 void cache_manager_show(void)
1151 GtkSizeGroup *sizegroup;
1156 gtk_window_present(GTK_WINDOW(cache_manager->dialog->dialog));
1160 cache_manager = g_new0(CacheManager, 1);
1162 cache_manager->dialog = generic_dialog_new(_("Cache Maintenance - GQview"),
1163 "GQiew", "cache_manager",
1165 NULL, cache_manager);
1166 gd = cache_manager->dialog;
1168 gd->cancel_cb = cache_manager_close_cb;
1169 generic_dialog_add_button(gd, GTK_STOCK_CLOSE, NULL,
1170 cache_manager_close_cb, FALSE);
1172 generic_dialog_add_message(gd, NULL, _("Cache and Data Maintenance"), NULL);
1174 sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
1176 group = pref_group_new(gd->vbox, FALSE, _("GQview thumbnail cache"), GTK_ORIENTATION_VERTICAL);
1178 buf = g_strconcat(_("Location:"), " ", homedir(), "/", GQVIEW_CACHE_RC_THUMB, NULL);
1179 label = pref_label_new(group, buf);
1180 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
1183 table = pref_table_new(group, 2, 2, FALSE, FALSE);
1185 button = pref_table_button(table, 0, 0, GTK_STOCK_CLEAR, _("Clean up"), FALSE,
1186 G_CALLBACK(cache_manager_gqview_clean_cb), cache_manager);
1187 gtk_size_group_add_widget(sizegroup, button);
1188 pref_table_label(table, 1, 0, _("Remove orphaned or outdated thumbnails."), 0.0);
1190 button = pref_table_button(table, 0, 1, GTK_STOCK_DELETE, _("Clear cache"), FALSE,
1191 G_CALLBACK(cache_manager_gqview_clear_cb), cache_manager);
1192 gtk_size_group_add_widget(sizegroup, button);
1193 pref_table_label(table, 1, 1, _("Delete all cached thumbnails."), 0.0);
1196 group = pref_group_new(gd->vbox, FALSE, _("Shared thumbnail cache"), GTK_ORIENTATION_VERTICAL);
1198 buf = g_strconcat(_("Location:"), " ", homedir(), "/", THUMB_FOLDER, NULL);
1199 label = pref_label_new(group, buf);
1200 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
1203 table = pref_table_new(group, 2, 2, FALSE, FALSE);
1205 button = pref_table_button(table, 0, 0, GTK_STOCK_CLEAR, _("Clean up"), FALSE,
1206 G_CALLBACK(cache_manager_standard_clean_cb), cache_manager);
1207 gtk_size_group_add_widget(sizegroup, button);
1208 pref_table_label(table, 1, 0, _("Remove orphaned or outdated thumbnails."), 0.0);
1210 button = pref_table_button(table, 0, 1, GTK_STOCK_DELETE, _("Clear cache"), FALSE,
1211 G_CALLBACK(cache_manager_standard_clear_cb), cache_manager);
1212 gtk_size_group_add_widget(sizegroup, button);
1213 pref_table_label(table, 1, 1, _("Delete all cached thumbnails."), 0.0);
1215 group = pref_group_new(gd->vbox, FALSE, _("Create thumbnails"), GTK_ORIENTATION_VERTICAL);
1217 table = pref_table_new(group, 2, 1, FALSE, FALSE);
1219 button = pref_table_button(table, 0, 1, GTK_STOCK_EXECUTE, _("Render"), FALSE,
1220 G_CALLBACK(cache_manager_render_cb), cache_manager);
1221 gtk_size_group_add_widget(sizegroup, button);
1222 pref_table_label(table, 1, 1, _("Render thumbnails for a specific folder."), 0.0);
1224 group = pref_group_new(gd->vbox, FALSE, _("Metadata"), GTK_ORIENTATION_VERTICAL);
1226 buf = g_strconcat(_("Location:"), " ", homedir(), "/", GQVIEW_CACHE_RC_METADATA, NULL);
1227 label = pref_label_new(group, buf);
1228 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
1231 table = pref_table_new(group, 2, 1, FALSE, FALSE);
1233 button = pref_table_button(table, 0, 0, GTK_STOCK_CLEAR, _("Clean up"), FALSE,
1234 G_CALLBACK(cache_manager_metadata_clean_cb), cache_manager);
1235 gtk_size_group_add_widget(sizegroup, button);
1236 pref_table_label(table, 1, 0, _("Remove orphaned keywords and comments."), 0.0);
1238 gtk_widget_show(cache_manager->dialog->dialog);