mirror of https://github.com/buggins/dlangui.git
second click on main menu item should close submenu - dlangide#166
This commit is contained in:
parent
46acde9ef0
commit
34d2d5afb1
|
|
@ -530,10 +530,25 @@ class MenuWidgetBase : ListWidget {
|
||||||
setHoverItem(-1);
|
setHoverItem(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected long _lastClosedPopupTs;
|
||||||
|
protected MenuItem _lastClosedPopupMenu;
|
||||||
|
protected enum REOPEN_MENU_THRESHOLD_MS = 200;
|
||||||
|
|
||||||
|
protected bool isRecentlyClosedItem(MenuItem item) {
|
||||||
|
if (!isMainMenu)
|
||||||
|
return false;
|
||||||
|
long ts = currentTimeMillis;
|
||||||
|
if (ts - _lastClosedPopupTs < REOPEN_MENU_THRESHOLD_MS && item && item is _lastClosedPopupMenu)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
protected void onPopupClosed(PopupWidget p) {
|
protected void onPopupClosed(PopupWidget p) {
|
||||||
debug(DebugMenus) Log.d("menu ", id, " onPopupClosed selectionChanging=", _selectionChangingInProgress);
|
debug(DebugMenus) Log.d("menu ", id, " onPopupClosed selectionChanging=", _selectionChangingInProgress);
|
||||||
if (_openedPopup) {
|
if (_openedPopup) {
|
||||||
if (_openedPopup is p) {
|
if (_openedPopup is p) {
|
||||||
|
_lastClosedPopupTs = currentTimeMillis;
|
||||||
|
_lastClosedPopupMenu = _openedMenu ? _openedMenu._item : null;
|
||||||
_openedMenu.onPopupClosed(p);
|
_openedMenu.onPopupClosed(p);
|
||||||
//bool undoSelection = _openedPopupIndex == _selectedItemIndex;
|
//bool undoSelection = _openedPopupIndex == _selectedItemIndex;
|
||||||
_openedPopup = null;
|
_openedPopup = null;
|
||||||
|
|
@ -554,6 +569,10 @@ class MenuWidgetBase : ListWidget {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void deactivate(bool force = false) {
|
||||||
|
// override in main menu
|
||||||
|
}
|
||||||
|
|
||||||
protected void openSubmenu(int index, MenuItemWidget itemWidget, bool selectFirstItem) {
|
protected void openSubmenu(int index, MenuItemWidget itemWidget, bool selectFirstItem) {
|
||||||
debug(DebugMenus) Log.d("menu", id, " open submenu ", index);
|
debug(DebugMenus) Log.d("menu", id, " open submenu ", index);
|
||||||
if (_openedPopup !is null) {
|
if (_openedPopup !is null) {
|
||||||
|
|
@ -569,6 +588,14 @@ class MenuWidgetBase : ListWidget {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isRecentlyClosedItem(itemWidget.item)) {
|
||||||
|
// don't reopen main menu item on duplicate click on the same menu item - deactivate instead
|
||||||
|
// deactivate main menu
|
||||||
|
deactivate();
|
||||||
|
_ignoreItemSelection = itemWidget.item;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
PopupMenu popupMenu = new PopupMenu(itemWidget.item, this);
|
PopupMenu popupMenu = new PopupMenu(itemWidget.item, this);
|
||||||
PopupWidget popup = window.showPopup(popupMenu, itemWidget, orientation == Orientation.Horizontal ? PopupAlign.Below : PopupAlign.Right);
|
PopupWidget popup = window.showPopup(popupMenu, itemWidget, orientation == Orientation.Horizontal ? PopupAlign.Below : PopupAlign.Right);
|
||||||
requestActionsUpdate();
|
requestActionsUpdate();
|
||||||
|
|
@ -622,15 +649,21 @@ class MenuWidgetBase : ListWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected MenuItem _ignoreItemSelection;
|
||||||
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) {
|
||||||
debug(DebugMenus) Log.d("menu ", id, " selectionChanged ", index, ", ", previouslySelectedItem, " _selectedItemIndex=", _selectedItemIndex);
|
debug(DebugMenus) Log.d("menu ", id, " selectionChanged ", index, ", ", previouslySelectedItem, " _selectedItemIndex=", _selectedItemIndex);
|
||||||
_selectionChangingInProgress = true;
|
_selectionChangingInProgress = true;
|
||||||
if (index >= 0)
|
|
||||||
setFocus();
|
|
||||||
MenuItemWidget itemWidget = index >= 0 ? cast(MenuItemWidget)_adapter.itemWidget(index) : null;
|
MenuItemWidget itemWidget = index >= 0 ? cast(MenuItemWidget)_adapter.itemWidget(index) : null;
|
||||||
MenuItemWidget prevWidget = previouslySelectedItem >= 0 ? cast(MenuItemWidget)_adapter.itemWidget(previouslySelectedItem) : null;
|
MenuItemWidget prevWidget = previouslySelectedItem >= 0 ? cast(MenuItemWidget)_adapter.itemWidget(previouslySelectedItem) : null;
|
||||||
|
if (itemWidget._item is _ignoreItemSelection && isMainMenu) {
|
||||||
|
_ignoreItemSelection = null;
|
||||||
|
deactivate();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (index >= 0)
|
||||||
|
setFocus();
|
||||||
bool popupWasOpen = false;
|
bool popupWasOpen = false;
|
||||||
if (prevWidget !is null) {
|
if (prevWidget !is null) {
|
||||||
if (_openedPopup !is null) {
|
if (_openedPopup !is null) {
|
||||||
|
|
@ -646,7 +679,8 @@ class MenuWidgetBase : ListWidget {
|
||||||
// instantly open submenu in main menu if previous submenu was opened
|
// instantly open submenu in main menu if previous submenu was opened
|
||||||
openSubmenu(index, itemWidget, false); // _orientation == Orientation.Horizontal for main menu, select first item
|
openSubmenu(index, itemWidget, false); // _orientation == Orientation.Horizontal for main menu, select first item
|
||||||
} else {
|
} else {
|
||||||
scheduleOpenSubmenu(index);
|
if (!isMainMenu)
|
||||||
|
scheduleOpenSubmenu(index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -949,7 +983,7 @@ class MainMenu : MenuWidgetBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// close and remove focus, if activated
|
/// close and remove focus, if activated
|
||||||
void deactivate(bool force = false) {
|
override void deactivate(bool force = false) {
|
||||||
debug(DebugMenus) Log.d("deactivating main menu");
|
debug(DebugMenus) Log.d("deactivating main menu");
|
||||||
if (!activated && !force)
|
if (!activated && !force)
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue