📄 cache_maint.c
字号:
};typedef struct _CleanData CleanData;struct _CleanData{ GenericDialog *gd; ThumbLoaderStd *tl; GList *list; GList *list_dir; gint days; gint clear; GtkWidget *button_close; GtkWidget *button_stop; GtkWidget *button_start; GtkWidget *progress; GtkWidget *spinner; GtkWidget *group; GtkWidget *entry; gint count_total; gint count_done; gint local; gint recurse; gint idle_id;};static void cache_manager_render_reset(CleanData *cd){ path_list_free(cd->list); cd->list = NULL; path_list_free(cd->list_dir); cd->list_dir = NULL; thumb_loader_free((ThumbLoader *)cd->tl); cd->tl = NULL;}static void cache_manager_render_close_cb(GenericDialog *fd, gpointer data){ CleanData *cd = data; if (!GTK_WIDGET_SENSITIVE(cd->button_close)) return; cache_manager_render_reset(cd); generic_dialog_close(cd->gd); g_free(cd);}static void cache_manager_render_finish(CleanData *cd){ cache_manager_render_reset(cd); gtk_entry_set_text(GTK_ENTRY(cd->progress), _("done")); spinner_set_interval(cd->spinner, -1); gtk_widget_set_sensitive(cd->group, TRUE); gtk_widget_set_sensitive(cd->button_start, TRUE); gtk_widget_set_sensitive(cd->button_stop, FALSE); gtk_widget_set_sensitive(cd->button_close, TRUE);}static void cache_manager_render_stop_cb(GenericDialog *fd, gpointer data){ CleanData *cd = data; cache_manager_render_finish(cd);}static void cache_manager_render_folder(CleanData *cd, const gchar *path){ GList *list_d = NULL; GList *list_f = NULL; if (cd->recurse) { path_list(path, &list_f, &list_d); } else { path_list(path, &list_f, NULL); } list_f = path_list_filter(list_f, FALSE); list_d = path_list_filter(list_d, TRUE); cd->list = g_list_concat(list_f, cd->list); cd->list_dir = g_list_concat(list_d, cd->list_dir);}static gint cache_manager_render_file(CleanData *cd);static void cache_manager_render_thumb_done_cb(ThumbLoader *tl, gpointer data){ CleanData *cd = data; thumb_loader_free((ThumbLoader *)cd->tl); cd->tl = NULL; while (cache_manager_render_file(cd));}static gint cache_manager_render_file(CleanData *cd){ if (cd->list) { gchar *path; gint success; path = cd->list->data; cd->list = g_list_remove(cd->list, path); cd->tl = (ThumbLoaderStd *)thumb_loader_new(thumb_max_width, thumb_max_height); thumb_loader_set_callbacks((ThumbLoader *)cd->tl, cache_manager_render_thumb_done_cb, cache_manager_render_thumb_done_cb, NULL, cd); thumb_loader_set_cache((ThumbLoader *)cd->tl, TRUE, cd->local, TRUE); success = thumb_loader_start((ThumbLoader *)cd->tl, path); if (success) { gtk_entry_set_text(GTK_ENTRY(cd->progress), path); } else { thumb_loader_free((ThumbLoader *)cd->tl); cd->tl = NULL; } g_free(path); return (!success); } else if (cd->list_dir) { gchar *path; path = cd->list_dir->data; cd->list_dir = g_list_remove(cd->list_dir, path); cache_manager_render_folder(cd, path); g_free(path); return TRUE; } cache_manager_render_finish(cd); return FALSE;}static void cache_manager_render_start_cb(GenericDialog *fd, gpointer data){ CleanData *cd = data; gchar *path; if (cd->list || !GTK_WIDGET_SENSITIVE(cd->button_start)) return; path = remove_trailing_slash((gtk_entry_get_text(GTK_ENTRY(cd->entry)))); parse_out_relatives(path); if (!isdir(path)) { warning_dialog(_("Invalid folder"), _("The specified folder can not be found."), GTK_STOCK_DIALOG_WARNING, cd->gd->dialog); } else { gtk_widget_set_sensitive(cd->group, FALSE); gtk_widget_set_sensitive(cd->button_start, FALSE); gtk_widget_set_sensitive(cd->button_stop, TRUE); gtk_widget_set_sensitive(cd->button_close, FALSE); spinner_set_interval(cd->spinner, SPINNER_SPEED); cache_manager_render_folder(cd, path); while (cache_manager_render_file(cd)); } g_free(path);}static void cache_manager_render_dialog(GtkWidget *widget, const gchar *path){ CleanData *cd; GtkWidget *hbox; GtkWidget *label; GtkWidget *button; cd = g_new0(CleanData, 1); cd->gd = generic_dialog_new(_("Create thumbnails"), "GQview", "create_thumbnails", widget, FALSE, NULL, cd); gtk_window_set_default_size(GTK_WINDOW(cd->gd->dialog), PURGE_DIALOG_WIDTH, -1); cd->gd->cancel_cb = cache_manager_render_close_cb; cd->button_close = generic_dialog_add_button(cd->gd, GTK_STOCK_CLOSE, NULL, cache_manager_render_close_cb, FALSE); cd->button_start = generic_dialog_add_button(cd->gd, GTK_STOCK_OK, _("S_tart"), cache_manager_render_start_cb, FALSE); cd->button_stop = generic_dialog_add_button(cd->gd, GTK_STOCK_STOP, NULL, cache_manager_render_stop_cb, FALSE); gtk_widget_set_sensitive(cd->button_stop, FALSE); generic_dialog_add_message(cd->gd, NULL, _("Create thumbnails"), NULL); hbox = pref_box_new(cd->gd->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, 0); pref_spacer(hbox, PREF_PAD_INDENT); cd->group = pref_box_new(hbox, TRUE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP); hbox = pref_box_new(cd->group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE); pref_label_new(hbox, _("Folder:")); label = tab_completion_new(&cd->entry, path, NULL, NULL); tab_completion_add_select_button(cd->entry,_("Select folder") , TRUE); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); gtk_widget_show(label); pref_checkbox_new_int(cd->group, _("Include subfolders"), FALSE, &cd->recurse); button = pref_checkbox_new_int(cd->group, _("Store thumbnails local to source images"), FALSE, &cd->local); gtk_widget_set_sensitive(button, thumbnail_spec_standard); pref_line(cd->gd->vbox, PREF_PAD_SPACE); hbox = pref_box_new(cd->gd->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE); cd->progress = gtk_entry_new(); GTK_WIDGET_UNSET_FLAGS(cd->progress, GTK_CAN_FOCUS); gtk_editable_set_editable(GTK_EDITABLE(cd->progress), FALSE); gtk_entry_set_text(GTK_ENTRY(cd->progress), _("click start to begin")); gtk_box_pack_start(GTK_BOX(hbox), cd->progress, TRUE, TRUE, 0); gtk_widget_show(cd->progress); cd->spinner = spinner_new(NULL, -1); gtk_box_pack_start(GTK_BOX(hbox), cd->spinner, FALSE, FALSE, 0); gtk_widget_show(cd->spinner); cd->list = NULL; gtk_widget_show(cd->gd->dialog);}static void cache_manager_standard_clean_close_cb(GenericDialog *gd, gpointer data){ CleanData *cd = data; if (!GTK_WIDGET_SENSITIVE(cd->button_close)) return; generic_dialog_close(cd->gd); thumb_loader_std_thumb_file_validate_cancel(cd->tl); path_list_free(cd->list); g_free(cd);}static void cache_manager_standard_clean_done(CleanData *cd){ gtk_widget_set_sensitive(cd->button_stop, FALSE); gtk_widget_set_sensitive(cd->button_close, TRUE); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(cd->progress), 1.0); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(cd->progress), _("done")); if (cd->idle_id != -1) { g_source_remove(cd->idle_id); cd->idle_id = -1; } thumb_loader_std_thumb_file_validate_cancel(cd->tl); cd->tl = NULL; path_list_free(cd->list); cd->list = NULL;}static void cache_manager_standard_clean_stop_cb(GenericDialog *gd, gpointer data){ CleanData *cd = data; cache_manager_standard_clean_done(cd);}static gint cache_manager_standard_clean_clear_cb(gpointer data){ CleanData *cd = data; if (cd->list) { gchar *next_path; next_path = cd->list->data; cd->list = g_list_remove(cd->list, next_path); if (debug) printf("thumb removed: %s\n", next_path); unlink_file(next_path); g_free(next_path); cd->count_done++; if (cd->count_total != 0) { gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(cd->progress), (gdouble)cd->count_done / cd->count_total); } return TRUE; } cd->idle_id = -1; cache_manager_standard_clean_done(cd); return FALSE;}static void cache_manager_standard_clean_valid_cb(const gchar *path, gint valid, gpointer data){ CleanData *cd = data; if (path) { if (!valid) { if (debug) printf("thumb cleaned: %s\n", path); unlink_file(path); } cd->count_done++; if (cd->count_total != 0) { gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(cd->progress), (gdouble)cd->count_done / cd->count_total); } } cd->tl = NULL; if (cd->list) { gchar *next_path; next_path = cd->list->data; cd->list = g_list_remove(cd->list, next_path); cd->tl = thumb_loader_std_thumb_file_validate(next_path, cd->days, cache_manager_standard_clean_valid_cb, cd); g_free(next_path); } else { cache_manager_standard_clean_done(cd); }}static void cache_manager_standard_clean_start_cb(GenericDialog *gd, gpointer data){ CleanData *cd = data; GList *list; gchar *path; if (cd->list || !GTK_WIDGET_SENSITIVE(cd->button_start)) return; gtk_widget_set_sensitive(cd->button_start, FALSE); gtk_widget_set_sensitive(cd->button_stop, TRUE); gtk_widget_set_sensitive(cd->button_close, FALSE); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(cd->progress), _("running...")); path = g_strconcat(homedir(), "/", THUMB_FOLDER, "/", THUMB_FOLDER_NORMAL, NULL); list = NULL; path_list(path, &list, NULL); cd->list = list; g_free(path); path = g_strconcat(homedir(), "/", THUMB_FOLDER, "/", THUMB_FOLDER_LARGE, NULL); list = NULL; path_list(path, &list, NULL); cd->list = g_list_concat(cd->list, list); g_free(path); path = g_strconcat(homedir(), "/", THUMB_FOLDER, "/", THUMB_FOLDER_FAIL, NULL); list = NULL; path_list(path, &list, NULL); cd->list = g_list_concat(cd->list, list); g_free(path); cd->count_total = g_list_length(cd->list); cd->count_done = 0; /* start iterating */ if (cd->clear) { cd->idle_id = g_idle_add(cache_manager_standard_clean_clear_cb, cd); } else { cache_manager_standard_clean_valid_cb(NULL, TRUE, cd); }}static void cache_manager_standard_process(GtkWidget *widget, gint clear){ CleanData *cd; const gchar *stock_id; const gchar *msg; cd = g_new0(CleanData, 1); cd->clear = clear; if (clear) { stock_id = GTK_STOCK_DELETE; msg = _("Clearing thumbnails..."); } else { stock_id = GTK_STOCK_CLEAR; msg = _("Removing old thumbnails..."); } cd->gd = generic_dialog_new(_("Maintenance"), "GQview", "standard_maintenance", widget, FALSE, NULL, cd); cd->gd->cancel_cb = cache_manager_standard_clean_close_cb; cd->button_close = generic_dialog_add_button(cd->gd, GTK_STOCK_CLOSE, NULL, cache_manager_standard_clean_close_cb, FALSE); cd->button_start = generic_dialog_add_button(cd->gd, GTK_STOCK_OK, _("S_tart"), cache_manager_standard_clean_start_cb, FALSE); cd->button_stop = generic_dialog_add_button(cd->gd, GTK_STOCK_STOP, NULL, cache_manager_standard_clean_stop_cb, FALSE); gtk_widget_set_sensitive(cd->button_stop, FALSE); generic_dialog_add_message(cd->gd, stock_id, msg, NULL); cd->progress = gtk_progress_bar_new(); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(cd->progress), _("click start to begin")); gtk_box_pack_start(GTK_BOX(cd->gd->vbox), cd->progress, FALSE, FALSE, 0); gtk_widget_show(cd->progress); cd->days = 30; cd->tl = NULL; cd->idle_id = -1; gtk_widget_show(cd->gd->dialog);}static void cache_manager_standard_clean_cb(GtkWidget *widget, gpointer data){ cache_manager_standard_process(widget, FALSE);}static void cache_manager_standard_clear_cb(GtkWidget *widget, gpointer data){ cache_manager_standard_process(widget, TRUE);}static void cache_manager_gqview_clean_cb(GtkWidget *widget, gpointer data){ cache_maintain_home(FALSE, FALSE, widget);}static void dummy_cancel_cb(GenericDialog *gd, gpointer data){ /* no op, only so cancel button appears */}static void cache_manager_gqview_clear_ok_cb(GenericDialog *gd, gpointer data){ cache_maintain_home(FALSE, TRUE, NULL);}void cache_manager_gqview_clear_confirm(GtkWidget *parent){ GenericDialog *gd; gd = generic_dialog_new(_("Clear cache"), "GQview", "clear_cache", parent, TRUE, dummy_cancel_cb, NULL); generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Clear cache"), _("This will remove all thumbnails that have\nbeen saved to disk, continue?")); generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, cache_manager_gqview_clear_ok_cb, TRUE); gtk_widget_show(gd->dialog);}static void cache_manager_gqview_clear_cb(GtkWidget *widget, gpointer data){ cache_manager_gqview_clear_confirm(widget);}static void cache_manager_render_cb(GtkWidget *widget, gpointer data){ cache_manager_render_dialog(widget, homedir());}static void cache_manager_metadata_clean_cb(GtkWidget *widget, gpointer data){ cache_maintain_home(TRUE, FALSE, widget);}static CacheManager *cache_manager = NULL;static void cache_manager_close_cb(GenericDialog *gd, gpointer data){ generic_dialog_close(gd); g_free(cache_manager); cache_manager = NULL;}void cache_manager_show(void){ GenericDialog *gd; GtkWidget *group; GtkWidget *button; GtkWidget *label; GtkWidget *table; GtkSizeGroup *sizegroup; gchar *buf; if (cache_manager) { gtk_window_present(GTK_WINDOW(cache_manager->dialog->dialog)); return; } cache_manager = g_new0(CacheManager, 1); cache_manager->dialog = generic_dialog_new(_("Cache Maintenance - GQview"), "GQiew", "cache_manager", NULL, FALSE, NULL, cache_manager); gd = cache_manager->dialog; gd->cancel_cb = cache_manager_close_cb; generic_dialog_add_button(gd, GTK_STOCK_CLOSE, NULL, cache_manager_close_cb, FALSE); generic_dialog_add_message(gd, NULL, _("Cache and Data Maintenance"), NULL); sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); group = pref_group_new(gd->vbox, FALSE, _("GQview thumbnail cache"), GTK_ORIENTATION_VERTICAL); buf = g_strconcat(_("Location:"), " ", homedir(), "/", GQVIEW_CACHE_RC_THUMB, NULL); label = pref_label_new(group, buf); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); g_free(buf); table = pref_table_new(group, 2, 2, FALSE, FALSE); button = pref_table_button(table, 0, 0, GTK_STOCK_CLEAR, _("Clean up"), FALSE, G_CALLBACK(cache_manager_gqview_clean_cb), cache_manager); gtk_size_group_add_widget(sizegroup, button); pref_table_label(table, 1, 0, _("Remove orphaned or outdated thumbnails."), 0.0); button = pref_table_button(table, 0, 1, GTK_STOCK_DELETE, _("Clear cache"), FALSE, G_CALLBACK(cache_manager_gqview_clear_cb), cache_manager); gtk_size_group_add_widget(sizegroup, button); pref_table_label(table, 1, 1, _("Delete all cached thumbnails."), 0.0); group = pref_group_new(gd->vbox, FALSE, _("Shared thumbnail cache"), GTK_ORIENTATION_VERTICAL); buf = g_strconcat(_("Location:"), " ", homedir(), "/", THUMB_FOLDER, NULL); label = pref_label_new(group, buf); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); g_free(buf); table = pref_table_new(group, 2, 2, FALSE, FALSE); button = pref_table_button(table, 0, 0, GTK_STOCK_CLEAR, _("Clean up"), FALSE, G_CALLBACK(cache_manager_standard_clean_cb), cache_manager); gtk_size_group_add_widget(sizegroup, button); pref_table_label(table, 1, 0, _("Remove orphaned or outdated thumbnails."), 0.0); button = pref_table_button(table, 0, 1, GTK_STOCK_DELETE, _("Clear cache"), FALSE, G_CALLBACK(cache_manager_standard_clear_cb), cache_manager); gtk_size_group_add_widget(sizegroup, button); pref_table_label(table, 1, 1, _("Delete all cached thumbnails."), 0.0); group = pref_group_new(gd->vbox, FALSE, _("Create thumbnails"), GTK_ORIENTATION_VERTICAL); table = pref_table_new(group, 2, 1, FALSE, FALSE); button = pref_table_button(table, 0, 1, GTK_STOCK_EXECUTE, _("Render"), FALSE, G_CALLBACK(cache_manager_render_cb), cache_manager); gtk_size_group_add_widget(sizegroup, button); pref_table_label(table, 1, 1, _("Render thumbnails for a specific folder."), 0.0); group = pref_group_new(gd->vbox, FALSE, _("Metadata"), GTK_ORIENTATION_VERTICAL); buf = g_strconcat(_("Location:"), " ", homedir(), "/", GQVIEW_CACHE_RC_METADATA, NULL); label = pref_label_new(group, buf); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); g_free(buf); table = pref_table_new(group, 2, 1, FALSE, FALSE); button = pref_table_button(table, 0, 0, GTK_STOCK_CLEAR, _("Clean up"), FALSE, G_CALLBACK(cache_manager_metadata_clean_cb), cache_manager); gtk_size_group_add_widget(sizegroup, button); pref_table_label(table, 1, 0, _("Remove orphaned keywords and comments."), 0.0); gtk_widget_show(cache_manager->dialog->dialog);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -