summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Swift/QtUI/QtChatView.cpp29
-rw-r--r--Swift/QtUI/QtChatView.h4
-rw-r--r--Swift/QtUI/QtChatWindow.cpp2
3 files changed, 19 insertions, 16 deletions
diff --git a/Swift/QtUI/QtChatView.cpp b/Swift/QtUI/QtChatView.cpp
index 1ad274f..70bb0e8 100644
--- a/Swift/QtUI/QtChatView.cpp
+++ b/Swift/QtUI/QtChatView.cpp
@@ -44,15 +44,13 @@ QtChatView::QtChatView(QtChatTheme* theme, QWidget* parent) : QWidget(parent) {
mainLayout->addWidget(webView_);
#endif
-
-
-
webPage_ = new QWebPage(this);
webPage_->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
webView_->setPage(webPage_);
connect(webPage_, SIGNAL(selectionChanged()), SLOT(copySelectionToClipboard()));
viewReady_ = false;
+ isAtBottom_ = true;
resetView();
}
@@ -76,7 +74,7 @@ QWebElement QtChatView::snippetToDOM(boost::shared_ptr<ChatSnippet> snippet) {
}
void QtChatView::addToDOM(boost::shared_ptr<ChatSnippet> snippet) {
- bool bottom = isScrolledToBottom();
+ rememberScrolledToBottom();
QWebElement newElement = snippetToDOM(snippet);
QWebElement continuationElement = lastElement_.findFirst("#insert");
if (snippet->getAppendToPrevious()) {
@@ -87,27 +85,21 @@ void QtChatView::addToDOM(boost::shared_ptr<ChatSnippet> snippet) {
newInsertPoint_.prependOutside(newElement);
}
lastElement_ = newElement;
- if (bottom) {
- /* Warning: I'm not confident about this, although it does work.*/
- QTimer::singleShot(0, this, SLOT(scrollToBottom()));
- }
}
void QtChatView::replaceLastMessage(const QString& newMessage) {
assert(viewReady_);
/* FIXME: must be queued? */
- bool bottom = isScrolledToBottom();
+ rememberScrolledToBottom();
assert(!lastElement_.isNull());
QWebElement replace = lastElement_.findFirst("span.swift_message");
assert(!replace.isNull());
QString old = lastElement_.toOuterXml();
replace.setInnerXml(ChatSnippet::escape(newMessage));
- if (bottom) {
- QTimer::singleShot(0, this, SLOT(scrollToBottom()));
- }
}
void QtChatView::replaceLastMessage(const QString& newMessage, const QString& note) {
+ rememberScrolledToBottom();
replaceLastMessage(newMessage);
QWebElement replace = lastElement_.findFirst("span.swift_time");
assert(!replace.isNull());
@@ -129,14 +121,21 @@ void QtChatView::setAckXML(const QString& id, const QString& xml) {
ackElement.setInnerXml(xml);
}
-bool QtChatView::isScrolledToBottom() const {
- return webPage_->mainFrame()->scrollBarValue(Qt::Vertical) == webPage_->mainFrame()->scrollBarMaximum(Qt::Vertical);
+void QtChatView::rememberScrolledToBottom() {
+ isAtBottom_ = webPage_->mainFrame()->scrollBarValue(Qt::Vertical) == webPage_->mainFrame()->scrollBarMaximum(Qt::Vertical);
}
void QtChatView::scrollToBottom() {
+ isAtBottom_ = true;
webPage_->mainFrame()->setScrollBarValue(Qt::Vertical, webPage_->mainFrame()->scrollBarMaximum(Qt::Vertical));
}
+void QtChatView::handleFrameSizeChanged() {
+ if (isAtBottom_) {
+ scrollToBottom();
+ }
+}
+
void QtChatView::handleLinkClicked(const QUrl& url) {
QDesktopServices::openUrl(url);
}
@@ -180,6 +179,8 @@ void QtChatView::resetView() {
newInsertPoint_.setOuterXml("<div id='swift_insert'/>");
chatElement.appendInside(newInsertPoint_);
Q_ASSERT(!newInsertPoint_.isNull());
+
+ connect(webPage_->mainFrame(), SIGNAL(contentsSizeChanged(const QSize&)), this, SLOT(handleFrameSizeChanged()), Qt::UniqueConnection);
}
}
diff --git a/Swift/QtUI/QtChatView.h b/Swift/QtUI/QtChatView.h
index 8c1a99a..84738d4 100644
--- a/Swift/QtUI/QtChatView.h
+++ b/Swift/QtUI/QtChatView.h
@@ -30,7 +30,7 @@ namespace Swift {
void addMessage(boost::shared_ptr<ChatSnippet> snippet);
void replaceLastMessage(const QString& newMessage);
void replaceLastMessage(const QString& newMessage, const QString& note);
- bool isScrolledToBottom() const;
+ void rememberScrolledToBottom();
void setAckXML(const QString& id, const QString& xml);
signals:
@@ -45,6 +45,7 @@ namespace Swift {
private slots:
void handleViewLoadFinished(bool);
+ void handleFrameSizeChanged();
private:
void headerEncode();
@@ -54,6 +55,7 @@ namespace Swift {
QWebElement snippetToDOM(boost::shared_ptr<ChatSnippet> snippet);
bool viewReady_;
+ bool isAtBottom_;
QtWebView* webView_;
QWebPage* webPage_;
QList<boost::shared_ptr<ChatSnippet> > queuedSnippets_;
diff --git a/Swift/QtUI/QtChatWindow.cpp b/Swift/QtUI/QtChatWindow.cpp
index 6913747..a71cd43 100644
--- a/Swift/QtUI/QtChatWindow.cpp
+++ b/Swift/QtUI/QtChatWindow.cpp
@@ -349,8 +349,8 @@ void QtChatWindow::returnPressed() {
if (!inputEnabled_) {
return;
}
- onSendMessageRequest(Q2PSTRING(input_->toPlainText()));
messageLog_->scrollToBottom();
+ onSendMessageRequest(Q2PSTRING(input_->toPlainText()));
inputClearing_ = true;
input_->clear();
inputClearing_ = false;