fix for issue #261 -- better matching of key flags, better accelerator handling

This commit is contained in:
Vadim Lopatin 2016-05-18 09:33:16 +03:00
parent ac4593b8f9
commit bc25586223
5 changed files with 119 additions and 11 deletions

View File

@ -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;

View File

@ -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)() {
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)

View File

@ -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),

View File

@ -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);
}

View File

@ -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);
}
}