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)));
 	}