OpenTTD Source
12.0-beta2
|
Go to the documentation of this file.
10 #include "../stdafx.h"
11 #include "../window_gui.h"
12 #include "../string_func.h"
13 #include "../strings_func.h"
14 #include "../window_func.h"
15 #include "../guitimer_func.h"
20 #include "../safeguards.h"
23 void DropDownListItem::Draw(
int left,
int right,
int top,
int bottom,
bool sel, Colours bg_colour)
const
28 int mid = top + this->Height(0) / 2;
29 GfxFillRect(left + 1, mid - 2, right - 1, mid - 2, c1);
30 GfxFillRect(left + 1, mid - 1, right - 1, mid - 1, c2);
33 uint DropDownListStringItem::Width()
const
36 GetString(buffer, this->String(),
lastof(buffer));
40 void DropDownListStringItem::Draw(
int left,
int right,
int top,
int bottom,
bool sel, Colours bg_colour)
const
54 char buffer1[512], buffer2[512];
60 StringID DropDownListParamStringItem::String()
const
66 StringID DropDownListCharStringItem::String()
const
75 this->sprite_y = dim.height;
78 uint DropDownListIconItem::Height(uint width)
const
83 uint DropDownListIconItem::Width()
const
88 void DropDownListIconItem::Draw(
int left,
int right,
int top,
int bottom,
bool sel, Colours bg_colour)
const
95 void DropDownListIconItem::SetDimension(
Dimension d)
100 static const NWidgetPart _nested_dropdown_menu_widgets[] = {
113 _nested_dropdown_menu_widgets,
lengthof(_nested_dropdown_menu_widgets)
146 assert(this->list.size() > 0);
154 uint items_width = size.width - (scroll ? NWidgetScrollbar::GetVerticalDimension().width : 0);
169 for (
const auto &item : this->list) {
170 list_height += item->Height(items_width);
174 this->vscroll->
SetCapacity(size.height * (uint16)this->list.size() / list_height);
175 this->vscroll->
SetCount((uint16)this->list.size());
179 this->parent_button = button;
180 this->selected_index = selected;
181 this->click_delay = 0;
182 this->drag_mode =
true;
198 w2->
OnDropdownClose(pt, this->parent_button, this->selected_index, this->instant_close);
217 int y = _cursor.
pos.y - this->top - nwi->
pos_y - 2;
221 for (
const auto &item : this->list) {
223 if (--pos >= 0)
continue;
225 int item_height = item->Height(
width);
227 if (y < item_height) {
228 if (item->masked || !item->Selectable())
return false;
229 value = item->result;
243 Colours colour = this->GetWidget<NWidgetCore>(widget)->colour;
247 for (
const auto &item : this->list) {
248 int item_height = item->Height(r.right - r.left + 1);
251 if (--pos >= 0)
continue;
253 if (y + item_height < r.bottom) {
254 bool selected = (this->selected_index == item->result);
257 item->Draw(r.left, r.right, y, y + item_height, selected, colour);
272 this->click_delay = 4;
273 this->selected_index = item;
280 if (!this->scrolling_timer.
Elapsed(delta_ms))
return;
283 if (this->scrolling != 0) {
303 if (this->click_delay != 0 && --this->click_delay == 0) {
311 if (this->drag_mode) {
315 this->drag_mode =
false;
317 if (this->instant_close) this->
Close();
320 this->click_delay = 2;
322 if (_cursor.
pos.y <= this->top + 2) {
324 this->scrolling = -1;
326 }
else if (_cursor.
pos.y >= this->top + this->height - 2) {
335 if (this->selected_index != item) {
336 this->selected_index = item;
361 int top = w->
top + wi_rect.bottom + 1;
364 uint width = wi_rect.right - wi_rect.left + 1;
367 uint max_item_width = 0;
372 for (
const auto &item : list) {
373 height += item->Height(width);
374 if (auto_width) max_item_width = std::max(max_item_width, item->Width() + 5);
387 if (height > available_height) {
389 uint available_height_above = std::max(w->
top + wi_rect.top -
GetMainViewTop() - 4, 0);
392 if (available_height_above > available_height) {
394 available_height = available_height_above;
398 if (height > available_height) {
400 uint avg_height = height / (uint)list.size();
403 assert(available_height >= avg_height);
406 uint rows = available_height / avg_height;
407 height = rows * avg_height;
410 max_item_width += NWidgetScrollbar::GetVerticalDimension().width;
415 top = w->
top + wi_rect.top - height - 4;
419 if (auto_width) width = std::max(width, max_item_width);
448 Rect wi_rect = nwi->GetCurrentRect();
449 Colours wi_colour = nwi->
colour;
460 wi_rect.left = wi_rect.right + 1 - width;
462 wi_rect.right = wi_rect.left + width - 1;
466 ShowDropDownListAt(w, std::move(list), selected, button, wi_rect, wi_colour, auto_width, instant_close);
485 if (!
HasBit(hidden_mask, i)) {
490 if (!list.empty())
ShowDropDownList(w, std::move(list), selected, button, width);
504 assert(dw !=
nullptr);
509 return parent_button;
DropdownWindow(Window *parent, DropDownList &&list, int selected, int button, bool instant_close, const Point &position, const Dimension &size, Colours wi_colour, bool scroll)
Create a dropdown menu.
int parent_button
Parent widget number where the window is dropped from.
StringID string
String ID of item.
String list item with parameters.
Dimensions (a width and height) of a rectangle in 2D.
const Scrollbar * GetScrollbar(uint widnum) const
Return the Scrollbar to a widget index.
int selected_index
Index of the selected item in the list.
std::vector< std::unique_ptr< const DropDownListItem > > DropDownList
A drop down list is a collection of drop down list items.
void CreateNestedTree(bool fill_nested=true)
Perform the first part of the initialization of a nested widget tree.
void OnRealtimeTick(uint delta_ms) override
Called periodically.
Window * FindWindowById(WindowClass cls, WindowNumber number)
Find a window by its class and window number.
static bool HasBit(const T x, const uint8 y)
Checks if a bit in a value is set.
Point OnInitialPosition(int16 sm_width, int16 sm_height, int window_number) override
Compute the initial position of the window.
@ WDF_NO_FOCUS
This window won't get focus/make any other window lose focus when click.
@ FILLRECT_CHECKER
Draw only every second pixel, used for greying-out.
int DrawString(int left, int right, int top, const char *str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly truncated to make it fit in its allocated space.
virtual void OnDropdownClose(Point pt, int widget, int index, bool instant_close)
A dropdown window associated to this window has been closed.
int32 WindowNumber
Number to differentiate different windows of the same class.
void DrawWidget(const Rect &r, int widget) const override
Draw the contents of a nested widget.
byte _colour_gradient[COLOUR_END][8]
All 16 colour gradients 8 colours per gradient from darkest (0) to lightest (7)
static void SetDParam(uint n, uint64 v)
Set a string parameter v at index n in the global string parameter array.
void Close() override
Hide the window and all its child windows, and mark them for a later deletion.
Dimension GetStringBoundingBox(const char *str, FontSize start_fontsize)
Return the string dimension in pixels.
void OnClick(Point pt, int widget, int click_count) override
A click with the left mouse button has been made on the window.
GUITimer scrolling_timer
Timer for auto-scroll of the item list.
uint32 SpriteID
The number of a sprite, without mapping bits and colourtables.
High level window description.
const NWID * GetWidget(uint widnum) const
Get the nested widget with number widnum from the nested widget tree.
@ WF_WHITE_BORDER
Window white border counter bit mask.
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
@ WD_FRAMERECT_LEFT
Offset at left to draw the frame rectangular area.
bool GetDropDownItem(int &value)
Find the dropdown item under the cursor.
@ WD_FRAMERECT_RIGHT
Offset at right to draw the frame rectangular area.
void ShowDropDownList(Window *w, DropDownList &&list, int selected, int button, uint width, bool auto_width, bool instant_close)
Show a drop down list.
byte click_delay
Timer to delay selection.
int GetMainViewTop()
Return the top of the main view available for general use.
virtual void OnDropdownSelect(int widget, int index)
A dropdown option associated to this window has been selected.
const DropDownList list
List with dropdown menu items.
Window * parent
Parent window.
int left
x position of left edge of the window
WindowFlags flags
Window flags.
WindowClass
Window classes.
WindowClass parent_wnd_class
Parent window class.
void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub, ZoomLevel zoom)
Draw a sprite, not in a viewport.
Coordinates of a point in 2D.
void ShowDropDownMenu(Window *w, const StringID *strings, int selected, int button, uint32 disabled_mask, uint32 hidden_mask, uint width)
Show a dropdown menu window near a widget of the parent window.
static const uint8 PC_BLACK
Black palette colour.
WindowNumber window_number
Window number within the window class.
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.
bool instant_close
Close the window when the mouse button is raised.
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
Iterable ensemble of all valid Windows.
Point position
Position of the topleft corner of the window.
int scrolling
If non-zero, auto-scroll the item list (one time).
Dimension GetSpriteSize(SpriteID sprid, Point *offset, ZoomLevel zoom)
Get the size of a sprite.
uint64 decode_params[10]
Parameters of the string.
uint32 StringID
Numeric value that represents a string, independent of the selected language.
int HideDropDownMenu(Window *pw)
Delete the drop-down menu from window pw.
#define FONT_HEIGHT_NORMAL
Height of characters in the normal (FS_NORMAL) font.
uint32 PaletteID
The number of the palette.
WindowClass window_class
Window class.
void FinishInitNested(WindowNumber window_number=0)
Perform the second part of the initialization of a nested widget tree.
int top
y position of top edge of the window
bool Elapsed(uint delta)
Test if a timer has elapsed.
void ShowDropDownListAt(Window *w, DropDownList &&list, int selected, int button, Rect wi_rect, Colours wi_colour, bool auto_width, bool instant_close)
Show a drop down list.
static const uint MILLISECONDS_PER_TICK
The number of milliseconds per game tick.
static int CenterBounds(int min, int max, int size)
Determine where to draw a centred object inside a widget.
#define lengthof(x)
Return the length of an fixed size array.
int width
width of the window (number of pixels to the right in x direction)
@ WDP_MANUAL
Manually align the window (so no automatic location finding)
void CloseWindowById(WindowClass cls, WindowNumber number, bool force)
Close a window by its class and window number (if it is open).
void OnMouseLoop() override
Called for every mouse loop run, which is at least once per (game) tick.
int strnatcmp(const char *s1, const char *s2, bool ignore_garbage_at_front)
Compares two strings using case insensitive natural sort.
Data structure for an opened window.
WindowNumber parent_wnd_num
Parent window number.
void SetWidgetDirty(byte widget_index) const
Invalidate a widget, i.e.
int GetMainViewBottom()
Return the bottom of the main view available for general use.
Specification of a rectangle with absolute coordinates of all edges.
void LowerWidget(byte widget_index)
Marks a widget as lowered.
Point pos
logical mouse position
@ WC_DROPDOWN_MENU
Drop down menu; Window numbers:
#define CLRBITS(x, y)
Clears several bits in a variable.
#define lastof(x)
Get the last element of an fixed size array.
bool _left_button_clicked
Is left mouse button clicked?
@ TD_RTL
Text is written right-to-left by default.
TextDirection _current_text_dir
Text direction of the currently selected language.
void SetDParamStr(uint n, const char *str)
This function is used to "bind" a C string to a OpenTTD dparam slot.
static const StringID INVALID_STRING_ID
Constant representing an invalid string (16bit in case it is used in savegames)
virtual void Close()
Hide the window and all its child windows, and mark them for a later deletion.
static bool NatSortFunc(std::unique_ptr< const DropDownListItem > const &first, std::unique_ptr< const DropDownListItem > const &second)
Natural sorting comparator function for DropDownList::sort().