Changeset a73b5e04f5607f8f2e71a141419a1e76be0747d9

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

[project @ Userlist using TreeView?; currently disfunctional!]

Original author: Armin Burgmeier <armin@…>
Date: 2005-11-07 20:34:58+00:00

Files:
3 modified

Legend:

Unmodified
Added
Removed
  • inc/userlist.hpp

    rafc8e5a ra73b5e0  
    2222#include <gtkmm/scrolledwindow.h> 
    2323#include <gtkmm/treeview.h> 
    24 #include <gtkmm/liststore.h> 
     24#include <gtkmm/treestore.h> 
    2525#include <obby/user.hpp> 
    26 #include <obby/local_document_info.hpp> 
    2726#include <obby/local_buffer.hpp> 
    28 #include "folder.hpp" 
     27#include "header.hpp" 
    2928 
    3029namespace Gobby 
     
    4241                ~Columns(); 
    4342 
    44                 Gtk::TreeModelColumn<Glib::RefPtr<Gdk::Pixbuf> > colour; 
    45                 Gtk::TreeModelColumn<Glib::ustring> name; 
    46                 Gtk::TreeModelColumn<bool> connected; 
    47                 Gtk::TreeModelColumn<bool> subscribed; 
     43                Gtk::TreeModelColumn<Glib::RefPtr<Gdk::Pixbuf> > icon; 
     44                Gtk::TreeModelColumn<Glib::ustring> text; 
     45                // TODO: Column with pointer that holds reference to obby::user. 
    4846        }; 
    4947 
    50         UserList(Header& header, const Folder& folder); 
     48        UserList(Header& header); 
    5149        ~UserList(); 
    5250 
     
    6361        virtual void obby_document_remove(obby::local_document_info& document); 
    6462protected: 
    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          */ 
    75         Gtk::TreeModel::iterator find_user(const Glib::ustring& name) const; 
    76         void add_user(const obby::user& user); 
    77  
    7863        /** Reference to header. 
    7964         */ 
    8065        Header& m_header; 
    8166 
    82         /** Currently selected document. 
    83          */ 
    84         obby::local_document_info* m_info; 
    85  
    8667        /** GUI components. 
    8768         */ 
    88         Gtk::TreeView m_list_view; 
    89         Glib::RefPtr<Gtk::ListStore> m_list_data; 
    90         Columns m_list_cols; 
     69        Gtk::TreeView m_tree_view; 
     70        Glib::RefPtr<Gtk::TreeStore> m_tree_data; 
     71        Columns m_tree_cols; 
    9172 
    92         Gtk::TreeViewColumn* m_view_col_colour; 
    93         Gtk::TreeViewColumn* m_view_col_name; 
    94         Gtk::TreeViewColumn* m_view_col_connected; 
    95         Gtk::TreeViewColumn* m_view_col_subscribed; 
     73        Gtk::TreeViewColumn m_view_col; 
     74 
     75        Gtk::TreeIter m_iter_online; 
     76        Gtk::TreeIter m_iter_offline; 
    9677}; 
    9778 
    98 #if 0 
    99 /** UserList-derivated class that lists all users in the session. 
    100  */ 
    101 class UserListSession : public UserList 
    102 { 
    103 public: 
    104         UserListSession(const Folder& folder); 
    105         ~UserListSession(); 
    106  
    107 protected: 
    108         virtual void obby_start(obby::local_buffer& buf); 
    109         virtual void obby_end(); 
    110         virtual void obby_user_join(obby::user& user); 
    111         virtual void obby_user_part(obby::user& user); 
    112 }; 
    113  
    114 /** UserList derivated class that lists all users who are subscribed to the 
    115  * currently active document. 
    116  */ 
    117 class UserListDocument : public UserList 
    118 { 
    119 public: 
    120         UserListDocument(const Folder& folder); 
    121         ~UserListDocument(); 
    122  
    123 protected: 
    124         /** Window delegates 
    125          */ 
    126         virtual void obby_start(obby::local_buffer& buf); 
    127         virtual void obby_end(); 
    128         virtual void obby_user_join(obby::user& user); 
    129         virtual void obby_user_part(obby::user& user); 
    130         virtual void obby_document_insert(obby::local_document_info& info); 
    131         virtual void obby_document_remove(obby::local_document_info& info); 
    132  
    133 }; 
    134 #endif 
    135  
    136 } 
     79} // namespace obby 
    13780 
    13881#endif // _GOBBY_USERLIST_HPP_ 
  • src/userlist.cpp

    rafc8e5a ra73b5e0  
    2424        /** Creates a pixbuf representing a user's colour. 
    2525         */ 
    26         Glib::RefPtr<Gdk::Pixbuf> create_coloured_pixbuf(int red, int green, 
    27                                                          int blue) 
     26        Glib::RefPtr<Gdk::Pixbuf> 
     27        create_coloured_pixbuf(const obby::colour& colour) 
    2828        { 
    2929                Glib::RefPtr<Gdk::Pixbuf> pixbuf = 
    3030                        Gdk::Pixbuf::create(Gdk::COLORSPACE_RGB, false, 8, 16, 
    3131                                16); 
    32                 pixbuf->fill( (red << 24) | (green << 16) | (blue << 8) ); 
     32                pixbuf->fill( (colour.get_red() << 24) | (colour.get_green() << 16) | (colour.get_blue() << 8) ); 
    3333 
    3434                // Border around the color 
     
    5656Gobby::UserList::Columns::Columns() 
    5757{ 
    58         add(colour); 
    59         add(name); 
    60         add(connected); 
    61         add(subscribed); 
     58        add(icon); 
     59        add(text); 
    6260} 
    6361 
     
    6664} 
    6765 
    68 Gobby::UserList::UserList(Header& header, const Folder& folder): 
    69         m_header(header), m_info(NULL) 
     66Gobby::UserList::UserList(Header& header): 
     67        m_header(header) 
    7068{ 
    71         m_list_data = Gtk::ListStore::create(m_list_cols); 
    72         m_list_view.set_model(m_list_data); 
     69        m_tree_data = Gtk::TreeStore::create(m_tree_cols); 
    7370 
    74         m_list_view.append_column(_("Colour"), m_list_cols.colour); 
    75         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); 
     71        m_view_col.pack_start(m_tree_cols.icon, false); 
     72        m_view_col.pack_start(m_tree_cols.text, false); 
     73        m_view_col.set_spacing(5); 
    7874 
    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); 
     75        m_tree_view.set_model(m_tree_data); 
     76        m_tree_view.append_column(m_view_col); 
    8477 
    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); 
     78        m_iter_online = m_tree_data->append(); 
     79        m_iter_offline = m_tree_data->append(); 
    8980 
    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); 
     81        (*m_iter_online)[m_tree_cols.text] = _("Online"); 
     82        (*m_iter_offline)[m_tree_cols.text] = _("Offline"); 
    9383 
    94         // No users can be selected 
    95         m_list_view.get_selection()->set_mode(Gtk::SELECTION_NONE); 
     84        m_view_col.set_sort_column(m_tree_cols.text); 
    9685 
    97         // Hide subscription column until a document has been inserted 
    98         m_view_col_subscribed->set_visible(false); 
     86        m_tree_view.get_selection()->set_mode(Gtk::SELECTION_NONE); 
     87        m_tree_view.set_headers_visible(false); 
    9988 
    10089        set_shadow_type(Gtk::SHADOW_IN); 
     
    10291        set_sensitive(false); 
    10392 
    104         add(m_list_view); 
    105  
    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  
    111         // UserList crashes with GTK+ 2.8.x if it gets too small and no entry 
    112         set_size_request(200, 0); 
     93        add(m_tree_view); 
    11394} 
    11495 
     
    119100void Gobby::UserList::obby_start(obby::local_buffer& buf) 
    120101{ 
    121         // Enable list 
    122102        set_sensitive(true); 
    123103} 
     
    125105void Gobby::UserList::obby_end() 
    126106{ 
    127         // Clear list 
    128         m_info = NULL; 
    129         m_list_data->clear(); 
    130         // Hide subscription column 
    131         m_view_col_subscribed->set_visible(false); 
    132         // Disable list item 
    133107        set_sensitive(false); 
     108        // TODO: Remove all users in the list 
    134109} 
    135110 
    136111void Gobby::UserList::obby_user_join(const obby::user& user) 
    137112{ 
    138         // Is there already such a user? 
    139         Gtk::TreeModel::iterator iter = find_user(user.get_name() ); 
    140         if(iter == m_list_data->children().end() ) 
    141         { 
    142                 // No, so add the user to the list 
    143                 add_user(user); 
    144         } 
    145         else 
    146         { 
    147                 // Update connected flag 
    148                 (*iter)[m_list_cols.connected] = 
    149                         user.get_flags() & obby::user::flags::CONNECTED; 
    150         } 
     113        // TODO: Check connected flag, add user to correct column, remove from 
     114        // other, if necessary 
    151115} 
    152116 
    153117void Gobby::UserList::obby_user_part(const obby::user& user) 
    154118{ 
    155         // User is not anymore connceted 
    156         Gtk::TreeModel::iterator iter = find_user(user.get_name() ); 
    157         (*iter)[m_list_cols.connected] = false; 
     119        // TODO: Remove user from online column, add to offline 
    158120} 
    159121 
    160122void Gobby::UserList::obby_user_colour(const obby::user& user) 
    161123{ 
    162         // Get user with this name 
    163         Gtk::TreeModel::iterator iter = find_user(user.get_name() ); 
    164         // Get new colour 
    165         unsigned int red = user.get_colour().get_red(); 
    166         unsigned int green = user.get_colour().get_green(); 
    167         unsigned int blue = user.get_colour().get_blue(); 
    168         // Update it 
    169         (*iter)[m_list_cols.colour] = create_coloured_pixbuf(red, green, blue); 
     124        // Change user colour of given user 
    170125} 
    171126 
    172127void Gobby::UserList::obby_document_insert(obby::local_document_info& info) 
    173128{ 
    174         // Get notification when a user subscribed to this document 
    175         info.subscribe_event().connect(sigc::bind( 
    176                 sigc::mem_fun(*this, &UserList::on_user_subscribe), 
    177                         sigc::ref(info)) ); 
    178  
    179         // Get notification when a user unsubscribed 
    180         info.unsubscribe_event().connect(sigc::bind( 
    181                 sigc::mem_fun(*this, &UserList::on_user_unsubscribe), 
    182                         sigc::ref(info)) ); 
    183          
    184         // There is at least one document: Show subscription column 
    185         m_view_col_subscribed->set_visible(true); 
     129        // TODO: Add to (un)subscribe event, add corresponding documents as 
     130        // child of user into list. 
    186131} 
    187132 
    188133void Gobby::UserList::obby_document_remove(obby::local_document_info& document) 
    189134{ 
    190         // Is this the last document to be removed? 
    191         if(document.get_buffer().document_count() == 1) 
    192                 // Hide subscription column then 
    193                 m_view_col_subscribed->set_visible(false); 
    194135} 
    195  
    196 void Gobby::UserList::on_folder_tab_switched(Document& document) 
    197 { 
    198         // No document open 
    199         if(!m_view_col_subscribed->get_visible() ) return; 
    200         // Update current info 
    201         obby::local_document_info* info = &document.get_document(); 
    202         // Same document 
    203         if(info == m_info) return; 
    204         m_info = info; 
    205         // Clear current data 
    206         m_list_data->clear(); 
    207         // Get user table 
    208         const obby::user_table& table = 
    209                 info->get_buffer().get_user_table(); 
    210         // Add all users in user table 
    211         for(obby::user_table::iterator iter = 
    212                 table.begin(obby::user::flags::NONE, obby::user::flags::NONE); 
    213             iter != 
    214                 table.end(obby::user::flags::NONE, obby::user::flags::NONE); 
    215             ++ iter) 
    216         { 
    217                 add_user(*iter); 
    218         } 
    219 } 
    220  
    221 void Gobby::UserList::on_user_subscribe(const obby::user& user, 
    222                                         obby::local_document_info& info) 
    223 { 
    224         // Not current doc 
    225         if(&info != m_info) return; 
    226         // Find user 
    227         Gtk::TreeModel::iterator iter = find_user(user.get_name() ); 
    228         // Update subscribed flag 
    229         (*iter)[m_list_cols.subscribed] = true; 
    230 } 
    231  
    232 void Gobby::UserList::on_user_unsubscribe(const obby::user& user, 
    233                                           obby::local_document_info& info) 
    234 { 
    235         // Not current doc 
    236         if(&info != m_info) return; 
    237         // Find user 
    238         Gtk::TreeModel::iterator iter = find_user(user.get_name() ); 
    239         // Update subscribed flag 
    240         (*iter)[m_list_cols.subscribed] = false; 
    241 } 
    242  
    243 Gtk::TreeModel::iterator 
    244 Gobby::UserList::find_user(const Glib::ustring& name) const 
    245 { 
    246         Gtk::TreeModel::iterator iter = m_list_data->children().begin(); 
    247         for(iter; iter != m_list_data->children().end(); ++ iter) 
    248                 if( (*iter)[m_list_cols.name] == name) 
    249                         return iter; 
    250         return m_list_data->children().end(); 
    251 } 
    252  
    253 void Gobby::UserList::add_user(const obby::user& user) 
    254 { 
    255         Gtk::TreeModel::Row row = *(m_list_data->append() ); 
    256  
    257         unsigned int red = user.get_colour().get_red(); 
    258         unsigned int green = user.get_colour().get_green(); 
    259         unsigned int blue = user.get_colour().get_blue(); 
    260  
    261         row[m_list_cols.name] = user.get_name(); 
    262         row[m_list_cols.colour] = create_coloured_pixbuf(red, green, blue); 
    263         row[m_list_cols.connected] = 
    264                 user.get_flags() & obby::user::flags::CONNECTED; 
    265  
    266         if(m_info != NULL) 
    267                 row[m_list_cols.subscribed] = m_info->is_subscribed(user); 
    268 } 
    269  
    270 #if 0 
    271 Gobby::UserListSession::UserListSession(const Folder& folder) 
    272  : UserList(folder) 
    273 { 
    274         set_sensitive(false); 
    275 } 
    276  
    277 Gobby::UserListSession::~UserListSession() 
    278 { 
    279 } 
    280  
    281 void Gobby::UserListSession::obby_start(obby::local_buffer& buf) 
    282 { 
    283 } 
    284  
    285 void Gobby::UserListSession::obby_end() 
    286 { 
    287 } 
    288  
    289 void Gobby::UserListSession::obby_user_join(obby::user& user) 
    290 { 
    291         Gtk::TreeModel::Row row = *(m_list_data->append() ); 
    292  
    293         unsigned int red = user.get_red(); 
    294         unsigned int green = user.get_green(); 
    295         unsigned int blue = user.get_blue(); 
    296  
    297         row[m_list_cols.name] = user.get_name(); 
    298         row[m_list_cols.connected] = true; 
    299         row[m_list_cols.color] = create_coloured_pixbuf(red, green, blue); 
    300 } 
    301  
    302 void Gobby::UserListSession::obby_user_part(obby::user& user) 
    303 { 
    304         Gtk::TreeModel::iterator iter = m_list_data->children().begin(); 
    305         (*iter)[m_list_cols.connected] = false; 
    306 } 
    307  
    308 Gobby::UserListDocument::UserListDocument(const Folder& folder) 
    309  : UserList(folder), m_info(NULL) 
    310 { 
    311  
    312         // Show subscribed users, not connected ones 
    313         m_list_view.get_column(1)->set_title("Subscribed"); 
    314         set_sensitive(false); 
    315 } 
    316  
    317 Gobby::UserListDocument::~UserListDocument() 
    318 { 
    319 } 
    320  
    321 void Gobby::UserListDocument::obby_start(obby::local_buffer& buf) 
    322 { 
    323 } 
    324  
    325 void Gobby::UserListDocument::obby_end() 
    326 { 
    327         m_info = NULL; 
    328         m_list_data->clear(); 
    329         m_list_view.get_column(2)->set_visible(false); 
    330         set_sensitive(false); 
    331 } 
    332  
    333 void Gobby::UserListDocument::obby_user_join(obby::user& user) 
    334 { 
    335         // Are there open documents? So add the user. 
    336         if(m_info) 
    337                 add_user(user); 
    338         { 
    339         } 
    340 } 
    341  
    342 void Gobby::UserListDocument::obby_user_part(obby::user& user) 
    343 { 
    344 } 
    345  
    346 void Gobby::UserListDocument::obby_document_insert( 
    347         obby::local_document_info& info 
    348 ) 
    349 { 
    350  
    351         // There is at least one document: Enable widget 
    352         set_sensitive(true); 
    353 } 
    354  
    355 void Gobby::UserListDocument::obby_document_remove( 
    356         obby::local_document_info& info 
    357 ) 
    358 { 
    359         // Is this the last document that gets removed? 
    360         if(info.get_buffer().document_count() == 1) 
    361         { 
    362                 m_info = NULL; 
    363                 // Hide subcription column 
    364                 m_list_view.get_column(2)->set_visible(false); 
    365         } 
    366 } 
    367 #endif 
  • src/window.cpp

    r34c0230 ra73b5e0  
    5757   m_header(), 
    5858   m_folder(m_header, m_preferences), 
    59    m_userlist(m_header, m_folder), 
     59   m_userlist(m_header), 
    6060   m_statusbar(m_header, m_folder) 
    6161{