| 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 | } |
| 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(); |
| 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 | |
| | 205 | void 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 | |
| | 211 | void 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 | |
| | 227 | void 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 | |
| | 241 | Gtk::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 | |
| | 252 | void 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 | } |