diff options
-rw-r--r-- | src/news_gui.cpp | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/src/news_gui.cpp b/src/news_gui.cpp index 9b2a5dcb5..d90b8eb3a 100644 --- a/src/news_gui.cpp +++ b/src/news_gui.cpp @@ -490,24 +490,35 @@ struct NewsWindow : Window { 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; + int newtop = max(this->top - 4, _screen.height - this->height - this->status_height - this->chat_height); + this->SetWindowTop(newtop); + } - if (this->viewport != NULL) this->viewport->top += y - this->top; +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 diff = Delta(this->top, y); - this->top = y; + 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, this->top, this->left + this->width, this->top + this->height + diff); + SetDirtyBlocks(this->left, mintop, this->left + this->width, maxtop + this->height); } -private: StringID GetCompanyMessageString() const { switch (this->ni->subtype) { |