Changeset 9dbcf11e5ce63f859fc9da0c994d9befd48f0737

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

[project @ Implemented tree-based userlist]

Original author: Armin Burgmeier <armin@…>
Date: 2005-11-11 18:14:53+00:00

Files:
2 modified

Legend:

Unmodified
Added
Removed
  • inc/userlist.hpp

    ra73b5e0 r9dbcf11  
    4949        ~UserList(); 
    5050 
    51         // Calls from the user folder 
     51        // Calls from the window 
    5252        // TODO: Replace them by signal handlers from buf 
    53         // TODO: TreeView mit connecteten und nicht connecteten usern 
    54         // TODO: Nix auswaehlbar machen? 
    5553        virtual void obby_start(obby::local_buffer& buf); 
    5654        virtual void obby_end(); 
     
    5856        virtual void obby_user_part(const obby::user& user); 
    5957        virtual void obby_user_colour(const obby::user& user); 
    60         virtual void obby_document_insert(obby::local_document_info& document); 
    61         virtual void obby_document_remove(obby::local_document_info& document); 
     58        virtual void obby_document_insert(obby::local_document_info& info); 
     59        virtual void obby_document_remove(obby::local_document_info& info); 
    6260protected: 
     61        Gtk::TreeIter find_iter(const Gtk::TreeIter& parent, 
     62                                const Glib::ustring& text) const; 
     63        void remove_children(const Gtk::TreeIter& parent); 
     64 
     65        void on_user_subscribe(const obby::user& user, 
     66                               const obby::local_document_info& info); 
     67        void on_user_unsubscribe(const obby::user& user, 
     68                                 const obby::local_document_info& info); 
     69 
    6370        /** Reference to header. 
    6471         */ 
    6572        Header& m_header; 
     73 
     74        obby::local_buffer* m_buffer; 
    6675 
    6776        /** GUI components. 
  • src/userlist.cpp

    ra73b5e0 r9dbcf11  
    1717 */ 
    1818 
     19#include <gtkmm/stock.h> 
    1920#include "common.hpp" 
    2021#include "userlist.hpp" 
     
    101102{ 
    102103        set_sensitive(true); 
     104 
     105        m_buffer = &buf; 
    103106} 
    104107 
     
    106109{ 
    107110        set_sensitive(false); 
    108         // TODO: Remove all users in the list 
     111 
     112        remove_children(m_iter_offline); 
     113        remove_children(m_iter_online); 
    109114} 
    110115 
    111116void Gobby::UserList::obby_user_join(const obby::user& user) 
    112117{ 
    113         // TODO: Check connected flag, add user to correct column, remove from 
    114         // other, if necessary 
     118        // Verify that the user is not already joined 
     119        if(find_iter(m_iter_online, user.get_name()) != m_iter_online->children().end() ) 
     120                throw std::logic_error("Gobby::UserList::obby_user_join"); 
     121 
     122        // Find user in offline list 
     123        Gtk::TreeIter iter = find_iter(m_iter_offline, user.get_name() ); 
     124        if(iter != m_iter_offline->children().end() ) 
     125        { 
     126                // Remove it, if the new user is connected 
     127                if(user.get_flags() & obby::user::flags::CONNECTED) 
     128                        m_tree_data->erase(iter); 
     129                else 
     130                        // Let the entry in the offline list if the new user is 
     131                        // not connected. 
     132                        return; 
     133        } 
     134 
     135        // Add it to correct list 
     136        if(user.get_flags() & obby::user::flags::CONNECTED) 
     137                iter = m_tree_data->append(m_iter_online->children()); 
     138        else 
     139                iter = m_tree_data->append(m_iter_offline->children()); 
     140 
     141        (*iter)[m_tree_cols.icon] = create_coloured_pixbuf(user.get_colour() ); 
     142        (*iter)[m_tree_cols.text] = user.get_name(); 
     143 
     144        // New user may already be subscribed to documents (client initial) 
     145        for(obby::buffer::document_iterator iter = m_buffer->document_begin(); 
     146            iter != m_buffer->document_end(); 
     147            ++ iter) 
     148        { 
     149                if(iter->is_subscribed(user) ) 
     150                { 
     151                        on_user_subscribe( 
     152                                user, 
     153                                dynamic_cast<const obby::local_document_info&>( 
     154                                        *iter 
     155                                ) 
     156                        ); 
     157                } 
     158        } 
    115159} 
    116160 
    117161void Gobby::UserList::obby_user_part(const obby::user& user) 
    118162{ 
    119         // TODO: Remove user from online column, add to offline 
     163        // Find user in online list 
     164        Gtk::TreeIter iter = find_iter(m_iter_online, user.get_name() ); 
     165        if(iter == m_iter_online->children().end() ) 
     166                throw std::logic_error("Gobby::UserList::obby_user_part"); 
     167 
     168        // Remove it from there 
     169        m_tree_data->erase(iter); 
     170 
     171        // Insert into offline list 
     172        iter = m_tree_data->append(m_iter_offline->children() ); 
     173        (*iter)[m_tree_cols.icon] = create_coloured_pixbuf(user.get_colour() ); 
     174        (*iter)[m_tree_cols.text] = user.get_name(); 
    120175} 
    121176 
    122177void Gobby::UserList::obby_user_colour(const obby::user& user) 
    123178{ 
    124         // Change user colour of given user 
     179        // Find user in list 
     180        Gtk::TreeIter iter = find_iter(m_iter_online, user.get_name() ); 
     181        if(iter == m_iter_online->children().end() ) 
     182                throw std::logic_error("Gobby::UserList::obby_user_colour"); 
     183 
     184        // Recolour 
     185        (*iter)[m_tree_cols.icon] = create_coloured_pixbuf(user.get_colour() ); 
    125186} 
    126187 
    127188void Gobby::UserList::obby_document_insert(obby::local_document_info& info) 
    128189{ 
    129         // TODO: Add to (un)subscribe event, add corresponding documents as 
    130         // child of user into list. 
    131 } 
    132  
    133 void Gobby::UserList::obby_document_remove(obby::local_document_info& document) 
    134 { 
    135 } 
     190        info.subscribe_event().connect( 
     191                sigc::bind( 
     192                        sigc::mem_fun(*this, &UserList::on_user_subscribe), 
     193                        sigc::ref(info) 
     194                ) 
     195        ); 
     196 
     197        info.unsubscribe_event().connect( 
     198                sigc::bind( 
     199                        sigc::mem_fun(*this, &UserList::on_user_unsubscribe), 
     200                        sigc::ref(info) 
     201                ) 
     202        ); 
     203} 
     204 
     205void Gobby::UserList::obby_document_remove(obby::local_document_info& info) 
     206{ 
     207        // Do nothing here because unsubscrption signal will be emitted for all 
     208        // users? 
     209} 
     210 
     211void Gobby::UserList::on_user_subscribe(const obby::user& user, 
     212                                        const obby::local_document_info& info) 
     213{ 
     214        Gtk::TreeIter iter = find_iter(m_iter_online, user.get_name() ); 
     215        if(iter == m_iter_online->children().end() ) 
     216                throw std::logic_error("Gobby::UserList::on_user_subscribe"); 
     217 
     218        Gtk::TreeIter doc = m_tree_data->append(iter->children() ); 
     219        (*doc)[m_tree_cols.icon] = render_icon( 
     220                Gtk::Stock::NEW, 
     221                Gtk::ICON_SIZE_BUTTON 
     222        ); 
     223 
     224        (*doc)[m_tree_cols.text] = info.get_title(); 
     225} 
     226 
     227void Gobby::UserList::on_user_unsubscribe(const obby::user& user, 
     228                                          const obby::local_document_info& info) 
     229{ 
     230        Gtk::TreeIter user_iter = find_iter(m_iter_online, user.get_name() ); 
     231        if(user_iter == m_iter_online->children().end() ) 
     232                throw std::logic_error("Gobby::UserList::on_user_unsubscribe"); 
     233 
     234        Gtk::TreeIter doc_iter = find_iter(user_iter, info.get_title() ); 
     235        if(doc_iter == user_iter->children().end() ) 
     236                throw std::logic_error("Gobby::UserList::on_user_unsubscribe"); 
     237 
     238        m_tree_data->erase(doc_iter); 
     239} 
     240 
     241Gtk::TreeIter Gobby::UserList::find_iter(const Gtk::TreeIter& parent, 
     242                                         const Glib::ustring& text) const 
     243{ 
     244        const Gtk::TreeNodeChildren& children = parent->children(); 
     245        for(Gtk::TreeIter i = children.begin(); i != children.end(); ++ i) 
     246                if( (*i)[m_tree_cols.text] == text) 
     247                        return i; 
     248 
     249        return children.end(); 
     250} 
     251 
     252void Gobby::UserList::remove_children(const Gtk::TreeIter& parent) 
     253{ 
     254        const Gtk::TreeNodeChildren& list = parent->children(); 
     255        Gtk::TreeIter iter = list.begin(); 
     256 
     257        while(iter != list.end() ) 
     258                iter = m_tree_data->erase(iter); 
     259}