From bc255862237e9f6601c5e4e4deefede7f67ed263 Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Wed, 18 May 2016 09:33:16 +0300 Subject: [PATCH] fix for issue #261 -- better matching of key flags, better accelerator handling --- src/dlangui/core/events.d | 109 +++++++++++++++++++++++++++++-- src/dlangui/graphics/resources.d | 10 ++- src/dlangui/widgets/editors.d | 5 +- src/dlangui/widgets/tree.d | 2 +- src/dlangui/widgets/widget.d | 4 +- 5 files changed, 119 insertions(+), 11 deletions(-) diff --git a/src/dlangui/core/events.d b/src/dlangui/core/events.d index 5a2026b6..89f9a815 100644 --- a/src/dlangui/core/events.d +++ b/src/dlangui/core/events.d @@ -55,26 +55,81 @@ struct Accelerator { } buf ~= toUTF32(keyName(keyCode)); } else { - if (keyFlags & KeyFlag.Control) + if ((keyFlags & KeyFlag.LControl) == KeyFlag.LControl && (keyFlags & KeyFlag.RControl) == KeyFlag.RControl) + buf ~= "LCtrl+RCtrl+"; + else if ((keyFlags & KeyFlag.LControl) == KeyFlag.LControl) + buf ~= "LCtrl+"; + else if ((keyFlags & KeyFlag.RControl) == KeyFlag.RControl) + buf ~= "RCtrl+"; + else if (keyFlags & KeyFlag.Control) buf ~= "Ctrl+"; - if (keyFlags & KeyFlag.Alt) + if ((keyFlags & KeyFlag.LAlt) == KeyFlag.LAlt && (keyFlags & KeyFlag.RAlt) == KeyFlag.RAlt) + buf ~= "LAlt+RAlt+"; + else if ((keyFlags & KeyFlag.LAlt) == KeyFlag.LAlt) + buf ~= "LAlt+"; + else if ((keyFlags & KeyFlag.RAlt) == KeyFlag.RAlt) + buf ~= "RAlt+"; + else if (keyFlags & KeyFlag.Alt) buf ~= "Alt+"; - if (keyFlags & KeyFlag.Shift) + if ((keyFlags & KeyFlag.LShift) == KeyFlag.LShift && (keyFlags & KeyFlag.RShift) == KeyFlag.RShift) + buf ~= "LShift+RShift+"; + else if ((keyFlags & KeyFlag.LShift) == KeyFlag.LShift) + buf ~= "LShift+"; + else if ((keyFlags & KeyFlag.RShift) == KeyFlag.RShift) + buf ~= "RShift+"; + else if (keyFlags & KeyFlag.Shift) buf ~= "Shift+"; + if ((keyFlags & KeyFlag.LMenu) == KeyFlag.LMenu && (keyFlags & KeyFlag.RMenu) == KeyFlag.RMenu) + buf ~= "LMenu+RMenu+"; + else if ((keyFlags & KeyFlag.LMenu) == KeyFlag.LMenu) + buf ~= "LMenu+"; + else if ((keyFlags & KeyFlag.RMenu) == KeyFlag.RMenu) + buf ~= "RMenu+"; + else if (keyFlags & KeyFlag.Menu) + buf ~= "Menu+"; buf ~= toUTF32(keyName(keyCode)); } return cast(dstring)buf; } + /// Serializes accelerator text description @property string toString() const { char[] buf; - if (keyFlags & KeyFlag.Control) + // ctrl + if ((keyFlags & KeyFlag.LControl) == KeyFlag.LControl && (keyFlags & KeyFlag.RControl) == KeyFlag.RControl) + buf ~= "LCtrl+RCtrl+"; + else if ((keyFlags & KeyFlag.LControl) == KeyFlag.LControl) + buf ~= "LCtrl+"; + else if ((keyFlags & KeyFlag.RControl) == KeyFlag.RControl) + buf ~= "RCtrl+"; + else if (keyFlags & KeyFlag.Control) buf ~= "Ctrl+"; - if (keyFlags & KeyFlag.Alt) + // alt + if ((keyFlags & KeyFlag.LAlt) == KeyFlag.LAlt && (keyFlags & KeyFlag.RAlt) == KeyFlag.RAlt) + buf ~= "LAlt+RAlt+"; + else if ((keyFlags & KeyFlag.LAlt) == KeyFlag.LAlt) + buf ~= "LAlt+"; + else if ((keyFlags & KeyFlag.RAlt) == KeyFlag.RAlt) + buf ~= "RAlt+"; + else if (keyFlags & KeyFlag.Alt) buf ~= "Alt+"; - if (keyFlags & KeyFlag.Shift) + // shift + if ((keyFlags & KeyFlag.LShift) == KeyFlag.LShift && (keyFlags & KeyFlag.RShift) == KeyFlag.RShift) + buf ~= "LShift+RShift+"; + else if ((keyFlags & KeyFlag.LShift) == KeyFlag.LShift) + buf ~= "LShift+"; + else if ((keyFlags & KeyFlag.RShift) == KeyFlag.RShift) + buf ~= "RShift+"; + else if (keyFlags & KeyFlag.Shift) buf ~= "Shift+"; - if (keyFlags & KeyFlag.Menu) + // menu + if ((keyFlags & KeyFlag.LMenu) == KeyFlag.LMenu && (keyFlags & KeyFlag.RMenu) == KeyFlag.RMenu) + buf ~= "LMenu+RMenu+"; + else if ((keyFlags & KeyFlag.LMenu) == KeyFlag.LMenu) + buf ~= "LMenu+"; + else if ((keyFlags & KeyFlag.RMenu) == KeyFlag.RMenu) + buf ~= "RMenu+"; + else if (keyFlags & KeyFlag.Menu) buf ~= "Menu+"; buf ~= keyName(keyCode); return cast(string)buf; @@ -91,21 +146,61 @@ struct Accelerator { s = s[5 .. $]; flagFound = true; } + if (s.startsWith("LCtrl+")) { + keyFlags |= KeyFlag.LControl; + s = s[5 .. $]; + flagFound = true; + } + if (s.startsWith("RCtrl+")) { + keyFlags |= KeyFlag.RControl; + s = s[5 .. $]; + flagFound = true; + } if (s.startsWith("Alt+")) { keyFlags |= KeyFlag.Alt; s = s[4 .. $]; flagFound = true; } + if (s.startsWith("LAlt+")) { + keyFlags |= KeyFlag.LAlt; + s = s[4 .. $]; + flagFound = true; + } + if (s.startsWith("RAlt+")) { + keyFlags |= KeyFlag.RAlt; + s = s[4 .. $]; + flagFound = true; + } if (s.startsWith("Shift+")) { keyFlags |= KeyFlag.Shift; s = s[6 .. $]; flagFound = true; } + if (s.startsWith("LShift+")) { + keyFlags |= KeyFlag.LShift; + s = s[6 .. $]; + flagFound = true; + } + if (s.startsWith("RShift+")) { + keyFlags |= KeyFlag.RShift; + s = s[6 .. $]; + flagFound = true; + } if (s.startsWith("Menu+")) { keyFlags |= KeyFlag.Menu; s = s[5 .. $]; flagFound = true; } + if (s.startsWith("LMenu+")) { + keyFlags |= KeyFlag.LMenu; + s = s[5 .. $]; + flagFound = true; + } + if (s.startsWith("RMenu+")) { + keyFlags |= KeyFlag.RMenu; + s = s[5 .. $]; + flagFound = true; + } if (!flagFound) break; s = s.strip; diff --git a/src/dlangui/graphics/resources.d b/src/dlangui/graphics/resources.d index fa2d83d9..990b74d1 100644 --- a/src/dlangui/graphics/resources.d +++ b/src/dlangui/graphics/resources.d @@ -162,8 +162,16 @@ struct EmbeddedResourceList { __gshared EmbeddedResourceList embeddedResourceList; +// immutable string test_res = import("res/background.xml"); +// Unfortunately, import with full pathes does not work on Windows +// version = USE_FULL_PATH_FOR_RESOURCES; + EmbeddedResource[] embedResource(string resourceName)() { - immutable string name = baseName(resourceName); + version (USE_FULL_PATH_FOR_RESOURCES) { + immutable string name = resourceName; + } else { + immutable string name = baseName(resourceName); + } static if (name.length > 0) { immutable ubyte[] data = cast(immutable ubyte[])import(name); static if (data.length > 0) diff --git a/src/dlangui/widgets/editors.d b/src/dlangui/widgets/editors.d index b73ff480..35fa6add 100644 --- a/src/dlangui/widgets/editors.d +++ b/src/dlangui/widgets/editors.d @@ -215,7 +215,8 @@ const Action ACTION_EDITOR_REPLACE = (new Action(EditorActions.Replace, KeyCode. const Action[] STD_EDITOR_ACTIONS = [ACTION_EDITOR_INSERT_NEW_LINE, ACTION_EDITOR_PREPEND_NEW_LINE, ACTION_EDITOR_APPEND_NEW_LINE, ACTION_EDITOR_DELETE_LINE, ACTION_EDITOR_TOGGLE_REPLACE_MODE, ACTION_EDITOR_SELECT_ALL, ACTION_EDITOR_TOGGLE_LINE_COMMENT, ACTION_EDITOR_TOGGLE_BLOCK_COMMENT, - ACTION_EDITOR_TOGGLE_BOOKMARK, ACTION_EDITOR_GOTO_NEXT_BOOKMARK, ACTION_EDITOR_GOTO_PREVIOUS_BOOKMARK + ACTION_EDITOR_TOGGLE_BOOKMARK, ACTION_EDITOR_GOTO_NEXT_BOOKMARK, ACTION_EDITOR_GOTO_PREVIOUS_BOOKMARK, + ]; /// base for all editor widgets @@ -483,8 +484,10 @@ class EditWidgetBase : ScrollWidgetBase, EditableContentListener, MenuItemAction acceleratorMap.add( [ new Action(EditorActions.Up, KeyCode.UP, 0), new Action(EditorActions.SelectUp, KeyCode.UP, KeyFlag.Shift), + new Action(EditorActions.SelectUp, KeyCode.UP, KeyFlag.Control | KeyFlag.Shift), new Action(EditorActions.Down, KeyCode.DOWN, 0), new Action(EditorActions.SelectDown, KeyCode.DOWN, KeyFlag.Shift), + new Action(EditorActions.SelectDown, KeyCode.DOWN, KeyFlag.Control | KeyFlag.Shift), new Action(EditorActions.Left, KeyCode.LEFT, 0), new Action(EditorActions.SelectLeft, KeyCode.LEFT, KeyFlag.Shift), new Action(EditorActions.Right, KeyCode.RIGHT, 0), diff --git a/src/dlangui/widgets/tree.d b/src/dlangui/widgets/tree.d index c4a696b8..21bced70 100644 --- a/src/dlangui/widgets/tree.d +++ b/src/dlangui/widgets/tree.d @@ -765,7 +765,7 @@ class TreeWidgetBase : ScrollWidget, OnTreeContentChangeListener, OnTreeStateCh override bool onKey(Widget source, KeyEvent event) { if (event.action == KeyAction.KeyDown) { - Action action = findKeyAction(event.keyCode, event.flags & (KeyFlag.Shift | KeyFlag.Alt | KeyFlag.Control)); + Action action = findKeyAction(event.keyCode, event.flags); // & (KeyFlag.Shift | KeyFlag.Alt | KeyFlag.Control) if (action !is null) { return handleAction(action); } diff --git a/src/dlangui/widgets/widget.d b/src/dlangui/widgets/widget.d index 2568d802..d006cc37 100644 --- a/src/dlangui/widgets/widget.d +++ b/src/dlangui/widgets/widget.d @@ -1113,8 +1113,10 @@ public: if (keyEvent.assigned && keyEvent(this, event)) return true; // processed by external handler if (event.action == KeyAction.KeyDown) { - Action action = findKeyAction(event.keyCode, event.flags & (KeyFlag.Shift | KeyFlag.Alt | KeyFlag.Control | KeyFlag.Menu)); + Log.d("Find key action for key = ", event.keyCode, " flags=", event.flags); + Action action = findKeyAction(event.keyCode, event.flags); // & (KeyFlag.Shift | KeyFlag.Alt | KeyFlag.Control | KeyFlag.Menu) if (action !is null) { + Log.d("Action found: ", action.id, " ", action.labelValue.id); return dispatchAction(action); } }