Mercurial > hg > openttd
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) {