📄 utilops.c
字号:
box_append_safe_delete_status(gd); generic_dialog_add_button(gd, GTK_STOCK_DELETE, NULL, file_util_delete_multiple_ok_cb, TRUE); gtk_widget_show(gd->dialog); }}/* * delete single file */static void file_util_delete_ok_cb(GenericDialog *gd, gpointer data){ gchar *path = data; if (!file_util_unlink(path)) { gchar *text = g_strdup_printf(_("Unable to delete file:\n%s"), path); file_util_warning_dialog(_("File deletion failed"), text, GTK_STOCK_DIALOG_ERROR, NULL); g_free(text); } else { file_maint_removed(path, NULL); } g_free(path);}static void file_util_delete_cancel_cb(GenericDialog *gd, gpointer data){ gchar *path = data; g_free(path);}static void file_util_delete_single(const gchar *path, GtkWidget *parent){ gchar *buf = g_strdup(path); if (!confirm_delete) { file_util_delete_ok_cb(NULL, buf); } else { GenericDialog *gd; GtkWidget *table; gchar *base; gd = file_util_gen_dlg(_("Delete file - GQview"), "GQview", "dlg_confirm", parent, TRUE, file_util_delete_cancel_cb, buf); generic_dialog_add_message(gd, NULL, _("Delete file?"), NULL); table = pref_table_new(gd->vbox, 2, 2, FALSE, FALSE); pref_table_label(table, 0, 0, _("File name:"), 1.0); pref_table_label(table, 1, 0, filename_from_path(path), 0.0); pref_table_label(table, 0, 1, _("Location:"), 1.0); base = remove_level_from_path(path); pref_table_label(table, 1, 1, base, 0.0); g_free(base); generic_dialog_add_image(gd, path, NULL, NULL, NULL, FALSE); box_append_safe_delete_status(gd); generic_dialog_add_button(gd, GTK_STOCK_DELETE, NULL, file_util_delete_ok_cb, TRUE); gtk_widget_show(gd->dialog); }}void file_util_delete(const gchar *source_path, GList *source_list, GtkWidget *parent){ if (!source_path && !source_list) return; if (source_path) { file_util_delete_single(source_path, parent); } else if (!source_list->next) { file_util_delete_single(source_list->data, parent); path_list_free(source_list); } else { file_util_delete_multiple(source_list, parent); }}/* *-------------------------------------------------------------------------- * Rename routines *-------------------------------------------------------------------------- *//* * rename multiple files */enum { RENAME_COLUMN_PATH = 0, RENAME_COLUMN_NAME, RENAME_COLUMN_PREVIEW, RENAME_COLUMN_COUNT};typedef struct _RenameDataMult RenameDataMult;struct _RenameDataMult{ FileDialog *fd; gint rename_auto; GtkWidget *listview; GtkWidget *button_auto; GtkWidget *rename_box; GtkWidget *rename_label; GtkWidget *rename_entry; GtkWidget *auto_box; GtkWidget *auto_entry_front; GtkWidget *auto_spin_start; GtkWidget *auto_spin_pad; GtkWidget *auto_entry_end; ImageWindow *imd; gint update_idle_id;};static void file_util_rename_multiple(RenameDataMult *rd);static void file_util_rename_multiple_ok_cb(GenericDialog *gd, gpointer data){ RenameDataMult *rd = data; GtkWidget *dialog; dialog = GENERIC_DIALOG(rd->fd)->dialog; if (!GTK_WIDGET_VISIBLE(dialog)) gtk_widget_show(dialog); rd->fd->type = TRUE; file_util_rename_multiple(rd);}static void file_util_rename_multiple_cancel_cb(GenericDialog *gd, gpointer data){ RenameDataMult *rd = data; GtkWidget *dialog; dialog = GENERIC_DIALOG(rd->fd)->dialog; if (!GTK_WIDGET_VISIBLE(dialog)) gtk_widget_show(dialog);}static gint file_util_rename_multiple_find_row(RenameDataMult *rd, const gchar *path, GtkTreeIter *iter){ GtkTreeModel *store; gint valid; gint row = 0; store = gtk_tree_view_get_model(GTK_TREE_VIEW(rd->listview)); valid = gtk_tree_model_get_iter_first(store, iter); while (valid) { gchar *path_n; gint ret; gtk_tree_model_get(GTK_TREE_MODEL(store), iter, RENAME_COLUMN_PATH, &path_n, -1); ret = (strcmp(path_n, path) == 0); g_free(path_n); if (ret) return row; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), iter); row++; } return -1;}static void file_util_rename_multiple(RenameDataMult *rd){ FileDialog *fd; fd = rd->fd; if (isfile(fd->dest_path) && !fd->type) { GenericDialog *gd; gd = file_util_gen_dlg(_("Overwrite file"), "GQview", "dlg_confirm", NULL, TRUE, file_util_rename_multiple_cancel_cb, rd); generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Overwrite file?"), _("Replace existing file by renaming new file.")); pref_spacer(gd->vbox, 0); generic_dialog_add_button(gd, GTK_STOCK_OK, _("_Overwrite"), file_util_rename_multiple_ok_cb, TRUE); generic_dialog_add_image(gd, fd->dest_path, _("Existing file"), fd->source_path, _("New file"), TRUE); gtk_widget_hide(GENERIC_DIALOG(fd)->dialog); gtk_widget_show(gd->dialog); return; } else { if (!rename_file(fd->source_path, fd->dest_path)) { gchar *text = g_strdup_printf(_("Unable to rename file:\n%s\n to:\n%s"), filename_from_path(fd->source_path), filename_from_path(fd->dest_path)); file_util_warning_dialog(_("Error renaming file"), text, GTK_STOCK_DIALOG_ERROR, NULL); g_free(text); } else { GtkTreeModel *store; GtkTreeIter iter; GtkTreeIter next; gint row; file_maint_renamed(fd->source_path, fd->dest_path); store = gtk_tree_view_get_model(GTK_TREE_VIEW(rd->listview)); row = file_util_rename_multiple_find_row(rd, rd->fd->source_path, &iter); if (row >= 0 && (gtk_tree_model_iter_nth_child(store, &next, NULL, row + 1) || (row > 0 && gtk_tree_model_iter_nth_child(store, &next, NULL, row - 1)) ) ) { GtkTreeSelection *selection; selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(rd->listview)); gtk_tree_selection_select_iter(selection, &next); gtk_list_store_remove(GTK_LIST_STORE(store), &iter); } else { if (debug) printf("closed by #%d\n", row); file_dialog_close(rd->fd); } } }}static void file_util_rename_multiple_auto(RenameDataMult *rd){ const gchar *front; const gchar *end; gint start_n; gint padding; gint n; GtkTreeModel *store; GtkTreeIter iter; gint valid; gint success; history_combo_append_history(rd->auto_entry_front, NULL); history_combo_append_history(rd->auto_entry_end, NULL); front = gtk_entry_get_text(GTK_ENTRY(rd->auto_entry_front)); end = gtk_entry_get_text(GTK_ENTRY(rd->auto_entry_end)); start_n = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(rd->auto_spin_start)); padding = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(rd->auto_spin_pad)); store = gtk_tree_view_get_model(GTK_TREE_VIEW(rd->listview)); /* first check for name conflicts */ success = TRUE; n = start_n; valid = gtk_tree_model_get_iter_first(store, &iter); while (valid && success) { gchar *dest; gchar *base; gchar *path; gtk_tree_model_get(store, &iter, RENAME_COLUMN_PATH, &path, -1); base = remove_level_from_path(path); dest = g_strdup_printf("%s/%s%0*d%s", base, front, padding, n, end); if (isname(dest)) success = FALSE; g_free(dest); g_free(base); g_free(path); n++; valid = gtk_tree_model_iter_next(store, &iter); } if (!success) { file_util_warning_dialog(_("Auto rename"), _("Can not auto rename with the selected\nnumber set, one or more files exist that\nmatch the resulting name list.\n"), GTK_STOCK_DIALOG_WARNING, NULL); return; } /* select the first iter, so that on fail the correct info is given to user */ if (gtk_tree_model_get_iter_first(store, &iter)) { GtkTreeSelection *selection; selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(rd->listview)); gtk_tree_selection_select_iter(selection, &iter); } /* now do it for real */ success = TRUE; n = start_n; while (success && gtk_tree_model_get_iter_first(store, &iter)) { gchar *dest; gchar *base; gchar *path; gtk_tree_model_get(store, &iter, RENAME_COLUMN_PATH, &path, -1); base = remove_level_from_path(path); dest = g_strdup_printf("%s/%s%0*d%s", base, front, padding, n, end); if (!rename_file(path, dest)) { success = FALSE; } else { file_maint_renamed(path, dest); } g_free(dest); g_free(base); g_free(path); if (success) { gtk_list_store_remove(GTK_LIST_STORE(store), &iter); if (gtk_tree_model_get_iter_first(store, &iter)) { GtkTreeSelection *selection; selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(rd->listview)); gtk_tree_selection_select_iter(selection, &iter); } } n++; } if (!success) { gchar *buf; n--; gtk_spin_button_set_value(GTK_SPIN_BUTTON(rd->auto_spin_start), (gdouble)n); buf = g_strdup_printf(_("Failed to rename\n%s\nThe number was %d."), filename_from_path(rd->fd->source_path), n); file_util_warning_dialog(_("Auto rename"), buf, GTK_STOCK_DIALOG_ERROR, NULL); g_free(buf); return; } file_dialog_close(rd->fd);}static void file_util_rename_multiple_cb(FileDialog *fd, gpointer data){ RenameDataMult *rd = data; gchar *base; const gchar *name; if (rd->rename_auto) { file_util_rename_multiple_auto(rd); return; } name = gtk_entry_get_text(GTK_ENTRY(rd->rename_entry)); base = remove_level_from_path(fd->source_path); g_free(fd->dest_path); fd->dest_path = concat_dir_and_file(base, name); g_free(base); if (strlen(name) == 0 || strcmp(fd->source_path, fd->dest_path) == 0) { return; } fd->type = FALSE; file_util_rename_multiple(rd);}static void file_util_rename_multiple_close_cb(FileDialog *fd, gpointer data){ RenameDataMult *rd = data; file_dialog_close(rd->fd);}static gboolean file_util_rename_multiple_select_cb(GtkTreeSelection *selection, GtkTreeModel *store, GtkTreePath *tpath, gboolean path_currently_selected, gpointer data){ RenameDataMult *rd = data; GtkTreeIter iter; const gchar *name; gchar *path = NULL; if (path_currently_selected || !gtk_tree_model_get_iter(store, &iter, tpath)) return TRUE; gtk_tree_model_get(store, &iter, RENAME_COLUMN_PATH, &path, -1); g_free(rd->fd->source_path); rd->fd->source_path = path; name = filename_from_path(rd->fd->source_path); gtk_label_set_text(GTK_LABEL(rd->rename_label), name); gtk_entry_set_text(GTK_ENTRY(rd->rename_entry), name); image_change_path(rd->imd, rd->fd->source_path, 0.0); if (GTK_WIDGET_VISIBLE(rd->rename_box)) { gtk_widget_grab_focus(rd->rename_entry); gtk_editable_select_region(GTK_EDITABLE(rd->rename_entry), 0, filename_base_length(name)); } return TRUE;}static void file_util_rename_multiple_preview_update(RenameDataMult *rd){ GtkTreeModel *store; GtkTreeIter iter; const gchar *front; const gchar *end; gint valid; gint start_n; gint padding; gint n; front = gtk_entry_get_text(GTK_ENTRY(rd->auto_entry_front)); end = gtk_entry_get_text(GTK_ENTRY(rd->auto_entry_end)); start_n = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(rd->auto_spin_start)); padding = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(rd->auto_spin_pad)); store = gtk_tree_view_get_model(GTK_TREE_VIEW(rd->listview)); n = start_n; valid = gtk_tree_model_get_iter_first(store, &iter); while (valid) { gchar *dest; dest = g_strdup_printf("%s%0*d%s", front, padding, n, end); gtk_list_store_set(GTK_LIST_STORE(store), &iter, RENAME_COLUMN_PREVIEW, dest, -1); g_free(dest); n++; valid = gtk_tree_model_iter_next(store, &iter); }}static gboolean file_util_rename_multiple_idle_cb(gpointer data){ RenameDataMult *rd = data; file_util_rename_multiple_preview_update(rd); rd->update_idle_id = -1; return FALSE;}static void file_util_rename_multiple_preview_order_cb(GtkTreeModel *treemodel, GtkTreePath *tpath, GtkTreeIter *iter, gpointer data){ RenameDataMult *rd = data; if (rd->rename_auto && rd->update_idle_id == -1) { rd->update_idle_id = g_idle_add(file_util_rename_multiple_idle_cb, rd); }}static void file_util_rename_multiple_preview_entry_cb(GtkWidget *entry, gpointer data){ RenameDataMult *rd = data; file_util_rename_multiple_preview_update(rd);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -