📄 ptk-file-browser.c
字号:
GTK_SHADOW_IN );}void ptk_file_browser_finalize( GObject *obj ){ PtkFileBrowser * file_browser = PTK_FILE_BROWSER( obj ); if ( file_browser->dir ) { g_signal_handlers_disconnect_matched( file_browser->dir, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, file_browser ); vfs_dir_remove_state_callback( file_browser->dir, ptk_file_browser_chdir_state_cb, file_browser ); vfs_dir_unref( file_browser->dir ); } /* Remove all idle handlers which are not called yet. */ do {} while ( g_source_remove_by_user_data( file_browser ) ); if ( file_browser->file_list ) { g_signal_handlers_disconnect_matched( file_browser->file_list, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, file_browser ); g_object_unref( G_OBJECT( file_browser->file_list ) ); } G_OBJECT_CLASS( parent_class ) ->finalize( obj );}void ptk_file_browser_get_property ( GObject *obj, guint prop_id, GValue *value, GParamSpec *pspec ){}void ptk_file_browser_set_property ( GObject *obj, guint prop_id, const GValue *value, GParamSpec *pspec ){}/* File Browser API */GtkWidget* ptk_file_browser_new( GtkWidget* mainWindow, PtkFileBrowserViewMode view_mode ){ PtkFileBrowser * file_browser; file_browser = ( PtkFileBrowser* ) g_object_new( PTK_TYPE_FILE_BROWSER, NULL ); file_browser->folder_view = create_folder_view( file_browser, view_mode ); file_browser->view_mode = view_mode; gtk_container_add ( GTK_CONTAINER ( file_browser->folder_view_scroll ), file_browser->folder_view ); gtk_widget_show_all( file_browser->folder_view_scroll ); return ( GtkWidget* ) file_browser;}static gboolean side_pane_chdir( PtkFileBrowser* file_browser, const char* folder_path ){ if ( file_browser->side_pane_mode == FB_SIDE_PANE_BOOKMARKS ) { ptk_location_view_chdir( file_browser->side_view, folder_path ); return TRUE; } else if ( file_browser->side_pane_mode == FB_SIDE_PANE_DIR_TREE ) { return ptk_dir_tree_view_chdir( file_browser->side_view, folder_path ); } return FALSE;}gboolean ptk_file_browser_chdir( PtkFileBrowser* file_browser, const char* folder_path, gboolean add_history ){ gboolean cancel = FALSE; GtkWidget* folder_view = file_browser->folder_view; GtkTreeView* dir_tree = file_browser->side_view; GtkEntry* addressBar; GtkStatusbar* statusBar; char* path_end; int test_access; char *cwd; char* path; gboolean is_current; /* * 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 || !folder_path ) return FALSE; if ( folder_path ) { path = strdup( folder_path ); /* remove redundent '/' */ if ( strcmp( path, "/" ) ) { path_end = path + strlen( path ) - 1; for ( ; path_end > path; --path_end ) { if ( *path_end != '/' ) break; else *path_end = '\0'; } } } else path = NULL; if ( ! path || ! g_file_test( path, ( G_FILE_TEST_IS_DIR ) ) ) { ptk_show_error( GTK_WINDOW( gtk_widget_get_toplevel( GTK_WIDGET( file_browser ) ) ), _( "Directory does'nt exist!" ) ); g_free( path ); return FALSE; } /* FIXME: check access */#if defined(HAVE_EUIDACCESS) test_access = euidaccess( path, R_OK | X_OK );#elif defined(HAVE_EACCESS) test_access = eaccess( path, R_OK | X_OK );#else /* No check */ test_access = 0;#endif if ( test_access == -1 ) { ptk_show_error( GTK_WINDOW( gtk_widget_get_toplevel( GTK_WIDGET( file_browser ) ) ), g_strerror( errno ) ); return FALSE; } g_signal_emit( file_browser, signals[ BEFORE_CHDIR_SIGNAL ], 0, path, &cancel ); if ( add_history ) { if ( ! file_browser->curHistory || strcmp( file_browser->curHistory->data, path ) ) { /* Has forward history */ if ( file_browser->curHistory && file_browser->curHistory->next ) { g_list_foreach ( file_browser->curHistory->next, ( GFunc ) g_free, NULL ); g_list_free( file_browser->curHistory->next ); file_browser->curHistory->next = NULL; } /* Add path to history if there is no forward history */ file_browser->history = g_list_append( file_browser->history, path ); file_browser->curHistory = g_list_last( file_browser->history ); } } if ( file_browser->view_mode == FBVM_ICON_VIEW ) ptk_icon_view_set_model( PTK_ICON_VIEW( folder_view ), NULL ); else if ( file_browser->view_mode == FBVM_LIST_VIEW ) gtk_tree_view_set_model( GTK_TREE_VIEW( folder_view ), NULL ); if ( file_browser->dir ) { g_signal_handlers_disconnect_matched( file_browser->dir, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, file_browser ); vfs_dir_remove_state_callback( file_browser->dir, ptk_file_browser_chdir_state_cb, file_browser ); vfs_dir_unref( file_browser->dir ); } file_browser->dir = vfs_get_dir( path ); vfs_dir_add_state_callback( file_browser->dir, ptk_file_browser_chdir_state_cb, file_browser ); file_browser->busy = TRUE; return TRUE;}static gbooleanptk_file_browser_delayed_content_change( PtkFileBrowser* file_browser ){ GTimeVal t; g_get_current_time( &t ); file_browser->prev_update_time = t.tv_sec; g_signal_emit( file_browser, signals[ CONTENT_CHANGE_SIGNAL ], 0 ); file_browser->update_timeout = 0; return FALSE;}#if 0void on_folder_content_update ( FolderContent* content, PtkFileBrowser* file_browser ){ /* FIXME: Newly added or deleted files should not be delayed. This must be fixed before 0.2.0 release. */ GTimeVal t; g_get_current_time( &t ); /* Previous update is < 5 seconds before. Queue the update, and don't update the view too often */ if ( ( t.tv_sec - file_browser->prev_update_time ) < 5 ) { /* If the update timeout has been set, wait until the timeout happens, and don't do anything here. */ if ( 0 == file_browser->update_timeout ) { /* No timeout callback. Add one */ /* Delay the update */ file_browser->update_timeout = g_timeout_add( 5000, ( GSourceFunc ) ptk_file_browser_delayed_content_change, file_browser ); } } else if ( 0 == file_browser->update_timeout ) { /* No timeout callback. Add one */ file_browser->prev_update_time = t.tv_sec; g_signal_emit( file_browser, signals[ CONTENT_CHANGE_SIGNAL ], 0 ); }}#endifstatic gboolean ptk_file_browser_content_changed( PtkFileBrowser* file_browser ){ gdk_threads_enter(); g_signal_emit( file_browser, signals[ CONTENT_CHANGE_SIGNAL ], 0 ); gdk_threads_leave(); return FALSE;}static void on_folder_content_changed( VFSDir* dir, VFSFileInfo* file, PtkFileBrowser* file_browser ){ g_idle_add( ( GSourceFunc ) ptk_file_browser_content_changed, file_browser );}static void on_sort_col_changed( GtkTreeSortable* sortable, PtkFileBrowser* file_browser ){ int col; gtk_tree_sortable_get_sort_column_id( sortable, &col, &file_browser->sort_type ); switch ( col ) { case COL_FILE_NAME: col = FB_SORT_BY_NAME; break; case COL_FILE_SIZE: col = FB_SORT_BY_SIZE; break; case COL_FILE_MTIME: col = FB_SORT_BY_MTIME; break; case COL_FILE_DESC: col = FB_SORT_BY_TYPE; break; case COL_FILE_PERM: col = FB_SORT_BY_PERM; break; case COL_FILE_OWNER: col = FB_SORT_BY_OWNER; break; } file_browser->sort_order = col;}static void ptk_file_browser_update_model( PtkFileBrowser* file_browser ){ PtkFileList * list; GtkTreeModel *old_list; list = ptk_file_list_new( file_browser->dir, file_browser->show_hidden_files ); old_list = file_browser->file_list; file_browser->file_list = GTK_TREE_MODEL( list ); if ( old_list ) g_object_unref( G_OBJECT( old_list ) ); gtk_tree_sortable_set_sort_column_id( GTK_TREE_SORTABLE( list ), file_list_order_from_sort_order( file_browser->sort_order ), file_browser->sort_type ); ptk_file_list_show_thumbnails( list, ( file_browser->view_mode == FBVM_ICON_VIEW ), file_browser->max_thumbnail ); g_signal_connect( list, "sort-column-changed", G_CALLBACK( on_sort_col_changed ), file_browser ); if ( file_browser->view_mode == FBVM_ICON_VIEW ) ptk_icon_view_set_model( PTK_ICON_VIEW( file_browser->folder_view ), GTK_TREE_MODEL( list ) ); else if ( file_browser->view_mode == FBVM_LIST_VIEW ) gtk_tree_view_set_model( GTK_TREE_VIEW( file_browser->folder_view ), GTK_TREE_MODEL( list ) );}void ptk_file_browser_chdir_state_cb( VFSDir* dir, int state, gpointer user_data ){ PtkFileList * list, *old_list; PtkFileBrowser* file_browser = ( PtkFileBrowser* ) user_data; if ( state == 1 ) { g_signal_connect( dir, "file-created", G_CALLBACK( on_folder_content_changed ), file_browser ); g_signal_connect( dir, "file-deleted", G_CALLBACK( on_folder_content_changed ), file_browser ); g_signal_connect( dir, "file-changed", G_CALLBACK( on_folder_content_changed ), file_browser ); ptk_file_browser_update_model( file_browser ); file_browser->busy = FALSE; g_signal_emit( file_browser, signals[ AFTER_CHDIR_SIGNAL ], 0 ); g_signal_emit( file_browser, signals[ CONTENT_CHANGE_SIGNAL ], 0 ); g_signal_emit( file_browser, signals[ SEL_CHANGE_SIGNAL ], 0 ); if ( file_browser->side_pane ) { side_pane_chdir( file_browser, ptk_file_browser_get_cwd( file_browser ) ); } } else if ( state == 2 ) { g_signal_emit( file_browser, signals[ CONTENT_CHANGE_SIGNAL ], 0 ); if ( file_browser->file_list ) { ptk_file_list_show_thumbnails( PTK_FILE_LIST( file_browser->file_list ), file_browser->view_mode == FBVM_ICON_VIEW, file_browser->max_thumbnail ); } }}const char* ptk_file_browser_get_cwd( PtkFileBrowser* file_browser ){ if ( ! file_browser->curHistory ) return NULL; return ( const char* ) file_browser->curHistory->data;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -