diff --git a/src/dlangui/widgets/editors.d b/src/dlangui/widgets/editors.d index ad1a234c..c82159bd 100644 --- a/src/dlangui/widgets/editors.d +++ b/src/dlangui/widgets/editors.d @@ -849,13 +849,6 @@ class EditWidgetBase : ScrollWidgetBase, EditableContentListener, MenuItemAction acceleratorMap.add([ACTION_EDITOR_FIND_NEXT, ACTION_EDITOR_FIND_PREV]); } - protected MenuItem _popupMenu; - @property MenuItem popupMenu() { return _popupMenu; } - @property EditWidgetBase popupMenu(MenuItem popupMenu) { - _popupMenu = popupMenu; - return this; - } - /// override bool onMenuItemAction(const Action action) { return dispatchAction(action); diff --git a/src/dlangui/widgets/grid.d b/src/dlangui/widgets/grid.d index 1da108f2..f6133220 100644 --- a/src/dlangui/widgets/grid.d +++ b/src/dlangui/widgets/grid.d @@ -1005,7 +1005,7 @@ class GridWidgetBase : ScrollWidgetBase, GridModelAdapter, MenuItemActionHandler } /// handle popup menu action - protected bool onMenuItemAction(const Action action) { + protected override bool onMenuItemAction(const Action action) { if (menuItemAction.assigned) return menuItemAction(action); return false; diff --git a/src/dlangui/widgets/widget.d b/src/dlangui/widgets/widget.d index bc650887..655d6762 100644 --- a/src/dlangui/widgets/widget.d +++ b/src/dlangui/widgets/widget.d @@ -41,6 +41,7 @@ public { import dlangui.core.i18n; import dlangui.core.collections; import dlangui.widgets.styles; + import dlangui.widgets.menu; import dlangui.graphics.drawbuf; import dlangui.graphics.resources; @@ -153,7 +154,7 @@ enum CursorType { * */ @dmlwidget -class Widget { +class Widget : MenuItemActionHandler { protected: /// widget id string _id; @@ -1506,13 +1507,38 @@ public: // =========================================================== // popup menu support + override bool onMenuItemAction(const Action action) { + return dispatchAction(action); + } + + protected MenuItem _popupMenu; + @property MenuItem popupMenu() { return _popupMenu; } + @property Widget popupMenu(MenuItem popupMenu) { + _popupMenu = popupMenu; + return this; + } + /// returns true if widget can show popup menu (e.g. by mouse right click at point x,y) bool canShowPopupMenu(int x, int y) { - return false; + if (_popupMenu is null) + return false; + if (_popupMenu.openingSubmenu.assigned) + if (!_popupMenu.openingSubmenu(_popupMenu)) + return false; + return true; } /// shows popup menu at (x,y) void showPopupMenu(int x, int y) { - // override to show popup + /// if preparation signal handler assigned, call it; don't show popup if false is returned from handler + if (_popupMenu.openingSubmenu.assigned) + if (!_popupMenu.openingSubmenu(_popupMenu)) + return; + _popupMenu.updateActionState(this); + import dlangui.widgets.popup; + PopupMenu popupMenu = new PopupMenu(_popupMenu); + popupMenu.menuItemAction = this; + PopupWidget popup = window.showPopup(popupMenu, this, PopupAlign.Point | PopupAlign.Right, x, y); + popup.flags = PopupFlags.CloseOnClickOutside; } /// override to change popup menu items state bool isActionEnabled(const Action action) {