Gobby::TabLabel::TabLabel(Folder& folder, SessionView& view, const Glib::ustring& active_icon_name): m_folder(folder), m_view(view), m_title(view.get_title()), m_changed(false), m_active_icon_name(active_icon_name) { set_column_spacing(6); m_title.set_halign(Gtk::ALIGN_START); update_icon(); update_color(); m_icon.show(); m_title.show(); m_button.set_halign(Gtk::ALIGN_END); m_button.show(); view.signal_active_user_changed().connect( sigc::mem_fun(*this, &TabLabel::on_active_user_changed)); m_notify_status_handle = g_signal_connect( G_OBJECT(view.get_session()), "notify::status", G_CALLBACK(on_notify_status_static), this); m_notify_subscription_group_handle = g_signal_connect( G_OBJECT(view.get_session()), "notify::subscription-group", G_CALLBACK(on_notify_subscription_group_static), this); m_folder.signal_document_changed().connect( sigc::mem_fun(*this, &TabLabel::on_folder_document_changed)); attach(m_icon, 0, 0, 1, 1); attach(m_title, 1, 0, 1, 1); attach(m_button, 2, 0, 1, 1); }
Gobby::TabLabel::TabLabel(Folder& folder, SessionView& view, const Glib::ustring& active_icon_name): Gtk::HBox(false, 6), m_folder(folder), m_view(view), m_title(view.get_title()), m_changed(false), m_active_icon_name(active_icon_name) { m_title.set_alignment(Gtk::ALIGN_START); update_icon(); update_color(); m_icon.show(); m_title.show(); m_extra.show(); m_button.show(); view.signal_active_user_changed().connect( sigc::mem_fun(*this, &TabLabel::on_active_user_changed)); m_notify_status_handle = g_signal_connect( G_OBJECT(view.get_session()), "notify::status", G_CALLBACK(on_notify_status_static), this); m_notify_subscription_group_handle = g_signal_connect( G_OBJECT(view.get_session()), "notify::subscription-group", G_CALLBACK(on_notify_subscription_group_static), this); m_folder.signal_document_changed().connect( sigc::mem_fun(*this, &TabLabel::on_folder_document_changed)); pack_start(m_icon, Gtk::PACK_SHRINK); pack_start(m_title, Gtk::PACK_SHRINK); pack_start(m_extra, Gtk::PACK_EXPAND_WIDGET); pack_end(m_button, Gtk::PACK_SHRINK); }
DocInfo(SessionView& view): m_view(view), m_active_user(NULL), m_active(false) { m_view.signal_active_user_changed().connect( sigc::mem_fun( *this, &DocInfo::on_active_user_changed)); on_active_user_changed(view.get_active_user()); }
void Gobby::SynchronizationCommands::on_document_removed(SessionView& view) { InfSession* session = view.get_session(); SyncMap::iterator iter = m_sync_map.find(session); if(iter != m_sync_map.end()) { delete iter->second; m_sync_map.erase(iter); } }
void Gobby::SynchronizationCommands::on_document_added(SessionView& view) { InfSession* session = view.get_session(); if(inf_session_get_status(session) == INF_SESSION_SYNCHRONIZING) { InfXmlConnection* connection; g_object_get(G_OBJECT(session), "sync-connection", &connection, NULL); gdouble percentage = inf_session_get_synchronization_progress( session, connection); g_object_unref(connection); g_assert(m_sync_map.find(session) == m_sync_map.end()); m_sync_map[session] = new SyncInfo(*this, view); set_progress_text(view, percentage); } }
void Gobby::UserJoinCommands::on_document_removed(InfBrowser* browser, const InfBrowserIter* iter, InfSessionProxy* proxy, Folder& folder, SessionView& view) { g_assert(proxy != NULL); UserJoinMap::iterator user_iter = m_user_join_map.find(proxy); // If the user join was successful the session is no longer in the map if(user_iter != m_user_join_map.end()) { delete user_iter->second; m_user_join_map.erase(user_iter); } else { // The user has removed the document. What we do now depends // on whether we are hosting the document or whether we are a // client. If we are a client we reset the connection of the // session proxy, which basically leads to us being // unsubscribed from the document. If we are hosting the // document, we do not want to unsubscribe from it, since // other users might still be connected. We therefore only // remove the local user from the session. If there are indeed // no other clients, then InfdDirectory will take care of // unsubscribing the session 60s after it became idle. if(INFD_IS_SESSION_PROXY(proxy)) { InfUser* user = view.get_active_user(); if(user != NULL) { InfSession* session; g_object_get(G_OBJECT(proxy), "session", &session, NULL); inf_session_set_user_status( session, user, INF_USER_UNAVAILABLE); g_object_unref(session); // TODO: set_active_user should go to // SessionView base: // TODO: The libinftextgtk objects should // reset the active user automatically when it // becomes unavailable. TextSessionView* text_view = dynamic_cast<TextSessionView*>(&view); if(text_view) text_view->set_active_user(NULL); ChatSessionView* chat_view = dynamic_cast<ChatSessionView*>(&view); if(chat_view) chat_view->set_active_user(NULL); } } else if(INFC_IS_SESSION_PROXY(proxy)) { infc_session_proxy_set_connection( INFC_SESSION_PROXY(proxy), NULL, NULL, 0); } } }