The Zandalar project
The Zandalar Project is a codename for the new Input archtecture and GUI navigation features.
Input Aggregator & events
Use Cases
The use cases are described by steps. For each step there might be some actions done at different levels:
- Raw input = the data that comes directly from the input system the application is using (OIS, glfw, etc.).
- Input Injection = the `InjectedInputReceiver`-ish function called with the right parameters
- For backwards compatibility-ish, we can persist the same interface(InjectedInputReceiver), but provide in it a default implementation that generates the input events for the current interface's functions.
- InputEvent = the `InputEvent` type generated from the injected input. This is the final step, and this is fed to the CEGUI library.
Clicking a button using a mouse
Step description | Raw input | Input Injection | InputEvent fed to CEGUI |
---|---|---|---|
Move the mouse over the button | Mouse movement | injectMouseMove/injectMousePosition | MovementInputEvent |
Press the LMB | Mouse button press | injectMouseButtonDown(LMB) | PressedButtonInputEvent(Mouse_LMB) |
Release the LMB | Mouse button release | injectMouseButtonUp(LMB) | ReleasedButtonInputEvent(Mouse_LMB) |
The button is clicked (Click event is triggered) | N/A | N/A | N/A |
Clicking/activating a button using the keyboard (new feature)
Step description | Raw input | Input Injection | InputEvent fed to CEGUI |
---|---|---|---|
Focus the button | Uses the use case "Focus a button using the keyboard/gamepad" | ||
Press the ENTER key (1) | Key Button press | injectKeyDown(Enter) | PressedButtonInputEvent(Keyb_Enter) |
Release the ENTER key | Key Button release | injectKeyUp(Enter) | ReleasedButtonInputEvent(Keyb_Enter) |
The button is clicked (Click event is triggered) | N/A | N/A | N/A |
(1) the key will be defined as per the NavigationStrategy (GUINavigation project part). If there is no such key defined, the event will be ignored.
Clicking/activating a button using a gamepad
The same as previous Clicking/activating a button using the keyboard, but with the difference that it uses a Gamepad button instead of a Keyboard one.
Type text into a textbox
Step description | Raw input | Input Injection | InputEvent fed to CEGUI |
---|---|---|---|
Focus the textbox | Uses the use case "Focus a textbox using the keyboard/gamepad" | ||
Press a character key | Char press | injectChar(chr) | TextInputEvent(chr) |
Press a non-character key | Key Button press | injectKeyDown(key) | PressedButtonInputEvent(Keyb_key) |
Release a non-character key | Key Button release | injectKeyUp(key) | ReleasedButtonInputEvent(Keyb_key |
Scroll horizontally with the mouse wheel
Step description | Raw input | Input Injection | InputEvent fed to CEGUI |
---|---|---|---|
Rotate the wheel | Wheel rotation delta | injectMouseWheelChange(delta) | ScrollInputEvent(direction, delta) |
Proposed design
Events
For start, the following events will cover all existing functions in the 'InjectedInputReceiver' interface:
Input Event name | Data | Functions covered |
---|---|---|
MovementInputEvent |
|
|
PressedButtonInputEvent |
|
|
ReleasedButtonInputEvent |
|
|
ActivatedInputEvent |
|
|
TextInputEvent |
|
|
ScrollInputEvent |
|
|
Unmapped (yet) functions:
- injectMouseLeaves
Use cases
Focus a button using the keyboard/gamepad
Just calling focus()
Prerequisite: first control in the current window is focused; navigation is configured.
- Pressed("Tab") = focus next ("next")
- Pressed("CTRL + Tab") = focus previous ("previous")
Steps:
- Press `Tab`
- The next control is focused.
Prerequisite: first control in the current window is focused; navigation is configured:
- Pressed("left") = go left ("left")
- Pressed("right") = go left ("right")
- Pressed("top") = go left ("top")
- Pressed("up") = go left ("up")
- ^The same items but with the gamepad's D-Pad configuration instead of the keys
Steps
- Press a configured key/gamepad button.
- The control in the specified direction is focused.