📄 ui_pathsel.c
字号:
if (buf && (!dd->path || strcmp(buf, dd->path) != 0)) { gchar *tmp = remove_trailing_slash(path); if (isdir(tmp)) { dest_populate(dd, tmp); } else if (isdir(buf)) { dest_populate(dd, buf); } g_free(tmp); } g_free(buf);}static void dest_filter_list_sync(Dest_Data *dd){ GtkWidget *entry; GtkListStore *store; gchar *old_text; GList *fwork; GList *twork; if (!dd->filter_list || !dd->filter_combo) return; entry = GTK_BIN(dd->filter_combo)->child; old_text = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry))); store = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(dd->filter_combo))); gtk_list_store_clear(store); fwork = dd->filter_list; twork = dd->filter_text_list; while (fwork && twork) { GtkTreeIter iter; gchar *name; gchar *filter; name = twork->data; filter = fwork->data; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, FILTER_COLUMN_NAME, name, FILTER_COLUMN_FILTER, filter, -1); if (strcmp(old_text, filter) == 0) { gtk_combo_box_set_active_iter(GTK_COMBO_BOX(dd->filter_combo), &iter); } fwork = fwork->next; twork = twork->next; } g_free(old_text);}static void dest_filter_add(Dest_Data *dd, const gchar *filter, const gchar *description, gint set){ GList *work; gchar *buf; gint c = 0; if (!filter) return; work = dd->filter_list; while (work) { gchar *f = work->data; if (strcmp(f, filter) == 0) { if (set) gtk_combo_box_set_active(GTK_COMBO_BOX(dd->filter_combo), c); return; } work = work->next; c++; } dd->filter_list = uig_list_insert_link(dd->filter_list, g_list_last(dd->filter_list), g_strdup(filter)); if (description) { buf = g_strdup_printf("%s ( %s )", description, filter); } else { buf = g_strdup_printf("( %s )", filter); } dd->filter_text_list = uig_list_insert_link(dd->filter_text_list, g_list_last(dd->filter_text_list), buf); if (set) gtk_entry_set_text(GTK_ENTRY(GTK_BIN(dd->filter_combo)->child), filter); dest_filter_list_sync(dd);}static void dest_filter_clear(Dest_Data *dd){ path_list_free(dd->filter_list); dd->filter_list = NULL; path_list_free(dd->filter_text_list); dd->filter_text_list = NULL; dest_filter_add(dd, "*", _("All Files"), TRUE);}static void dest_filter_changed_cb(GtkEditable *editable, gpointer data){ Dest_Data *dd = data; GtkWidget *entry; const gchar *buf; gchar *path; entry = GTK_BIN(dd->filter_combo)->child; buf = gtk_entry_get_text(GTK_ENTRY(entry)); g_free(dd->filter); dd->filter = NULL; if (strlen(buf) > 0) dd->filter = g_strdup(buf); path = g_strdup(dd->path); dest_populate(dd, path); g_free(path);}static void dest_bookmark_select_cb(const gchar *path, gpointer data){ Dest_Data *dd = data; if (isdir(path)) { dest_change_dir(dd, path, (dd->f_view != NULL)); } else if (isfile(path) && dd->f_view) { gtk_entry_set_text(GTK_ENTRY(dd->entry), path); } }/* *----------------------------------------------------------------------------- * destination widget setup routines (public) *----------------------------------------------------------------------------- */ GtkWidget *path_selection_new_with_files(GtkWidget *entry, const gchar *path, const gchar *filter, const gchar *filter_desc){ GtkWidget *hbox2; Dest_Data *dd; GtkWidget *scrolled; GtkWidget *table; GtkWidget *paned; GtkListStore *store; GtkTreeSelection *selection; GtkTreeViewColumn *column; GtkCellRenderer *renderer; dd = g_new0(Dest_Data, 1); dd->show_hidden = FALSE; dd->select_func = NULL; dd->select_data = NULL; dd->gd = NULL; table = gtk_table_new(4, (filter != NULL) ? 3 : 1, FALSE); gtk_table_set_col_spacings(GTK_TABLE(table), PREF_PAD_GAP); gtk_table_set_row_spacing(GTK_TABLE(table), 0, PREF_PAD_GAP); gtk_widget_show(table); dd->entry = entry; g_object_set_data(G_OBJECT(dd->entry), "destination_data", dd); hbox2 = pref_table_box(table, 0, 0, GTK_ORIENTATION_HORIZONTAL, NULL); gtk_box_set_spacing(GTK_BOX(hbox2), PREF_PAD_BUTTON_GAP); pref_button_new(hbox2, NULL, _("Home"), FALSE, G_CALLBACK(dest_home_cb), dd); pref_button_new(hbox2, NULL, _("New folder"), FALSE, G_CALLBACK(dest_new_dir_cb), dd); dd->hidden_button = gtk_check_button_new_with_label(_("Show hidden")); g_signal_connect(G_OBJECT(dd->hidden_button), "clicked", G_CALLBACK(dest_show_hidden_cb), dd); gtk_box_pack_end(GTK_BOX(hbox2), dd->hidden_button, FALSE, FALSE, 0); gtk_widget_show(dd->hidden_button); hbox2 = gtk_hbox_new(FALSE, PREF_PAD_GAP); if (filter) { paned = gtk_hpaned_new(); gtk_table_attach(GTK_TABLE(table), paned, 0, 3, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); gtk_widget_show(paned); gtk_paned_add1(GTK_PANED(paned), hbox2); } else { paned = NULL; gtk_table_attach(GTK_TABLE(table), hbox2, 0, 1, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); } gtk_widget_show(hbox2); /* bookmarks */ scrolled = bookmark_list_new(NULL, dest_bookmark_select_cb, dd); gtk_box_pack_start(GTK_BOX(hbox2), scrolled, FALSE, FALSE, 0); gtk_widget_show(scrolled); dd->bookmark_list = scrolled; 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_box_pack_start(GTK_BOX(hbox2), scrolled, TRUE, TRUE, 0); gtk_widget_show(scrolled); store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING); dd->d_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); g_object_unref(store); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(dd->d_view), PATH_SEL_USE_HEADINGS); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dd->d_view)); gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_SINGLE); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, _("Folders")); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_add_attribute(column, renderer, "text", 0); gtk_tree_view_append_column(GTK_TREE_VIEW(dd->d_view), column);#if 0 /* only for debugging */ column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, _("Path")); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_add_attribute(column, renderer, "text", 1); gtk_tree_view_append_column(GTK_TREE_VIEW(dd->d_view), column);#endif gtk_widget_set_size_request(dd->d_view, DEST_WIDTH, DEST_HEIGHT); gtk_container_add(GTK_CONTAINER(scrolled), dd->d_view); gtk_widget_show(dd->d_view); g_signal_connect(G_OBJECT(dd->d_view), "button_press_event", G_CALLBACK(dest_press_cb), dd); g_signal_connect(G_OBJECT(dd->d_view), "key_press_event", G_CALLBACK(dest_keypress_cb), dd); g_signal_connect(G_OBJECT(dd->d_view), "row_activated", G_CALLBACK(dest_activate_cb), dd); g_signal_connect(G_OBJECT(dd->d_view), "destroy", G_CALLBACK(dest_free_data), dd); if (filter) { GtkListStore *store; hbox2 = pref_table_box(table, 2, 0, GTK_ORIENTATION_HORIZONTAL, NULL); pref_label_new(hbox2, _("Filter:")); store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING); dd->filter_combo = gtk_combo_box_entry_new_with_model(GTK_TREE_MODEL(store), FILTER_COLUMN_FILTER); g_object_unref(store); gtk_cell_layout_clear(GTK_CELL_LAYOUT(dd->filter_combo)); renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(dd->filter_combo), renderer, TRUE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(dd->filter_combo), renderer, "text", FILTER_COLUMN_NAME, NULL);#if 0 gtk_combo_set_case_sensitive(GTK_COMBO(dd->filter_combo), TRUE);#endif gtk_box_pack_start(GTK_BOX(hbox2), dd->filter_combo, TRUE, TRUE, 0); gtk_widget_show(dd->filter_combo); 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); if (paned) { gtk_paned_add2(GTK_PANED(paned), scrolled); } else { gtk_table_attach(GTK_TABLE(table), scrolled, 2, 3, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); } gtk_widget_show(scrolled); store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING); dd->f_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); g_object_unref(store); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(dd->f_view), PATH_SEL_USE_HEADINGS); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dd->f_view)); gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_SINGLE); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, _("Files")); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_add_attribute(column, renderer, "text", 0); gtk_tree_view_append_column(GTK_TREE_VIEW(dd->f_view), column); gtk_widget_set_size_request(dd->f_view, DEST_WIDTH, DEST_HEIGHT); gtk_container_add(GTK_CONTAINER(scrolled), dd->f_view); gtk_widget_show(dd->f_view); g_signal_connect(G_OBJECT(dd->f_view), "button_press_event", G_CALLBACK(dest_press_cb), dd); g_signal_connect(G_OBJECT(dd->f_view), "key_press_event", G_CALLBACK(dest_keypress_cb), dd); g_signal_connect(G_OBJECT(dd->f_view), "row_activated", G_CALLBACK(dest_activate_cb), dd); g_signal_connect(selection, "changed", G_CALLBACK(dest_select_cb), dd); dest_filter_clear(dd); dest_filter_add(dd, filter, filter_desc, TRUE); dd->filter = g_strdup(gtk_entry_get_text(GTK_ENTRY(GTK_BIN(dd->filter_combo)->child))); } if (path && path[0] == '/' && isdir(path)) { dest_populate(dd, path); } else { gchar *buf = remove_level_from_path(path); if (buf && buf[0] == '/' && isdir(buf)) { dest_populate(dd, buf); } else { gint pos = -1; dest_populate(dd, (gchar *)homedir()); if (path) gtk_editable_insert_text(GTK_EDITABLE(dd->entry), "/", -1, &pos); if (path) gtk_editable_insert_text(GTK_EDITABLE(dd->entry), path, -1, &pos); } g_free(buf); } if (dd->filter_combo) { g_signal_connect(G_OBJECT(GTK_BIN(dd->filter_combo)->child), "changed", G_CALLBACK(dest_filter_changed_cb), dd); } g_signal_connect(G_OBJECT(dd->entry), "changed", G_CALLBACK(dest_entry_changed_cb), dd); dest_dnd_init(dd); return table;}GtkWidget *path_selection_new(const gchar *path, GtkWidget *entry){ return path_selection_new_with_files(entry, path, NULL, NULL);}void path_selection_sync_to_entry(GtkWidget *entry){ Dest_Data *dd = g_object_get_data(G_OBJECT(entry), "destination_data"); const gchar *path; if (!dd) return; path = gtk_entry_get_text(GTK_ENTRY(entry)); if (isdir(path) && (!dd->path || strcmp(path, dd->path) != 0)) { dest_populate(dd, path); } else { gchar *buf = remove_level_from_path(path); if (isdir(buf) && (!dd->path || strcmp(buf, dd->path) != 0)) { dest_populate(dd, buf); } g_free(buf); }}void path_selection_add_select_func(GtkWidget *entry, void (*func)(const gchar *, gpointer), gpointer data){ Dest_Data *dd = g_object_get_data(G_OBJECT(entry), "destination_data"); if (!dd) return; dd->select_func = func; dd->select_data = data;}void path_selection_add_filter(GtkWidget *entry, const gchar *filter, const gchar *description, gint set){ Dest_Data *dd = g_object_get_data(G_OBJECT(entry), "destination_data"); if (!dd) return; if (!filter) return; dest_filter_add(dd, filter, description, set);}void path_selection_clear_filter(GtkWidget *entry){ Dest_Data *dd = g_object_get_data(G_OBJECT(entry), "destination_data"); if (!dd) return; dest_filter_clear(dd);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -