mirror of https://github.com/OpenTTD/OpenTTD.git
(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.
This commit is contained in:
parent
7cd579e7ef
commit
aad67b5736
|
@ -440,8 +440,6 @@ public:
|
||||||
|
|
||||||
virtual void OnClick(Point pt, int widget)
|
virtual void OnClick(Point pt, int widget)
|
||||||
{
|
{
|
||||||
if (widget != GRP_WIDGET_SORT_BY_DROPDOWN && widget != GRP_WIDGET_MANAGE_VEHICLES_DROPDOWN) HideDropDownMenu(this);
|
|
||||||
|
|
||||||
switch(widget) {
|
switch(widget) {
|
||||||
case GRP_WIDGET_SORT_BY_ORDER: // Flip sorting method ascending/descending
|
case GRP_WIDGET_SORT_BY_ORDER: // Flip sorting method ascending/descending
|
||||||
this->vehicles.ToggleSortOrder();
|
this->vehicles.ToggleSortOrder();
|
||||||
|
|
|
@ -925,7 +925,6 @@ struct NetworkStartServerWindow : public QueryStringBaseWindow {
|
||||||
|
|
||||||
virtual void OnClick(Point pt, int widget)
|
virtual void OnClick(Point pt, int widget)
|
||||||
{
|
{
|
||||||
if (widget != NSSW_CONNTYPE_BTN && widget != NSSW_LANGUAGE_BTN) HideDropDownMenu(this);
|
|
||||||
this->field = widget;
|
this->field = widget;
|
||||||
switch (widget) {
|
switch (widget) {
|
||||||
case NSSW_CLOSE: // Close 'X'
|
case NSSW_CLOSE: // Close 'X'
|
||||||
|
|
|
@ -839,7 +839,6 @@ public:
|
||||||
|
|
||||||
virtual void OnClick(Point pt, int widget)
|
virtual void OnClick(Point pt, int widget)
|
||||||
{
|
{
|
||||||
if (this->widget[widget].type != WWT_DROPDOWN) HideDropDownMenu(this);
|
|
||||||
switch (widget) {
|
switch (widget) {
|
||||||
case ORDER_WIDGET_ORDER_LIST: {
|
case ORDER_WIDGET_ORDER_LIST: {
|
||||||
ResetObjectToPlace();
|
ResetObjectToPlace();
|
||||||
|
|
|
@ -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)
|
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);
|
DeleteWindowById(WC_DROPDOWN_MENU, 0);
|
||||||
|
|
||||||
if (is_dropdown_menu_shown) {
|
|
||||||
DeleteDropDownList(list);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
w->LowerWidget(button);
|
w->LowerWidget(button);
|
||||||
w->InvalidateWidget(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)
|
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;
|
uint result = 0;
|
||||||
DropDownList *list = new DropDownList();
|
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
|
* Delete the drop-down menu from window \a pw
|
||||||
* @param pw Parent window of the drop-down menu window
|
* @param pw Parent window of the drop-down menu window
|
||||||
*/
|
*/
|
||||||
void HideDropDownMenu(Window *pw)
|
int HideDropDownMenu(Window *pw)
|
||||||
{
|
{
|
||||||
Window *w;
|
Window *w;
|
||||||
FOR_ALL_WINDOWS_FROM_BACK(w) {
|
FOR_ALL_WINDOWS_FROM_BACK(w) {
|
||||||
|
@ -377,9 +364,12 @@ void HideDropDownMenu(Window *pw)
|
||||||
DropdownWindow *dw = dynamic_cast<DropdownWindow*>(w);
|
DropdownWindow *dw = dynamic_cast<DropdownWindow*>(w);
|
||||||
if (pw->window_class == dw->parent_wnd_class &&
|
if (pw->window_class == dw->parent_wnd_class &&
|
||||||
pw->window_number == dw->parent_wnd_num) {
|
pw->window_number == dw->parent_wnd_num) {
|
||||||
|
int parent_button = dw->parent_button;
|
||||||
delete dw;
|
delete dw;
|
||||||
break;
|
return parent_button;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,6 @@
|
||||||
void ShowDropDownMenu(Window *w, const StringID *strings, int selected, int button, uint32 disabled_mask, uint32 hidden_mask, uint width = 0);
|
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 */
|
/* Hide drop down menu of a parent window */
|
||||||
void HideDropDownMenu(Window *pw);
|
int HideDropDownMenu(Window *pw);
|
||||||
|
|
||||||
#endif /* WIDGETS_DROPDOWN_FUNC_H */
|
#endif /* WIDGETS_DROPDOWN_FUNC_H */
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include "tilehighlight_func.h"
|
#include "tilehighlight_func.h"
|
||||||
#include "network/network.h"
|
#include "network/network.h"
|
||||||
#include "querystring_gui.h"
|
#include "querystring_gui.h"
|
||||||
|
#include "widgets/dropdown_func.h"
|
||||||
|
|
||||||
#include "table/sprites.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 (w->desc_flags & WDF_STD_BTN) {
|
||||||
if (widget == 0) { /* 'X' */
|
if (widget == 0) { /* 'X' */
|
||||||
delete w;
|
delete w;
|
||||||
|
|
Loading…
Reference in New Issue