Mercurial > hg > openttd
changeset 12873:dfac207cd6bd draft
(svn r17365) -Codechange: introduce wrapper functions to update the position, capacity and count of scroll bars. This to (eventually) prevent the scrollbar overflowing outside of the window
author | rubidium <rubidium@openttd.org> |
---|---|
date | Wed, 02 Sep 2009 06:34:40 +0000 |
parents | a286dcbc6260 |
children | f46ccd4ad157 |
files | src/window.cpp src/window_gui.h |
diffstat | 2 files changed, 94 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/src/window.cpp +++ b/src/window.cpp @@ -2635,10 +2635,7 @@ */ void SetVScrollCount(Window *w, int num) { - w->vscroll.count = num; - num -= w->vscroll.cap; - if (num < 0) num = 0; - if (num < w->vscroll.pos) w->vscroll.pos = num; + w->vscroll.SetCount(num); } /** @@ -2650,10 +2647,7 @@ */ void SetVScroll2Count(Window *w, int num) { - w->vscroll2.count = num; - num -= w->vscroll2.cap; - if (num < 0) num = 0; - if (num < w->vscroll2.pos) w->vscroll2.pos = num; + w->vscroll2.SetCount(num); } /** @@ -2665,10 +2659,7 @@ */ void SetHScrollCount(Window *w, int num) { - w->hscroll.count = num; - num -= w->hscroll.cap; - if (num < 0) num = 0; - if (num < w->hscroll.pos) w->hscroll.pos = num; + w->hscroll.SetCount(num); }
--- a/src/window_gui.h +++ b/src/window_gui.h @@ -13,6 +13,7 @@ #define WINDOW_GUI_H #include "core/geometry_func.hpp" +#include "core/math_func.hpp" #include "vehicle_type.h" #include "viewport_type.h" #include "company_type.h" @@ -183,10 +184,99 @@ /** * Scrollbar data structure */ -struct Scrollbar { +class Scrollbar { +public: // To become private uint16 count; ///< Number of elements in the list uint16 cap; ///< Number of visible elements of the scroll bar uint16 pos; ///< Index of first visible item of the list +public: + /** + * Gets the number of elements in the list + * @return the number of elements + */ + FORCEINLINE uint16 GetCount() const + { + return this->count; + } + + /** + * Gets the number of visible elements of the scrollbar + * @return the number of visible elements + */ + FORCEINLINE uint16 GetCapacity() const + { + return this->cap; + } + + /** + * Gets the position of the first visible element in the list + * @return the position of the element + */ + FORCEINLINE uint16 GetPosition() const + { + return this->pos; + } + + /** + * Sets the number of elements in the list + * @param num the number of elements in the list + * @note updates the position if needed + */ + void SetCount(int num) + { + assert(num >= 0); + assert(num <= MAX_UVALUE(uint16)); + + this->count = num; + num -= this->cap; + if (num < 0) num = 0; + if (num < this->pos) this->pos = num; + } + + /** + * Set the capacity of visible elements. + * @param capacity the new capacity + * @note updates the position if needed + */ + void SetCapacity(int capacity) + { + assert(capacity > 0); + assert(capacity <= MAX_UVALUE(uint16)); + + this->cap = capacity; + if (this->cap + this->pos > this->count) this->pos = max(0, this->count - this->cap); + } + + /** + * Updates the capacity by adding/removing a number of (visible) elements. + * @param difference the difference in capacity + * @note updates the position if needed + */ + void UpdateCapacity(int difference) + { + this->SetCapacity(this->cap + difference); + } + + /** + * Sets the position of the first visible element + * @param position the position of the element + */ + void SetPosition(int position) + { + assert(position >= 0); + assert(this->count <= this->cap ? (position == 0) : (position + this->cap < this->count)); + this->pos = position; + } + + /** + * Updates the position of the first visible element by the given amount. + * If the position would be too low or high it will be clamped appropriately + * @param difference the amount of change requested + */ + void UpdatePosition(int difference) + { + this->SetPosition(Clamp(this->pos + difference, 0, this->count - this->cap)); + } }; /**