diff --git a/src/conversationsview.cpp b/src/conversationsview.cpp index a25f3394e7d7b0aedd1739e44b4cff092a9dd3a4..879a8664ad3a583fec730b0ccdae611ed0fee0e1 100644 --- a/src/conversationsview.cpp +++ b/src/conversationsview.cpp @@ -62,6 +62,7 @@ struct _ConversationsViewPrivate QMetaObject::Connection selection_updated; QMetaObject::Connection layout_changed; QMetaObject::Connection modelSortedConnection_; + QMetaObject::Connection conversationUpdatedConnection_; QMetaObject::Connection filterChangedConnection_; }; @@ -222,6 +223,50 @@ render_time(G_GNUC_UNUSED GtkTreeViewColumn *tree_column, g_object_set(G_OBJECT(cell), "markup", text, NULL); } +void +update_conversation(ConversationsView *self, const std::string& uid) { + auto priv = CONVERSATIONS_VIEW_GET_PRIVATE(self); + auto model = gtk_tree_view_get_model (GTK_TREE_VIEW(self)); + + auto idx = 0; + auto iterIsCorrect = true; + GtkTreeIter iter; + + while(iterIsCorrect) { + iterIsCorrect = gtk_tree_model_iter_nth_child (model, &iter, nullptr, idx); + if (!iterIsCorrect) + break; + gchar *ringId; + gtk_tree_model_get (model, &iter, + 0 /* col# */, &ringId /* data */, + -1); + if(std::string(ringId) == uid) { + // Get informations + auto conversation = priv->accountContainer_->info.conversationModel->filteredConversation(idx); + auto contactUri = conversation.participants.front(); + auto contactInfo = priv->accountContainer_->info.contactModel->getContact(contactUri); + auto lastMessage = conversation.interactions.empty() ? "" : + conversation.interactions.at(conversation.lastMessageUid).body; + std::replace(lastMessage.begin(), lastMessage.end(), '\n', ' '); + auto alias = contactInfo.profileInfo.alias; + alias.erase(std::remove(alias.begin(), alias.end(), '\r'), alias.end()); + // Update iter + gtk_list_store_set (GTK_LIST_STORE(model), &iter, + 0 /* col # */ , conversation.uid.c_str() /* celldata */, + 1 /* col # */ , alias.c_str() /* celldata */, + 2 /* col # */ , contactInfo.profileInfo.uri.c_str() /* celldata */, + 3 /* col # */ , contactInfo.registeredName.c_str() /* celldata */, + 4 /* col # */ , contactInfo.profileInfo.avatar.c_str() /* celldata */, + 5 /* col # */ , lastMessage.c_str() /* celldata */, + -1 /* end */); + g_free(ringId); + return; + } + g_free(ringId); + idx++; + } +} + static GtkTreeModel* create_and_fill_model(ConversationsView *self) { @@ -529,6 +574,12 @@ build_conversations_view(ConversationsView *self) gtk_tree_view_set_model(GTK_TREE_VIEW(self), GTK_TREE_MODEL(model)); }); + priv->conversationUpdatedConnection_ = QObject::connect( + &*priv->accountContainer_->info.conversationModel, + &lrc::api::ConversationModel::conversationUpdated, + [self] (const std::string& uid) { + update_conversation(self, uid); + }); priv->filterChangedConnection_ = QObject::connect( &*priv->accountContainer_->info.conversationModel, @@ -578,6 +629,7 @@ conversations_view_dispose(GObject *object) QObject::disconnect(priv->selection_updated); QObject::disconnect(priv->layout_changed); QObject::disconnect(priv->modelSortedConnection_); + QObject::disconnect(priv->conversationUpdatedConnection_); QObject::disconnect(priv->filterChangedConnection_); gtk_widget_destroy(priv->popupMenu_);