summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/widget.cpp4
-rw-r--r--src/widget_type.h28
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)));
}