menu fixes - #301

This commit is contained in:
Vadim Lopatin 2016-10-13 16:15:51 +03:00
parent 342b736fbe
commit 52a2795af3
1 changed files with 44 additions and 1 deletions

View File

@ -567,6 +567,43 @@ class MenuWidgetBase : ListWidget {
} }
} }
enum MENU_OPEN_DELAY_MS = 400;
ulong _submenuOpenTimer = 0;
int _submenuOpenItemIndex = -1;
protected void scheduleOpenSubmenu(int index) {
if (_submenuOpenTimer) {
cancelTimer(_submenuOpenTimer);
_submenuOpenTimer = 0;
}
_submenuOpenItemIndex = index;
_submenuOpenTimer = setTimer(MENU_OPEN_DELAY_MS);
}
protected void cancelOpenSubmenu() {
if (_submenuOpenTimer) {
cancelTimer(_submenuOpenTimer);
_submenuOpenTimer = 0;
}
}
/// handle timer; return true to repeat timer event after next interval, false cancel timer
override bool onTimer(ulong id) {
if (id == _submenuOpenTimer) {
_submenuOpenTimer = 0;
MenuItemWidget itemWidget = _submenuOpenItemIndex >= 0 ? cast(MenuItemWidget)_adapter.itemWidget(_submenuOpenItemIndex) : null;
if (itemWidget !is null) {
if (itemWidget.item.isSubmenu()) {
Log.d("Opening submenu by timer");
openSubmenu(_submenuOpenItemIndex, itemWidget, _orientation == Orientation.Horizontal); // for main menu, select first item
} else {
// normal item
}
}
}
// override to do something useful
// return true to repeat after the same interval, false to stop timer
return false;
}
protected bool _selectionChangingInProgress; protected bool _selectionChangingInProgress;
/// override to handle change of selection /// override to handle change of selection
override protected void selectionChanged(int index, int previouslySelectedItem = -1) { override protected void selectionChanged(int index, int previouslySelectedItem = -1) {
@ -587,7 +624,12 @@ class MenuWidgetBase : ListWidget {
if (itemWidget !is null) { if (itemWidget !is null) {
if (itemWidget.item.isSubmenu()) { if (itemWidget.item.isSubmenu()) {
if (_selectOnHover || popupWasOpen) { if (_selectOnHover || popupWasOpen) {
openSubmenu(index, itemWidget, _orientation == Orientation.Horizontal); // for main menu, select first item if (popupWasOpen && _orientation == Orientation.Horizontal) {
// instantly open submenu in main menu if previous submenu was opened
openSubmenu(index, itemWidget, false); // _orientation == Orientation.Horizontal for main menu, select first item
} else {
scheduleOpenSubmenu(index);
}
} }
} else { } else {
// normal item // normal item
@ -775,6 +817,7 @@ class MenuWidgetBase : ListWidget {
} }
/// closes this menu - handle ESC key /// closes this menu - handle ESC key
void close() { void close() {
cancelOpenSubmenu();
if (thisPopup !is null) if (thisPopup !is null)
thisPopup.close(); thisPopup.close();
} }