📄 ui_pathsel.c
字号:
else { const gchar *text; gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, new, 1, new_path, -1); text = gtk_entry_get_text(GTK_ENTRY(dd->entry)); if (text && old_path && strcmp(text, old_path) == 0) { gtk_entry_set_text(GTK_ENTRY(dd->entry), new_path); } } g_free(old_path); g_free(new_path); return TRUE;}static void dest_view_rename(Dest_Data *dd, GtkTreeView *view){ GtkTreeModel *model; GtkTreeIter iter; gchar *text; if (!dd->right_click_path) return; model = gtk_tree_view_get_model(view); gtk_tree_model_get_iter(model, &iter, dd->right_click_path); gtk_tree_model_get(model, &iter, 0, &text, -1); tree_edit_by_path(view, dd->right_click_path, 0, text, dest_view_rename_cb, dd); g_free(text);}static void dest_view_delete_dlg_cancel(GenericDialog *gd, gpointer data){ DestDel_Data *dl = data; dl->dd->gd = NULL; g_free(dl->path); g_free(dl);}static void dest_view_delete_dlg_ok_cb(GenericDialog *gd, gpointer data){ DestDel_Data *dl = data; if (!unlink_file(dl->path)) { gchar *text = g_strdup_printf(_("Unable to delete file:\n%s"), dl->path); warning_dialog(_("File deletion failed"), text, GTK_STOCK_DIALOG_WARNING, dl->dd->entry); g_free(text); } else if (dl->dd->path) { /* refresh list */ gchar *path = g_strdup(dl->dd->path); dest_populate(dl->dd, path); g_free(path); } dest_view_delete_dlg_cancel(gd, data);}static void dest_view_delete(Dest_Data *dd, GtkTreeView *view){ gchar *path; gchar *text; DestDel_Data *dl; GtkTreeModel *model; GtkTreeIter iter; if (view != GTK_TREE_VIEW(dd->f_view)) return; if (!dd->right_click_path) return; model = gtk_tree_view_get_model(view); gtk_tree_model_get_iter(model, &iter, dd->right_click_path); gtk_tree_model_get(model, &iter, 1, &path, -1); if (!path) return; dl = g_new(DestDel_Data, 1); dl->dd = dd; dl->path = path; if (dd->gd) { GenericDialog *gd = dd->gd; dest_view_delete_dlg_cancel(dd->gd, dd->gd->data); generic_dialog_close(gd); } dd->gd = generic_dialog_new(_("Delete file"), PACKAGE, "dlg_confirm", dd->entry, TRUE, dest_view_delete_dlg_cancel, dl); generic_dialog_add_button(dd->gd, GTK_STOCK_DELETE, NULL, dest_view_delete_dlg_ok_cb, TRUE); text = g_strdup_printf(_("About to delete the file:\n %s"), path); generic_dialog_add_message(dd->gd, GTK_STOCK_DIALOG_QUESTION, _("Delete file"), text); g_free(text); gtk_widget_show(dd->gd->dialog);}static void dest_view_bookmark(Dest_Data *dd, GtkTreeView *view){ GtkTreeModel *model; GtkTreeIter iter; gchar *path; if (!dd->right_click_path) return; model = gtk_tree_view_get_model(view); gtk_tree_model_get_iter(model, &iter, dd->right_click_path); gtk_tree_model_get(model, &iter, 1, &path, -1); bookmark_list_add(dd->bookmark_list, filename_from_path(path), path); g_free(path);}static void dest_popup_dir_rename_cb(GtkWidget *widget, gpointer data){ Dest_Data *dd = data; dest_view_rename(dd, GTK_TREE_VIEW(dd->d_view));}static void dest_popup_dir_bookmark_cb(GtkWidget *widget, gpointer data){ Dest_Data *dd = data; dest_view_bookmark(dd, GTK_TREE_VIEW(dd->d_view));}static void dest_popup_file_rename_cb(GtkWidget *widget, gpointer data){ Dest_Data *dd = data; dest_view_rename(dd, GTK_TREE_VIEW(dd->f_view));}static void dest_popup_file_delete_cb(GtkWidget *widget, gpointer data){ Dest_Data *dd = data; dest_view_delete(dd, GTK_TREE_VIEW(dd->f_view));}static void dest_popup_file_bookmark_cb(GtkWidget *widget, gpointer data){ Dest_Data *dd = data; dest_view_bookmark(dd, GTK_TREE_VIEW(dd->f_view));}static void dest_popup_position_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data){ Dest_Data *dd = data; GtkTreeView *view; gint cw, ch; view = g_object_get_data(G_OBJECT(menu), "active_view"); tree_view_get_cell_clamped(view, dd->right_click_path, 0, TRUE, x, y, &cw, &ch); *y += ch; popup_menu_position_clamp(menu, x, y, 0);}static gint dest_popup_menu(Dest_Data *dd, GtkTreeView *view, gint button, guint32 time, gint local){ GtkWidget *menu; if (!dd->right_click_path) return FALSE; if (view == GTK_TREE_VIEW(dd->d_view)) { GtkTreeModel *model; GtkTreeIter iter; gchar *text; gint normal_dir; model = gtk_tree_view_get_model(view); gtk_tree_model_get_iter(model, &iter, dd->right_click_path); gtk_tree_model_get(model, &iter, 0, &text, -1); if (!text) return FALSE; normal_dir = (strcmp(text, ".") == 0 || strcmp(text, "..") == 0); menu = popup_menu_short_lived(); menu_item_add_sensitive(menu, _("_Rename"), !normal_dir, G_CALLBACK(dest_popup_dir_rename_cb), dd); menu_item_add_stock(menu, _("Add _Bookmark"), GTK_STOCK_JUMP_TO, G_CALLBACK(dest_popup_dir_bookmark_cb), dd); } else { menu = popup_menu_short_lived(); menu_item_add(menu, _("_Rename"), G_CALLBACK(dest_popup_file_rename_cb), dd); menu_item_add_stock(menu, _("_Delete"), GTK_STOCK_DELETE, G_CALLBACK(dest_popup_file_delete_cb), dd); menu_item_add_stock(menu, _("Add _Bookmark"), GTK_STOCK_JUMP_TO, G_CALLBACK(dest_popup_file_bookmark_cb), dd); } if (local) { g_object_set_data(G_OBJECT(menu), "active_view", view); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, dest_popup_position_cb, dd, button, time); } else { gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, button, time); } return TRUE;}static gint dest_press_cb(GtkWidget *view, GdkEventButton *event, gpointer data){ Dest_Data *dd = data; GtkTreePath *tpath; GtkTreeViewColumn *column; gint cell_x, cell_y; GtkTreeModel *model; GtkTreeIter iter; GtkTreeSelection *selection; if (event->button != 3 || !gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(view), event->x, event->y, &tpath, &column, &cell_x, &cell_y)) { return FALSE; } model = gtk_tree_view_get_model(GTK_TREE_VIEW(view)); gtk_tree_model_get_iter(model, &iter, tpath); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); gtk_tree_selection_select_iter(selection, &iter); if (dd->right_click_path) gtk_tree_path_free(dd->right_click_path); dd->right_click_path = tpath; return dest_popup_menu(dd, GTK_TREE_VIEW(view), 0, event->time, FALSE);}static gboolean dest_keypress_cb(GtkWidget *view, GdkEventKey *event, gpointer data){ Dest_Data *dd = data; switch (event->keyval) { case GDK_F10: if (!(event->state & GDK_CONTROL_MASK)) return FALSE; case GDK_Menu: dest_view_store_selection(dd, GTK_TREE_VIEW(view)); dest_popup_menu(dd, GTK_TREE_VIEW(view), 0, event->time, TRUE); return TRUE; break; case 'R': case 'r': if (event->state & GDK_CONTROL_MASK) { dest_view_store_selection(dd, GTK_TREE_VIEW(view)); dest_view_rename(dd, GTK_TREE_VIEW(view)); return TRUE; } break; case GDK_Delete: dest_view_store_selection(dd, GTK_TREE_VIEW(view)); dest_view_delete(dd, GTK_TREE_VIEW(view)); return TRUE; break; case 'B' : case 'b': if (event->state & GDK_CONTROL_MASK) { dest_view_store_selection(dd, GTK_TREE_VIEW(view)); dest_view_bookmark(dd, GTK_TREE_VIEW(view)); return TRUE; } break; } return FALSE;} static void dest_new_dir_cb(GtkWidget *widget, gpointer data){ Dest_Data *dd = data; gchar *path; gchar *buf; const gchar *tmp; gint from_text = FALSE; tmp = gtk_entry_get_text(GTK_ENTRY(dd->entry)); if (!isname(tmp)) { path = g_strdup(tmp); from_text = TRUE; } else { buf = concat_dir_and_file(dd->path, _("New folder")); path = unique_filename(buf, NULL, " ", FALSE); g_free(buf); } if (!mkdir_utf8(path, 0755)) { /* failed */ gchar *text; text = g_strdup_printf(_("Unable to create folder:\n%s"), filename_from_path(path)); warning_dialog(_("Error creating folder"), text, GTK_STOCK_DIALOG_ERROR, dd->entry); g_free(text); } else { GtkTreeIter iter; GtkListStore *store; const gchar *text; if (from_text) gtk_entry_set_text(GTK_ENTRY(dd->entry), dd->path); store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(dd->d_view))); text = filename_from_path(path); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, text, 1, path, -1); if (dd->right_click_path) gtk_tree_path_free(dd->right_click_path); dd->right_click_path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter); tree_edit_by_path(GTK_TREE_VIEW(dd->d_view), dd->right_click_path, 0, text, dest_view_rename_cb, dd); } g_free(path);}/* *----------------------------------------------------------------------------- * destination widget file selection, traversal, view options *----------------------------------------------------------------------------- */ static void dest_select_cb(GtkTreeSelection *selection, gpointer data){ Dest_Data *dd = data; GtkTreeView *view; GtkTreeModel *store; GtkTreeIter iter; gchar *path; if (!gtk_tree_selection_get_selected(selection, NULL, &iter)) return; view = gtk_tree_selection_get_tree_view(selection); store = gtk_tree_view_get_model(view); gtk_tree_model_get(store, &iter, 1, &path, -1); if (view == GTK_TREE_VIEW(dd->d_view)) { dest_change_dir(dd, path, (dd->f_view != NULL)); } else { gtk_entry_set_text(GTK_ENTRY(dd->entry), path); } g_free(path);}static void dest_activate_cb(GtkWidget *view, GtkTreePath *tpath, GtkTreeViewColumn *column, gpointer data){ Dest_Data *dd = data; GtkTreeModel *store; GtkTreeIter iter; gchar *path; store = gtk_tree_view_get_model(GTK_TREE_VIEW(view)); gtk_tree_model_get_iter(store, &iter, tpath); gtk_tree_model_get(store, &iter, 1, &path, -1); if (view == dd->d_view) { dest_change_dir(dd, path, (dd->f_view != NULL)); } else { if (dd->select_func) { dd->select_func(path, dd->select_data); } } g_free(path);}static void dest_home_cb(GtkWidget *widget, gpointer data){ Dest_Data *dd = data; dest_change_dir(dd, homedir(), (dd->f_view != NULL));}static void dest_show_hidden_cb(GtkWidget *widget, gpointer data){ Dest_Data *dd = data; gchar *buf; dd->show_hidden = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dd->hidden_button)); buf = g_strdup(dd->path); dest_populate(dd, buf); g_free(buf);}static void dest_entry_changed_cb(GtkEditable *editable, gpointer data){ Dest_Data *dd = data; const gchar *path; gchar *buf; path = gtk_entry_get_text(GTK_ENTRY(dd->entry)); if (dd->path && strcmp(path, dd->path) == 0) return; buf = remove_level_from_path(path);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -