Changeset - r15774:198012b94ead
[Not reviewed]
master
0 4 0
frosch - 14 years ago 2010-08-12 09:11:12
frosch@openttd.org
(svn r20458) -Codechange: Move Scrollbar from window.cpp to widget.cpp
4 files changed with 158 insertions and 158 deletions:
0 comments (0 inline, 0 general)
src/widget.cpp
Show inline comments
 
@@ -1633,6 +1633,38 @@ void NWidgetViewport::UpdateViewportCoor
 
}
 

	
 
/**
 
 * Compute the row of a scrolled widget that a user clicked in.
 
 * @param clickpos    Vertical position of the mouse click (without taking scrolling into account).
 
 * @param widget      Widget number of the widget clicked in.
 
 * @param padding     Amount of empty space between the widget edge and the top of the first row. Default value is \c 0.
 
 * @param line_height Height of a single row. A negative value means using the vertical resize step of the widget.
 
 * @return Row number clicked at. If clicked at a wrong position, #INT_MAX is returned.
 
 */
 
int Scrollbar::GetScrolledRowFromWidget(int clickpos, const Window * const w, int widget, int padding, int line_height) const
 
{
 
	uint pos = w->GetRowFromWidget(clickpos, widget, padding, line_height);
 
	if (pos != INT_MAX) pos += this->GetPosition();
 
	return (pos >= this->GetCount()) ? INT_MAX : pos;
 
}
 

	
 
/**
 
 * Set capacity of visible elements from the size and resize properties of a widget.
 
 * @param w       Window.
 
 * @param widget  Widget with size and resize properties.
 
 * @param padding Padding to subtract from the size.
 
 * @note Updates the position if needed.
 
 */
 
void Scrollbar::SetCapacityFromWidget(Window *w, int widget, int padding)
 
{
 
	NWidgetBase *nwid = w->GetWidget<NWidgetBase>(widget);
 
	if (this->is_vertical) {
 
		this->SetCapacity(((int)nwid->current_y - padding) / (int)nwid->resize_y);
 
	} else {
 
		this->SetCapacity(((int)nwid->current_x - padding) / (int)nwid->resize_x);
 
	}
 
}
 

	
 
/**
 
 * Scrollbar widget.
 
 * @param tp     Scrollbar type. (horizontal/vertical)
 
 * @param colour Colour of the scrollbar.
src/widget_type.h
Show inline comments
 
@@ -502,6 +502,132 @@ public:
 
};
 

	
 
/**
 
 * Scrollbar data structure
 
 */
 
class Scrollbar {
 
private:
 
	const bool is_vertical; ///< Scrollbar has vertical orientation.
 
	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:
 
	Scrollbar(bool is_vertical) : is_vertical(is_vertical)
 
	{
 
	}
 

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

	
 
	/**
 
	 * Checks whether given current item is visible in the list
 
	 * @param item to check
 
	 * @return true iff the item is visible
 
	 */
 
	FORCEINLINE bool IsVisible(uint16 item) const
 
	{
 
		return IsInsideBS(item, this->GetPosition(), this->GetCapacity());
 
	}
 

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

	
 
	void SetCapacityFromWidget(Window *w, int widget, int padding = 0);
 

	
 
	/**
 
	 * 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)
 
	{
 
		if (difference == 0) return;
 
		this->SetPosition(Clamp(this->pos + difference, 0, max(this->count - this->cap, 0)));
 
	}
 

	
 
	/**
 
	 * Scroll towards the given position; if the item is visible nothing
 
	 * happens, otherwise it will be shown either at the bottom or top of
 
	 * the window depending on where in the list it was.
 
	 * @param position the position to scroll towards.
 
	 */
 
	void ScrollTowards(int position)
 
	{
 
		if (position < this->GetPosition()) {
 
			/* scroll up to the item */
 
			this->SetPosition(position);
 
		} else if (position >= this->GetPosition() + this->GetCapacity()) {
 
			/* scroll down so that the item is at the bottom */
 
			this->SetPosition(position - this->GetCapacity() + 1);
 
		}
 
	}
 

	
 
	int GetScrolledRowFromWidget(int clickpos, const Window * const w, int widget, int padding = 0, int line_height = -1) const;
 
};
 

	
 
