Changeset 7bf4916ab93fbcb1e951abeeaf7bb1cf7bf96207

Show
Ignore:
Timestamp:
01/06/07 23:44:38 (6 years ago)
Author:
Philipp Kern <phil@…>
Parents:
be3e9b4bbc5b5c2b45798231ad6969467ced33be
Children:
c54960cbe832f355a9a5b956a17b8199d2c3b1d0
git-committer:
Philipp Kern <phil@0x539.de> / 2007-01-06T22:44:38Z+0000
Message:

[project @ Connected/Subscribed flags in user list (fixes #12)]

Original author: Armin Burgmeier <armin@…>
Date: 2005-07-26 14:24:50+00:00

Files:
3 modified

Legend:

Unmodified
Added
Removed
  • inc/userlist.hpp

    rd7a5c00 r7bf4916  
    2626#include <obby/local_document_info.hpp> 
    2727#include <obby/local_buffer.hpp> 
     28#include "folder.hpp" 
    2829 
    2930namespace Gobby 
    3031{ 
    3132 
     33/** List showing users that are participating in the obby session. 
     34 */ 
    3235class UserList : public Gtk::ScrolledWindow 
    3336{ 
     
    3942                ~Columns(); 
    4043 
     44                Gtk::TreeModelColumn<Glib::RefPtr<Gdk::Pixbuf> > colour; 
    4145                Gtk::TreeModelColumn<Glib::ustring> name; 
    42                 Gtk::TreeModelColumn<Glib::RefPtr<Gdk::Pixbuf> > color; 
     46                Gtk::TreeModelColumn<bool> connected; 
     47                Gtk::TreeModelColumn<bool> subscribed; 
    4348        }; 
    4449 
    45         UserList(); 
     50        UserList(const Folder& folder); 
    4651        ~UserList(); 
    4752 
    48         // Calls from the window 
    49         void obby_start(obby::local_buffer& buf); 
    50         void obby_end(); 
    51         void obby_user_join(obby::user& user); 
    52         void obby_user_part(obby::user& user); 
    53         void obby_user_colour(obby::user& user); 
    54         void obby_document_insert(obby::local_document_info& document); 
    55         void obby_document_remove(obby::local_document_info& document); 
     53        // Calls from the user folder 
     54        // TODO: Replace them by signal handlers from buf 
     55        // TODO: Context menu to show/hide non-connected users 
     56        // TODO: Nix auswaehlbar machen? 
     57        virtual void obby_start(obby::local_buffer& buf); 
     58        virtual void obby_end(); 
     59        virtual void obby_user_join(obby::user& user); 
     60        virtual void obby_user_part(obby::user& user); 
     61        virtual void obby_user_colour(obby::user& user); 
     62        virtual void obby_document_insert(obby::local_document_info& document); 
     63        virtual void obby_document_remove(obby::local_document_info& document); 
    5664protected: 
    57         // Helper functions 
     65        /** Signal handlers 
     66         */ 
     67        void on_folder_tab_switched(Document& document); 
     68        void on_user_subscribe(const obby::user& user, 
     69                               obby::local_document_info& info); 
     70        void on_user_unsubscribe(const obby::user& user, 
     71                                 obby::local_document_info& info); 
     72 
     73        /** Helper functions 
     74         */ 
    5875        Gtk::TreeModel::iterator find_user(const Glib::ustring& name) const; 
     76        void add_user(const obby::user& user); 
    5977 
     78        /** Currently selected document. 
     79         */ 
     80        obby::local_document_info* m_info; 
     81 
     82        /** GUI components. 
     83         */ 
    6084        Gtk::TreeView m_list_view; 
    6185        Glib::RefPtr<Gtk::ListStore> m_list_data; 
    6286        Columns m_list_cols; 
     87 
     88        Gtk::TreeViewColumn* m_view_col_colour; 
     89        Gtk::TreeViewColumn* m_view_col_name; 
     90        Gtk::TreeViewColumn* m_view_col_connected; 
     91        Gtk::TreeViewColumn* m_view_col_subscribed; 
    6392}; 
     93 
     94#if 0 
     95/** UserList-derivated class that lists all users in the session. 
     96 */ 
     97class UserListSession : public UserList 
     98{ 
     99public: 
     100        UserListSession(const Folder& folder); 
     101        ~UserListSession(); 
     102 
     103protected: 
     104        virtual void obby_start(obby::local_buffer& buf); 
     105        virtual void obby_end(); 
     106        virtual void obby_user_join(obby::user& user); 
     107        virtual void obby_user_part(obby::user& user); 
     108}; 
     109 
     110/** UserList derivated class that lists all users who are subscribed to the 
     111 * currently active document. 
     112 */ 
     113class UserListDocument : public UserList 
     114{ 
     115public: 
     116        UserListDocument(const Folder& folder); 
     117        ~UserListDocument(); 
     118 
     119protected: 
     120        /** Window delegates 
     121         */ 
     122        virtual void obby_start(obby::local_buffer& buf); 
     123        virtual void obby_end(); 
     124        virtual void obby_user_join(obby::user& user); 
     125        virtual void obby_user_part(obby::user& user); 
     126        virtual void obby_document_insert(obby::local_document_info& info); 
     127        virtual void obby_document_remove(obby::local_document_info& info); 
     128 
     129}; 
     130#endif 
    64131 
    65132} 
  • src/userlist.cpp

    rd7a5c00 r7bf4916  
    2222namespace 
    2323{ 
     24        /** Creates a pixbuf representing a user's colour. 
     25         */ 
    2426        Glib::RefPtr<Gdk::Pixbuf> create_coloured_pixbuf(int red, int green, 
    2527                                                         int blue) 
     
    4648                        } 
    4749                } 
     50 
    4851                return pixbuf; 
    4952        } 
     
    5356Gobby::UserList::Columns::Columns() 
    5457{ 
     58        add(colour); 
    5559        add(name); 
    56         add(color); 
     60        add(connected); 
     61        add(subscribed); 
    5762} 
    5863 
     
    6166} 
    6267 
    63 Gobby::UserList::UserList() 
     68Gobby::UserList::UserList(const Folder& folder) 
     69 : m_info(NULL) 
    6470{ 
    6571        m_list_data = Gtk::ListStore::create(m_list_cols); 
    6672        m_list_view.set_model(m_list_data); 
    6773 
    68         m_list_view.append_column(_("Colour"), m_list_cols.color); 
     74        m_list_view.append_column(_("Colour"), m_list_cols.colour); 
    6975        m_list_view.append_column(_("Name"), m_list_cols.name); 
     76        m_list_view.append_column(_("Connected"), m_list_cols.connected); 
     77        m_list_view.append_column(_("Subscribed"), m_list_cols.subscribed); 
     78 
     79        // Store TreeViewColumns 
     80        m_view_col_colour = m_list_view.get_column(0); 
     81        m_view_col_name = m_list_view.get_column(1); 
     82        m_view_col_connected = m_list_view.get_column(2); 
     83        m_view_col_subscribed = m_list_view.get_column(3); 
     84 
     85        // Let the user sort by these columns 
     86        m_view_col_name->set_sort_column(m_list_cols.name); 
     87        m_view_col_connected->set_sort_column(m_list_cols.connected); 
     88        m_view_col_subscribed->set_sort_column(m_list_cols.subscribed); 
     89 
     90        // Let the user reorder the columns 
     91        for(int i = 0; i < 4; ++ i) 
     92                m_list_view.get_column(i)->set_reorderable(true); 
     93 
     94        // No users can be selected 
     95        m_list_view.get_selection()->set_mode(Gtk::SELECTION_NONE); 
     96 
     97        // Hide subscription column until a document has been inserted 
     98        m_view_col_subscribed->set_visible(false); 
    7099 
    71100        set_shadow_type(Gtk::SHADOW_IN); 
    72101        set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); 
     102        set_sensitive(false); 
     103 
    73104        add(m_list_view); 
    74105 
    75         set_sensitive(false); 
     106        // Connect tab_switched_event from folder to change subscribed flag 
     107        // according to current document. 
     108        folder.tab_switched_event().connect( 
     109                sigc::mem_fun(*this, &UserList::on_folder_tab_switched) ); 
     110 
    76111} 
    77112 
     
    82117void Gobby::UserList::obby_start(obby::local_buffer& buf) 
    83118{ 
     119        // Enable list 
    84120        set_sensitive(true); 
    85121} 
     
    87123void Gobby::UserList::obby_end() 
    88124{ 
     125        // Clear list 
     126        m_info = NULL; 
    89127        m_list_data->clear(); 
     128        // Hide subscription column 
     129        m_view_col_subscribed->set_visible(false); 
     130        // Disable list item 
    90131        set_sensitive(false); 
    91132} 
     
    93134void Gobby::UserList::obby_user_join(obby::user& user) 
    94135{ 
    95         Gtk::TreeModel::Row row = *(m_list_data->append() ); 
    96  
     136        // Is there already such a user? 
     137        Gtk::TreeModel::iterator iter = find_user(user.get_name() ); 
     138        if(iter == m_list_data->children().end() ) 
     139        { 
     140                // No, so add the user to the list 
     141                add_user(user); 
     142        } 
     143        else 
     144        { 
     145                // Update connected flag 
     146                (*iter)[m_list_cols.connected] = true; 
     147        } 
     148} 
     149 
     150void Gobby::UserList::obby_user_part(obby::user& user) 
     151{ 
     152        // User is not anymore connceted 
     153        Gtk::TreeModel::iterator iter = find_user(user.get_name() ); 
     154        (*iter)[m_list_cols.connected] = false; 
     155} 
     156 
     157void Gobby::UserList::obby_user_colour(obby::user& user) 
     158{ 
     159        // Get user with this name 
     160        Gtk::TreeModel::iterator iter = find_user(user.get_name() ); 
     161        // Get new colour 
    97162        unsigned int red = user.get_red(); 
    98163        unsigned int green = user.get_green(); 
    99164        unsigned int blue = user.get_blue(); 
    100  
    101         row[m_list_cols.name] = user.get_name(); 
    102         row[m_list_cols.color] = create_coloured_pixbuf(red, green, blue); 
    103 } 
    104  
    105 void Gobby::UserList::obby_user_part(obby::user& user) 
    106 { 
    107         Gtk::TreeModel::iterator iter = find_user(user.get_name() ); 
    108         if(iter == m_list_data->children().end() ) return; 
    109  
    110         m_list_data->erase(iter); 
    111 } 
    112  
    113 void Gobby::UserList::obby_user_colour(obby::user& user) 
    114 { 
    115         Gtk::TreeModel::iterator iter = find_user(user.get_name() ); 
    116  
    117         unsigned int red = user.get_red(); 
    118         unsigned int green = user.get_green(); 
    119         unsigned int blue = user.get_blue(); 
     165        // Update it 
     166        (*iter)[m_list_cols.colour] = create_coloured_pixbuf(red, green, blue); 
     167} 
     168 
     169void Gobby::UserList::obby_document_insert(obby::local_document_info& info) 
     170{ 
     171        // Get notification when a user subscribed to this document 
     172        info.subscribe_event().connect(sigc::bind( 
     173                sigc::mem_fun(*this, &UserList::on_user_subscribe), 
     174                        sigc::ref(info)) ); 
     175 
     176        // Get notification when a user unsubscribed 
     177        info.unsubscribe_event().connect(sigc::bind( 
     178                sigc::mem_fun(*this, &UserList::on_user_unsubscribe), 
     179                        sigc::ref(info)) ); 
    120180         
    121         (*iter)[m_list_cols.color] = create_coloured_pixbuf(red, green, blue); 
    122 } 
    123  
    124 void Gobby::UserList::obby_document_insert(obby::local_document_info& document) 
    125 { 
    126          
     181        // There is at least one document: Show subscription column 
     182        m_view_col_subscribed->set_visible(true); 
    127183} 
    128184 
    129185void Gobby::UserList::obby_document_remove(obby::local_document_info& document) 
    130186{ 
     187        // Is this the last document to be removed? 
     188        if(document.get_buffer().document_count() == 1) 
     189                // Hide subscription column then 
     190                m_view_col_subscribed->set_visible(false); 
     191} 
     192 
     193void Gobby::UserList::on_folder_tab_switched(Document& document) 
     194{ 
     195        // No document open 
     196        if(!m_view_col_subscribed->get_visible() ) return; 
     197        // Update current info 
     198        obby::local_document_info* info = &document.get_document(); 
     199        // Same document 
     200        if(info == m_info) return; 
     201        m_info = info; 
     202        // Clear current data 
     203        m_list_data->clear(); 
     204        // Get user table 
     205        const obby::user_table& user_table = 
     206                info->get_buffer().get_user_table(); 
     207        // Add all users in user table 
     208        for(obby::user_table::user_iterator<obby::user::NONE, false> iter = 
     209                user_table.user_begin<obby::user::NONE, false>(); 
     210            iter != user_table.user_end<obby::user::NONE, false>(); 
     211            ++ iter) 
     212                add_user(*iter); 
     213} 
     214 
     215void Gobby::UserList::on_user_subscribe(const obby::user& user, 
     216                                        obby::local_document_info& info) 
     217{ 
     218        // Not current doc 
     219        if(&info != m_info) return; 
     220        // Find user 
     221        Gtk::TreeModel::iterator iter = find_user(user.get_name() ); 
     222        // Update subscribed flag 
     223        (*iter)[m_list_cols.subscribed] = true; 
     224} 
     225 
     226void Gobby::UserList::on_user_unsubscribe(const obby::user& user, 
     227                                          obby::local_document_info& info) 
     228{ 
     229        // Not current doc 
     230        if(&info != m_info) return; 
     231        // Find user 
     232        Gtk::TreeModel::iterator iter = find_user(user.get_name() ); 
     233        // Update subscribed flag 
     234        (*iter)[m_list_cols.subscribed] = false; 
    131235} 
    132236 
     
    141245} 
    142246 
     247void Gobby::UserList::add_user(const obby::user& user) 
     248{ 
     249        Gtk::TreeModel::Row row = *(m_list_data->append() ); 
     250 
     251        unsigned int red = user.get_red(); 
     252        unsigned int green = user.get_green(); 
     253        unsigned int blue = user.get_blue(); 
     254 
     255        row[m_list_cols.name] = user.get_name(); 
     256        row[m_list_cols.colour] = create_coloured_pixbuf(red, green, blue); 
     257        row[m_list_cols.connected] = true; 
     258 
     259        if(m_info != NULL) 
     260                row[m_list_cols.subscribed] = m_info->is_subscribed(user); 
     261} 
     262 
     263#if 0 
     264Gobby::UserListSession::UserListSession(const Folder& folder) 
     265 : UserList(folder) 
     266{ 
     267        set_sensitive(false); 
     268} 
     269 
     270Gobby::UserListSession::~UserListSession() 
     271{ 
     272} 
     273 
     274void Gobby::UserListSession::obby_start(obby::local_buffer& buf) 
     275{ 
     276} 
     277 
     278void Gobby::UserListSession::obby_end() 
     279{ 
     280} 
     281 
     282void Gobby::UserListSession::obby_user_join(obby::user& user) 
     283{ 
     284        Gtk::TreeModel::Row row = *(m_list_data->append() ); 
     285 
     286        unsigned int red = user.get_red(); 
     287        unsigned int green = user.get_green(); 
     288        unsigned int blue = user.get_blue(); 
     289 
     290        row[m_list_cols.name] = user.get_name(); 
     291        row[m_list_cols.connected] = true; 
     292        row[m_list_cols.color] = create_coloured_pixbuf(red, green, blue); 
     293} 
     294 
     295void Gobby::UserListSession::obby_user_part(obby::user& user) 
     296{ 
     297        Gtk::TreeModel::iterator iter = m_list_data->children().begin(); 
     298        (*iter)[m_list_cols.connected] = false; 
     299} 
     300 
     301Gobby::UserListDocument::UserListDocument(const Folder& folder) 
     302 : UserList(folder), m_info(NULL) 
     303{ 
     304 
     305        // Show subscribed users, not connected ones 
     306        m_list_view.get_column(1)->set_title("Subscribed"); 
     307        set_sensitive(false); 
     308} 
     309 
     310Gobby::UserListDocument::~UserListDocument() 
     311{ 
     312} 
     313 
     314void Gobby::UserListDocument::obby_start(obby::local_buffer& buf) 
     315{ 
     316} 
     317 
     318void Gobby::UserListDocument::obby_end() 
     319{ 
     320        m_info = NULL; 
     321        m_list_data->clear(); 
     322        m_list_view.get_column(2)->set_visible(false); 
     323        set_sensitive(false); 
     324} 
     325 
     326void Gobby::UserListDocument::obby_user_join(obby::user& user) 
     327{ 
     328        // Are there open documents? So add the user. 
     329        if(m_info) 
     330                add_user(user); 
     331        { 
     332        } 
     333} 
     334 
     335void Gobby::UserListDocument::obby_user_part(obby::user& user) 
     336{ 
     337} 
     338 
     339void Gobby::UserListDocument::obby_document_insert( 
     340        obby::local_document_info& info 
     341) 
     342{ 
     343 
     344        // There is at least one document: Enable widget 
     345        set_sensitive(true); 
     346} 
     347 
     348void Gobby::UserListDocument::obby_document_remove( 
     349        obby::local_document_info& info 
     350) 
     351{ 
     352        // Is this the last document that gets removed? 
     353        if(info.get_buffer().document_count() == 1) 
     354        { 
     355                m_info = NULL; 
     356                // Hide subcription column 
     357                m_list_view.get_column(2)->set_visible(false); 
     358        } 
     359} 
     360#endif 
  • src/window.cpp

    r8ec5e5b r7bf4916  
    5353   m_zeroconf(NULL), 
    5454#endif 
    55    m_folder(m_preferences), m_header(m_folder), m_statusbar(m_folder) 
     55   m_folder(m_preferences), m_userlist(m_folder), 
     56   m_header(m_folder), m_statusbar(m_folder) 
    5657{ 
    5758        // Header