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));
+	}
 };
 
 /**