Difference between revisions of "The Zandalar project"
m |
|||
Line 63: | Line 63: | ||
| Rotate the wheel || Wheel rotation delta || injectMouseWheelChange(delta) || ScrollInputEvent(direction, delta) | | Rotate the wheel || Wheel rotation delta || injectMouseWheelChange(delta) || ScrollInputEvent(direction, delta) | ||
|} | |} | ||
− | |||
− | |||
− | |||
== Proposed design == | == Proposed design == | ||
Line 118: | Line 115: | ||
= GUI navigation = | = GUI navigation = | ||
== Use cases == | == Use cases == | ||
− | === Navigate | + | |
− | Prerequisite: first textbox is focused | + | === Focus a button using the keyboard/gamepad === |
+ | Just calling focus() | ||
+ | |||
+ | === Navigate a form === | ||
+ | Prerequisite: first textbox is focused; navigation is configured. | ||
+ | * Pressed("Tab") = focus next ("next") | ||
+ | * Pressed("CTRL + Tab") = focus previous ("previous") | ||
+ | Steps: | ||
* Press `Tab` | * Press `Tab` | ||
− | * The next textbox is focused | + | * The next control is focused. |
+ | |||
+ | === Navigate a 2D Menu === | ||
+ | Prerequisite: first textbox 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. |
Revision as of 21:48, 9 July 2013
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 textbox 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 textbox 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.