[Openmcl-devel] Lisp User Interface LUI
Terje Norderhaug
terje at in-progress.com
Sat Jan 10 17:35:24 PST 2009
On Jan 9, 2009, at 11:05 PM, Alexander Repenning wrote:
>> Processing this information, the user interface engine can build
>> the same window as the original "OpenGL 3D" application-window
>> XMLisp template.
>
> I think one could do this with X-expression transformers.
Such as XSLT. But the examples I have presented are not meant to
require the interface designer to define how to perform the
transformation from layout + stylesheet to the equivalent of the
XMLisp template.
Consider your "Currency Converter" XMLisp template (see below) and
compare it to the equivalent layout and stylesheet. An XMLlisp parser
should be able to build the same structure as the template by
applying its own generalized transformation to the layout and
stylesheet: For each element in the layout that matches the select
pattern of a style, add the remaining attributes of the style.
For example, when loading the layout, the XML parser may read the
layout element starting with <row>. Applying the stylesheet, it finds
that the <style select="row" align="stretch" minimize="vertical"
valign="bottom"/> has a select that matches the row element, and
continues to add the attributes of the style (minus the select) to
the <row> start tag. The result is <row align="stretch"
minimize="vertical" valign="bottom"> which is the same as in your
XMLlisp template.
In conclusion, a minor change to the XMLisp processor would allow
user interface templates to be split into layouts and stylesheets,
with associated benefits.
-- Terje Norderhaug
>>> <application-window title="Currency Converter" width="300"
>>> height="180">
>>> <column align="stretch" valign="stretch" padding="9">
>>> <row align="stretch" minimize="vertical" valign="bottom">
>>> <label text="Exchange Rate per $1:" align="right" flex="2"/>
>>> <editable-number name="rate" text="1.0" flex="1"/>
>>> </row>
>>> <row align="stretch" minimize="vertical" valign="bottom">
>>> <label text="Dollars to Convert:" align="right" flex="2"/>
>>> <editable-number name="dollars" text="1.0" flex="1"/>
>>> </row>
>>> <row align="stretch" minimize="vertical" valign="bottom">
>>> <label text="Amount in the other Currency:" align="right"
>>> flex="2"/>
>>> <editable-number name="amount" text="1.0" flex="1"/>
>>> </row>
>>> <row align="right" valign="bottom" vflex="1">
>>> <button text="Convert" action="convert-currency-action"
>>> default-button="true"/>
>>> </row>
>>> </column>
>>> </application-window>
>>>
>>> This can be split into two parts, first layout:
>>>
>>> <application-window title="Currency Converter" >
>>> <column>
>>> <row>
>>> <label text="Exchange Rate per $1:" />
>>> <editable-number name="rate"/>
>>> </row>
>>> <row>
>>> <label text="Dollars to Convert:"/>
>>> <editable-number name="dollars" />
>>> </row>
>>> <row>
>>> <label text="Amount in the other Currency:" />
>>> <editable-number name="amount""/>
>>> </row>
>>> <row class="convert">
>>> <button text="Convert" action="convert-currency-action"/>
>>> </row>
>>> </column>
>>> </application-window>
>>>
>>> Here is an example of what a style sheet could look like that
>>> combined with the layout would produce the same result as the
>>> original example:
>>>
>>> <style select="application-window" width="300" height="180"/>
>>> <style select="column" align="stretch" valign="stretch"
>>> padding="9"/>
>>> <style select="row" align="stretch" minimize="vertical"
>>> valign="bottom"/>
>>> <style select="row.convert" align="right" valign="bottom"
>>> vflex="1"/>
>>> <style select="label" align="right" flex="2"/>
>>> <style select="editable-number" text="1.0 flex="1"/>
>>> <style select="row.convert button" default-button="true"/>
>>>
>>> End users (and others) can now customize the presentation style
>>> of the window by adding a (separate) stylesheet containing the
>>> styles they want to be different.
More information about the Openmcl-devel
mailing list