diff options
-rw-r--r-- | src/widgets/dropdown.cpp | 16 | ||||
-rw-r--r-- | src/widgets/dropdown_type.h | 4 |
2 files changed, 17 insertions, 3 deletions
diff --git a/src/widgets/dropdown.cpp b/src/widgets/dropdown.cpp index f1d39dfff..f04c72764 100644 --- a/src/widgets/dropdown.cpp +++ b/src/widgets/dropdown.cpp @@ -71,6 +71,7 @@ struct DropdownWindow : Window { int selected_index; byte click_delay; bool drag_mode; + bool instant_close; int scrolling; DropdownWindow(int x, int y, int width, int height, const Widget *widget) : Window(x, y, width, height, WC_DROPDOWN_MENU, widget) @@ -196,7 +197,17 @@ struct DropdownWindow : Window { if (!_left_button_clicked) { this->drag_mode = false; - if (!this->GetDropDownItem(item)) return; + if (!this->GetDropDownItem(item)) { + if (this->instant_close) { + if (GetWidgetFromPos(w2, _cursor.pos.x - w2->left, _cursor.pos.y - w2->top) == this->parent_button) { + /* Send event for selected option if we're still + * on the parent button of the list. */ + w2->OnDropdownSelect(this->parent_button, this->selected_index); + } + delete this; + } + return; + } this->click_delay = 2; } else { if (_cursor.pos.y <= this->top + 2) { @@ -218,7 +229,7 @@ struct DropdownWindow : Window { } }; -void ShowDropDownList(Window *w, DropDownList *list, int selected, int button, uint width) +void ShowDropDownList(Window *w, DropDownList *list, int selected, int button, uint width, bool instant_close) { bool is_dropdown_menu_shown = w->IsWidgetLowered(button); @@ -327,6 +338,7 @@ void ShowDropDownList(Window *w, DropDownList *list, int selected, int button, u dw->selected_index = selected; dw->click_delay = 0; dw->drag_mode = true; + dw->instant_close = instant_close; } void ShowDropDownMenu(Window *w, const StringID *strings, int selected, int button, uint32 disabled_mask, uint32 hidden_mask, uint width) diff --git a/src/widgets/dropdown_type.h b/src/widgets/dropdown_type.h index c9686a178..f3a5f7976 100644 --- a/src/widgets/dropdown_type.h +++ b/src/widgets/dropdown_type.h @@ -72,7 +72,9 @@ typedef std::list<DropDownListItem *> DropDownList; * @param width Override the width determined by the selected widget. * If UINT_MAX then the width is determined by the widest item * in the list. + * @param instant_close Set to true if releasing mouse button should close the + * list regardless of where the cursor is. */ -void ShowDropDownList(Window *w, DropDownList *list, int selected, int button, uint width = 0); +void ShowDropDownList(Window *w, DropDownList *list, int selected, int button, uint width = 0, bool instant_close = false); #endif /* WIDGETS_DROPDOWN_TYPE_H */ |