diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/widget.cpp | 4 | ||||
-rw-r--r-- | src/widget_type.h | 28 |
2 files changed, 28 insertions, 4 deletions
diff --git a/src/widget.cpp b/src/widget.cpp index 559f8d391..4170b2a01 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -103,9 +103,9 @@ static void ScrollbarClickPositioning(Window *w, NWidgetScrollbar *sb, int x, in 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; diff --git a/src/widget_type.h b/src/widget_type.h index 5850443e1..5d135552a 100644 --- a/src/widget_type.h +++ b/src/widget_type.h @@ -556,9 +556,17 @@ 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. + 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 @@ public: } /** + * 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 @@ public: * 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))); } |