diff --git a/src/chatlog/chatmessage.cpp b/src/chatlog/chatmessage.cpp index fd071c7db..b2e8f8a8f 100644 --- a/src/chatlog/chatmessage.cpp +++ b/src/chatlog/chatmessage.cpp @@ -41,7 +41,8 @@ #define TIME_COL_WIDTH 90.0 -ChatMessage::ChatMessage() +ChatMessage::ChatMessage(DocumentCache& documentCache_) + : documentCache{documentCache_} { } @@ -49,9 +50,10 @@ ChatMessage::~ChatMessage() = default; ChatMessage::Ptr ChatMessage::createChatMessage(const QString& sender, const QString& rawMessage, MessageType type, bool isMe, MessageState state, - const QDateTime& date, bool colorizeName) + const QDateTime& date, DocumentCache& documentCache, + bool colorizeName) { - ChatMessage::Ptr msg = ChatMessage::Ptr(new ChatMessage); + ChatMessage::Ptr msg = ChatMessage::Ptr(new ChatMessage(documentCache)); QString text = rawMessage.toHtmlEscaped(); QString senderText = sender; @@ -108,16 +110,17 @@ ChatMessage::Ptr ChatMessage::createChatMessage(const QString& sender, const QSt } } - msg->addColumn(new Text(senderText, authorFont, true, sender, textType, color), + msg->addColumn(new Text(documentCache, senderText, authorFont, true, sender, textType, color), ColumnFormat(NAME_COL_WIDTH, ColumnFormat::FixedSize, ColumnFormat::Right)); - msg->addColumn(new Text(text, baseFont, false, ((type == ACTION) && isMe) + msg->addColumn(new Text(documentCache, text, baseFont, false, ((type == ACTION) && isMe) ? QString("%1 %2").arg(sender, rawMessage) : rawMessage), ColumnFormat(1.0, ColumnFormat::VariableSize)); switch (state) { case MessageState::complete: - msg->addColumn(new Timestamp(date, Settings::getInstance().getTimestampFormat(), baseFont), + msg->addColumn(new Timestamp(date, Settings::getInstance().getTimestampFormat(), + baseFont, documentCache), ColumnFormat(TIME_COL_WIDTH, ColumnFormat::FixedSize, ColumnFormat::Right)); break; case MessageState::pending: @@ -133,9 +136,10 @@ ChatMessage::Ptr ChatMessage::createChatMessage(const QString& sender, const QSt } ChatMessage::Ptr ChatMessage::createChatInfoMessage(const QString& rawMessage, - SystemMessageType type, const QDateTime& date) + SystemMessageType type, const QDateTime& date, + DocumentCache& documentCache) { - ChatMessage::Ptr msg = ChatMessage::Ptr(new ChatMessage); + ChatMessage::Ptr msg = ChatMessage::Ptr(new ChatMessage(documentCache)); QString text = rawMessage.toHtmlEscaped(); QString img; @@ -155,18 +159,20 @@ ChatMessage::Ptr ChatMessage::createChatInfoMessage(const QString& rawMessage, msg->addColumn(new Image(QSize(18, 18), img), ColumnFormat(NAME_COL_WIDTH, ColumnFormat::FixedSize, ColumnFormat::Right)); - msg->addColumn(new Text("" + text + "", baseFont, false, text), + msg->addColumn(new Text(documentCache, "" + text + "", baseFont, false, text), ColumnFormat(1.0, ColumnFormat::VariableSize, ColumnFormat::Left)); - msg->addColumn(new Timestamp(date, Settings::getInstance().getTimestampFormat(), baseFont), + msg->addColumn(new Timestamp(date, Settings::getInstance().getTimestampFormat(), + baseFont, documentCache), ColumnFormat(TIME_COL_WIDTH, ColumnFormat::FixedSize, ColumnFormat::Right)); return msg; } ChatMessage::Ptr ChatMessage::createFileTransferMessage(const QString& sender, CoreFile& coreFile, - ToxFile file, bool isMe, const QDateTime& date) + ToxFile file, bool isMe, const QDateTime& date, + DocumentCache& documentCache) { - ChatMessage::Ptr msg = ChatMessage::Ptr(new ChatMessage); + ChatMessage::Ptr msg = ChatMessage::Ptr(new ChatMessage(documentCache)); QFont baseFont = Settings::getInstance().getChatMessageFont(); QFont authorFont = baseFont; @@ -174,19 +180,19 @@ ChatMessage::Ptr ChatMessage::createFileTransferMessage(const QString& sender, C authorFont.setBold(true); } - msg->addColumn(new Text(sender, authorFont, true), + msg->addColumn(new Text(documentCache, sender, authorFont, true), ColumnFormat(NAME_COL_WIDTH, ColumnFormat::FixedSize, ColumnFormat::Right)); msg->addColumn(new ChatLineContentProxy(new FileTransferWidget(nullptr, coreFile, file), 320, 0.6f), ColumnFormat(1.0, ColumnFormat::VariableSize)); - msg->addColumn(new Timestamp(date, Settings::getInstance().getTimestampFormat(), baseFont), + msg->addColumn(new Timestamp(date, Settings::getInstance().getTimestampFormat(), baseFont, documentCache), ColumnFormat(TIME_COL_WIDTH, ColumnFormat::FixedSize, ColumnFormat::Right)); return msg; } -ChatMessage::Ptr ChatMessage::createTypingNotification() +ChatMessage::Ptr ChatMessage::createTypingNotification(DocumentCache& documentCache) { - ChatMessage::Ptr msg = ChatMessage::Ptr(new ChatMessage); + ChatMessage::Ptr msg = ChatMessage::Ptr(new ChatMessage(documentCache)); QFont baseFont = Settings::getInstance().getChatMessageFont(); @@ -199,7 +205,7 @@ ChatMessage::Ptr ChatMessage::createTypingNotification() // as user will keep typing. Issue #1280 msg->addColumn(new NotificationIcon(QSize(18, 18)), ColumnFormat(NAME_COL_WIDTH, ColumnFormat::FixedSize, ColumnFormat::Right)); - msg->addColumn(new Text("[user]...", baseFont, false, ""), + msg->addColumn(new Text(documentCache, "[user]...", baseFont, false, ""), ColumnFormat(1.0, ColumnFormat::VariableSize, ColumnFormat::Left)); return msg; @@ -213,14 +219,14 @@ ChatMessage::Ptr ChatMessage::createTypingNotification() * * @return created message */ -ChatMessage::Ptr ChatMessage::createBusyNotification() +ChatMessage::Ptr ChatMessage::createBusyNotification(DocumentCache& documentCache) { - ChatMessage::Ptr msg = ChatMessage::Ptr(new ChatMessage); + ChatMessage::Ptr msg = ChatMessage::Ptr(new ChatMessage(documentCache)); QFont baseFont = Settings::getInstance().getChatMessageFont(); baseFont.setPixelSize(baseFont.pixelSize() + 2); baseFont.setBold(true); - msg->addColumn(new Text(QObject::tr("Reformatting text...", "Waiting for text to be reformatted"), baseFont, false, ""), + msg->addColumn(new Text(documentCache, QObject::tr("Reformatting text...", "Waiting for text to be reformatted"), baseFont, false, ""), ColumnFormat(1.0, ColumnFormat::VariableSize, ColumnFormat::Center)); return msg; @@ -231,7 +237,7 @@ void ChatMessage::markAsDelivered(const QDateTime& time) QFont baseFont = Settings::getInstance().getChatMessageFont(); // remove the spinner and replace it by $time - replaceContent(2, new Timestamp(time, Settings::getInstance().getTimestampFormat(), baseFont)); + replaceContent(2, new Timestamp(time, Settings::getInstance().getTimestampFormat(), baseFont, documentCache)); } void ChatMessage::markAsBroken() diff --git a/src/chatlog/chatmessage.h b/src/chatlog/chatmessage.h index 892fd0e25..033bad576 100644 --- a/src/chatlog/chatmessage.h +++ b/src/chatlog/chatmessage.h @@ -27,6 +27,7 @@ class CoreFile; class QGraphicsScene; +class DocumentCache; class ChatMessage : public ChatLine { @@ -47,21 +48,22 @@ public: ALERT, }; - ChatMessage(); + explicit ChatMessage(DocumentCache& documentCache); ~ChatMessage(); ChatMessage(const ChatMessage&) = default; - ChatMessage& operator=(const ChatMessage&) = default; ChatMessage(ChatMessage&&) = default; static ChatMessage::Ptr createChatMessage(const QString& sender, const QString& rawMessage, MessageType type, bool isMe, MessageState state, - const QDateTime& date, bool colorizeName = false); + const QDateTime& date, DocumentCache&, + bool colorizeName = false); static ChatMessage::Ptr createChatInfoMessage(const QString& rawMessage, SystemMessageType type, - const QDateTime& date); + const QDateTime& date, DocumentCache&); static ChatMessage::Ptr createFileTransferMessage(const QString& sender, CoreFile& coreFile, - ToxFile file, bool isMe, const QDateTime& date); - static ChatMessage::Ptr createTypingNotification(); - static ChatMessage::Ptr createBusyNotification(); + ToxFile file, bool isMe, const QDateTime& date, + DocumentCache&); + static ChatMessage::Ptr createTypingNotification(DocumentCache&); + static ChatMessage::Ptr createBusyNotification(DocumentCache&); void markAsDelivered(const QDateTime& time); void markAsBroken(); @@ -77,4 +79,5 @@ protected: private: bool action = false; + DocumentCache& documentCache; }; diff --git a/src/chatlog/chatwidget.cpp b/src/chatlog/chatwidget.cpp index 3452cf768..c8660708e 100644 --- a/src/chatlog/chatwidget.cpp +++ b/src/chatlog/chatwidget.cpp @@ -62,16 +62,16 @@ T clamp(T x, T min, T max) return x; } -ChatMessage::Ptr createDateMessage(QDateTime timestamp) +ChatMessage::Ptr createDateMessage(QDateTime timestamp, DocumentCache& documentCache) { const auto& s = Settings::getInstance(); const auto date = timestamp.date(); auto dateText = date.toString(s.getDateFormat()); - return ChatMessage::createChatInfoMessage(dateText, ChatMessage::INFO, QDateTime()); + return ChatMessage::createChatInfoMessage(dateText, ChatMessage::INFO, QDateTime(), documentCache); } ChatMessage::Ptr createMessage(const QString& displayName, bool isSelf, bool colorizeNames, - const ChatLogMessage& chatLogMessage) + const ChatLogMessage& chatLogMessage, DocumentCache& documentCache) { auto messageType = chatLogMessage.message.isAction ? ChatMessage::MessageType::ACTION : ChatMessage::MessageType::NORMAL; @@ -88,11 +88,13 @@ ChatMessage::Ptr createMessage(const QString& displayName, bool isSelf, bool col const auto timestamp = chatLogMessage.message.timestamp; return ChatMessage::createChatMessage(displayName, chatLogMessage.message.content, messageType, - isSelf, chatLogMessage.state, timestamp, colorizeNames); + isSelf, chatLogMessage.state, timestamp, documentCache, + colorizeNames); } void renderMessageRaw(const QString& displayName, bool isSelf, bool colorizeNames, - const ChatLogMessage& chatLogMessage, ChatLine::Ptr& chatLine) + const ChatLogMessage& chatLogMessage, ChatLine::Ptr& chatLine, + DocumentCache& documentCache) { // HACK: This is kind of gross, but there's not an easy way to fit this into // the existing architecture. This shouldn't ever fail since we should only @@ -108,7 +110,7 @@ void renderMessageRaw(const QString& displayName, bool isSelf, bool colorizeName chatMessage->markAsBroken(); } } else { - chatLine = createMessage(displayName, isSelf, colorizeNames, chatLogMessage); + chatLine = createMessage(displayName, isSelf, colorizeNames, chatLogMessage, documentCache); } } @@ -204,11 +206,13 @@ ChatLogIdx clampedAdd(ChatLogIdx idx, int val, IChatLog& chatLog) } // namespace -ChatWidget::ChatWidget(IChatLog& chatLog_, const Core& core_, QWidget* parent) +ChatWidget::ChatWidget(IChatLog& chatLog_, const Core& core_, DocumentCache& documentCache_, + QWidget* parent) : QGraphicsView(parent) , chatLog(chatLog_) , core(core_) , chatLineStorage(new ChatLineStorage()) + , documentCache(documentCache_) { // Create the scene busyScene = new QGraphicsScene(this); @@ -216,7 +220,7 @@ ChatWidget::ChatWidget(IChatLog& chatLog_, const Core& core_, QWidget* parent) scene->setItemIndexMethod(QGraphicsScene::BspTreeIndex); setScene(scene); - busyNotification = ChatMessage::createBusyNotification(); + busyNotification = ChatMessage::createBusyNotification(documentCache); busyNotification->addToScene(busyScene); busyNotification->visibilityChanged(true); @@ -539,7 +543,7 @@ void ChatWidget::insertChatlines(std::map chatLines) if (!chatLineStorage->contains(date)) { // If there is no dateline for the given date we need to insert it // above the line we'd like to insert. - auto dateLine = createDateMessage(date); + auto dateLine = createDateMessage(date, documentCache); chatLineStorage->insertDateLine(date, dateLine); dateLine->addToScene(scene); dateLine->visibilityChanged(false); @@ -1391,7 +1395,7 @@ bool ChatWidget::isActiveFileTransfer(ChatLine::Ptr l) void ChatWidget::setTypingNotification() { - typingNotification = ChatMessage::createTypingNotification(); + typingNotification = ChatMessage::createTypingNotification(documentCache); typingNotification->visibilityChanged(true); typingNotification->setVisible(false); typingNotification->addToScene(scene); @@ -1409,7 +1413,8 @@ void ChatWidget::renderItem(const ChatLogItem& item, bool hideName, bool coloriz case ChatLogItem::ContentType::message: { const auto& chatLogMessage = item.getContentAsMessage(); - renderMessageRaw(item.getDisplayName(), isSelf, colorizeNames_, chatLogMessage, chatMessage); + renderMessageRaw(item.getDisplayName(), isSelf, colorizeNames_, chatLogMessage, + chatMessage, documentCache); break; } @@ -1422,7 +1427,8 @@ void ChatWidget::renderItem(const ChatLogItem& item, bool hideName, bool coloriz const auto& systemMessage = item.getContentAsSystemMessage(); auto chatMessageType = getChatMessageType(systemMessage); - chatMessage = ChatMessage::createChatInfoMessage(systemMessage.toString(), chatMessageType, QDateTime::currentDateTime()); + chatMessage = ChatMessage::createChatInfoMessage(systemMessage.toString(), + chatMessageType, QDateTime::currentDateTime(), documentCache); // Ignore caller's decision to hide the name. We show the icon in the // slot of the sender's name so we always want it visible hideName = false; @@ -1441,7 +1447,8 @@ void ChatWidget::renderFile(QString displayName, ToxFile file, bool isSelf, QDat if (!chatMessage) { CoreFile* coreFile = core.getCoreFile(); assert(coreFile); - chatMessage = ChatMessage::createFileTransferMessage(displayName, *coreFile, file, isSelf, timestamp); + chatMessage = ChatMessage::createFileTransferMessage(displayName, *coreFile, + file, isSelf, timestamp, documentCache); } else { auto proxy = static_cast(chatMessage->getContent(1)); assert(proxy->getWidgetType() == ChatLineContentProxy::FileTransferWidgetType); diff --git a/src/chatlog/chatwidget.h b/src/chatlog/chatwidget.h index 0eea3c0c8..c03e5dddc 100644 --- a/src/chatlog/chatwidget.h +++ b/src/chatlog/chatwidget.h @@ -42,7 +42,8 @@ class ChatWidget : public QGraphicsView { Q_OBJECT public: - explicit ChatWidget(IChatLog& chatLog_, const Core& core_, QWidget* parent = nullptr); + ChatWidget(IChatLog& chatLog_, const Core& core_, DocumentCache&, + QWidget* parent = nullptr); virtual ~ChatWidget(); void insertChatlines(std::map chatLines); @@ -214,4 +215,5 @@ private: std::unique_ptr chatLineStorage; std::vector> renderCompletionFns; + DocumentCache& documentCache; }; diff --git a/src/chatlog/content/text.cpp b/src/chatlog/content/text.cpp index 73ad09dd0..7aad51063 100644 --- a/src/chatlog/content/text.cpp +++ b/src/chatlog/content/text.cpp @@ -31,14 +31,16 @@ #include #include -Text::Text(const QString& txt, const QFont& font, bool enableElide, const QString& rwText, - const TextType& type, const QColor& custom) +Text::Text(DocumentCache& documentCache_, const QString& txt, const QFont& font, + bool enableElide, const QString& rwText, const TextType& type, + const QColor& custom) : rawText(rwText) , elide(enableElide) , defFont(font) , defStyleSheet(Style::getStylesheet(QStringLiteral("chatArea/innerStyle.css"), font)) , textType(type) , customColor(custom) + , documentCache(documentCache_) { color = textColor(); setText(txt); @@ -49,7 +51,7 @@ Text::Text(const QString& txt, const QFont& font, bool enableElide, const QStrin Text::~Text() { if (doc) - DocumentCache::getInstance().push(doc); + documentCache.push(doc); } void Text::setText(const QString& txt) @@ -315,7 +317,7 @@ QString Text::getLinkAt(QPointF scenePos) const void Text::regenerate() { if (!doc) { - doc = DocumentCache::getInstance().pop(); + doc = documentCache.pop(); dirty = true; } @@ -362,7 +364,7 @@ void Text::regenerate() void Text::freeResources() { - DocumentCache::getInstance().push(doc); + documentCache.push(doc); doc = nullptr; } diff --git a/src/chatlog/content/text.h b/src/chatlog/content/text.h index 9014342b2..fef9669b4 100644 --- a/src/chatlog/content/text.h +++ b/src/chatlog/content/text.h @@ -25,6 +25,7 @@ #include class QTextDocument; +class DocumentCache; class Text : public ChatLineContent { @@ -38,8 +39,10 @@ public: CUSTOM }; - Text(const QString& txt = "", const QFont& font = QFont(), bool enableElide = false, - const QString& rawText = QString(), const TextType& type = NORMAL, const QColor& custom = Style::getColor(Style::MainText)); + Text(DocumentCache&, const QString& txt = "", const QFont& font = QFont(), + bool enableElide = false, const QString& rawText = QString(), + const TextType& type = NORMAL, + const QColor& custom = Style::getColor(Style::MainText)); virtual ~Text(); void setText(const QString& txt); @@ -109,4 +112,5 @@ private: TextType textType; QColor color; QColor customColor; + DocumentCache& documentCache; }; diff --git a/src/chatlog/content/timestamp.cpp b/src/chatlog/content/timestamp.cpp index 1565e1def..8772ffbd8 100644 --- a/src/chatlog/content/timestamp.cpp +++ b/src/chatlog/content/timestamp.cpp @@ -19,8 +19,8 @@ #include "timestamp.h" -Timestamp::Timestamp(const QDateTime& time_, const QString& format, const QFont& font) - : Text(time_.toString(format), font, false, time_.toString(format)) +Timestamp::Timestamp(const QDateTime& time_, const QString& format, const QFont& font, DocumentCache& documentCache_) + : Text(documentCache_, time_.toString(format), font, false, time_.toString(format)) { time = time_; } diff --git a/src/chatlog/content/timestamp.h b/src/chatlog/content/timestamp.h index db549652a..d6e9c63ff 100644 --- a/src/chatlog/content/timestamp.h +++ b/src/chatlog/content/timestamp.h @@ -24,12 +24,14 @@ #include class QTextDocument; +class DocumentCache; class Timestamp : public Text { Q_OBJECT public: - Timestamp(const QDateTime& time_, const QString& format, const QFont& font); + Timestamp(const QDateTime& time_, const QString& format, const QFont& font, + DocumentCache&); QDateTime getTime(); protected: diff --git a/src/chatlog/documentcache.cpp b/src/chatlog/documentcache.cpp index 298479645..8f5199089 100644 --- a/src/chatlog/documentcache.cpp +++ b/src/chatlog/documentcache.cpp @@ -41,12 +41,3 @@ void DocumentCache::push(QTextDocument* doc) documents.push(doc); } } - -/** - * @brief Returns the singleton instance. - */ -DocumentCache& DocumentCache::getInstance() -{ - static DocumentCache instance; - return instance; -} diff --git a/src/chatlog/documentcache.h b/src/chatlog/documentcache.h index 8b9d8f190..4bae19368 100644 --- a/src/chatlog/documentcache.h +++ b/src/chatlog/documentcache.h @@ -26,17 +26,13 @@ class QTextDocument; class DocumentCache { public: - static DocumentCache& getInstance(); - - QTextDocument* pop(); - void push(QTextDocument* doc); - -private: DocumentCache() = default; ~DocumentCache(); DocumentCache(DocumentCache&) = delete; DocumentCache& operator=(const DocumentCache&) = delete; + QTextDocument* pop(); + void push(QTextDocument* doc); private: QStack documents; }; diff --git a/src/widget/form/chatform.cpp b/src/widget/form/chatform.cpp index 5b8327981..a01f400f4 100644 --- a/src/widget/form/chatform.cpp +++ b/src/widget/form/chatform.cpp @@ -106,8 +106,10 @@ QString secondsToDHMS(quint32 duration) } } // namespace -ChatForm::ChatForm(Profile& profile, Friend* chatFriend, IChatLog& chatLog_, IMessageDispatcher& messageDispatcher_) - : GenericChatForm(profile.getCore(), chatFriend, chatLog_, messageDispatcher_) +ChatForm::ChatForm(Profile& profile, Friend* chatFriend, IChatLog& chatLog_, + IMessageDispatcher& messageDispatcher_, DocumentCache& documentCache_) + : GenericChatForm(profile.getCore(), chatFriend, chatLog_, messageDispatcher_, + documentCache_) , core{profile.getCore()} , f(chatFriend) , isTyping{false} diff --git a/src/widget/form/chatform.h b/src/widget/form/chatform.h index 16f86005d..c7e4ed067 100644 --- a/src/widget/form/chatform.h +++ b/src/widget/form/chatform.h @@ -42,12 +42,14 @@ class QPixmap; class QHideEvent; class QMoveEvent; class ImagePreviewButton; +class DocumentCache; class ChatForm : public GenericChatForm { Q_OBJECT public: - ChatForm(Profile& profile, Friend* chatFriend, IChatLog& chatLog_, IMessageDispatcher& messageDispatcher_); + ChatForm(Profile& profile, Friend* chatFriend, IChatLog& chatLog_, + IMessageDispatcher& messageDispatcher_, DocumentCache&); ~ChatForm() override; void setStatusMessage(const QString& newMessage); diff --git a/src/widget/form/genericchatform.cpp b/src/widget/form/genericchatform.cpp index aadb91e86..447bd7634 100644 --- a/src/widget/form/genericchatform.cpp +++ b/src/widget/form/genericchatform.cpp @@ -137,7 +137,8 @@ QPushButton* createButton(const QString& name, T* self, Fun onClickSlot) } // namespace GenericChatForm::GenericChatForm(const Core& core_, const Contact* contact, IChatLog& chatLog_, - IMessageDispatcher& messageDispatcher_, QWidget* parent_) + IMessageDispatcher& messageDispatcher_, DocumentCache& documentCache, + QWidget* parent_) : QWidget(parent_, Qt::Window) , core{core_} , audioInputFlag(false) @@ -149,7 +150,7 @@ GenericChatForm::GenericChatForm(const Core& core_, const Contact* contact, ICha headWidget = new ChatFormHeader(); searchForm = new SearchForm(); dateInfo = new QLabel(this); - chatWidget = new ChatWidget(chatLog_, core, this); + chatWidget = new ChatWidget(chatLog_, core, documentCache, this); searchForm->hide(); dateInfo->setAlignment(Qt::AlignHCenter); dateInfo->setVisible(false); diff --git a/src/widget/form/genericchatform.h b/src/widget/form/genericchatform.h index 83f9093fa..a19781bde 100644 --- a/src/widget/form/genericchatform.h +++ b/src/widget/form/genericchatform.h @@ -53,6 +53,7 @@ class QVBoxLayout; class IMessageDispatcher; struct Message; +class DocumentCache; namespace Ui { class MainWindow; @@ -69,7 +70,8 @@ class GenericChatForm : public QWidget Q_OBJECT public: GenericChatForm(const Core& core_, const Contact* contact, IChatLog& chatLog_, - IMessageDispatcher& messageDispatcher_, QWidget* parent_ = nullptr); + IMessageDispatcher& messageDispatcher_, DocumentCache&, + QWidget* parent_ = nullptr); ~GenericChatForm() override; void setName(const QString& newName); diff --git a/src/widget/form/groupchatform.cpp b/src/widget/form/groupchatform.cpp index c815e9b6c..b0819d807 100644 --- a/src/widget/form/groupchatform.cpp +++ b/src/widget/form/groupchatform.cpp @@ -82,8 +82,9 @@ QString editName(const QString& name) * @brief Timeout = peer stopped sending audio. */ -GroupChatForm::GroupChatForm(Core& core_, Group* chatGroup, IChatLog& chatLog_, IMessageDispatcher& messageDispatcher_, IGroupSettings& settings_) - : GenericChatForm(core_, chatGroup, chatLog_, messageDispatcher_) +GroupChatForm::GroupChatForm(Core& core_, Group* chatGroup, IChatLog& chatLog_, + IMessageDispatcher& messageDispatcher_, IGroupSettings& settings_, DocumentCache& documentCache_) + : GenericChatForm(core_, chatGroup, chatLog_, messageDispatcher_, documentCache_) , core{core_} , group(chatGroup) , inCall(false) diff --git a/src/widget/form/groupchatform.h b/src/widget/form/groupchatform.h index 675034c07..b8648742a 100644 --- a/src/widget/form/groupchatform.h +++ b/src/widget/form/groupchatform.h @@ -35,12 +35,15 @@ class IMessageDispatcher; struct Message; class Settings; class IGroupSettings; +class DocumentCache; class GroupChatForm : public GenericChatForm { Q_OBJECT public: - explicit GroupChatForm(Core& core_, Group* chatGroup, IChatLog& chatLog_, IMessageDispatcher& messageDispatcher_, IGroupSettings& settings_); + explicit GroupChatForm(Core& core_, Group* chatGroup, IChatLog& chatLog_, + IMessageDispatcher& messageDispatcher_, IGroupSettings& settings_, + DocumentCache&); ~GroupChatForm(); void peerAudioPlaying(ToxPk peerPk); diff --git a/src/widget/widget.cpp b/src/widget/widget.cpp index 773c3de26..37dd63ba2 100644 --- a/src/widget/widget.cpp +++ b/src/widget/widget.cpp @@ -49,6 +49,7 @@ #include "splitterrestorer.h" #include "form/groupchatform.h" #include "src/chatlog/content/filetransferwidget.h" +#include "src/chatlog/documentcache.h" #include "src/core/core.h" #include "src/core/coreav.h" #include "src/core/corefile.h" @@ -147,6 +148,7 @@ Widget::Widget(Profile &profile_, IAudioControl& audio_, QWidget* parent) , eventIcon(false) , audio(audio_) , settings(Settings::getInstance()) + , documentCache(new DocumentCache()) { installEventFilter(this); QString locale = settings.getTranslation(); @@ -1185,7 +1187,8 @@ void Widget::addFriend(uint32_t friendId, const ToxPk& friendPk) auto chatHistory = std::make_shared(*newfriend, history, *core, settings, *friendMessageDispatcher); - auto friendForm = new ChatForm(profile, newfriend, *chatHistory, *friendMessageDispatcher); + auto friendForm = new ChatForm(profile, newfriend, *chatHistory, + *friendMessageDispatcher, *documentCache); connect(friendForm, &ChatForm::updateFriendActivity, this, &Widget::updateFriendActivity); friendMessageDispatchers[friendPk] = friendMessageDispatcher; @@ -2168,7 +2171,7 @@ Group* Widget::createGroup(uint32_t groupnumber, const GroupId& groupId) connect(messageDispatcher.get(), &IMessageDispatcher::messageReceived, notifyReceivedCallback); groupAlertConnections.insert(groupId, notifyReceivedConnection); - auto form = new GroupChatForm(*core, newgroup, *groupChatLog, *messageDispatcher, settings); + auto form = new GroupChatForm(*core, newgroup, *groupChatLog, *messageDispatcher, settings, *documentCache); connect(&settings, &Settings::nameColorsChanged, form, &GenericChatForm::setColorizedNames); form->setColorizedNames(settings.getEnableGroupChatsColor()); groupMessageDispatchers[groupId] = messageDispatcher; diff --git a/src/widget/widget.h b/src/widget/widget.h index 8923dbe7e..252f59109 100644 --- a/src/widget/widget.h +++ b/src/widget/widget.h @@ -83,6 +83,7 @@ class UpdateCheck; class Settings; class IChatLog; class ChatHistory; +class DocumentCache; class Widget final : public QMainWindow { @@ -381,6 +382,7 @@ private: QAction* nextConversationAction; QAction* previousConversationAction; #endif + std::unique_ptr documentCache; }; bool toxActivateEventHandler(const QByteArray& data);