Moving through every focusable widget by tab/shift-tab is very slow. This commit introduces the concept of groups--widgets that can be skipped through via ctrl-tab/ctrl-shift-tab.
Right now this only includes containers where all children are focusable, but I'll expand the definition of groups over time to make navingating to large areas of the UI easier..
When we unfocus, wait a second. If we don't have focus after the timer elapses, warp the mouse to the global coordinates.
This seems to restore some semblance of focus whenever it is unset, while not breaking the case where a focus is set and the mouse suddenly jumps, thus changing the focus again.
Here I add a `ScreenReader` `Node` which, when added to the `SceneTree`, should read the contents of any supported `Control`. I also do a bit of cleanup on filenames, as well as breaking the editor plugin support into its own class.
* It was the mouse warping, not the grabbing of focus, that caused keyboard traversal issues. Now we only mouse-warp prior to simulating a right-click via Menu.
* Despite what the docs say, `id_focused` seems to pass an index, not an ID. Now popup menu items speak more accurately.
I'm not immediately sure how to present multiple tree selections. I also don't know if I can control selection status from the input events. So, for the time being, we force a single row to be selected. This isn't the most ideal solution, but it makes debugging other issues easier, so I'll use it for now to unblock other work.
* Use new TTS.gd script rather than loading directly. TTS.gd gives us flexibility to handle TTS with the native Rust plugin on some platforms, something like a Java module under Android, etc.
* Make `Panel` focusable. This handles the case where exiting a game from the editor places focus on an element without focus, thus breaking keyboard navigation.
* Log when we attempt to grab focus so I can debug cases where focus tries to go somewhere it can't.
* Concatenate tokens then join them, rather than building up strings token by token and conditionally presenting them.
* Present `hint_tooltip` in lieu of text in some cases, and don't present it again afterwards.
* Add an action to autoclose the dialog for setting keybindings after 5 seconds, thus allowing capturing keys to attach to actions.
* Remove "Hello, world." from global script and move it into player.
* Add commands to speak coordinates, headings, and to stop speech.
* Add Quit command.
* Announce new screen on change.
* Other minor cleanups.
* Added method to simulate left mouse-clicks for items with no keyboard accessibility.
* Add ability to expand `EditorInspectorSection` to get at the properties contained therein via simulated mouse-click.
* Added method for selecting tree columns.
* Added mechanism to switch between buttons in columns using Home/End.
* Use custom `TreeItem.get_button_tooltip(...)` getter to retrieve tooltips for buttons in columns.
* Send correct signal when button is pressed.
* Other minor improvements.
Current features include:
* A global script that initializes the TTS extension and speaks "Hello, world."
* A player Area2D node.
Once this plugin gains more features, the basic game will be removed, and it will be built in the context of actual production games.