📄 utilops.c
字号:
generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Overwrite file?"), _("Replace existing file with new file.")); pref_spacer(gd->vbox, 0); generic_dialog_add_button(gd, GTK_STOCK_YES, _("_Overwrite"), file_util_move_multiple_ok_cb, TRUE); fdm->yes_all_button = generic_dialog_add_button(gd, NULL, _("Overwrite _all"), file_util_move_multiple_all_cb, FALSE); generic_dialog_add_button(gd, GTK_STOCK_GOTO_LAST, _("S_kip all"), file_util_move_multiple_skip_all_cb, FALSE); generic_dialog_add_button(gd, GTK_STOCK_GO_FORWARD, _("_Skip"), file_util_move_multiple_skip_cb, FALSE); generic_dialog_add_image(gd, fdm->dest, _("Existing file"), fdm->source, _("New file"), TRUE); /* rename option */ fdm->rename = FALSE; fdm->rename_all = FALSE; fdm->rename_auto = FALSE; hbox = pref_box_new(gd->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_GAP); fdm->rename_auto_box = gtk_check_button_new_with_label(_("Auto rename")); g_signal_connect(G_OBJECT(fdm->rename_auto_box), "clicked", G_CALLBACK(file_util_move_multiple_rename_auto_cb), gd); gtk_box_pack_start(GTK_BOX(hbox), fdm->rename_auto_box, FALSE, FALSE, 0); gtk_widget_show(fdm->rename_auto_box); hbox = pref_box_new(gd->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_GAP); fdm->rename_box = gtk_check_button_new_with_label(_("Rename")); g_signal_connect(G_OBJECT(fdm->rename_box), "clicked", G_CALLBACK(file_util_move_multiple_rename_cb), gd); gtk_box_pack_start(GTK_BOX(hbox), fdm->rename_box, FALSE, FALSE, 0); gtk_widget_show(fdm->rename_box); fdm->rename_entry = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(fdm->rename_entry), filename_from_path(fdm->dest)); gtk_widget_set_sensitive(fdm->rename_entry, FALSE); gtk_box_pack_start(GTK_BOX(hbox), fdm->rename_entry, TRUE, TRUE, 0); gtk_widget_show(fdm->rename_entry); return gd;}static void file_util_move_multiple(FileDataMult *fdm){ while (fdm->dest || fdm->source_next) { gint success = FALSE; gint skip_file = FALSE; if (!fdm->dest) { GList *work = fdm->source_next; fdm->source = work->data; fdm->dest = concat_dir_and_file(fdm->dest_base, filename_from_path(fdm->source)); fdm->source_next = work->next; fdm->confirmed = FALSE; } if (fdm->dest && fdm->source && strcmp(fdm->dest, fdm->source) == 0) { if (!fdm->confirmed) { GenericDialog *gd; const gchar *title; gchar *text; if (fdm->copy) { title = _("Source to copy matches destination"); text = g_strdup_printf(_("Unable to copy file:\n%s\nto itself."), fdm->dest); } else { title = _("Source to move matches destination"); text = g_strdup_printf(_("Unable to move file:\n%s\nto itself."), fdm->dest); } gd = file_util_gen_dlg(title, "GQview", "dlg_confirm", NULL, TRUE, file_util_move_multiple_cancel_cb, fdm); generic_dialog_add_message(gd, GTK_STOCK_DIALOG_WARNING, title, text); g_free(text); generic_dialog_add_button(gd, GTK_STOCK_GO_FORWARD, _("Co_ntinue"), file_util_move_multiple_continue_cb, TRUE); gtk_widget_show(gd->dialog); return; } skip_file = TRUE; } else if (isfile(fdm->dest)) { if (!fdm->confirmed && !fdm->confirm_all) { GenericDialog *gd; gd = file_util_move_multiple_confirm_dialog(fdm); gtk_widget_show(gd->dialog); return; } if (fdm->skip) skip_file = TRUE; } if (skip_file) { success = TRUE; if (!fdm->confirm_all) fdm->skip = FALSE; } else { gint try = TRUE; if (fdm->confirm_all && fdm->rename_all && isfile(fdm->dest)) { gchar *buf; buf = unique_filename_simple(fdm->dest); if (buf) { g_free(fdm->dest); fdm->dest = buf; } else { try = FALSE; } } if (try) { if (fdm->copy) { if (copy_file(fdm->source, fdm->dest)) { success = TRUE; file_maint_copied(fdm->source, fdm->dest); } } else { if (move_file(fdm->source, fdm->dest)) { success = TRUE; file_maint_moved(fdm->source, fdm->dest, fdm->source_list); } } } } if (!success) { GenericDialog *gd; const gchar *title; gchar *text; if (fdm->copy) { title = _("Error copying file"); text = g_strdup_printf(_("Unable to copy file:\n%s\nto:\n%s\nduring multiple file copy."), fdm->source, fdm->dest); } else { title = _("Error moving file"); text = g_strdup_printf(_("Unable to move file:\n%s\nto:\n%s\nduring multiple file move."), fdm->source, fdm->dest); } gd = file_util_gen_dlg(title, "GQview", "dlg_confirm", NULL, TRUE, file_util_move_multiple_cancel_cb, fdm); generic_dialog_add_message(gd, GTK_STOCK_DIALOG_WARNING, title, text); g_free(text); generic_dialog_add_button(gd, GTK_STOCK_GO_FORWARD, _("Co_ntinue"), file_util_move_multiple_continue_cb, TRUE); gtk_widget_show(gd->dialog); } g_free(fdm->dest); fdm->dest = NULL; if (!success) return; } file_data_multiple_free(fdm);}/* * Single file move */static FileDataSingle *file_data_single_new(const gchar *source, const gchar *dest, gint copy){ FileDataSingle *fds = g_new0(FileDataSingle, 1); fds->confirmed = FALSE; fds->source = g_strdup(source); fds->dest = g_strdup(dest); fds->copy = copy; return fds;}static void file_data_single_free(FileDataSingle *fds){ g_free(fds->source); g_free(fds->dest); g_free(fds);}static void file_util_move_single(FileDataSingle *fds);static void file_util_move_single_ok_cb(GenericDialog *gd, gpointer data){ FileDataSingle *fds = data; fds->confirmed = TRUE; if (fds->rename_auto) { gchar *buf; buf = unique_filename_simple(fds->dest); if (buf) { g_free(fds->dest); fds->dest = buf; } else { /* unique failed? well, return to the overwrite prompt :( */ fds->confirmed = FALSE; } } else if (fds->rename) { const gchar *name; name = gtk_entry_get_text(GTK_ENTRY(fds->rename_entry)); if (strlen(name) == 0 || strcmp(name, filename_from_path(fds->source)) == 0) { fds->confirmed = FALSE; } else { gchar *base; base = remove_level_from_path(fds->dest); g_free(fds->dest); fds->dest = concat_dir_and_file(base, name); fds->confirmed = !isname(fds->dest); g_free(base); } } file_util_move_single(fds);}static void file_util_move_single_cancel_cb(GenericDialog *gd, gpointer data){ FileDataSingle *fds = data; file_data_single_free(fds);}static void file_util_move_single_rename_auto_cb(GtkWidget *widget, gpointer data){ GenericDialog *gd = data; FileDataSingle *fds; fds = gd->data; fds->rename_auto = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); gtk_widget_set_sensitive(fds->rename_box, !fds->rename_auto); gtk_widget_set_sensitive(fds->rename_entry, (!fds->rename_auto && fds->rename)); if (fds->rename_auto) { gchar *preview; preview = unique_filename_simple(fds->dest); if (preview) gtk_entry_set_text(GTK_ENTRY(fds->rename_entry), filename_from_path(preview)); g_free(preview); }}static void file_util_move_single_rename_cb(GtkWidget *widget, gpointer data){ GenericDialog *gd = data; FileDataSingle *fds; fds = gd->data; fds->rename = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); gtk_widget_set_sensitive(fds->rename_entry, fds->rename); if (fds->rename) { const gchar *name; gtk_widget_grab_focus(fds->rename_entry); name = gtk_entry_get_text(GTK_ENTRY(fds->rename_entry)); gtk_editable_select_region(GTK_EDITABLE(fds->rename_entry), 0, filename_base_length(name)); }}static void file_util_move_single(FileDataSingle *fds){ if (fds->dest && fds->source && strcmp(fds->dest, fds->source) == 0) { file_util_warning_dialog(_("Source matches destination"), _("Source and destination are the same, operation cancelled."), GTK_STOCK_DIALOG_INFO, NULL); } else if (isfile(fds->dest) && !fds->confirmed) { GenericDialog *gd; GtkWidget *hbox; gd = file_util_gen_dlg(_("Overwrite file"), "GQview", "dlg_confirm", NULL, TRUE, file_util_move_single_cancel_cb, fds); generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Overwrite file?"), _("Replace existing file with new file.")); pref_spacer(gd->vbox, 0); generic_dialog_add_button(gd, GTK_STOCK_OK, _("_Overwrite"), file_util_move_single_ok_cb, TRUE); generic_dialog_add_image(gd, fds->dest, _("Existing file"), fds->source, _("New file"), TRUE); /* rename option */ fds->rename = FALSE; fds->rename_auto = FALSE; hbox = pref_box_new(gd->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_GAP); fds->rename_auto_box = gtk_check_button_new_with_label(_("Auto rename")); g_signal_connect(G_OBJECT(fds->rename_auto_box), "clicked", G_CALLBACK(file_util_move_single_rename_auto_cb), gd); gtk_box_pack_start(GTK_BOX(hbox), fds->rename_auto_box, FALSE, FALSE, 0); gtk_widget_show(fds->rename_auto_box); hbox = pref_box_new(gd->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_GAP); fds->rename_box = gtk_check_button_new_with_label(_("Rename")); g_signal_connect(G_OBJECT(fds->rename_box), "clicked", G_CALLBACK(file_util_move_single_rename_cb), gd); gtk_box_pack_start(GTK_BOX(hbox), fds->rename_box, FALSE, FALSE, 0); gtk_widget_show(fds->rename_box); fds->rename_entry = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(fds->rename_entry), filename_from_path(fds->dest)); gtk_widget_set_sensitive(fds->rename_entry, FALSE); gtk_box_pack_start(GTK_BOX(hbox), fds->rename_entry, TRUE, TRUE, 0); gtk_widget_show(fds->rename_entry); gtk_widget_show(gd->dialog); return; } else { gint success = FALSE; if (fds->copy) { if (copy_file(fds->source, fds->dest)) { success = TRUE; file_maint_copied(fds->source, fds->dest); } } else { if (move_file(fds->source, fds->dest)) { success = TRUE; file_maint_moved(fds->source, fds->dest, NULL); } } if (!success) { gchar *title; gchar *text; if (fds->copy) { title = _("Error copying file"); text = g_strdup_printf(_("Unable to copy file:\n%s\nto:\n%s"), fds->source, fds->dest); } else { title = _("Error moving file"); text = g_strdup_printf(_("Unable to move file:\n%s\nto:\n%s"), fds->source, fds->dest); } file_util_warning_dialog(title, text, GTK_STOCK_DIALOG_ERROR, NULL); g_free(text); } } file_data_single_free(fds);}/* * file move dialog */static void file_util_move_do(FileDialog *fd){ file_dialog_sync_history(fd, TRUE); if (fd->multiple_files) { file_util_move_multiple(file_data_multiple_new(fd->source_list, fd->dest_path, fd->type)); fd->source_list = NULL; } else { if (isdir(fd->dest_path)) { gchar *buf = concat_dir_and_file(fd->dest_path, filename_from_path(fd->source_path)); gtk_entry_set_text(GTK_ENTRY(fd->entry), buf); g_free(buf); } file_util_move_single(file_data_single_new(fd->source_path, fd->dest_path, fd->type)); } file_dialog_close(fd);}static void file_util_move_check(FileDialog *fd){ if (fd->dest_path && strcmp(fd->dest_path, "~") == 0) { gtk_entry_set_text(GTK_ENTRY(fd->entry), homedir()); } if (fd->multiple_files && !isdir(fd->dest_path)) { if (isfile(fd->dest_path)) { file_util_warning_dialog(_("Invalid destination"), _("When operating with multiple files, please select\na folder, not a file."), GTK_STOCK_DIALOG_INFO, NULL); } else file_util_warning_dialog(_("Invalid folder"), _("Please select an existing folder."), GTK_STOCK_DIALOG_INFO, NULL); return; } if (!fd->dest_path || fd->dest_path[0] != '/') { if (fd->source_path) { gchar *base; gchar *path; base = remove_level_from_path(fd->source_path); path = concat_dir_and_file(base, fd->dest_path); gtk_entry_set_text(GTK_ENTRY(fd->entry), path); g_free(path); g_free(base); } return; } file_util_move_do(fd);}static void file_util_move_cb(FileDialog *fd, gpointer data){ file_util_move_check(fd);}static void file_util_move_cancel_cb(FileDialog *fd, gpointer data){ file_dialog_close(fd);}static void real_file_util_move(const gchar *source_path, GList *source_list, const gchar *dest_path, gint copy, GtkWidget *parent){ FileDialog *fd; GtkWidget *label; gchar *path = NULL; gint multiple; const gchar *text; const gchar *title; const gchar *op_text; const gchar *stock_id; if (!source_path && !source_list) return; if (source_path) { path = g_strdup(source_path); multiple = FALSE; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -