diff -r 2816230a107e -r 8c7da08df048 QTfrontend/ui/widget/chatwidget.cpp --- a/QTfrontend/ui/widget/chatwidget.cpp Sun Jan 27 02:09:02 2013 +0100 +++ b/QTfrontend/ui/widget/chatwidget.cpp Sun Jan 27 21:46:25 2013 +0400 @@ -31,6 +31,7 @@ #include #include #include +#include #include "DataManager.h" #include "hwconsts.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(); @@ -473,11 +470,13 @@ chatText->setHtml(""+chatStrings.join("
")+""); - chatText->moveCursor(QTextCursor::End); + afterContentAdd(); } void HWChatWidget::onServerMessage(const QString& str) { + beforeContentAdd(); + if (chatStrings.size() > 250) chatStrings.removeFirst(); @@ -485,7 +484,7 @@ chatText->setHtml(""+chatStrings.join("
")+""); - chatText->moveCursor(QTextCursor::End); + afterContentAdd(); } @@ -901,3 +900,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); + } +}