[PEAK] A quick UI API sketch
Phillip J. Eby
pje at telecommunity.com
Wed Nov 7 20:43:29 EST 2007
This should be somewhat self-explanatory in the light of the previous
post, but some non-obvious points are added below...
class PreviewScope(ui.Scope):
currentDate = ...
def nextDay(self):
...
def previousDay(self):
...
ui.Text[currentDate](
_(u'Preview Date'), _(u'The day to view in the preview area'),
...
)
ui.Action[nextDay](
_(u'Next Day'), _(u'Move forward a day'),
...
)
...
ui.TopMenu['preview_nav'](
_(u'Navigation'), _(u'Navigation menu for the preview area'),
items = [previousDay, nextDay, ...],
...
)
This is sketching a scope with a set of scope-defined features and
presentation options. Specifically, it's all being done inside the
original scope class. For a plugin to extend these features, it
would need to define an AddOn to attach to the scope.
The idea for object references is to use objects as keys or
identifies to uniquely designate a feature. This might be a
CellProperty or an unbound method (i.e. function linked to a class),
for example. Technically, these objects can be *converted* into keys
of some sort; we won't want to use them directly for various ugly
reasons relating to inheritance and overriding. But as long as the
key can be generated *from* the object, we can use the objects in the
API. A plugin can import the scope it wants to extend, for example,
and refer to e.g. ``PreviewScope.currentDate`` in order to look
something up by that key.
The idea with the various things like ``ui.Text[foo]`` is that
feature and CA types can be subscripted by an object to return a
registration factory for an instance of that type. You then call the
factory with whatever arguments are relevant, in order to register
construction data, that will be used at Scope creation time to add
the actual feature or CA instances.
There's still a lot to flesh out here, but this seems like a step in
the right direction. Notice, by the way, that CA groupings are done
via a path string key instead of an object key; this makes it
somewhat more practical to have plugins contribute to a shared menu
that neither one defined.
More information about the PEAK
mailing list