summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpeter1138 <peter1138@openttd.org>2009-02-01 22:32:07 +0000
committerpeter1138 <peter1138@openttd.org>2009-02-01 22:32:07 +0000
commitaad67b5736ce1f265eaf8aa0596c80c089f659ec (patch)
tree11498b2611a021129b26fdd96527d3ab137b426e
parent7cd579e7efa1052ba2a1d47e9f635861191f1043 (diff)
downloadopenttd-aad67b5736ce1f265eaf8aa0596c80c089f659ec.tar.xz
(svn r15312) -Codechange: Handle closing of drop down menus when clicking in a window in a single place, instead of in the OnClick event for some windows. This standardises behaviour so that clicking anywhere in a window will close its drop down menu, which happened before for some windows but not all. In addition the dubious feature of hiding a drop down menu by opening the same menu has been removed. This only caused wasted CPU cycles as a whole new list was generated and then destroyed. Breathe.
-rw-r--r--src/group_gui.cpp2
-rw-r--r--src/network/network_gui.cpp1
-rw-r--r--src/order_gui.cpp1
-rw-r--r--src/widgets/dropdown.cpp20
-rw-r--r--src/widgets/dropdown_func.h2
-rw-r--r--src/window.cpp5
6 files changed, 11 insertions, 20 deletions
diff --git a/src/group_gui.cpp b/src/group_gui.cpp
index 3ec866801..b8cc53377 100644
--- a/src/group_gui.cpp
+++ b/src/group_gui.cpp
@@ -440,8 +440,6 @@ public:
virtual void OnClick(Point pt, int widget)
{
- if (widget != GRP_WIDGET_SORT_BY_DROPDOWN && widget != GRP_WIDGET_MANAGE_VEHICLES_DROPDOWN) HideDropDownMenu(this);
-
switch(widget) {
case GRP_WIDGET_SORT_BY_ORDER: // Flip sorting method ascending/descending
this->vehicles.ToggleSortOrder();
diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp
index 6a59e1a6c..f4e52db4a 100644
--- a/src/network/network_gui.cpp
+++ b/src/network/network_gui.cpp
@@ -925,7 +925,6 @@ struct NetworkStartServerWindow : public QueryStringBaseWindow {
virtual void OnClick(Point pt, int widget)
{
- if (widget != NSSW_CONNTYPE_BTN && widget != NSSW_LANGUAGE_BTN) HideDropDownMenu(this);
this->field = widget;
switch (widget) {
case NSSW_CLOSE: // Close 'X'
diff --git a/src/order_gui.cpp b/src/order_gui.cpp
index 43978edb2..b20d1c556 100644
--- a/src/order_gui.cpp
+++ b/src/order_gui.cpp
@@ -839,7 +839,6 @@ public:
virtual void OnClick(Point pt, int widget)
{
- if (this->widget[widget].type != WWT_DROPDOWN) HideDropDownMenu(this);
switch (widget) {
case ORDER_WIDGET_ORDER_LIST: {
ResetObjectToPlace();
diff --git a/src/widgets/dropdown.cpp b/src/widgets/dropdown.cpp
index 083f31f38..42cd28d0f 100644
--- a/src/widgets/dropdown.cpp
+++ b/src/widgets/dropdown.cpp
@@ -226,15 +226,8 @@ struct DropdownWindow : Window {
void ShowDropDownList(Window *w, DropDownList *list, int selected, int button, uint width, bool auto_width, bool instant_close)
{
- bool is_dropdown_menu_shown = w->IsWidgetLowered(button);
-
DeleteWindowById(WC_DROPDOWN_MENU, 0);
- if (is_dropdown_menu_shown) {
- DeleteDropDownList(list);
- return;
- }
-
w->LowerWidget(button);
w->InvalidateWidget(button);
@@ -339,12 +332,6 @@ void ShowDropDownList(Window *w, DropDownList *list, int selected, int button, u
void ShowDropDownMenu(Window *w, const StringID *strings, int selected, int button, uint32 disabled_mask, uint32 hidden_mask, uint width)
{
- /* Don't create a new list if we're just closing an existing menu */
- if (w->IsWidgetLowered(button)) {
- DeleteWindowById(WC_DROPDOWN_MENU, 0);
- return;
- }
-
uint result = 0;
DropDownList *list = new DropDownList();
@@ -368,7 +355,7 @@ void ShowDropDownMenu(Window *w, const StringID *strings, int selected, int butt
* Delete the drop-down menu from window \a pw
* @param pw Parent window of the drop-down menu window
*/
-void HideDropDownMenu(Window *pw)
+int HideDropDownMenu(Window *pw)
{
Window *w;
FOR_ALL_WINDOWS_FROM_BACK(w) {
@@ -377,9 +364,12 @@ void HideDropDownMenu(Window *pw)
DropdownWindow *dw = dynamic_cast<DropdownWindow*>(w);
if (pw->window_class == dw->parent_wnd_class &&
pw->window_number == dw->parent_wnd_num) {
+ int parent_button = dw->parent_button;
delete dw;
- break;
+ return parent_button;
}
}
+
+ return -1;
}
diff --git a/src/widgets/dropdown_func.h b/src/widgets/dropdown_func.h
index 03cb52d0c..bd4e93a67 100644
--- a/src/widgets/dropdown_func.h
+++ b/src/widgets/dropdown_func.h
@@ -9,6 +9,6 @@
void ShowDropDownMenu(Window *w, const StringID *strings, int selected, int button, uint32 disabled_mask, uint32 hidden_mask, uint width = 0);
/* Hide drop down menu of a parent window */
-void HideDropDownMenu(Window *pw);
+int HideDropDownMenu(Window *pw);
#endif /* WIDGETS_DROPDOWN_FUNC_H */
diff --git a/src/window.cpp b/src/window.cpp
index 50d93117a..f5fed776d 100644
--- a/src/window.cpp
+++ b/src/window.cpp
@@ -22,6 +22,7 @@
#include "tilehighlight_func.h"
#include "network/network.h"
#include "querystring_gui.h"
+#include "widgets/dropdown_func.h"
#include "table/sprites.h"
@@ -188,6 +189,10 @@ static void DispatchLeftClickEvent(Window *w, int x, int y, bool double_click)
}
}
+ /* Close any child drop down menus. If the button pressed was the drop down
+ * list's own button, then we should not process the click any further. */
+ if (HideDropDownMenu(w) == widget) return;
+
if (w->desc_flags & WDF_STD_BTN) {
if (widget == 0) { /* 'X' */
delete w;