summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/widgets/dropdown.cpp16
-rw-r--r--src/widgets/dropdown_type.h4
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 */