changeset 9869:3cc11b73fa26 draft

(svn r14015) -Codechange: Add facility for a drop down list to always close (if requested) when the mouse button is released.
author peter1138 <peter1138@openttd.org>
date Thu, 07 Aug 2008 18:26:13 +0000
parents d06bace3c21c
children 3f5460dfb6ea
files src/widgets/dropdown.cpp src/widgets/dropdown_type.h
diffstat 2 files changed, 17 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/widgets/dropdown.cpp
+++ b/src/widgets/dropdown.cpp
@@ -71,6 +71,7 @@
 	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 @@
 
 			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 @@
 	}
 };
 
-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 @@
 	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)
--- a/src/widgets/dropdown_type.h
+++ b/src/widgets/dropdown_type.h
@@ -72,7 +72,9 @@
  * @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 */