25 std::unique_ptr<DropDownListItem> MakeDropDownListDividerItem()
27 return std::make_unique<DropDownListDividerItem>(-1);
30 std::unique_ptr<DropDownListItem> MakeDropDownListStringItem(
StringID str,
int value,
bool masked,
bool shaded)
32 return std::make_unique<DropDownListStringItem>(str, value, masked, shaded);
35 std::unique_ptr<DropDownListItem> MakeDropDownListStringItem(
const std::string &str,
int value,
bool masked,
bool shaded)
37 return std::make_unique<DropDownListStringItem>(str, value, masked, shaded);
40 std::unique_ptr<DropDownListItem> MakeDropDownListIconItem(
SpriteID sprite,
PaletteID palette,
StringID str,
int value,
bool masked,
bool shaded)
42 return std::make_unique<DropDownListIconItem>(sprite, palette, str, value, masked, shaded);
45 std::unique_ptr<DropDownListItem> MakeDropDownListIconItem(
const Dimension &dim,
SpriteID sprite,
PaletteID palette,
StringID str,
int value,
bool masked,
bool shaded)
47 return std::make_unique<DropDownListIconItem>(dim, sprite, palette, str, value, masked, shaded);
50 std::unique_ptr<DropDownListItem> MakeDropDownListCheckedItem(
bool checked,
StringID str,
int value,
bool masked,
bool shaded)
52 return std::make_unique<DropDownListCheckedItem>(checked, str, value, masked, shaded);
55 static constexpr
NWidgetPart _nested_dropdown_menu_widgets[] = {
68 _nested_dropdown_menu_widgets
78 bool drag_mode =
true;
107 assert(!this->list.empty());
113 this->GetWidget<NWidgetCore>(
WID_DM_ITEMS)->colour = wi_colour;
114 this->GetWidget<NWidgetCore>(
WID_DM_SCROLL)->colour = wi_colour;
122 void Close([[maybe_unused]]
int data = 0)
override
141 this->instant_close =
false;
154 if (desired.height < available_height)
return;
157 uint avg_height =
list.height / (uint)this->list.size();
160 desired.width = std::max(
list.width, desired.width - NWidgetScrollbar::GetVerticalDimension().width);
180 widget_dim.width = std::max<uint>(widget_dim.width, button_rect.
Width());
183 uint available_height_below = std::max(
GetMainViewBottom() - button_rect.bottom - 1, 0);
184 uint available_height_above = std::max(button_rect.top - 1 -
GetMainViewTop(), 0);
187 if (widget_dim.height > available_height_below && available_height_above > available_height_below) {
189 this->position.y = button_rect.top - widget_dim.height;
192 this->position.y = button_rect.bottom + 1;
197 this->position.x = button_rect.right + 1 - (int)(widget_dim.width + (list_dim.height > widget_dim.height ? NWidgetScrollbar::GetVerticalDimension().width : 0));
199 this->position.x = button_rect.left;
202 this->items_dim = widget_dim;
207 this->vscroll->
SetCount(this->list.size());
210 if (this->position.y < button_rect.top && list_dim.height > widget_dim.height) this->vscroll->
UpdatePosition(INT_MAX);
218 Point OnInitialPosition([[maybe_unused]] int16_t sm_width, [[maybe_unused]] int16_t sm_height, [[maybe_unused]]
int window_number)
override
233 int y = _cursor.
pos.y - this->
top - r.top;
236 for (
const auto &item : this->list) {
238 if (--pos >= 0)
continue;
240 int item_height = item->Height();
242 if (y < item_height) {
243 if (item->masked || !item->Selectable())
return false;
244 value = item->result;
254 void DrawWidget(
const Rect &r,
WidgetID widget)
const override
258 Colours colour = this->GetWidget<NWidgetCore>(widget)->colour;
263 for (
const auto &item : this->list) {
264 int item_height = item->Height();
267 if (--pos >= 0)
continue;
269 if (y + item_height - 1 <= ir.bottom) {
270 Rect full{ir.left, y, ir.right, y + item_height - 1};
272 bool selected = (this->selected_result == item->result) && item->Selectable();
281 void OnClick([[maybe_unused]]
Point pt,
WidgetID widget, [[maybe_unused]]
int click_count)
override
286 this->click_delay = 4;
287 this->selected_result = item;
294 if (this->scrolling == 0)
return;
303 if (this->click_delay != 0 && --this->click_delay == 0) {
306 if (!this->persist) this->Close();
311 if (this->drag_mode) {
315 this->drag_mode =
false;
317 if (this->instant_close) this->Close();
320 this->click_delay = 2;
324 this->scrolling = -1;
335 if (this->selected_result != item) {
336 this->selected_result = item;
344 this->list = std::move(
list);
347 this->
InitializePositionSize(this->position.x, this->position.y, this->nested_root->smallest_x, this->nested_root->smallest_y);
355 if (ddw !=
nullptr) ddw->ReplaceList(std::move(list));
366 for (
const auto &item : list) {
367 dim.height += item->Height();
368 dim.width = std::max(dim.width, item->Width());
389 new DropdownWindow(w, std::move(list), selected, button, wi_rect, instant_close, wi_colour, persist);
409 Rect wi_rect = nwi->GetCurrentRect();
410 Colours wi_colour = nwi->
colour;
427 ShowDropDownListAt(w, std::move(list), selected, button, wi_rect, wi_colour, instant_close, persist);
446 for (
auto string : strings) {
447 if (!
HasBit(hidden_mask, i)) {
448 list.push_back(MakeDropDownListStringItem(
string, i,
HasBit(disabled_mask, i)));
453 if (!list.empty())
ShowDropDownList(w, std::move(list), selected, button, width);
constexpr debug_inline bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
#define CLRBITS(x, y)
Clears several bits in a variable.
constexpr T SetBit(T &x, const uint8_t y)
Set a bit in a variable.
void ShowDropDownMenu(Window *w, std::span< const StringID > strings, int selected, WidgetID button, uint32_t disabled_mask, uint32_t hidden_mask, uint width)
Show a dropdown menu window near a widget of the parent window.
void ShowDropDownList(Window *w, DropDownList &&list, int selected, WidgetID button, uint width, bool instant_close, bool persist)
Show a drop down list.
Dimension GetDropDownListDimension(const DropDownList &list)
Determine width and height required to fully display a DropDownList.
void ShowDropDownListAt(Window *w, DropDownList &&list, int selected, WidgetID button, Rect wi_rect, Colours wi_colour, bool instant_close, bool persist)
Show a drop down list.
Common drop down list components.
Functions related to the drop down widget.
Types related to the drop down widget.
std::vector< std::unique_ptr< const DropDownListItem > > DropDownList
A drop down list is a collection of drop down list items.
bool _left_button_clicked
Is left mouse button clicked?
void GfxFillRect(int left, int top, int right, int bottom, int colour, FillRectMode mode)
Applies a certain FillRectMode-operation to a rectangle [left, right] x [top, bottom] on the screen.
uint32_t SpriteID
The number of a sprite, without mapping bits and colourtables.
uint32_t PaletteID
The number of the palette.
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
static const uint8_t PC_BLACK
Black palette colour.
A number of safeguards to prevent using unsafe methods.
Definition of base types and functions in a cross-platform compatible way.
TextDirection _current_text_dir
Text direction of the currently selected language.
Functions related to OTTD's strings.
@ TD_RTL
Text is written right-to-left by default.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
Point pos
logical mouse position
Dimensions (a width and height) of a rectangle in 2D.
WidgetID parent_button
Parent widget number where the window is dropped from.
void OnMouseLoop() override
Called for every mouse loop run, which is at least once per (game) tick.
bool persist
Persist dropdown menu.
DropdownWindow(Window *parent, DropDownList &&list, int selected, WidgetID button, const Rect wi_rect, bool instant_close, Colours wi_colour, bool persist)
Create a dropdown menu.
IntervalTimer< TimerWindow > scroll_interval
Rate limit how fast scrolling happens.
void UpdateSizeAndPosition()
Update size and position of window to fit dropdown list into available space.
Rect wi_rect
Rect of the button that opened the dropdown.
bool instant_close
Close the window when the mouse button is raised.
Dimension items_dim
Calculated cropped and padded dimension for the items widget.
uint8_t click_delay
Timer to delay selection.
int selected_result
Result value of the selected item in the list.
bool GetDropDownItem(int &value)
Find the dropdown item under the cursor.
DropDownList list
List with dropdown menu items.
void FitAvailableHeight(Dimension &desired, const Dimension &list, uint available_height)
Fit dropdown list into available height, rounding to average item size.
Point position
Position of the topleft corner of the window.
int scrolling
If non-zero, auto-scroll the item list (one time).
void OnFocusLost(bool closing) override
The window has lost focus.
Coordinates of a point in 2D.
constexpr uint Horizontal() const
Get total horizontal padding of RectPadding.
constexpr uint Vertical() const
Get total vertical padding of RectPadding.
Specification of a rectangle with absolute coordinates of all edges.
int Width() const
Get width of Rect.
Rect Shrink(int s) const
Copy and shrink Rect by s pixels.
Rect Translate(int x, int y) const
Copy and translate Rect by x,y pixels.
High level window description.
Data structure for an opened window.
void ReInit(int rx=0, int ry=0, bool reposition=false)
Re-initialize a window, and optionally change its size.
virtual void Close(int data=0)
Hide the window and all its child windows, and mark them for a later deletion.
void FinishInitNested(WindowNumber window_number=0)
Perform the second part of the initialization of a nested widget tree.
void InitializePositionSize(int x, int y, int min_width, int min_height)
Set the position and smallest size of the window.
Window * parent
Parent window.
ResizeInfo resize
Resize information.
void CreateNestedTree()
Perform the first part of the initialization of a nested widget tree.
virtual void OnDropdownClose(Point pt, WidgetID widget, int index, bool instant_close)
A dropdown window associated to this window has been closed.
int left
x position of left edge of the window
Window * FindChildWindow(WindowClass wc=WC_INVALID) const
Find the Window whose parent pointer points to this window.
int top
y position of top edge of the window
const NWID * GetWidget(WidgetID widnum) const
Get the nested widget with number widnum from the nested widget tree.
virtual void OnDropdownSelect([[maybe_unused]] WidgetID widget, [[maybe_unused]] int index)
A dropdown option associated to this window has been selected.
WindowFlags flags
Window flags.
const Scrollbar * GetScrollbar(WidgetID widnum) const
Return the Scrollbar to a widget index.
WindowNumber window_number
Window number within the window class.
Definition of Interval and OneShot timers.
Definition of the Window system.
int GetMainViewTop()
Return the top of the main view available for general use.
void CloseWindowByClass(WindowClass cls, int data)
Close all windows of a given class.
int GetMainViewBottom()
Return the bottom of the main view available for general use.
Window functions not directly related to making/drawing windows.
Functions, definitions and such used only by the GUI.
@ WF_WHITE_BORDER
Window white border counter bit mask.
@ WDF_NO_FOCUS
This window won't get focus/make any other window lose focus when click.
@ WDP_MANUAL
Manually align the window (so no automatic location finding)
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
@ WC_DROPDOWN_MENU
Drop down menu; Window numbers:
Functions related to zooming.
int ScaleGUITrad(int value)
Scale traditional pixel dimensions to GUI zoom level.