diff options
-rw-r--r-- | Swift/QtUI/ChatSnippet.h | 10 | ||||
-rw-r--r-- | Swift/QtUI/MessageSnippet.cpp | 3 | ||||
-rw-r--r-- | Swift/QtUI/QtChatView.cpp | 8 | ||||
-rw-r--r-- | Swift/QtUI/SystemMessageSnippet.cpp | 3 |
4 files changed, 21 insertions, 3 deletions
diff --git a/Swift/QtUI/ChatSnippet.h b/Swift/QtUI/ChatSnippet.h index 9786518..f323295 100644 --- a/Swift/QtUI/ChatSnippet.h +++ b/Swift/QtUI/ChatSnippet.h @@ -6,6 +6,8 @@ #pragma once +#include <boost/shared_ptr.hpp> + #include <QString> #include <QDateTime> #include "QtChatTheme.h" @@ -13,12 +15,14 @@ namespace Swift { class ChatSnippet { public: - ChatSnippet(bool appendToPrevious = false); + ChatSnippet(bool appendToPrevious); virtual ~ChatSnippet(); virtual const QString& getContent() const = 0; virtual QString getContinuationElementID() const { return ""; } + boost::shared_ptr<ChatSnippet> getContinuationFallbackSnippet() {return continuationFallback_;} + bool getAppendToPrevious() const { return appendToPrevious_; } @@ -26,9 +30,13 @@ namespace Swift { static QString escape(const QString&); protected: + void setContinuationFallbackSnippet(boost::shared_ptr<ChatSnippet> continuationFallback) { + continuationFallback_ = continuationFallback; + } static QString timeToEscapedString(const QDateTime& time); private: bool appendToPrevious_; + boost::shared_ptr<ChatSnippet> continuationFallback_; }; } diff --git a/Swift/QtUI/MessageSnippet.cpp b/Swift/QtUI/MessageSnippet.cpp index 995a0db..47cb1a0 100644 --- a/Swift/QtUI/MessageSnippet.cpp +++ b/Swift/QtUI/MessageSnippet.cpp @@ -12,6 +12,9 @@ namespace Swift { MessageSnippet::MessageSnippet(const QString& message, const QString& sender, const QDateTime& time, const QString& iconURI, bool isIncoming, bool appendToPrevious, QtChatTheme* theme, const QString& id) : ChatSnippet(appendToPrevious) { + if (appendToPrevious) { + setContinuationFallbackSnippet(boost::shared_ptr<ChatSnippet>(new MessageSnippet(message, sender, time, iconURI, isIncoming, false, theme, id))); + } if (isIncoming) { if (appendToPrevious) { content_ = theme->getIncomingNextContent(); diff --git a/Swift/QtUI/QtChatView.cpp b/Swift/QtUI/QtChatView.cpp index 2a66fc0..4738da3 100644 --- a/Swift/QtUI/QtChatView.cpp +++ b/Swift/QtUI/QtChatView.cpp @@ -75,9 +75,12 @@ QWebElement QtChatView::snippetToDOM(boost::shared_ptr<ChatSnippet> snippet) { void QtChatView::addToDOM(boost::shared_ptr<ChatSnippet> snippet) { rememberScrolledToBottom(); - QWebElement newElement = snippetToDOM(snippet); + bool insert = snippet->getAppendToPrevious(); QWebElement continuationElement = lastElement_.findFirst("#insert"); - if (snippet->getAppendToPrevious()) { + bool fallback = insert && continuationElement.isNull(); + boost::shared_ptr<ChatSnippet> newSnippet = (insert && fallback) ? snippet->getContinuationFallbackSnippet() : snippet; + QWebElement newElement = snippetToDOM(newSnippet); + if (insert && !fallback) { Q_ASSERT(!continuationElement.isNull()); continuationElement.replace(newElement); } else { @@ -155,6 +158,7 @@ void QtChatView::handleViewLoadFinished(bool ok) { } void QtChatView::resetView() { + lastElement_ = QWebElement(); QString pageHTML = theme_->getTemplate(); pageHTML.replace("==bodyBackground==", "background-color:#e3e3e3"); pageHTML.replace(pageHTML.indexOf("%@"), 2, theme_->getBase()); diff --git a/Swift/QtUI/SystemMessageSnippet.cpp b/Swift/QtUI/SystemMessageSnippet.cpp index 13919b2..2e0aec4 100644 --- a/Swift/QtUI/SystemMessageSnippet.cpp +++ b/Swift/QtUI/SystemMessageSnippet.cpp @@ -11,6 +11,9 @@ namespace Swift { SystemMessageSnippet::SystemMessageSnippet(const QString& message, const QDateTime& time, bool appendToPrevious, QtChatTheme* theme) : ChatSnippet(appendToPrevious) { + if (appendToPrevious) { + setContinuationFallbackSnippet(boost::shared_ptr<ChatSnippet>(new SystemMessageSnippet(message, time, false, theme))); + } content_ = theme->getStatus(); content_.replace("%message%", "<span class='swift_message'>" + escape(message) + "</span>"); |