mirror of https://github.com/buggins/dlangui.git
fix for issue #261 -- better matching of key flags, better accelerator handling
This commit is contained in:
parent
ac4593b8f9
commit
bc25586223
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue