OpenTTD Source  20240919-master-gdf0233f4c2
Scrollbar Class Reference

Scrollbar data structure. More...

#include <widget_type.h>

Inheritance diagram for Scrollbar:
NWidgetScrollbar

Public Types

enum  ScrollbarStepping { SS_RAW, SS_SMALL, SS_BIG }
 Stepping sizes when scrolling. More...
 
using size_type = int32_t
 

Public Member Functions

 Scrollbar (bool is_vertical)
 
size_type GetCount () const
 Gets the number of elements in the list. More...
 
size_type GetCapacity () const
 Gets the number of visible elements of the scrollbar. More...
 
size_type GetPosition () const
 Gets the position of the first visible element in the list. More...
 
bool IsVisible (size_type item) const
 Checks whether given current item is visible in the list. More...
 
bool IsVertical () const
 Is the scrollbar vertical or not? More...
 
void SetStepSize (size_t stepsize)
 Set the distance to scroll when using the buttons or the wheel. More...
 
void SetCount (size_t num)
 Sets the number of elements in the list. More...
 
void SetCapacity (size_t capacity)
 Set the capacity of visible elements. More...
 
void SetCapacityFromWidget (Window *w, WidgetID widget, int padding=0)
 Set capacity of visible elements from the size and resize properties of a widget. More...
 
bool SetPosition (size_type position)
 Sets the position of the first visible element. More...
 
bool UpdatePosition (int difference, ScrollbarStepping unit=SS_SMALL)
 Updates the position of the first visible element by the given amount. More...
 
void ScrollTowards (size_type position)
 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. More...
 
size_type GetScrolledRowFromWidget (int clickpos, const Window *const w, WidgetID widget, int padding=0, int line_height=-1) const
 Compute the row of a scrolled widget that a user clicked in. More...
 
template<typename Tcontainer >
auto GetVisibleRangeIterators (Tcontainer &container) const
 Get a pair of iterators for the range of visible elements in a container. More...
 
template<typename Tcontainer >
auto GetScrolledItemFromWidget (Tcontainer &container, int clickpos, const Window *const w, WidgetID widget, int padding=0, int line_height=-1) const
 Return an iterator pointing to the element of a scrolled widget that a user clicked in. More...
 
EventState UpdateListPositionOnKeyPress (int &list_position, uint16_t keycode) const
 Update the given list position as if it were on this scroll bar when the given keycode was pressed. More...
 

Static Public Attributes

static constexpr size_type max_size_type = std::numeric_limits<size_type>::max()
 
static constexpr size_type npos = max_size_type
 

Private Attributes

const bool is_vertical
 Scrollbar has vertical orientation.
 
size_type count
 Number of elements in the list.
 
size_type cap
 Number of visible elements of the scroll bar.
 
size_type pos
 Index of first visible item of the list.
 
size_type stepsize
 Distance to scroll, when pressing the buttons or using the wheel.
 

Detailed Description

Scrollbar data structure.

Definition at line 696 of file widget_type.h.

Member Enumeration Documentation

◆ ScrollbarStepping

Stepping sizes when scrolling.

Enumerator
SS_RAW 

Step in single units.

SS_SMALL 

Step in stepsize units.

SS_BIG 

Step in cap units.

Definition at line 710 of file widget_type.h.

Member Function Documentation

◆ GetCapacity()

size_type Scrollbar::GetCapacity ( ) const
inline

Gets the number of visible elements of the scrollbar.

Returns
the number of visible elements

Definition at line 733 of file widget_type.h.

References cap.

Referenced by DispatchMouseWheelEvent(), GoalListWindow::DrawListColumn(), NewGRFInspectWindow::DrawString(), GetVisibleRangeIterators(), HandleScrollbarHittest(), IsVisible(), ScrollTowards(), and ScriptDebugWindow::UpdateLogScroll().

◆ GetCount()

size_type Scrollbar::GetCount ( ) const
inline

◆ GetPosition()

◆ GetScrolledItemFromWidget()

template<typename Tcontainer >
auto Scrollbar::GetScrolledItemFromWidget ( Tcontainer &  container,
int  clickpos,
const Window *const  w,
WidgetID  widget,
int  padding = 0,
int  line_height = -1 
) const
inline

Return an iterator pointing to the element of a scrolled widget that a user clicked in.

Parameters
containerContainer of elements represented by the scrollbar.
clickposVertical position of the mouse click (without taking scrolling into account).
wThe window the click was in.
widgetWidget number of the widget clicked in.
paddingAmount of empty space between the widget edge and the top of the first row. Default value is 0.
line_heightHeight of a single row. A negative value means using the vertical resize step of the widget.
Returns
Iterator to the element clicked at. If clicked at a wrong position, returns as interator to the end of the container.

Definition at line 881 of file widget_type.h.

References GetCount(), and GetScrolledRowFromWidget().

◆ GetScrolledRowFromWidget()

Scrollbar::size_type Scrollbar::GetScrolledRowFromWidget ( int  clickpos,
const Window *const  w,
WidgetID  widget,
int  padding = 0,
int  line_height = -1 
) const

Compute the row of a scrolled widget that a user clicked in.

Parameters
clickposVertical position of the mouse click (without taking scrolling into account).
wThe window the click was in.
widgetWidget number of the widget clicked in.
paddingAmount of empty space between the widget edge and the top of the first row. Default value is 0.
line_heightHeight of a single row. A negative value means using the vertical resize step of the widget.
Returns
Row number clicked at. If clicked at a wrong position, #Scrollbar::npos is returned.

Definition at line 2320 of file widget.cpp.

References GetCount(), GetPosition(), Window::GetRowFromWidget(), and pos.

Referenced by NetworkClientListWindow::GetButtonAtPoint(), and GetScrolledItemFromWidget().

◆ GetVisibleRangeIterators()

template<typename Tcontainer >
auto Scrollbar::GetVisibleRangeIterators ( Tcontainer &  container) const
inline

Get a pair of iterators for the range of visible elements in a container.

Parameters
containerContainer of elements represented by the scrollbar.
Returns
Pair of iterators of visible elements.

Definition at line 862 of file widget_type.h.

References GetCapacity(), GetCount(), and GetPosition().

Referenced by DrawEngineList(), and NetworkContentListWindow::DrawMatrix().

◆ IsVertical()

bool Scrollbar::IsVertical ( ) const
inline

Is the scrollbar vertical or not?

Returns
True iff the scrollbar is vertical.

Definition at line 761 of file widget_type.h.

References is_vertical.

Referenced by NWidgetMatrix::GetScrollOffsets(), SetCapacityFromWidget(), and NWidgetMatrix::SetCount().

◆ IsVisible()

bool Scrollbar::IsVisible ( size_type  item) const
inline

Checks whether given current item is visible in the list.

Parameters
itemto check
Returns
true iff the item is visible

Definition at line 752 of file widget_type.h.

References GetCapacity(), GetPosition(), and IsInsideBS().

Referenced by TimetableWindow::DrawArrivalDeparturePanel(), and OrdersWindow::OnInvalidateData().

◆ ScrollTowards()

void Scrollbar::ScrollTowards ( size_type  position)
inline

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.

Parameters
positionthe position to scroll towards.

Definition at line 843 of file widget_type.h.

References GetCapacity(), GetPosition(), and SetPosition().

Referenced by ReplaceVehicleWindow::GenerateLists(), OrdersWindow::OnInvalidateData(), NetworkContentListWindow::ScrollToSelected(), VehicleGroupWindow::SelectGroup(), NWidgetMatrix::SetClicked(), and NewGRFWindow::UpdateScrollBars().

◆ SetCapacity()

void Scrollbar::SetCapacity ( size_t  capacity)
inline

Set the capacity of visible elements.

Parameters
capacitythe new capacity
Note
updates the position if needed

Definition at line 796 of file widget_type.h.

References SetPosition().

Referenced by DepotWindow::OnResize(), SetCapacityFromWidget(), NWidgetMatrix::SetCount(), and DropdownWindow::UpdateSizeAndPosition().

◆ SetCapacityFromWidget()

void Scrollbar::SetCapacityFromWidget ( Window w,
WidgetID  widget,
int  padding = 0 
)

Set capacity of visible elements from the size and resize properties of a widget.

Parameters
wWindow.
widgetWidget with size and resize properties.
paddingPadding to subtract from the size.
Note
Updates the position if needed.

Definition at line 2394 of file widget.cpp.

References NWidgetBase::current_x, NWidgetBase::current_y, Window::GetWidget(), IsVertical(), NWidgetBase::resize_x, NWidgetBase::resize_y, and SetCapacity().

Referenced by TextfileWindow::OnResize(), PickerWindow::OnResize(), ScriptListWindow::OnResize(), SubsidyListWindow::OnResize(), SignListWindow::OnResize(), GoalListWindow::OnResize(), BuildBridgeWindow::OnResize(), GSConfigWindow::OnResize(), NewGRFParametersWindow::OnResize(), ScriptSettingsWindow::OnResize(), NewGRFInspectWindow::OnResize(), ReplaceVehicleWindow::OnResize(), BuildIndustryWindow::OnResize(), CompanyStationsWindow::OnResize(), TimetableWindow::OnResize(), StoryBookWindow::OnResize(), NewGRFWindow::OnResize(), SaveLoadWindow::OnResize(), NetworkGameWindow::OnResize(), NetworkContentListWindow::OnResize(), SelectCompanyLiveryWindow::OnResize(), VehicleGroupWindow::OnResize(), TownDirectoryWindow::OnResize(), PaymentRatesGraphWindow::OnResize(), DepotWindow::OnResize(), SpriteAlignerWindow::OnResize(), MessageHistoryWindow::OnResize(), ScriptDebugWindow::OnResize(), RefitWindow::OnResize(), OrdersWindow::OnResize(), NetworkClientListWindow::OnResize(), IndustryDirectoryWindow::OnResize(), BuildVehicleWindow::OnResize(), StationViewWindow::OnResize(), SavePresetWindow::OnResize(), VehicleListWindow::OnResize(), SelectStationWindow< T >::OnResize(), VehicleDetailsWindow::OnResize(), GameSettingsWindow::OnResize(), and IndustryCargoesWindow::OnResize().

