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)); buf ~= toUTF32(keyName(keyCode));
} else { } 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+"; 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+"; 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+"; 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)); buf ~= toUTF32(keyName(keyCode));
} }
return cast(dstring)buf; return cast(dstring)buf;
} }
/// Serializes accelerator text description /// Serializes accelerator text description
@property string toString() const { @property string toString() const {
char[] buf; 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+"; 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+"; 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+"; 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 ~= "Menu+";
buf ~= keyName(keyCode); buf ~= keyName(keyCode);
return cast(string)buf; return cast(string)buf;
@ -91,21 +146,61 @@ struct Accelerator {
s = s[5 .. $]; s = s[5 .. $];
flagFound = true; 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+")) { if (s.startsWith("Alt+")) {
keyFlags |= KeyFlag.Alt; keyFlags |= KeyFlag.Alt;
s = s[4 .. $]; s = s[4 .. $];
flagFound = true; 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+")) { if (s.startsWith("Shift+")) {
keyFlags |= KeyFlag.Shift; keyFlags |= KeyFlag.Shift;
s = s[6 .. $]; s = s[6 .. $];
flagFound = true; 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+")) { if (s.startsWith("Menu+")) {
keyFlags |= KeyFlag.Menu; keyFlags |= KeyFlag.Menu;
s = s[5 .. $]; s = s[5 .. $];
flagFound = true; 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) if (!flagFound)
break; break;
s = s.strip; s = s.strip;

View File

@ -162,8 +162,16 @@ struct EmbeddedResourceList {
__gshared EmbeddedResourceList 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)() { EmbeddedResource[] embedResource(string resourceName)() {
version (USE_FULL_PATH_FOR_RESOURCES) {
immutable string name = resourceName;
} else {
immutable string name = baseName(resourceName); immutable string name = baseName(resourceName);
}
static if (name.length > 0) { static if (name.length > 0) {
immutable ubyte[] data = cast(immutable ubyte[])import(name); immutable ubyte[] data = cast(immutable ubyte[])import(name);
static if (data.length > 0) 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, 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_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_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 /// base for all editor widgets
@ -483,8 +484,10 @@ class EditWidgetBase : ScrollWidgetBase, EditableContentListener, MenuItemAction
acceleratorMap.add( [ acceleratorMap.add( [
new Action(EditorActions.Up, KeyCode.UP, 0), new Action(EditorActions.Up, KeyCode.UP, 0),
new Action(EditorActions.SelectUp, KeyCode.UP, KeyFlag.Shift), 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.Down, KeyCode.DOWN, 0),
new Action(EditorActions.SelectDown, KeyCode.DOWN, KeyFlag.Shift), 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.Left, KeyCode.LEFT, 0),
new Action(EditorActions.SelectLeft, KeyCode.LEFT, KeyFlag.Shift), new Action(EditorActions.SelectLeft, KeyCode.LEFT, KeyFlag.Shift),
new Action(EditorActions.Right, KeyCode.RIGHT, 0), 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) { override bool onKey(Widget source, KeyEvent event) {
if (event.action == KeyAction.KeyDown) { 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) { if (action !is null) {
return handleAction(action); return handleAction(action);
} }

View File

@ -1113,8 +1113,10 @@ public:
if (keyEvent.assigned && keyEvent(this, event)) if (keyEvent.assigned && keyEvent(this, event))
return true; // processed by external handler return true; // processed by external handler
if (event.action == KeyAction.KeyDown) { 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) { if (action !is null) {
Log.d("Action found: ", action.id, " ", action.labelValue.id);
return dispatchAction(action); return dispatchAction(action);
} }
} }