diff --git a/src/dlangui/core/events.d b/src/dlangui/core/events.d index 74e435e3..6d88a4a4 100644 --- a/src/dlangui/core/events.d +++ b/src/dlangui/core/events.d @@ -66,6 +66,9 @@ class ActionState { } return false; } + override string toString() const { + return (enabled ? "enabled" : "disabled") ~ (visible ? "_visible" : "_invisible") ~ (checked ? "_checked" : ""); + } } /// action is diff --git a/src/dlangui/widgets/menu.d b/src/dlangui/widgets/menu.d index 92eb76e7..0a9442bd 100644 --- a/src/dlangui/widgets/menu.d +++ b/src/dlangui/widgets/menu.d @@ -231,7 +231,11 @@ class MenuItem { /// call to update state for action (if action is assigned for widget) void updateActionState(Widget w) { + //import dlangui.widgets.editors; if (_action) { + //if (_action.id == EditorActions.Copy) { + // Log.d("Requesting Copy action. Old state: ", _action.state); + //} w.updateActionState(_action, true); _enabled = _action.state.enabled; _checked = _action.state.checked; @@ -663,6 +667,17 @@ class MenuWidgetBase : ListWidget { protected int _menuToggleState; protected Widget _menuTogglePreviousFocus; + /// override to handle specific actions state (e.g. change enabled state for supported actions) + override bool handleActionStateRequest(const Action a) { + if (_menuTogglePreviousFocus) { + Log.d("Menu.handleActionStateRequest forwarding to ", _menuTogglePreviousFocus); + bool res = _menuTogglePreviousFocus.handleActionStateRequest(a); + Log.d("Menu.handleActionStateRequest forwarding handled successful: ", a.state.toString); + return res; + } + return false; + } + /// list navigation using keys override bool onKeyEvent(KeyEvent event) { if (orientation == Orientation.Horizontal) { @@ -723,7 +738,7 @@ class MenuWidgetBase : ListWidget { } } } - if (_selectedItemIndex >= 0 && event.action == KeyAction.KeyDown && event.flags == 0 && (event.keyCode == KeyCode.RETURN || event.keyCode == KeyCode.SPACE)) { + if (_selectedItemIndex >= 0 && event.action == KeyAction.KeyDown && /*event.flags == 0 &&*/ (event.keyCode == KeyCode.RETURN || event.keyCode == KeyCode.SPACE)) { itemClicked(_selectedItemIndex); return true; } @@ -757,8 +772,8 @@ class MainMenu : MenuWidgetBase { /// call to update state for action (if action is assigned for widget) override void updateActionState(bool force) { - Log.d("MainMenu: updateActionState"); - _item.updateActionState(this); + //Log.d("MainMenu: updateActionState"); + //_item.updateActionState(this); } @@ -869,6 +884,9 @@ class MainMenu : MenuWidgetBase { if (focused && _openedPopup is null) { // activating! _menuTogglePreviousFocus = window.focusedWidget; + //updateActionState(true); + Log.d("MainMenu: updateActionState"); + _item.updateActionState(this); } super.handleFocusChange(focused); } diff --git a/src/dlangui/widgets/widget.d b/src/dlangui/widgets/widget.d index aad5be0b..86f85b5d 100644 --- a/src/dlangui/widgets/widget.d +++ b/src/dlangui/widgets/widget.d @@ -623,19 +623,25 @@ class Widget { /// action to emit on click @property const(Action) action() { return _action; } /// action to emit on click - @property void action(const Action action) { _action = action.clone; } + @property void action(const Action action) { _action = action.clone; handleActionStateChanged(); } /// action to emit on click - @property void action(Action action) { _action = action; } + @property void action(Action action) { _action = action; handleActionStateChanged(); } /// ask for update state of some action (unles force=true, checks window flag actionsUpdateRequested), returns true if action state is changed bool updateActionState(Action a, bool force = false) { if (Window w = window) { if (!force && !w.actionsUpdateRequested()) return false; const ActionState oldState = a.state; + //import dlangui.widgets.editors; + //if (a.id == EditorActions.Undo) { + // Log.d("Requesting Undo action. Old state: ", a.state); + //} if (w.dispatchActionStateRequest(a, this)) { // state is updated + //Log.d("updateActionState ", a.label, " found state: ", a.state.toString); } else { a.state = a.defaultState; + //Log.d("updateActionState ", a.label, " using default state: ", a.state.toString); } if (a.state != oldState) return true;