📄 utilops.c
字号:
else if (source_list->next) { multiple = TRUE; } else { path = g_strdup(source_list->data); path_list_free(source_list); source_list = NULL; multiple = FALSE; } if (copy) { title = _("Copy - GQview"); op_text = _("_Copy"); if (path) { text = _("Copy file"); } else { text = _("Copy multiple files"); } stock_id = GTK_STOCK_COPY; } else { title = _("Move - GQview"); op_text = _("_Move"); if (path) { text = _("Move file"); } else { text = _("Move multiple files"); } stock_id = GTK_STOCK_OK; } fd = file_util_file_dlg(title, "GQview", "dlg_copymove", parent, file_util_move_cancel_cb, NULL); generic_dialog_add_message(GENERIC_DIALOG(fd), NULL, text, NULL); if (path) { GtkWidget *box; box = pref_box_new(GENERIC_DIALOG(fd)->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE); pref_label_new(box, _("File name:")); pref_label_new(box, filename_from_path(path)); } label = pref_label_new(GENERIC_DIALOG(fd)->vbox, _("Choose the destination folder.")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); pref_spacer(GENERIC_DIALOG(fd)->vbox, 0); file_dialog_add_button(fd, stock_id, op_text, file_util_move_cb, TRUE); file_dialog_add_path_widgets(fd, NULL, dest_path, "move_copy", NULL, NULL); fd->type = copy; fd->source_path = path; fd->source_list = source_list; fd->multiple_files = multiple; gtk_widget_show(GENERIC_DIALOG(fd)->dialog);}void file_util_move(const gchar *source_path, GList *source_list, const gchar *dest_path, GtkWidget *parent){ real_file_util_move(source_path, source_list, dest_path, FALSE, parent);}void file_util_copy(const gchar *source_path, GList *source_list, const gchar *dest_path, GtkWidget *parent){ real_file_util_move(source_path, source_list, dest_path, TRUE, parent);}void file_util_move_simple(GList *list, const gchar *dest_path){ if (!list) return; if (!dest_path) { path_list_free(list); return; } if (!list->next) { const gchar *source; gchar *dest; source = list->data; dest = concat_dir_and_file(dest_path, filename_from_path(source)); file_util_move_single(file_data_single_new(source, dest, FALSE)); g_free(dest); path_list_free(list); return; } file_util_move_multiple(file_data_multiple_new(list, dest_path, FALSE));}void file_util_copy_simple(GList *list, const gchar *dest_path){ if (!list) return; if (!dest_path) { path_list_free(list); return; } if (!list->next) { const gchar *source; gchar *dest; source = list->data; dest = concat_dir_and_file(dest_path, filename_from_path(source)); file_util_move_single(file_data_single_new(source, dest, TRUE)); g_free(dest); path_list_free(list); return; } file_util_move_multiple(file_data_multiple_new(list, dest_path, TRUE));}/* *-------------------------------------------------------------------------- * Safe Delete *-------------------------------------------------------------------------- */static gint file_util_safe_number(gint64 free_space){ gint n = 0; gint64 total = 0; GList *list; GList *work; gint sorted = FALSE; gint warned = FALSE; if (!filelist_read(safe_delete_path, &list, NULL)) return 0; work = list; while (work) { FileData *fd; gint v; fd = work->data; work = work->next; v = (gint)strtol(fd->name, NULL, 10); if (v >= n) n = v + 1; total += fd->size; } while (list && (free_space < 0 || total + free_space > (gint64)safe_delete_size * 1048576) ) { FileData *fd; if (!sorted) { list = filelist_sort(list, SORT_NAME, TRUE); sorted = TRUE; } fd = list->data; list = g_list_remove(list, fd); if (debug) printf("expunging from trash for space: %s\n", fd->name); if (!unlink_file(fd->path) && !warned) { file_util_warning_dialog(_("Delete failed"), _("Unable to remove old file from trash folder"), GTK_STOCK_DIALOG_WARNING, NULL); warned = TRUE; } total -= fd->size; file_data_free(fd); } filelist_free(list); return n;}void file_util_trash_clear(void){ file_util_safe_number(-1);}static gchar *file_util_safe_dest(const gchar *path){ gint n; n = file_util_safe_number(filesize(path)); return g_strdup_printf("%s/%06d_%s", safe_delete_path, n, filename_from_path(path));}static void file_util_safe_del_toggle_cb(GtkWidget *button, gpointer data){ safe_delete_enable = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button));}static void file_util_safe_del_close_cb(GtkWidget *dialog, gpointer data){ GenericDialog **gd = data; *gd = NULL;}static gint file_util_unlink(const gchar *path){ static GenericDialog *gd = NULL; gchar *result = NULL; gint success = TRUE; if (!isfile(path)) return FALSE; if (!safe_delete_enable) { return unlink_file(path); } if (!isdir(safe_delete_path)) { if (debug) printf("creating trash: %s\n", safe_delete_path); if (!safe_delete_path || !mkdir_utf8(safe_delete_path, 0755)) { result = _("Could not create folder"); success = FALSE; } } if (success) { gchar *dest; dest = file_util_safe_dest(path); if (dest) { if (debug) printf("safe deleting %s to %s\n", path, dest); success = move_file(path, dest); } else { success = FALSE; } if (!success && !access_file(path, W_OK)) { result = _("Permission denied"); } g_free(dest); } if (result && !gd) { GtkWidget *button; gchar *buf; buf = g_strdup_printf(_("Unable to access or create the trash folder.\n\"%s\""), safe_delete_path); gd = file_util_warning_dialog(result, buf, GTK_STOCK_DIALOG_WARNING, NULL); g_free(buf); button = gtk_check_button_new_with_label(_("Turn off safe delete")); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(file_util_safe_del_toggle_cb), NULL); gtk_box_pack_start(GTK_BOX(gd->vbox), button, FALSE, FALSE, 0); gtk_widget_show(button); g_signal_connect(G_OBJECT(gd->dialog), "destroy", G_CALLBACK(file_util_safe_del_close_cb), &gd); } return success;}static void box_append_safe_delete_status(GenericDialog *gd){ GtkWidget *label; gchar *buf; buf = g_strdup_printf(_("Safe delete: %s"), (safe_delete_enable) ? _("on") : _("off")); label = pref_label_new(gd->vbox, buf); g_free(buf); gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); gtk_widget_set_sensitive(label, FALSE);}/* *-------------------------------------------------------------------------- * Delete routines *-------------------------------------------------------------------------- *//* * delete multiple files */static void file_util_delete_multiple_ok_cb(GenericDialog *gd, gpointer data);static void file_util_delete_multiple_cancel_cb(GenericDialog *gd, gpointer data);static void file_util_delete_multiple_ok_cb(GenericDialog *gd, gpointer data){ GList *source_list = data; while (source_list) { gchar *path = source_list->data; source_list = g_list_remove(source_list, path); if (!file_util_unlink(path)) { if (source_list) { GenericDialog *d; gchar *text; d = file_util_gen_dlg(_("Delete failed"), "GQview", "dlg_confirm", NULL, TRUE, file_util_delete_multiple_cancel_cb, source_list); text = g_strdup_printf(_("Unable to delete file:\n %s\n Continue multiple delete operation?"), path); generic_dialog_add_message(d, GTK_STOCK_DIALOG_WARNING, NULL, text); g_free(text); generic_dialog_add_button(d, GTK_STOCK_GO_FORWARD, _("Co_ntinue"), file_util_delete_multiple_ok_cb, TRUE); gtk_widget_show(d->dialog); } else { gchar *text; text = g_strdup_printf(_("Unable to delete file:\n%s"), path); file_util_warning_dialog(_("Delete failed"), text, GTK_STOCK_DIALOG_ERROR, NULL); g_free(text); } g_free(path); return; } else { file_maint_removed(path, source_list); } g_free(path); }}static void file_util_delete_multiple_cancel_cb(GenericDialog *gd, gpointer data){ GList *source_list = data; path_list_free(source_list);}static void file_util_delete_multiple_review_skip(GenericDialog *gd, gint next){ GtkWidget *button_back; GtkWidget *button_next; GtkWidget *button_label; GList *list; GList *list_point; const gchar *path; gchar *buf; list = gd->data; button_back = g_object_get_data(G_OBJECT(gd->dialog), "button_back"); button_next = g_object_get_data(G_OBJECT(gd->dialog), "button_next"); button_label = g_object_get_data(G_OBJECT(gd->dialog), "button_label"); list_point = g_object_get_data(G_OBJECT(gd->dialog), "list_point"); if (!list || !button_label) return; if (list_point) { if (next) { if (list_point->next) list_point = list_point->next; } else { if (list_point->prev) list_point = list_point->prev; } } else { list_point = list; } if (!list_point) return; path = list_point->data; buf = g_strdup_printf(_("File %d of %d"), g_list_index(list, (gpointer)path) + 1, g_list_length(list)); gtk_label_set_text(GTK_LABEL(button_label), buf); g_free(buf); gtk_widget_set_sensitive(button_back, (list_point->prev != NULL) ); gtk_widget_set_sensitive(button_next, (list_point->next != NULL) ); generic_dialog_image_set(gd, path); g_object_set_data(G_OBJECT(gd->dialog), "list_point", list_point);}static void file_util_delete_multiple_review_back(GtkWidget *button, gpointer data){ GenericDialog *gd = data; file_util_delete_multiple_review_skip(gd, FALSE);}static void file_util_delete_multiple_review_next(GtkWidget *button, gpointer data){ GenericDialog *gd = data; file_util_delete_multiple_review_skip(gd, TRUE);}static void file_util_delete_multiple_review_button_cb(ImageWindow *imd, gint button, guint32 time, gdouble x, gdouble y, guint state, gpointer data){ if (button == 1) { file_util_delete_multiple_review_next(NULL, data); } else if (button == 2 || button == 3) { file_util_delete_multiple_review_back(NULL, data); }}static void file_util_delete_multiple_review_scroll_cb(ImageWindow *imd, GdkScrollDirection direction, guint32 time, gdouble x, gdouble y, guint state, gpointer data){ if (direction == GDK_SCROLL_UP) { file_util_delete_multiple_review_back(NULL, data); } else if (direction == GDK_SCROLL_DOWN) { file_util_delete_multiple_review_next(NULL, data); }}static void file_util_delete_multiple(GList *source_list, GtkWidget *parent){ if (!confirm_delete) { file_util_delete_multiple_ok_cb(NULL, source_list); } else { GenericDialog *gd; GtkWidget *hbox; GtkWidget *button; GtkWidget *label; ImageWindow *imd; gchar *buf; gd = file_util_gen_dlg(_("Delete files - GQview"), "GQview", "dlg_confirm", parent, TRUE, file_util_delete_multiple_cancel_cb, source_list); generic_dialog_add_message(gd, NULL, _("Delete multiple files"), NULL); generic_dialog_add_image(gd, NULL, NULL, NULL, NULL, TRUE); imd = g_object_get_data(G_OBJECT(gd->dialog), "img_image"); image_set_button_func(imd, file_util_delete_multiple_review_button_cb, gd); image_set_scroll_func(imd, file_util_delete_multiple_review_scroll_cb, gd); hbox = pref_box_new(gd->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_BUTTON_GAP); button = pref_button_new(hbox, GTK_STOCK_GO_BACK, NULL, TRUE, G_CALLBACK(file_util_delete_multiple_review_back), gd); gtk_widget_set_sensitive(button, FALSE); g_object_set_data(G_OBJECT(gd->dialog), "button_back", button); button = pref_button_new(hbox, GTK_STOCK_GO_FORWARD, NULL, TRUE, G_CALLBACK(file_util_delete_multiple_review_next), gd); g_object_set_data(G_OBJECT(gd->dialog), "button_next", button); buf = g_strdup_printf(_("Review %d files"), g_list_length(source_list) ); label = pref_label_new(hbox, buf); g_free(buf); g_object_set_data(G_OBJECT(gd->dialog), "button_label", label);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -