📄 utilops.c
字号:
}static void file_util_rename_multiple_preview_adj_cb(GtkWidget *spin, gpointer data){ RenameDataMult *rd = data; file_util_rename_multiple_preview_update(rd);}static void file_util_rename_mulitple_auto_toggle(GtkWidget *widget, gpointer data){ RenameDataMult *rd = data; GtkTreeViewColumn *column; rd->rename_auto = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rd->button_auto)); if (rd->rename_auto) { if (GTK_WIDGET_VISIBLE(rd->rename_box)) gtk_widget_hide(rd->rename_box); if (!GTK_WIDGET_VISIBLE(rd->auto_box)) gtk_widget_show(rd->auto_box); file_util_rename_multiple_preview_update(rd); } else { if (GTK_WIDGET_VISIBLE(rd->auto_box)) gtk_widget_hide(rd->auto_box); if (!GTK_WIDGET_VISIBLE(rd->rename_box)) gtk_widget_show(rd->rename_box); } column = gtk_tree_view_get_column(GTK_TREE_VIEW(rd->listview), RENAME_COLUMN_PREVIEW - 1); gtk_tree_view_column_set_visible(column, rd->rename_auto);}static GtkWidget *furm_simple_vlabel(GtkWidget *box, const gchar *text, gint expand){ GtkWidget *vbox; GtkWidget *label; vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(box), vbox, expand, expand, 0); gtk_widget_show(vbox); label = gtk_label_new(text); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); gtk_widget_show(label); return vbox;}static GtkTreeViewColumn *file_util_rename_multiple_add_column(RenameDataMult *rd, const gchar *text, gint n){ GtkTreeViewColumn *column; GtkCellRenderer *renderer; column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, text); gtk_tree_view_column_set_min_width(column, 4); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_GROW_ONLY); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_add_attribute(column, renderer, "text", n); gtk_tree_view_append_column(GTK_TREE_VIEW(rd->listview), column); return column;}static void file_util_rename_multiple_destroy_cb(GtkWidget *widget, gpointer data){ RenameDataMult *rd = data; if (rd->update_idle_id != -1) g_source_remove(rd->update_idle_id); g_free(rd);}static void file_util_rename_multiple_do(GList *source_list, GtkWidget *parent){ RenameDataMult *rd; GtkWidget *pane; GtkWidget *scrolled; GtkListStore *store; GtkTreeSelection *selection; GtkTreeViewColumn *column; GtkWidget *hbox; GtkWidget *vbox; GtkWidget *box2; GtkWidget *table; GtkWidget *combo; GList *work; const gchar *name; rd = g_new0(RenameDataMult, 1); rd->fd = file_util_file_dlg(_("Rename - GQview"), "GQview", "dlg_rename", parent, file_util_rename_multiple_close_cb, rd); generic_dialog_add_message(GENERIC_DIALOG(rd->fd), NULL, _("Rename multiple files"), NULL); file_dialog_add_button(rd->fd, GTK_STOCK_OK, _("_Rename"), file_util_rename_multiple_cb, TRUE); rd->fd->source_path = g_strdup(source_list->data); rd->fd->dest_path = NULL; rd->update_idle_id = -1; vbox = GENERIC_DIALOG(rd->fd)->vbox; pane = gtk_hpaned_new(); gtk_box_pack_start(GTK_BOX(vbox), pane, TRUE, TRUE, 0); gtk_widget_show(pane); scrolled = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_paned_pack1(GTK_PANED(pane), scrolled, TRUE, TRUE); gtk_widget_show(scrolled); store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); rd->listview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); g_object_unref(store); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(rd->listview), TRUE); gtk_tree_view_set_enable_search(GTK_TREE_VIEW(rd->listview), FALSE); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(rd->listview)); gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_SINGLE); gtk_tree_selection_set_select_function(selection, file_util_rename_multiple_select_cb, rd, NULL); file_util_rename_multiple_add_column(rd, _("Original Name"), RENAME_COLUMN_NAME); column = file_util_rename_multiple_add_column(rd, _("Preview"), RENAME_COLUMN_PREVIEW); gtk_tree_view_column_set_visible(column, FALSE); gtk_tree_view_set_reorderable(GTK_TREE_VIEW(rd->listview), TRUE); g_signal_connect(G_OBJECT(store), "row_changed", G_CALLBACK(file_util_rename_multiple_preview_order_cb), rd); gtk_widget_set_size_request(rd->listview, 250, 150); gtk_container_add(GTK_CONTAINER(scrolled), rd->listview); gtk_widget_show(rd->listview); work = source_list; while (work) { gchar *path = work->data; GtkTreeIter iter; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, RENAME_COLUMN_PATH, path, RENAME_COLUMN_NAME, filename_from_path(path), -1); work = work->next; } path_list_free(source_list); rd->imd = image_new(TRUE); gtk_widget_set_size_request(rd->imd->widget, DIALOG_DEF_IMAGE_DIM_X, DIALOG_DEF_IMAGE_DIM_Y); gtk_paned_pack2(GTK_PANED(pane), rd->imd->widget, FALSE, TRUE); gtk_widget_show(rd->imd->widget); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_widget_show(hbox); rd->button_auto = gtk_check_button_new_with_label(_("Auto rename")); g_signal_connect(G_OBJECT(rd->button_auto), "clicked", G_CALLBACK(file_util_rename_mulitple_auto_toggle), rd); gtk_box_pack_end(GTK_BOX(hbox), rd->button_auto, FALSE, FALSE, 0); gtk_widget_show(rd->button_auto); rd->rename_box = pref_box_new(vbox, FALSE, GTK_ORIENTATION_VERTICAL, 0); table = pref_table_new(rd->rename_box, 2, 2, FALSE, FALSE); pref_table_label(table, 0, 0, _("Original name:"), 1.0); rd->rename_label = pref_table_label(table, 1, 0, filename_from_path(rd->fd->source_path), 0.0); pref_table_label(table, 0, 1, _("New name:"), 1.0); rd->rename_entry = gtk_entry_new(); gtk_table_attach(GTK_TABLE(table), rd->rename_entry, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, FALSE, 0, 0); generic_dialog_attach_default(GENERIC_DIALOG(rd->fd), rd->rename_entry); gtk_widget_grab_focus(rd->rename_entry); name = filename_from_path(rd->fd->source_path); gtk_entry_set_text(GTK_ENTRY(rd->rename_entry), name); gtk_editable_select_region(GTK_EDITABLE(rd->rename_entry), 0, filename_base_length(name)); gtk_widget_show(rd->rename_entry); rd->auto_box = gtk_vbox_new(FALSE, PREF_PAD_GAP); gtk_box_pack_start(GTK_BOX(vbox), rd->auto_box, FALSE, FALSE, 0); /* do not show it here */ hbox = pref_box_new(rd->auto_box, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_GAP); box2 = furm_simple_vlabel(hbox, _("Begin text"), TRUE); combo = history_combo_new(&rd->auto_entry_front, "", "numerical_rename_prefix", -1); g_signal_connect(G_OBJECT(rd->auto_entry_front), "changed", G_CALLBACK(file_util_rename_multiple_preview_entry_cb), rd); gtk_box_pack_start(GTK_BOX(box2), combo, TRUE, TRUE, 0); gtk_widget_show(combo); box2 = furm_simple_vlabel(hbox, _("Start #"), FALSE); rd->auto_spin_start = pref_spin_new(box2, NULL, NULL, 0.0, 1000000.0, 1.0, 0, 0.0, G_CALLBACK(file_util_rename_multiple_preview_adj_cb), rd); box2 = furm_simple_vlabel(hbox, _("End text"), TRUE); combo = history_combo_new(&rd->auto_entry_end, "", "numerical_rename_suffix", -1); g_signal_connect(G_OBJECT(rd->auto_entry_end), "changed", G_CALLBACK(file_util_rename_multiple_preview_entry_cb), rd); gtk_box_pack_start(GTK_BOX(box2), combo, TRUE, TRUE, 0); gtk_widget_show(combo); rd->auto_spin_pad = pref_spin_new(rd->auto_box, _("Padding:"), NULL, 1.0, 8.0, 1.0, 0, 1.0, G_CALLBACK(file_util_rename_multiple_preview_adj_cb), rd); image_change_path(rd->imd, rd->fd->source_path, 0.0); g_signal_connect(G_OBJECT(GENERIC_DIALOG(rd->fd)->dialog), "destroy", G_CALLBACK(file_util_rename_multiple_destroy_cb), rd); gtk_widget_show(GENERIC_DIALOG(rd->fd)->dialog);}/* * rename single file */static void file_util_rename_single(FileDataSingle *fds);static void file_util_rename_single_ok_cb(GenericDialog *gd, gpointer data){ FileDataSingle *fds = data; fds->confirmed = TRUE; file_util_rename_single(fds);}static void file_util_rename_single_cancel_cb(GenericDialog *gd, gpointer data){ FileDataSingle *fds = data; file_data_single_free(fds);}static void file_util_rename_single(FileDataSingle *fds){ if (isfile(fds->dest) && !fds->confirmed) { GenericDialog *gd; gd = file_util_gen_dlg(_("Overwrite file"), "GQview", "dlg_confirm", NULL, TRUE, file_util_rename_single_cancel_cb, fds); 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_single_ok_cb, TRUE); generic_dialog_add_image(gd, fds->dest, _("Existing file"), fds->source, _("New file"), TRUE); gtk_widget_show(gd->dialog); return; } else { if (!rename_file(fds->source, fds->dest)) { gchar *text = g_strdup_printf(_("Unable to rename file:\n%s\nto:\n%s"), filename_from_path(fds->source), filename_from_path(fds->dest)); file_util_warning_dialog(_("Error renaming file"), text, GTK_STOCK_DIALOG_ERROR, NULL); g_free(text); } else { file_maint_renamed(fds->source, fds->dest); } } file_data_single_free(fds);}static void file_util_rename_single_cb(FileDialog *fd, gpointer data){ const gchar *name; gchar *path; name = gtk_entry_get_text(GTK_ENTRY(fd->entry)); path = concat_dir_and_file(fd->dest_path, name); if (strlen(name) == 0 || strcmp(fd->source_path, path) == 0) { g_free(path); return; } file_util_rename_single(file_data_single_new(fd->source_path, path, fd->type)); g_free(path); file_dialog_close(fd);}static void file_util_rename_single_close_cb(FileDialog *fd, gpointer data){ file_dialog_close(fd);}static void file_util_rename_single_do(const gchar *source_path, GtkWidget *parent){ FileDialog *fd; GtkWidget *table; const gchar *name; fd = file_util_file_dlg(_("Rename - GQview"), "GQview", "dlg_rename", parent, file_util_rename_single_close_cb, NULL); generic_dialog_add_message(GENERIC_DIALOG(fd), NULL, _("Rename file"), NULL); generic_dialog_add_image(GENERIC_DIALOG(fd), source_path, NULL, NULL, NULL, FALSE); file_dialog_add_button(fd, GTK_STOCK_OK, _("_Rename"), file_util_rename_single_cb, TRUE); fd->source_path = g_strdup(source_path); fd->dest_path = remove_level_from_path(source_path); table = pref_table_new(GENERIC_DIALOG(fd)->vbox, 2, 2, FALSE, FALSE); pref_table_label(table, 0, 0, _("Original name:"), 1.0); pref_table_label(table, 1, 0, filename_from_path(fd->source_path), 0.0); pref_table_label(table, 0, 1, _("New name:"), 1.0); fd->entry = gtk_entry_new(); gtk_table_attach(GTK_TABLE(table), fd->entry, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, FALSE, 0, 0); generic_dialog_attach_default(GENERIC_DIALOG(fd), fd->entry); gtk_widget_grab_focus(fd->entry); name = filename_from_path(fd->source_path); gtk_entry_set_text(GTK_ENTRY(fd->entry), name); gtk_editable_select_region(GTK_EDITABLE(fd->entry), 0, filename_base_length(name)); gtk_widget_show(fd->entry); gtk_widget_show(GENERIC_DIALOG(fd)->dialog);}void file_util_rename(const gchar *source_path, GList *source_list, GtkWidget *parent){ if (!source_path && !source_list) return; if (source_path) { file_util_rename_single_do(source_path, parent); } else if (!source_list->next) { file_util_rename_single_do(source_list->data, parent); path_list_free(source_list); } else { file_util_rename_multiple_do(source_list, parent); }}/* *-------------------------------------------------------------------------- * Create directory routines *-------------------------------------------------------------------------- */static void file_util_create_dir_do(const gchar *base, const gchar *name){ gchar *path; path = concat_dir_and_file(base, name); if (isdir(path)) { gchar *text = g_strdup_printf(_("The folder:\n%s\nalready exists."), name); file_util_warning_dialog(_("Folder exists"), text, GTK_STOCK_DIALOG_INFO, NULL); g_free(text); } else if (isname(path)) { gchar *text = g_strdup_printf(_("The path:\n%s\nalready exists as a file."), name); file_util_warning_dialog(_("Could not create folder"), text, GTK_STOCK_DIALOG_INFO, NULL); g_free(text); } else { if (!mkdir_utf8(path, 0755)) { gchar *text = g_strdup_printf(_("Unable to create folder:\n%s"), name); file_util_warning_dialog(_("Error creating folder"), text, GTK_STOCK_DIALOG_ERROR, NULL); g_free(text); } } g_free(path);}static void file_util_create_dir_cb(FileDialog *fd, gpointer data){ const gchar *name; name = gtk_entry_get_text(GTK_ENTRY(fd->entry)); if (strlen(name) == 0) return; if (name[0] == '/') { gchar *buf; buf = remove_level_from_path(name); file_util_create_dir_do(buf, filename_from_path(name)); g_free(buf); } else { file_util_create_dir_do(fd->dest_path, name); } file_dialog_close(fd);}static void file_util_create_dir_close_cb(FileDialog *fd, gpointer data){ file_dialog_close(fd);}void file_util_create_dir(const gchar *path, GtkWidget *parent){ FileDialog *fd; gchar *text; if (!isdir(path)) return; fd = file_util_file_dlg(_("New folder - GQview"), "GQview", "dlg_newdir", parent, file_util_create_dir_close_cb, NULL); text = g_strdup_printf(_("Create folder in:\n%s\nnamed:"), path); generic_dialog_add_message(GENERIC_DIALOG(fd), NULL, NULL, text); g_free(text); file_dialog_add_button(fd, GTK_STOCK_OK, NULL, file_util_create_dir_cb, TRUE); fd->dest_path = g_strdup(path); fd->entry = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(GENERIC_DIALOG(fd)->vbox), fd->entry, FALSE, FALSE, 0); generic_dialog_attach_default(GENERIC_DIALOG(fd), fd->entry); gtk_widget_grab_focus(fd->entry); gtk_widget_show(fd->entry); gtk_widget_show(GENERIC_DIALOG(fd)->dialog);}gint file_util_rename_dir(const gchar *old_path, const gchar *new_path, GtkWidget *parent){ const gchar *old_name; const gchar *new_name; if (!old_path || !new_path || !isdir(old_path)) return FALSE; old_name = filename_from_path(old_path); new_name = filename_from_path(new_path); if (isdir(new_path)) { gchar *text = g_strdup_printf(_("The folder:\n%s\nalready exists."), new_name); file_util_warning_dialog(_("Folder exists"), text, GTK_STOCK_DIALOG_INFO, parent); g_free(text); return FALSE; } if (isname(new_path)) { gchar *text = g_strdup_printf(_("The path:\n%s\nalready exists as a file."), new_name); file_util_warning_dialog(_("Rename failed"), text, GTK_STOCK_DIALOG_INFO,parent); g_free(text); return FALSE; } if (!rename_file(old_path, new_path)) { gchar *text = g_strdup_printf(_("Failed to rename %s to %s."), old_name, new_name); file_util_warning_dialog("Rename failed", text, GTK_STOCK_DIALOG_ERROR, parent); g_free(text); return FALSE; } return TRUE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -