mirror of https://github.com/buggins/dlangui.git
menu fixes - #301
This commit is contained in:
parent
342b736fbe
commit
52a2795af3
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue