Mercurial > hg > openttd
changeset 17026:0b2b2fbffd00 draft
(svn r21763) -Codechange: Pass the distance to Scrollbar::UpdatePosition() in units of small or big steps.
author | frosch <frosch@openttd.org> |
---|---|
date | Sun, 09 Jan 2011 20:39:06 +0000 |
parents | b08aae5bac58 |
children | 96e98a584a28 |
files | src/widget.cpp src/widget_type.h |
diffstat | 2 files changed, 28 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/widget.cpp +++ b/src/widget.cpp @@ -103,9 +103,9 @@ Point pt = HandleScrollbarHittest(sb, mi, ma, sb->type == NWID_HSCROLLBAR); if (pos < pt.x) { - sb->UpdatePosition(rtl ? sb->GetCapacity() : -sb->GetCapacity()); + sb->UpdatePosition(rtl ? 1 : -1, Scrollbar::SS_BIG); } else if (pos > pt.y) { - sb->UpdatePosition(rtl ? -sb->GetCapacity() : sb->GetCapacity()); + sb->UpdatePosition(rtl ? -1 : 1, Scrollbar::SS_BIG); } else { _scrollbar_start_pos = pt.x - mi - 9; _scrollbar_size = ma - mi - 23;
--- a/src/widget_type.h +++ b/src/widget_type.h @@ -556,9 +556,17 @@ 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. + uint16 stepsize; ///< Distance to scroll, when pressing the buttons or using the wheel. public: - Scrollbar(bool is_vertical) : is_vertical(is_vertical) + /** Stepping sizes when scrolling */ + enum ScrollbarStepping { + SS_RAW, ///< Step in single units. + SS_SMALL, ///< Step in #stepsize units. + SS_BIG, ///< Step in #cap units. + }; + + Scrollbar(bool is_vertical) : is_vertical(is_vertical), stepsize(1) { } @@ -609,6 +617,16 @@ } /** + * Set the distance to scroll when using the buttons or the wheel. + * @param stepsize Scrolling speed. + */ + void SetStepSize(uint16 stepsize) + { + assert(stepsize > 0); + this->stepsize = stepsize; + } + + /** * Sets the number of elements in the list * @param num the number of elements in the list * @note updates the position if needed @@ -655,10 +673,16 @@ * 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 + * @param unit The stepping unit of \a difference */ - void UpdatePosition(int difference) + void UpdatePosition(int difference, ScrollbarStepping unit = SS_SMALL) { if (difference == 0) return; + switch (unit) { + case SS_SMALL: difference *= this->stepsize; break; + case SS_BIG: difference *= this->cap; break; + default: break; + } this->SetPosition(Clamp(this->pos + difference, 0, max(this->count - this->cap, 0))); }