◆ SetCount()

void Scrollbar::SetCount ( size_t  num)
inline

Sets the number of elements in the list.

Parameters
numthe number of elements in the list
Note
updates the position if needed

Definition at line 782 of file widget_type.h.

References SetPosition().

Referenced by NetworkContentListWindow::BuildContentList(), PickerWindow::BuildPickerClassList(), IndustryDirectoryWindow::BuildSortIndustriesList(), CompanyStationsWindow::BuildStationsList(), IndustryCargoesWindow::ComputeCargoDisplay(), IndustryCargoesWindow::ComputeIndustryDisplay(), ReplaceVehicleWindow::GenerateLists(), SubsidyListWindow::OnInvalidateData(), GoalListWindow::OnInvalidateData(), NewGRFParametersWindow::OnInvalidateData(), OrdersWindow::OnInvalidateData(), SpriteAlignerWindow::OnInvalidateData(), ScriptDebugWindow::OnInvalidateData(), MessageHistoryWindow::OnInvalidateData(), SelectStationWindow< T >::OnInvalidateData(), GameSettingsWindow::OnInvalidateData(), TimetableWindow::OnPaint(), VehicleGroupWindow::OnPaint(), StoryBookWindow::OnPaint(), RefitWindow::OnPaint(), StationViewWindow::OnPaint(), BuildVehicleWindow::OnPaint(), VehicleDetailsWindow::OnPaint(), StoryBookWindow::OnResize(), GSConfigWindow::RebuildVisibleSettings(), ScriptSettingsWindow::RebuildVisibleSettings(), StoryBookWindow::RefreshSelectedPage(), SavePresetWindow::SavePresetWindow(), ScriptListWindow::ScriptListWindow(), BuildAirportWindow::SelectFirstAvailableAirport(), VehicleGroupWindow::SelectGroup(), NWidgetMatrix::SetCount(), TextfileWindow::SetupScrollbars(), ScriptDebugWindow::UpdateLogScroll(), NewGRFWindow::UpdateScrollBars(), and DropdownWindow::UpdateSizeAndPosition().

◆ SetPosition()

bool Scrollbar::SetPosition ( size_type  position)
inline

Sets the position of the first visible element.

Parameters
positionthe position of the element
Returns
true iff the position has changed

Definition at line 812 of file widget_type.h.

References Clamp(), and pos.

Referenced by ReplaceVehicleWindow::OnRailRoadTypeChange(), ScrollTowards(), SetCapacity(), SetCount(), ScriptDebugWindow::UpdateLogScroll(), and UpdatePosition().

◆ SetStepSize()

void Scrollbar::SetStepSize ( size_t  stepsize)
inline

Set the distance to scroll when using the buttons or the wheel.

Parameters
stepsizeScrolling speed.

Definition at line 770 of file widget_type.h.

References stepsize.

Referenced by ScriptDebugWindow::ScriptDebugWindow(), and NWidgetMatrix::SetCount().

◆ UpdateListPositionOnKeyPress()

EventState Scrollbar::UpdateListPositionOnKeyPress ( int &  list_position,
uint16_t  keycode 
) const

Update the given list position as if it were on this scroll bar when the given keycode was pressed.

This does not update the actual position of this scroll bar, that is left to the caller. It does, however use the capacity and count of the scroll bar for the bounds and amount to scroll.

When the count is 0 or the return is ES_NOT_HANDLED, then the position is not updated. With WKC_UP and WKC_DOWN the position goes one up or down respectively. With WKC_PAGEUP and WKC_PAGEDOWN the position goes one capacity up or down respectively. With WKC_HOME the first position is selected and with WKC_END the last position is selected. This function ensures that pos is in the range [0..count).

Parameters
list_positionThe current position in the list.
key_codeThe pressed key code.
Returns
ES_NOT_HANDLED when another key than the 6 specific keys was pressed, otherwise ES_HANDLED.

Definition at line 2341 of file widget.cpp.

◆ UpdatePosition()

bool Scrollbar::UpdatePosition ( int  difference,
ScrollbarStepping  unit = SS_SMALL 
)
inline

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

Parameters
differencethe amount of change requested
unitThe stepping unit of difference
Returns
true iff the position has changed

Definition at line 826 of file widget_type.h.

References cap, SetPosition(), SS_BIG, SS_SMALL, and stepsize.

Referenced by DispatchMouseWheelEvent(), and DropdownWindow::UpdateSizeAndPosition().


The documentation for this class was generated from the following files: