📄 ptk-file-browser.c
字号:
gboolean ptk_file_browser_is_busy( PtkFileBrowser* file_browser ){ return file_browser->busy;}gboolean ptk_file_browser_can_back( PtkFileBrowser* file_browser ){ /* there is back history */ return ( file_browser->curHistory && file_browser->curHistory->prev );}void ptk_file_browser_go_back( PtkFileBrowser* file_browser ){ const char * path; /* * FIXME: * Do nothing when there is unfinished task running in the * working thread. * This should be fixed with a better way in the future. */ if ( file_browser->busy ) return ; /* there is no back history */ if ( ! file_browser->curHistory || ! file_browser->curHistory->prev ) return ; path = ( const char* ) file_browser->curHistory->prev->data; if ( ptk_file_browser_chdir( file_browser, path, FALSE ) ) { file_browser->curHistory = file_browser->curHistory->prev; }}gboolean ptk_file_browser_can_forward( PtkFileBrowser* file_browser ){ /* If there is forward history */ return ( file_browser->curHistory && file_browser->curHistory->next );}void ptk_file_browser_go_forward( PtkFileBrowser* file_browser ){ const char * path; /* * FIXME: * Do nothing when there is unfinished task running in the * working thread. * This should be fixed with a better way in the future. */ if ( file_browser->busy ) return ; /* If there is no forward history */ if ( ! file_browser->curHistory || ! file_browser->curHistory->next ) return ; path = ( const char* ) file_browser->curHistory->next->data; if ( ptk_file_browser_chdir( file_browser, path, FALSE ) ) { file_browser->curHistory = file_browser->curHistory->next; }}GtkWidget* ptk_file_browser_get_folder_view( PtkFileBrowser* file_browser ){ return file_browser->folder_view;}/* FIXME: unused function */GtkTreeView* ptk_file_browser_get_dir_tree( PtkFileBrowser* file_browser ){ return NULL;}void ptk_file_browser_select_all( PtkFileBrowser* file_browser ){ GtkTreeSelection * tree_sel; if ( file_browser->view_mode == FBVM_ICON_VIEW ) { ptk_icon_view_select_all( PTK_ICON_VIEW( file_browser->folder_view ) ); } else if ( file_browser->view_mode == FBVM_LIST_VIEW ) { tree_sel = gtk_tree_view_get_selection( GTK_TREE_VIEW( file_browser->folder_view ) ); gtk_tree_selection_select_all( tree_sel ); }}static gbooleaninvert_selection ( GtkTreeModel* model, GtkTreePath *path, GtkTreeIter* it, PtkFileBrowser* file_browser ){ GtkTreeSelection * tree_sel; if ( file_browser->view_mode == FBVM_ICON_VIEW ) { if ( ptk_icon_view_path_is_selected ( PTK_ICON_VIEW( file_browser->folder_view ), path ) ) ptk_icon_view_unselect_path ( PTK_ICON_VIEW( file_browser->folder_view ), path ); else ptk_icon_view_select_path ( PTK_ICON_VIEW( file_browser->folder_view ), path ); } else if ( file_browser->view_mode == FBVM_LIST_VIEW ) { tree_sel = gtk_tree_view_get_selection( GTK_TREE_VIEW( file_browser->folder_view ) ); if ( gtk_tree_selection_path_is_selected ( tree_sel, path ) ) gtk_tree_selection_unselect_path ( tree_sel, path ); else gtk_tree_selection_select_path ( tree_sel, path ); } return FALSE;}void ptk_file_browser_invert_selection( PtkFileBrowser* file_browser ){ GtkTreeModel * model; if ( file_browser->view_mode == FBVM_ICON_VIEW ) { model = ptk_icon_view_get_model( PTK_ICON_VIEW( file_browser->folder_view ) ); g_signal_handlers_block_matched( file_browser->folder_view, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, on_folder_view_item_sel_change, NULL ); gtk_tree_model_foreach ( model, ( GtkTreeModelForeachFunc ) invert_selection, file_browser ); g_signal_handlers_unblock_matched( file_browser->folder_view, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, on_folder_view_item_sel_change, NULL ); on_folder_view_item_sel_change( PTK_ICON_VIEW( file_browser->folder_view ), file_browser ); } else if ( file_browser->view_mode == FBVM_LIST_VIEW ) { GtkTreeSelection* tree_sel; tree_sel = gtk_tree_view_get_selection(GTK_TREE_VIEW( file_browser->folder_view )); g_signal_handlers_block_matched( tree_sel, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, on_folder_view_item_sel_change, NULL ); model = gtk_tree_view_get_model( GTK_TREE_VIEW( file_browser->folder_view ) ); gtk_tree_model_foreach ( model, ( GtkTreeModelForeachFunc ) invert_selection, file_browser ); g_signal_handlers_unblock_matched( tree_sel, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, on_folder_view_item_sel_change, NULL ); on_folder_view_item_sel_change( (PtkIconView*)tree_sel, file_browser ); }}/* signal handlers */voidon_folder_view_item_activated ( PtkIconView *iconview, GtkTreePath *path, PtkFileBrowser* file_browser ){ ptk_file_browser_open_selected_files_with_app( file_browser, NULL );}voidon_folder_view_row_activated ( GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn* col, PtkFileBrowser* file_browser ){ ptk_file_browser_open_selected_files_with_app( file_browser, NULL );}void on_folder_view_item_sel_change ( PtkIconView *iconview, PtkFileBrowser* file_browser ){ GList * sel_files; GList* sel; GtkTreeIter it; GtkTreeSelection* tree_sel; GtkTreeModel* model; VFSFileInfo* file; file_browser->n_sel_files = 0; file_browser->sel_size = 0; sel_files = folder_view_get_selected_items( file_browser, &model ); for ( sel = sel_files; sel; sel = g_list_next( sel ) ) { if ( gtk_tree_model_get_iter( model, &it, ( GtkTreePath* ) sel->data ) ) { gtk_tree_model_get( model, &it, COL_FILE_INFO, &file, -1 ); if ( file ) { file_browser->sel_size += vfs_file_info_get_size( file ); vfs_file_info_unref( file ); } ++file_browser->n_sel_files; } } g_list_foreach( sel_files, ( GFunc ) gtk_tree_path_free, NULL ); g_list_free( sel_files ); g_signal_emit( file_browser, signals[ SEL_CHANGE_SIGNAL ], 0 );}gbooleanon_folder_view_key_press_event ( GtkWidget *widget, GdkEventKey *event, PtkFileBrowser* file_browser ){ int modifier = ( event->state & ( GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK ) ); if ( ! gtk_widget_is_focus( widget ) ) return FALSE; if ( modifier == GDK_CONTROL_MASK ) { switch ( event->keyval ) { case GDK_x: ptk_file_browser_cut( file_browser ); break; case GDK_c: ptk_file_browser_copy( file_browser ); break; case GDK_v: ptk_file_browser_paste( file_browser ); return TRUE; break; case GDK_i: ptk_file_browser_invert_selection( file_browser ); break; case GDK_a: ptk_file_browser_select_all( file_browser ); break; case GDK_h: ptk_file_browser_show_hidden_files( file_browser, ! file_browser->show_hidden_files ); break; default: return FALSE; } } else if ( modifier == GDK_MOD1_MASK ) { switch ( event->keyval ) { case GDK_Return: ptk_file_browser_file_properties( file_browser ); break; default: return FALSE; } } else if ( modifier == 0 ) { switch ( event->keyval ) { case GDK_F2: ptk_file_browser_rename_selected_file( file_browser ); break; case GDK_Delete: ptk_file_browser_delete( file_browser ); break; default: return FALSE; } } else { return FALSE; } return TRUE;}gbooleanon_folder_view_button_release_event ( GtkWidget *widget, GdkEventButton *event, PtkFileBrowser* file_browser ){ GtkTreeSelection * tree_sel; GtkTreePath* tree_path; GList* sel_files; VFSFileInfo* file; char* file_path; if ( file_browser->view_mode == FBVM_LIST_VIEW && !can_folder_view_sel_change ) { can_folder_view_sel_change = TRUE; tree_sel = gtk_tree_view_get_selection( GTK_TREE_VIEW( widget ) ); gtk_tree_view_get_path_at_pos( GTK_TREE_VIEW( widget ), event->x, event->y, &tree_path, NULL, NULL, NULL ); if ( tree_path ) { if ( gtk_tree_selection_path_is_selected( tree_sel, tree_path ) ) { gtk_tree_selection_unselect_all( tree_sel ); gtk_tree_selection_select_path( tree_sel, tree_path ); } gtk_tree_path_free( tree_path ); } } return FALSE;}static void show_popup_menu( PtkFileBrowser* file_browser, GdkEventButton *event ){ const char * cwd; char* dir_name = NULL; guint32 time; gint button; GtkWidget* popup; char* file_path = NULL; VFSFileInfo* file; GList* sel_files; cwd = ptk_file_browser_get_cwd( file_browser ); sel_files = ptk_file_browser_get_selected_files( file_browser ); if( ! sel_files ) { file = vfs_file_info_new(); vfs_file_info_get( file, cwd, NULL ); vfs_file_info_ref( file ); sel_files = g_list_prepend( NULL, file ); file_path = g_strdup( cwd ); dir_name = g_path_get_dirname( cwd ); } else { file = (VFSFileInfo*)sel_files->data; vfs_file_info_ref( file ); file_path = g_build_filename( cwd, vfs_file_info_get_name( file ), NULL ); } if ( g_file_test( file_path, G_FILE_TEST_EXISTS ) ) { if ( event ) { button = event->button; time = event->time; } else { button = 0; time = gtk_get_current_event_time(); } popup = ptk_file_menu_new( file_path, file, dir_name ? dir_name : cwd, sel_files, file_browser ); gtk_menu_popup( GTK_MENU( popup ), NULL, NULL, NULL, NULL, button, time ); } vfs_file_info_unref( file ); g_free( file_path ); g_free( dir_name );}/* invoke popup menu via shortcut key */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -