diff -r 404ddce27b23 -r c13ebed437cb QTfrontend/ui/widget/chatwidget.cpp --- a/QTfrontend/ui/widget/chatwidget.cpp Wed Feb 20 02:21:58 2013 +0100 +++ b/QTfrontend/ui/widget/chatwidget.cpp Tue Apr 02 21:00:57 2013 +0200 @@ -31,12 +31,13 @@ #include #include #include +#include #include "DataManager.h" #include "hwconsts.h" #include "gameuiconfig.h" #include "playerslistmodel.h" - +#include "HWApplication.h" #include "chatwidget.h" @@ -156,24 +157,18 @@ void HWChatWidget::displayError(const QString & message) { addLine("msg_Error", " !!! " + message); - // scroll to the end - chatText->moveCursor(QTextCursor::End); } void HWChatWidget::displayNotice(const QString & message) { addLine("msg_Notice", " *** " + message); - // scroll to the end - chatText->moveCursor(QTextCursor::End); } void HWChatWidget::displayWarning(const QString & message) { addLine("msg_Warning", " *!* " + message); - // scroll to the end - chatText->moveCursor(QTextCursor::End); } @@ -451,6 +446,8 @@ if (s_displayNone->contains(cssClass)) return; // the css forbids us to display this line + beforeContentAdd(); + if (chatStrings.size() > 250) chatStrings.removeFirst(); @@ -467,17 +464,20 @@ { line = QString("%1").arg(line); SDLInteraction::instance().playSoundFile(m_hilightSound); + HWApplication::alert(this, 800); } chatStrings.append(line); chatText->setHtml(""+chatStrings.join("
")+""); - chatText->moveCursor(QTextCursor::End); + afterContentAdd(); } void HWChatWidget::onServerMessage(const QString& str) { + beforeContentAdd(); + if (chatStrings.size() > 250) chatStrings.removeFirst(); @@ -485,7 +485,7 @@ chatText->setHtml(""+chatStrings.join("
")+""); - chatText->moveCursor(QTextCursor::End); + afterContentAdd(); } @@ -901,3 +901,21 @@ m_nicksMenu->popup(chatNicks->mapToGlobal(pos)); } + +void HWChatWidget::beforeContentAdd() +{ + m_scrollBarPos = chatText->verticalScrollBar()->value(); + m_scrollToBottom = m_scrollBarPos == chatText->verticalScrollBar()->maximum(); +} + +void HWChatWidget::afterContentAdd() +{ + if(m_scrollToBottom) + { + chatText->verticalScrollBar()->setValue(chatText->verticalScrollBar()->maximum()); + chatText->moveCursor(QTextCursor::End); + } else + { + chatText->verticalScrollBar()->setValue(m_scrollBarPos); + } +}