Changeset a73b5e04f5607f8f2e71a141419a1e76be0747d9
- Timestamp:
- 01/06/07 23:52:22 (6 years ago)
- Parents:
- 1be24ded71c2b8ec47770d9f242a47fb92b9bc62
- Children:
- f94f43663a2895417594b24a3aa3dcecf6d2e7ac
- git-committer:
- Philipp Kern <phil@0x539.de> / 2007-01-06T22:52:22Z+0000
- Files:
-
- 3 modified
-
inc/userlist.hpp (modified) (3 diffs)
-
src/userlist.cpp (modified) (6 diffs)
-
src/window.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
inc/userlist.hpp
rafc8e5a ra73b5e0 22 22 #include <gtkmm/scrolledwindow.h> 23 23 #include <gtkmm/treeview.h> 24 #include <gtkmm/ liststore.h>24 #include <gtkmm/treestore.h> 25 25 #include <obby/user.hpp> 26 #include <obby/local_document_info.hpp>27 26 #include <obby/local_buffer.hpp> 28 #include " folder.hpp"27 #include "header.hpp" 29 28 30 29 namespace Gobby … … 42 41 ~Columns(); 43 42 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. 48 46 }; 49 47 50 UserList(Header& header , const Folder& folder);48 UserList(Header& header); 51 49 ~UserList(); 52 50 … … 63 61 virtual void obby_document_remove(obby::local_document_info& document); 64 62 protected: 65 /** Signal handlers66 */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 functions74 */75 Gtk::TreeModel::iterator find_user(const Glib::ustring& name) const;76 void add_user(const obby::user& user);77 78 63 /** Reference to header. 79 64 */ 80 65 Header& m_header; 81 66 82 /** Currently selected document.83 */84 obby::local_document_info* m_info;85 86 67 /** GUI components. 87 68 */ 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; 91 72 92 Gtk::TreeViewColumn * m_view_col_colour;93 Gtk::TreeViewColumn* m_view_col_name; 94 Gtk::Tree ViewColumn* m_view_col_connected;95 Gtk::Tree ViewColumn* m_view_col_subscribed;73 Gtk::TreeViewColumn m_view_col; 74 75 Gtk::TreeIter m_iter_online; 76 Gtk::TreeIter m_iter_offline; 96 77 }; 97 78 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 137 80 138 81 #endif // _GOBBY_USERLIST_HPP_ -
src/userlist.cpp
rafc8e5a ra73b5e0 24 24 /** Creates a pixbuf representing a user's colour. 25 25 */ 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) 28 28 { 29 29 Glib::RefPtr<Gdk::Pixbuf> pixbuf = 30 30 Gdk::Pixbuf::create(Gdk::COLORSPACE_RGB, false, 8, 16, 31 31 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) ); 33 33 34 34 // Border around the color … … 56 56 Gobby::UserList::Columns::Columns() 57 57 { 58 add(colour); 59 add(name); 60 add(connected); 61 add(subscribed); 58 add(icon); 59 add(text); 62 60 } 63 61 … … 66 64 } 67 65 68 Gobby::UserList::UserList(Header& header , const Folder& folder):69 m_header(header) , m_info(NULL)66 Gobby::UserList::UserList(Header& header): 67 m_header(header) 70 68 { 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); 73 70 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); 78 74 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); 84 77 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(); 89 80 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"); 93 83 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); 96 85 97 // Hide subscription column until a document has been inserted98 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); 99 88 100 89 set_shadow_type(Gtk::SHADOW_IN); … … 102 91 set_sensitive(false); 103 92 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); 113 94 } 114 95 … … 119 100 void Gobby::UserList::obby_start(obby::local_buffer& buf) 120 101 { 121 // Enable list122 102 set_sensitive(true); 123 103 } … … 125 105 void Gobby::UserList::obby_end() 126 106 { 127 // Clear list128 m_info = NULL;129 m_list_data->clear();130 // Hide subscription column131 m_view_col_subscribed->set_visible(false);132 // Disable list item133 107 set_sensitive(false); 108 // TODO: Remove all users in the list 134 109 } 135 110 136 111 void Gobby::UserList::obby_user_join(const obby::user& user) 137 112 { 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 151 115 } 152 116 153 117 void Gobby::UserList::obby_user_part(const obby::user& user) 154 118 { 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 158 120 } 159 121 160 122 void Gobby::UserList::obby_user_colour(const obby::user& user) 161 123 { 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 170 125 } 171 126 172 127 void Gobby::UserList::obby_document_insert(obby::local_document_info& info) 173 128 { 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. 186 131 } 187 132 188 133 void Gobby::UserList::obby_document_remove(obby::local_document_info& document) 189 134 { 190 // Is this the last document to be removed?191 if(document.get_buffer().document_count() == 1)192 // Hide subscription column then193 m_view_col_subscribed->set_visible(false);194 135 } 195 196 void Gobby::UserList::on_folder_tab_switched(Document& document)197 {198 // No document open199 if(!m_view_col_subscribed->get_visible() ) return;200 // Update current info201 obby::local_document_info* info = &document.get_document();202 // Same document203 if(info == m_info) return;204 m_info = info;205 // Clear current data206 m_list_data->clear();207 // Get user table208 const obby::user_table& table =209 info->get_buffer().get_user_table();210 // Add all users in user table211 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 doc225 if(&info != m_info) return;226 // Find user227 Gtk::TreeModel::iterator iter = find_user(user.get_name() );228 // Update subscribed flag229 (*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 doc236 if(&info != m_info) return;237 // Find user238 Gtk::TreeModel::iterator iter = find_user(user.get_name() );239 // Update subscribed flag240 (*iter)[m_list_cols.subscribed] = false;241 }242 243 Gtk::TreeModel::iterator244 Gobby::UserList::find_user(const Glib::ustring& name) const245 {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 0271 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 ones313 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& info348 )349 {350 351 // There is at least one document: Enable widget352 set_sensitive(true);353 }354 355 void Gobby::UserListDocument::obby_document_remove(356 obby::local_document_info& info357 )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 column364 m_list_view.get_column(2)->set_visible(false);365 }366 }367 #endif -
src/window.cpp
r34c0230 ra73b5e0 57 57 m_header(), 58 58 m_folder(m_header, m_preferences), 59 m_userlist(m_header , m_folder),59 m_userlist(m_header), 60 60 m_statusbar(m_header, m_folder) 61 61 {
