diff --git a/src/chatview.cpp b/src/chatview.cpp index e5f4bf6d1e76071f013bc1242fd33b9a431deda3..b1fad82c7b1ee1ac413d5723591bcec417749365 100644 --- a/src/chatview.cpp +++ b/src/chatview.cpp @@ -40,6 +40,15 @@ // Client #include "utils/files.h" +struct CppImpl { + struct Interaction { + std::string conv; + uint64_t id; + lrc::api::interaction::Info info; + }; + std::vector<Interaction> interactionsBuffer_; +}; + struct _ChatView { GtkBox parent; @@ -70,6 +79,9 @@ struct _ChatViewPrivate gulong webkit_ready; gulong webkit_send_text; gulong webkit_drag_drop; + + bool ready_ {false}; + CppImpl* cpp_; }; G_DEFINE_TYPE_WITH_PRIVATE(ChatView, chat_view, GTK_TYPE_BOX); @@ -452,8 +464,6 @@ print_text_recording(ChatView *self) *(*priv->accountInfo_)->conversationModel, priv->conversation_->interactions ); - - QObject::disconnect(priv->new_interaction_connection); } static void @@ -472,14 +482,12 @@ webkit_chat_container_ready(ChatView* self) print_text_recording(self); load_participants_images(self); - priv->new_interaction_connection = QObject::connect( - &*(*priv->accountInfo_)->conversationModel, &lrc::api::ConversationModel::newInteraction, - [self, priv](const std::string& uid, uint64_t interactionId, lrc::api::interaction::Info interaction) { - if (!priv->conversation_) return; - if (uid == priv->conversation_->uid) { - print_interaction_to_buffer(self, interactionId, interaction); + priv->ready_ = true; + for (const auto& interaction: priv->cpp_->interactionsBuffer_) { + if (interaction.conv == priv->conversation_->uid) { + print_interaction_to_buffer(self, interaction.id, interaction.info); } - }); + } priv->update_interaction_connection = QObject::connect( &*(*priv->accountInfo_)->conversationModel, &lrc::api::ConversationModel::interactionStatusUpdated, @@ -641,6 +649,20 @@ build_chat_view(ChatView* self) self ); + priv->new_interaction_connection = QObject::connect( + &*(*priv->accountInfo_)->conversationModel, &lrc::api::ConversationModel::newInteraction, + [self, priv](const std::string& uid, uint64_t interactionId, lrc::api::interaction::Info interaction) { + if (!priv->conversation_) return; + if (!priv->ready_ && priv->cpp_) { + priv->cpp_->interactionsBuffer_.emplace_back(CppImpl::Interaction { + uid, interactionId, interaction}); + } else if (uid == priv->conversation_->uid) { + print_interaction_to_buffer(self, interactionId, interaction); + } + }); + + priv->cpp_ = new CppImpl(); + if (webkit_chat_container_is_ready(WEBKIT_CHAT_CONTAINER(priv->webkit_chat_container))) webkit_chat_container_ready(self); }