/**
 
 * Nested widget to display and control a scrollbar in a window.
 
 * Also assign the scrollbar to other widgets using #SetScrollbar() to make the mousewheel work.
 
 * @ingroup NestedWidgets
src/window.cpp
Show inline comments
 
@@ -98,38 +98,6 @@ int Window::GetRowFromWidget(int clickpo
 
}
 

	
 
/**
 
 * Compute the row of a scrolled widget that a user clicked in.
 
 * @param clickpos    Vertical position of the mouse click (without taking scrolling into account).
 
 * @param widget      Widget number of the widget clicked in.
 
 * @param padding     Amount of empty space between the widget edge and the top of the first row. Default value is \c 0.
 
 * @param line_height Height of a single row. A negative value means using the vertical resize step of the widget.
 
 * @return Row number clicked at. If clicked at a wrong position, #INT_MAX is returned.
 
 */
 
int Scrollbar::GetScrolledRowFromWidget(int clickpos, const Window * const w, int widget, int padding, int line_height) const
 
{
 
	uint pos = w->GetRowFromWidget(clickpos, widget, padding, line_height);
 
	if (pos != INT_MAX) pos += this->GetPosition();
 
	return (pos >= this->GetCount()) ? INT_MAX : pos;
 
}
 

	
 
/**
 
 * Set capacity of visible elements from the size and resize properties of a widget.
 
 * @param w       Window.
 
 * @param widget  Widget with size and resize properties.
 
 * @param padding Padding to subtract from the size.
 
 * @note Updates the position if needed.
 
 */
 
void Scrollbar::SetCapacityFromWidget(Window *w, int widget, int padding)
 
{
 
	NWidgetBase *nwid = w->GetWidget<NWidgetBase>(widget);
 
	if (this->is_vertical) {
 
		this->SetCapacity(((int)nwid->current_y - padding) / (int)nwid->resize_y);
 
	} else {
 
		this->SetCapacity(((int)nwid->current_x - padding) / (int)nwid->resize_x);
 
	}
 
}
 

	
 
/**
 
 * Return the Scrollbar to a widget index.
 
 * @param widnum Scrollbar widget index
 
 * @return Scrollbar to the widget
src/window_gui.h
Show inline comments
 
@@ -184,132 +184,6 @@ enum WindowDefaultFlag {
 
};
 

	
 
/**
 
 * Scrollbar data structure
 
 */
 
class Scrollbar {
 
private:
 
	const bool is_vertical; ///< Scrollbar has vertical orientation.
 
	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:
 
	Scrollbar(bool is_vertical) : is_vertical(is_vertical)
 
	{
 
	}
 

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

	
 
	/**
 
	 * Checks whether given current item is visible in the list
 
	 * @param item to check
 
	 * @return true iff the item is visible
 
	 */
 
	FORCEINLINE bool IsVisible(uint16 item) const
 
	{
 
		return IsInsideBS(item, this->GetPosition(), this->GetCapacity());
 
	}
 

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

	
 
	void SetCapacityFromWidget(Window *w, int widget, int padding = 0);
 

	
 
	/**
 
	 * 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)
 
	{
 
		if (difference == 0) return;
 
		this->SetPosition(Clamp(this->pos + difference, 0, max(this->count - this->cap, 0)));
 
	}
 

	
 
	/**
 
	 * Scroll towards the given position; if the item is visible nothing
 
	 * happens, otherwise it will be shown either at the bottom or top of
 
	 * the window depending on where in the list it was.
 
	 * @param position the position to scroll towards.
 
	 */
 
	void ScrollTowards(int position)
 
	{
 
		if (position < this->GetPosition()) {
 
			/* scroll up to the item */
 
			this->SetPosition(position);
 
		} else if (position >= this->GetPosition() + this->GetCapacity()) {
 
			/* scroll down so that the item is at the bottom */
 
			this->SetPosition(position - this->GetCapacity() + 1);
 
		}
 
	}
 

	
 
	int GetScrolledRowFromWidget(int clickpos, const Window * const w, int widget, int padding = 0, int line_height = -1) const;
 
};
 

	
 
/**
 
 * Data structure for resizing a window
 
 */
 
struct ResizeInfo {
0 comments (0 inline, 0 general)