Attached is a patch that is a first stab at 4 -- uses a lot of templating to get things done, which isn't ideal.
This speeds up opening up editor and environment settings a bit on slow systems, but there is more to do in terms of the parts of the config that aren't supplied by plugins. The idea would be to break up the XRC into chunks that can be instantiated in pieces. I didn't mess with Project dialogs, they seem to open quickly enough even on slow systems. Most things still work fine. The dialogs will occasionally resize as you click on configs with big panels that haven't been opened yet, which looks a bit weird and could be remedied with size hints. BrowseTracker's config panel is screwed up for some reason. Shouldn't be difficult to fix.
In the end I'm not sure the performance is worth the pain, but I do have a good handle on how the config system works now, which will help implementing the other items on the list.
I do get an assertion on exit:
(codeblocks:9081): GLib-GObject-WARNING **: invalid uninstantiatable type `<invalid>' in cast to `GtkRadioMenuItem'
(codeblocks:9081): Gtk-CRITICAL **: IA__gtk_radio_menu_item_get_group: assertion `GTK_IS_RADIO_MENU_ITEM (radio_menu_item)' failed
(codeblocks:9081): GLib-GObject-WARNING **: invalid uninstantiatable type `<invalid>' in cast to `GtkRadioMenuItem'
(codeblocks:9081): Gtk-CRITICAL **: IA__gtk_radio_menu_item_get_group: assertion `GTK_IS_RADIO_MENU_ITEM (radio_menu_item)' failed
Aborted (core dumped)
Don't have time to check whether my changes caused this.
The big challenge will be #5 on my list. If settings change outside of the config (e.g. list of mimetypehandlers is modified when you double click on new file types in the project tree), the config will need to be notified if it is opened.
I plan to take a break from coding for a week or so, so won't be very active here.
[attachment deleted by admin]