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.