⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ptk-file-browser.c

📁 台湾人开发的Linux下的文件管理器
💻 C
📖 第 1 页 / 共 5 页
字号:
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 + -