📄 ptk-file-browser.c
字号:
gbooleanon_folder_view_popup_menu ( GtkWidget* widget, PtkFileBrowser* file_browser ){ show_popup_menu( file_browser, NULL ); return TRUE;}gbooleanon_folder_view_button_press_event ( GtkWidget *widget, GdkEventButton *event, PtkFileBrowser* file_browser ){ VFSFileInfo * file; GtkTreeModel * model; GtkTreePath *tree_path; GtkTreeIter it; gchar *file_path; GtkTreeSelection* tree_sel; gboolean ret = FALSE; if ( event->type == GDK_BUTTON_PRESS ) { if ( file_browser->view_mode == FBVM_ICON_VIEW ) { tree_path = ptk_icon_view_get_path_at_pos( PTK_ICON_VIEW( widget ), event->x, event->y ); if ( !tree_path && event->button == 3 ) { ptk_icon_view_unselect_all ( PTK_ICON_VIEW( widget ) ); } model = ptk_icon_view_get_model( PTK_ICON_VIEW( widget ) ); } else if ( file_browser->view_mode == FBVM_LIST_VIEW ) { model = gtk_tree_view_get_model( GTK_TREE_VIEW( widget ) ); gtk_tree_view_get_path_at_pos( GTK_TREE_VIEW( widget ), event->x, event->y, &tree_path, NULL, NULL, NULL ); tree_sel = gtk_tree_view_get_selection( GTK_TREE_VIEW( widget ) ); /* If click on a selected row */ if ( tree_path && event->type == GDK_BUTTON_PRESS ) { /* multiple selection enabled */ if ( event->state & GDK_CONTROL_MASK ) { can_folder_view_sel_change = TRUE; if ( gtk_tree_selection_path_is_selected ( tree_sel, tree_path ) ) gtk_tree_selection_unselect_path( tree_sel, tree_path ); else gtk_tree_selection_select_path( tree_sel, tree_path ); ret = TRUE; } else if ( event->state & GDK_SHIFT_MASK ) { GtkTreePath * cursor; can_folder_view_sel_change = TRUE; gtk_tree_view_get_cursor( GTK_TREE_VIEW( widget ), &cursor, NULL ); if ( cursor ) { gtk_tree_selection_unselect_all( tree_sel ); gtk_tree_selection_select_range( tree_sel, cursor, tree_path ); gtk_tree_path_free( cursor ); } else { if ( gtk_tree_selection_path_is_selected ( tree_sel, tree_path ) ) gtk_tree_selection_unselect_path( tree_sel, tree_path ); else gtk_tree_selection_select_path( tree_sel, tree_path ); gtk_tree_view_set_cursor( GTK_TREE_VIEW( widget ), tree_path, NULL, 0 ); } ret = TRUE; } else /* single selection mode */ { /* don't unselect selected row when clicked (for drag & drop) */ if ( gtk_tree_selection_path_is_selected ( tree_sel, tree_path ) ) can_folder_view_sel_change = FALSE; else { can_folder_view_sel_change = TRUE; gtk_tree_selection_unselect_all( tree_sel ); gtk_tree_selection_select_path( tree_sel, tree_path ); gtk_tree_view_set_cursor( GTK_TREE_VIEW( widget ), tree_path, NULL, 0 ); } } } else can_folder_view_sel_change = TRUE; } /* an item is selected */ if ( tree_path && gtk_tree_model_get_iter( model, &it, tree_path ) ) { gtk_tree_model_get( model, &it, COL_FILE_INFO, &file, -1 ); file_path = g_build_filename( ptk_file_browser_get_cwd( file_browser ), vfs_file_info_get_name( file ), NULL ); } else /* no item is selected */ { file = NULL; file_path = NULL; } /* middle button */ if ( event->button == 2 && file_path ) /* middle click on a item */ { if ( G_LIKELY( file_path ) ) { if ( g_file_test( file_path, G_FILE_TEST_IS_DIR ) ) { g_signal_emit( file_browser, signals[ OPEN_ITEM_SIGNAL ], 0, file_path, PTK_OPEN_NEW_TAB ); } } } else if ( event->button == 3 ) /* right click */ { /* cancel all selection, and select the item if it's not selected */ if ( file_browser->view_mode == FBVM_ICON_VIEW ) { if ( tree_path && !ptk_icon_view_path_is_selected ( PTK_ICON_VIEW( widget ), tree_path ) ) { ptk_icon_view_unselect_all ( PTK_ICON_VIEW( widget ) ); ptk_icon_view_select_path( PTK_ICON_VIEW( widget ), tree_path ); } } show_popup_menu( file_browser, event ); } if ( file ) vfs_file_info_unref( file ); g_free( file_path ); gtk_tree_path_free( tree_path ); } return ret;}static gboolean on_dir_tree_update_sel ( PtkFileBrowser* file_browser ){ char * dir_path; if ( ! file_browser->side_view ) return FALSE; gdk_threads_enter(); dir_path = ptk_dir_tree_view_get_selected_dir( file_browser->side_view ); if ( dir_path ) { if ( strcmp( dir_path, ptk_file_browser_get_cwd( file_browser ) ) ) { ptk_file_browser_chdir( file_browser, dir_path, TRUE ); } g_free( dir_path ); } gdk_threads_leave(); return FALSE;}voidon_dir_tree_sel_changed ( GtkTreeSelection *treesel, PtkFileBrowser* file_browser ){ g_idle_add( ( GSourceFunc ) on_dir_tree_update_sel, file_browser );}voidon_location_view_row_activated ( GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, PtkFileBrowser* file_browser ){ char * dir_path; GtkTreeIter it; dir_path = ptk_location_view_get_selected_dir( file_browser->side_view ); if ( dir_path ) { if ( strcmp( dir_path, ptk_file_browser_get_cwd( file_browser ) ) ) { ptk_file_browser_chdir( file_browser, dir_path, TRUE ); } g_free( dir_path ); }}static void on_shortcut_new_tab_activate( GtkMenuItem* item, PtkFileBrowser* file_browser ){ char * dir_path; dir_path = ptk_location_view_get_selected_dir( file_browser->side_view ); if ( dir_path ) { g_signal_emit( file_browser, signals[ OPEN_ITEM_SIGNAL ], 0, dir_path, PTK_OPEN_NEW_TAB ); g_free( dir_path ); }}static void on_shortcut_new_window_activate( GtkMenuItem* item, PtkFileBrowser* file_browser ){ char * dir_path; dir_path = ptk_location_view_get_selected_dir( file_browser->side_view ); if ( dir_path ) { g_signal_emit( file_browser, signals[ OPEN_ITEM_SIGNAL ], 0, dir_path, PTK_OPEN_NEW_WINDOW ); g_free( dir_path ); }}static void on_shortcut_remove_activate( GtkMenuItem* item, PtkFileBrowser* file_browser ){ char * dir_path; dir_path = ptk_location_view_get_selected_dir( file_browser->side_view ); if ( dir_path ) { ptk_bookmarks_remove( dir_path ); g_free( dir_path ); }}static void on_shortcut_rename_activate( GtkMenuItem* item, PtkFileBrowser* file_browser ){ ptk_location_view_rename_selected_bookmark( file_browser->side_view );}static PtkMenuItemEntry shortcut_popup_menu[] = { PTK_MENU_ITEM( N_( "Open in New _Tab" ), on_shortcut_new_tab_activate, 0, 0 ), PTK_MENU_ITEM( N_( "Open in New _Window" ), on_shortcut_new_window_activate, 0, 0 ), PTK_SEPARATOR_MENU_ITEM, PTK_STOCK_MENU_ITEM( GTK_STOCK_REMOVE, on_shortcut_remove_activate ), PTK_IMG_MENU_ITEM( N_( "_Rename" ), "gtk-edit", on_shortcut_rename_activate, GDK_F2, 0 ), PTK_MENU_END };gbooleanon_location_view_button_press_event ( GtkTreeView* view, GdkEventButton* evt, PtkFileBrowser* file_browser ){ GtkTreeIter it; GtkTreeSelection* tree_sel; GtkTreeModel* model; GtkTreePath* tree_path; int pos; GtkMenu* popup; GtkMenuItem* item; char * dir_path; tree_sel = gtk_tree_view_get_selection( view ); if ( evt->button == 2 ) { dir_path = ptk_location_view_get_selected_dir( file_browser->side_view ); if ( dir_path ) { g_signal_emit( file_browser, signals[ OPEN_ITEM_SIGNAL ], 0, dir_path, PTK_OPEN_NEW_TAB ); g_free( dir_path ); } return FALSE; } if ( evt->button != 3 ) return FALSE; if ( gtk_tree_selection_get_selected( tree_sel, &model, &it ) ) { if ( ptk_location_view_is_item_bookmark( view, &it ) ) { popup = GTK_MENU( gtk_menu_new() ); ptk_menu_add_items_from_data( GTK_WIDGET( popup ), shortcut_popup_menu, file_browser, NULL ); gtk_widget_show_all( GTK_WIDGET( popup ) ); g_signal_connect( popup, "selection-done", G_CALLBACK( gtk_widget_destroy ), NULL ); gtk_menu_popup( popup, NULL, NULL, NULL, NULL, evt->button, evt->time ); } } return FALSE;}static gboolean can_sel_change ( GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, gpointer data ){ return can_folder_view_sel_change;}static GtkWidget* create_folder_view( PtkFileBrowser* file_browser, PtkFileBrowserViewMode view_mode ){ GtkWidget * folder_view; GtkTreeSelection* tree_sel; GtkCellRenderer* renderer; switch ( view_mode ) { case FBVM_ICON_VIEW: folder_view = ptk_icon_view_new (); ptk_icon_view_set_selection_mode ( PTK_ICON_VIEW( folder_view ), GTK_SELECTION_MULTIPLE ); ptk_icon_view_set_pixbuf_column ( PTK_ICON_VIEW( folder_view ), COL_FILE_BIG_ICON ); ptk_icon_view_set_text_column ( PTK_ICON_VIEW( folder_view ), COL_FILE_NAME ); ptk_icon_view_set_column_spacing( PTK_ICON_VIEW( folder_view ), 4 ); ptk_icon_view_set_item_width ( PTK_ICON_VIEW( folder_view ), 110 ); ptk_icon_view_set_enable_search( PTK_ICON_VIEW( folder_view ), TRUE ); ptk_icon_view_set_search_column( PTK_ICON_VIEW( folder_view ), COL_FILE_NAME ); gtk_cell_layout_clear ( GTK_CELL_LAYOUT ( folder_view ) ); /* renderer = gtk_cell_renderer_pixbuf_new (); */ renderer = ptk_file_icon_renderer_new(); /* add the icon renderer */ g_object_set ( G_OBJECT ( renderer ), "follow_state", TRUE, NULL ); gtk_cell_layout_pack_start ( GTK_CELL_LAYOUT ( folder_view ), renderer, FALSE ); gtk_cell_layout_add_attribute ( GTK_CELL_LAYOUT ( folder_view ), renderer, "pixbuf", COL_FILE_BIG_ICON ); gtk_cell_layout_add_attribute ( GTK_CELL_LAYOUT ( folder_view ), renderer, "info", COL_FILE_INFO ); /* add the name renderer */ renderer = ptk_text_renderer_new (); g_object_set ( G_OBJECT ( renderer ), "wrap-mode", PANGO_WRAP_WORD_CHAR, "wrap-width", 110, "xalign", 0.5, "yalign", 0.0, NULL ); gtk_cell_layout_pack_start ( GTK_CELL_LAYOUT ( folder_view ), renderer, TRUE ); gtk_cell_layout_add_attribute ( GTK_CELL_LAYOUT ( folder_view ), renderer, "text", COL_FILE_NAME ); ptk_icon_view_enable_model_drag_source ( PTK_ICON_VIEW( folder_view ), ( GDK_CONTROL_MASK | GDK_BUTTON1_MASK | GDK_BUTTON3_MASK ), drag_targets, sizeof( drag_targets ) / sizeof( GtkTargetEntry ), GDK_ACTION_DEFAULT | GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK ); ptk_icon_view_enable_model_drag_dest ( PTK_ICON_VIEW( folder_view ), drag_targets, sizeof( drag_targets ) / sizeof( GtkTargetEntry ), GDK_ACTION_DEFAULT | GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK ); g_signal_connect ( ( gpointer ) folder_view, "item_activated", G_CALLBACK ( on_folder_view_item_activated ), file_browser );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -