diff --git a/src/dlangui/core/events.d b/src/dlangui/core/events.d index 89f9a815..3bfa9e42 100644 --- a/src/dlangui/core/events.d +++ b/src/dlangui/core/events.d @@ -573,13 +573,39 @@ struct ActionMap { foreach(acc; a.accelerators) _map[acc] = a; } + private static __gshared immutable uint[] flagMasks = [ + KeyFlag.LRControl | KeyFlag.LRAlt | KeyFlag.LRShift | KeyFlag.LRMenu, + + KeyFlag.LRControl | KeyFlag.LRAlt | KeyFlag.LRShift | KeyFlag.LRMenu, + KeyFlag.LRControl | KeyFlag.Alt | KeyFlag.LRShift | KeyFlag.LRMenu, + KeyFlag.LRControl | KeyFlag.LRAlt | KeyFlag.Shift | KeyFlag.LRMenu, + KeyFlag.LRControl | KeyFlag.LRAlt | KeyFlag.LRShift | KeyFlag.Menu, + + KeyFlag.Control | KeyFlag.Alt | KeyFlag.LRShift | KeyFlag.LRMenu, + KeyFlag.Control | KeyFlag.LRAlt | KeyFlag.Shift | KeyFlag.LRMenu, + KeyFlag.Control | KeyFlag.LRAlt | KeyFlag.LRShift | KeyFlag.Menu, + KeyFlag.LRControl | KeyFlag.Alt | KeyFlag.Shift | KeyFlag.LRMenu, + KeyFlag.LRControl | KeyFlag.Alt | KeyFlag.LRShift | KeyFlag.Menu, + KeyFlag.LRControl | KeyFlag.LRAlt | KeyFlag.Shift | KeyFlag.Menu, + + KeyFlag.Control | KeyFlag.Alt | KeyFlag.Shift | KeyFlag.LRMenu, + KeyFlag.Control | KeyFlag.Alt | KeyFlag.LRShift | KeyFlag.Menu, + KeyFlag.Control | KeyFlag.LRAlt | KeyFlag.Shift | KeyFlag.Menu, + KeyFlag.LRControl | KeyFlag.Alt | KeyFlag.Shift | KeyFlag.Menu, + + KeyFlag.Control | KeyFlag.Alt | KeyFlag.Shift | KeyFlag.Menu + ]; /// Aind action by key, return null if not found Action findByKey(uint keyCode, uint flags) { Accelerator acc; acc.keyCode = keyCode; - acc.keyFlags = flags; - if (acc in _map) - return _map[acc]; + foreach(mask; flagMasks) { + acc.keyFlags = flags & mask; + if (auto p = acc in _map) { + if (p.checkAccelerator(keyCode, flags)) + return *p; + } + } return null; } } @@ -903,7 +929,12 @@ enum KeyFlag : uint { /// Left Menu/Win key is down LMenu = 0x0240, /// Right Menu/Win key is down - RMenu = 0x0140 + RMenu = 0x0140, + + LRControl = LControl | RControl, // both left and right + LRAlt = LAlt | RAlt, // both left and right + LRShift = LShift | RShift, // both left and right + LRMenu = LMenu | RMenu, // both left and right } /// Key code constants for KeyEvent diff --git a/src/dlangui/widgets/editors.d b/src/dlangui/widgets/editors.d index 35fa6add..8b1399ee 100644 --- a/src/dlangui/widgets/editors.d +++ b/src/dlangui/widgets/editors.d @@ -207,8 +207,8 @@ const Action ACTION_EDITOR_SELECT_ALL = (new Action(EditorActions.SelectAll, Key const Action ACTION_EDITOR_TOGGLE_LINE_COMMENT = (new Action(EditorActions.ToggleLineComment, KeyCode.KEY_DIVIDE, KeyFlag.Control)); const Action ACTION_EDITOR_TOGGLE_BLOCK_COMMENT = (new Action(EditorActions.ToggleBlockComment, KeyCode.KEY_DIVIDE, KeyFlag.Control | KeyFlag.Shift)); const Action ACTION_EDITOR_TOGGLE_BOOKMARK = (new Action(EditorActions.ToggleBookmark, "ACTION_EDITOR_TOGGLE_BOOKMARK"c, null, KeyCode.KEY_B, KeyFlag.Control | KeyFlag.Shift)); -const Action ACTION_EDITOR_GOTO_NEXT_BOOKMARK = (new Action(EditorActions.GoToNextBookmark, "ACTION_EDITOR_GOTO_NEXT_BOOKMARK"c, null, KeyCode.DOWN, KeyFlag.Control | KeyFlag.Shift)); -const Action ACTION_EDITOR_GOTO_PREVIOUS_BOOKMARK = (new Action(EditorActions.GoToPreviousBookmark, "ACTION_EDITOR_GOTO_PREVIOUS_BOOKMARK"c, null, KeyCode.UP, KeyFlag.Control | KeyFlag.Shift)); +const Action ACTION_EDITOR_GOTO_NEXT_BOOKMARK = (new Action(EditorActions.GoToNextBookmark, "ACTION_EDITOR_GOTO_NEXT_BOOKMARK"c, null, KeyCode.DOWN, KeyFlag.Control | KeyFlag.Shift | KeyFlag.Alt)); +const Action ACTION_EDITOR_GOTO_PREVIOUS_BOOKMARK = (new Action(EditorActions.GoToPreviousBookmark, "ACTION_EDITOR_GOTO_PREVIOUS_BOOKMARK"c, null, KeyCode.UP, KeyFlag.Control | KeyFlag.Shift | KeyFlag.Alt)); const Action ACTION_EDITOR_FIND = (new Action(EditorActions.Find, KeyCode.KEY_F, KeyFlag.Control)); const Action ACTION_EDITOR_REPLACE = (new Action(EditorActions.Replace, KeyCode.KEY_H, KeyFlag.Control));