changeset 15286:866819135c90 draft

(svn r19921) -Fix [FS#3865]: closing chatbox could cause glitches when news message was shown
author smatz <smatz@openttd.org>
date Fri, 04 Jun 2010 09:47:55 +0000
parents 82c67ddaac6e
children 2e0c9dca8f5b
files src/news_gui.cpp
diffstat 1 files changed, 20 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/news_gui.cpp
+++ b/src/news_gui.cpp
@@ -490,24 +490,35 @@
 	virtual void OnInvalidateData(int data)
 	{
 		/* The chatbar has notified us that is was either created or closed */
+		int newtop = this->top + this->chat_height - data;
 		this->chat_height = data;
+		this->SetWindowTop(newtop);
 	}
 
 	virtual void OnTick()
 	{
 		/* Scroll up newsmessages from the bottom in steps of 4 pixels */
-		int y = max(this->top - 4, _screen.height - this->height - this->status_height - this->chat_height);
-		if (y == this->top) return;
-
-		if (this->viewport != NULL) this->viewport->top += y - this->top;
-
-		int diff = Delta(this->top, y);
-		this->top = y;
-
-		SetDirtyBlocks(this->left, this->top, this->left + this->width, this->top + this->height + diff);
+		int newtop = max(this->top - 4, _screen.height - this->height - this->status_height - this->chat_height);
+		this->SetWindowTop(newtop);
 	}
 
 private:
+	/**
+	 * Moves the window so #newtop is new 'top' coordinate. Makes screen dirty where needed.
+	 * @param newtop new top coordinate
+	 */
+	void SetWindowTop(int newtop)
+	{
+		if (this->top == newtop) return;
+
+		int mintop = min(newtop, this->top);
+		int maxtop = max(newtop, this->top);
+		if (this->viewport != NULL) this->viewport->top += newtop - this->top;
+		this->top = newtop;
+
+		SetDirtyBlocks(this->left, mintop, this->left + this->width, maxtop + this->height);
+	}
+
 	StringID GetCompanyMessageString() const
 	{
 		switch (this->ni->subtype) {