All Orca TODO's are maintained as RFE's and bugs in the GNOME bugzilla
database:  http://bugzilla.gnome.org/buglist.cgi?query=product%3Aorca

Roadmap for Plugin Based Orca:
# Stage 1 (ALL DONE)
- (DONE): implement Plugin System Manager what handles all our plugin stuff
- (DONE): migrate some example plugins
    -- (DONE): Clipboard
    -- (DONE): Preferences
    -- (DONE): SelfVoice
    -- (DONE): Time
    -- (DONE): Date
    -- (DONE): MouseReview
    -- (DONE): HelloOrca
    -- (DONE): ByeOrca
    -- (DONE): HelloWorld
- (DONE): implement a base plugin class to have an unify Plugin API
- (DONE): Dynamic API Manager to let plugins register its own bits of functionality for global usage (also used for compatibiltiy)
- (DONE): initial "orca" class to hold all of orcas API. so we can easy share it with plugins
- (DONE): create a basic plugin manager:
    -- (DONE): install
    -- (DONE): uninstall
    -- (DONE): activate plugins
    -- (DONE): details
- (DONE): compatibiltiy: 
    -- (DONE): ability to register shortcuts in current structure
    -- (DONE): place current objects in Dynamic API Manager
    -- (DONE): use existing settings to store plugin activ states

# Stage 2 (ALL DONE)
- (DONE): Translation API: Plugins store its own translation. we should provide an unify way to consume it. maybe implemented into plugin.plugin?
    -- (DONE): plugins can bring its own translations
    -- (DONE): plugins can use orcas build in translations
- (DONE): Orca should track by Plugins registered stuff like 
    -- (DONE): gestures
    -- (DONE): event subscription
    -- (DONE): signals
    -- (DONE): api
- (DONE): Orca should unregister the by the Plugins registered stuff by itself on unload
    -- (DONE): gestures
    -- (DONE): event subscription
    -- (DONE): signals
    -- (DONE): api
- (DONE):
    -- (DONE): allow None context (orca core)
    -- (DONE): improve API
- (DONE): Dont trust plugins, hardening core against crashes in callbacks
    -- (DONE): gestures
    -- (DONE): event subscription
- (DONE): ability to call code while plugin un-/ installation
    -- (DONE): onPostInstall
    -- (DONE): onPreUninstall

# Stage 3 (TODO):
- (WIP): Create an clean "orca" class and object based API
- (TODO): create useful signals
- (WIP): cleanup as much as possible
- register per application shortcuts
- register per profile shortcuts
- (TODO): Bugfixing and hardening
    -- Unregister bindings on unload plugin
    -- (TODO): compatibiltiy registered shortcuts do not unregister properly
- (TODO): keyboard / gesture duplication check (for new and old way)
- (TODO): Release :)

# Stage 4 (TODO)
- (TODO): Per Plugin settings: Plugins come along with its own settings (structure, defaults). We need an unify API to. The Settings are handled by Gsettings instead of JSON:
    -- (DONE): basic gsetting handling
    -- (DONE): profile management (global settings)
    -- (DONE): use gsettings in plugin manager
    -- (TODO): resource manager integration
    -- (TODO): install (along with the plugin)
    -- (TODO): uninstall (along with the plugin)
    -- (TODO): upgrade
    -- (WIP): load
    -- (WIP): save
    -- (TODO): reset
    -- (TODO): check compatibiltiy
    -- (WIP): scope: profiles
    -- (WIP): scope: per application
- (TODO): generic preferences GUI
    -- (TODO): List based
    -- (TODO): generic
        --- (TODO): default
            ---- (TODO): Radio Buttons
            ---- (TODO): Menu Buttons
            ---- (TODO): Booleans
            ---- (TODO): Integer Min / Max
            ---- (TODO): slider
        --- (TODO): custom
            ---- (TODO): any embedded widget / subform / table
        --- (TODO): # other
            ---- (TODO): dependency value for simple enable / disable
    -- (TODO): agnostic to installed plugins
    -- (TODO): searchable
    -- (TODO): set values
    -- (TODO): reset to default value
    -- (TODO): load
    -- (TODO): save
    -- (TODO): export
    -- (TODO): import
    -- (TODO): keyboard
    -- (TODO): punctuation
    -- (TODO): scope: global
    -- (TODO): scope: profiles
    -- (TODO): scope: per application
# Documentation:
- https://git.launchpad.net/ubuntu/+source/gnome-orca/commit/?h=applied/ubuntu/bionic&id=b2d49a3f250881eff036b1ebfc97148fe94acf75
- https://www.micahcarrick.com/gsettings-python-gnome-3.html
- https://stackoverflow.com/questions/24407025/how-do-i-use-g-settings-schema-get-key-from-python
- https://encarsia.github.io/posts/gsettings/
- http://zderadicka.eu/gsettings-flexible-configuration-system/
- https://qastack.com.de/ubuntu/251712/how-can-i-install-a-gsettings-schema-without-root-privileges
- https://docs.gtk.org/glib/gvariant-format-strings.html
- https://awebablog.wordpress.com/2017/12/16/session-5-part-1-gtk_with_python/
- https://valadoc.org/gtk+-3.0/Gtk.ListBox.html

# Final Stage 5 (TODO)
- (WIP): Create an clean "orca" class and object based API
- (TODO): create useful signals
- (TODO): Remove compatibiltiy layers
- (WIP): cleanup as much as possible
- (WIP): move all parts into plugins
    -- (TODO): Move source into Plugins
    -- (TODO): Move Settings into Plugins
    -- (TODO): Move Translation into Plugins
- (TODO): Bugfixing and hardening
- (TODO): Release :)

Known Bugs:
- (DONE) PluginManager is not translated on first start
- (DONE) Plugins enable / disable state not stored without manuall add setting to user-settings.conf: "activePlugins": [],
- (DONE) Profile selector does not open at preferences page
- (DONE) ByeOrca is not announced
- (DONE) Plugins without compatibiltiy bindings -> shortcut is not consumed | this is currently a bug in master | use plugin_system_old_keyboard branch what reverts the broken commit of master: https://github.com/chrys87/orca-plugin/tree/plugin_system_old_keyboard 

Build:
NOCONFIGURE=1 ./autogen.sh
./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var
make
sudo make install

Plguin readme:

Translation
# read text from python file
xgettext -d TranslationTest -o TranslationTest.pot ../TranslationTest.py
# copy .pot to .po
# compile to mo
msgfmt -o TranslationTest.mo TranslationTest

gsettings
glib-compile-schemas /path/to/schema/files/