source: iovar/lib/qtui/xhtml.xsl @ 82:0f12c9007739

Last change on this file since 82:0f12c9007739 was 82:0f12c9007739, checked in by Shawn Wilson <shawn@…>, 19 months ago

saw_020317_1 - Add /bin/qtui for easily generating interfaces from QT5 .ui files!

File size: 12.4 KB
Line 
1<?xml version="1.0"?>
2<!--
3     Copyright (C) 2017 Virgo Venture, Inc.
4     @%@~LICENSE~@%@
5-->
6<xsl:stylesheet version="1.0"
7    xmlns="http://www.w3.org/1999/xhtml"
8    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
9    xmlns:xlink="http://www.w3.org/1999/xlink"
10    xmlns:fn="http://www.w3.org/2005/xpath-functions"
11    xmlns:xs="http://www.w3.org/2001/XMLSchema"
12    >
13
14    <xsl:output
15        method="xml"
16        media-type="application/xhtml+xml"
17        doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
18        doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
19        omit-xml-declaration="no"
20        />
21
22    <xsl:template match="/">
23        <xsl:comment>
24
25            Copyright (C) 2017 Virgo Venture, Inc.
26            @%@~LICENSE~@%@
27
28        </xsl:comment>
29        <html>
30            <xsl:apply-templates/>
31        </html>
32    </xsl:template>
33
34    <!--
35         Main template:
36             <ui version="4.0"> ... </ui>
37    -->
38    <xsl:template match="/ui[@version='4.0']">
39        <xsl:variable name="title" select="widget/property[@name='windowTitle']/string"/>
40        <head>
41            <title><xsl:value-of select="$title"/> | qtui</title>
42            <link rel="stylesheet" type="text/css" href="/usr/include/iovar/qtui.css"/>
43        </head>
44        <body>
45            <h1>qtui</h1>
46            <xsl:apply-templates/>
47        </body>
48    </xsl:template>
49
50    <xsl:template match="/*" priority="-1">
51        <head>
52            <title>Error</title>
53        </head>
54        <body>
55            <h1>Error</h1>
56            <xsl:choose>
57                <xsl:when test="/ui">
58                    <code>Unsupported ui file version: <em><xsl:value-of select="@version"/></em></code>
59                </xsl:when>
60                <xsl:otherwise>
61                    <code>Input does not appear to be a QT5 .ui XML tree (expecting &lt;ui&gt; root node): <xsl:value-of select="local-name()"/></code>
62                </xsl:otherwise>
63            </xsl:choose>
64        </body>
65    </xsl:template>
66
67    <xsl:template match="*" priority="-1">
68        <!-- hide everything by default... bring out only what we support in other templates below -->
69    </xsl:template>
70
71
72
73    <!--
74         WIDGETS
75    -->
76
77    <xsl:template match="widget">
78        <div id="{@name}" class="qtui-widget {@class}">
79            <xsl:call-template name="style"/>
80            <xsl:apply-templates/>
81        </div>
82    </xsl:template>
83
84    <xsl:template match="widget[@class='QMainWindow']">
85        <div id="{@name}" class="qtui-widget {@class}">
86            <xsl:call-template name="style"/>
87
88            <xsl:if test="property[@name='windowTitle']">
89                <h2><xsl:value-of select="property[@name='windowTitle']/string"/></h2>
90            </xsl:if>
91
92            <xsl:apply-templates/>
93        </div>
94    </xsl:template>
95
96    <xsl:template match="widget[@class='QDialog']">
97        <div id="{@name}" class="qtui-widget {@class}">
98            <xsl:call-template name="style"/>
99
100            <xsl:if test="property[@name='windowTitle']">
101                <h2><xsl:value-of select="property[@name='windowTitle']/string"/></h2>
102            </xsl:if>
103
104            <xsl:apply-templates/>
105        </div>
106    </xsl:template>
107
108    <xsl:template match="widget[@class='QMenuBar']">
109        <navbar id="{@name}" class="qtui-widget {@class}">
110            <xsl:call-template name="style"/>
111
112            <ul>
113                <xsl:apply-templates/>
114            </ul>
115        </navbar>
116    </xsl:template>
117
118    <xsl:template match="widget[@class='QMenu']">
119        <li id="{@name}" class="qtui-widget {@class}">
120            <xsl:call-template name="style"/>
121
122            <a>
123                <xsl:call-template name="hotkey"><xsl:with-param name="label" select="property[@name='title']/string"/></xsl:call-template>
124            </a>
125
126            <xsl:if test="widget[@class='QMenu'] | addaction">
127                <ul>
128                    <xsl:apply-templates/>
129
130                    <xsl:for-each select="addaction">
131                        <xsl:variable name="name" select="@name"/>
132                        <xsl:variable name="node" select="//action[@name=$name]"/>
133                        <li id="$node/@name" class="qtui-action">
134                            <a>
135                                <xsl:call-template name="hotkey"><xsl:with-param name="label" select="$node/property[@name='text']/string"/></xsl:call-template>
136                            </a>
137                        </li>
138                    </xsl:for-each>
139                </ul>
140            </xsl:if>
141        </li>
142    </xsl:template>
143
144    <xsl:template match="widget[@class='QLabel']">
145        <p id="{@name}" class="qtui-widget {@class}">
146            <xsl:call-template name="style"/>
147            <xsl:value-of select="property[@name='text']/string"/>
148        </p>
149    </xsl:template>
150
151    <xsl:template match="widget[@class='QPushButton']">
152        <button id="{@name}" class="qtui-widget {@class}">
153            <xsl:call-template name="style"/>
154            <xsl:value-of select="property[@name='text']/string"/>
155        </button>
156    </xsl:template>
157
158    <xsl:template match="widget[@class='QListWidget']">
159        <select id="{@name}" class="qtui-widget {@class}" size="5">
160            <xsl:call-template name="style"/>
161        </select>
162    </xsl:template>
163
164    <xsl:template match="widget[@class='QTextEdit']">
165        <textarea id="{@name}" class="qtui-widget {@class}">
166            <xsl:call-template name="style"/>
167            <xsl:if test="property[@name='readOnly']/bool[text()='true']">
168                <xsl:attribute name="readonly">readonly</xsl:attribute>
169            </xsl:if>
170            <xsl:value-of select="property[@name='placeholderText']/string"/>
171        </textarea>
172    </xsl:template>
173
174    <xsl:template match="widget[@class='QLineEdit']">
175        <input type="text" id="{@name}" class="qtui-widget {@class}">
176            <xsl:call-template name="style"/>
177        </input>
178    </xsl:template>
179
180
181
182    <!--
183         LAYOUT & MISC.
184    -->
185
186    <xsl:template match="layout">
187        <div id="{@name}" class="qtui-layout {@class}">
188            <xsl:apply-templates/>
189        </div>
190    </xsl:template>
191
192    <xsl:template match="item">
193        <div class="qtui-item">
194            <xsl:if test="../@stretch">
195                <xsl:call-template name="stretch">
196                    <xsl:with-param name="stretch" select="../@stretch"/>
197                    <xsl:with-param name="desired" select="count(preceding-sibling::*[name() = name(current())])"/>
198                </xsl:call-template>
199            </xsl:if>
200            <xsl:apply-templates/>
201        </div>
202    </xsl:template>
203
204    <xsl:template match="spacer">
205        <div class="qtui-spacer">
206            <xsl:text disable-output-escaping="yes">&amp;</xsl:text>nbsp;
207        </div>
208    </xsl:template>
209
210
211
212
213    <!--
214         UTILITIES
215    -->
216
217    <xsl:template name="style">
218        <xsl:attribute name="style">
219            <xsl:if test="@class != 'QMainWindow' and @class != 'QDialog'">
220                <xsl:if test="property[@name='geometry']/rect/x">position:absolute;left:<xsl:value-of select="property[@name='geometry']/rect/x"/>px;</xsl:if>
221                <xsl:if test="property[@name='geometry']/rect/y">position:absolute;top:<xsl:value-of select="property[@name='geometry']/rect/y"/>px;</xsl:if>
222            </xsl:if>
223            <xsl:if test="property[@name='geometry']/rect/width">width:<xsl:value-of select="property[@name='geometry']/rect/width"/>px;</xsl:if>
224            <xsl:if test="property[@name='geometry']/rect/height">height:<xsl:value-of select="property[@name='geometry']/rect/height"/>px;</xsl:if>
225            <xsl:if test="property[@name='sizeGripEnabled']/bool[text()!='false']">max-width:100%; max-height:100%;</xsl:if>
226            <xsl:if test="property[@name='minimumSize']/size/width">min-width:<xsl:value-of select="property[@name='minimumSize']/size/width"/>px;</xsl:if>
227            <xsl:if test="property[@name='minimumSize']/size/height">min-height:<xsl:value-of select="property[@name='minimumSize']/size/height"/>px;</xsl:if>
228            <xsl:if test="property[@name='maximumSize']/size/width">max-width:<xsl:value-of select="property[@name='maximumSize']/size/width"/>px;</xsl:if>
229            <xsl:if test="property[@name='maximumSize']/size/height">max-height:<xsl:value-of select="property[@name='maximumSize']/size/height"/>px;</xsl:if>
230
231            <xsl:if test="property[@name='pixmap']/pixmap">
232                background-image:url(/usr/include/qtui/<xsl:value-of select="substring(property[@name='pixmap']/pixmap,2)"/>);
233                background-repeat: no-repeat;
234                background-position: center center;
235            </xsl:if>
236
237            <xsl:if test="property[@name='palette']/palette/active/colorrole[@role='Text']/brush[@brushstyle='SolidPattern']/color">color: rgba(
238                <xsl:value-of select="property[@name='palette']/palette/active/colorrole[@role='Text']/brush[@brushstyle='SolidPattern']/color/red"/>,
239                <xsl:value-of select="property[@name='palette']/palette/active/colorrole[@role='Text']/brush[@brushstyle='SolidPattern']/color/green"/>,
240                <xsl:value-of select="property[@name='palette']/palette/active/colorrole[@role='Text']/brush[@brushstyle='SolidPattern']/color/blue"/>,
241                <xsl:value-of select="property[@name='palette']/palette/active/colorrole[@role='Text']/brush[@brushstyle='SolidPattern']/color/@alpha div 255.0"/>);
242            </xsl:if>
243
244            <xsl:if test="property[@name='palette']/palette/active/colorrole[@role='Base']/brush[@brushstyle='SolidPattern']/color">background-color: rgba(
245                <xsl:value-of select="property[@name='palette']/palette/active/colorrole[@role='Base']/brush[@brushstyle='SolidPattern']/color/red"/>,
246                <xsl:value-of select="property[@name='palette']/palette/active/colorrole[@role='Base']/brush[@brushstyle='SolidPattern']/color/green"/>,
247                <xsl:value-of select="property[@name='palette']/palette/active/colorrole[@role='Base']/brush[@brushstyle='SolidPattern']/color/blue"/>,
248                <xsl:value-of select="property[@name='palette']/palette/active/colorrole[@role='Base']/brush[@brushstyle='SolidPattern']/color/@alpha div 255.0"/>);
249            </xsl:if>
250
251            <xsl:if test="property[@name='font']/font/pointsize">font-size: <xsl:value-of select="property[@name='font']/font/pointsize"/>pt;</xsl:if>
252            <xsl:if test="property[@name='font']/font/bold[text()='true']">font-weight: bold;</xsl:if>
253
254            <xsl:if test="layout">
255                display: flex;
256            </xsl:if>
257
258            <xsl:if test="property[@name='styleSheet']/string"><xsl:value-of select="property[@name='styleSheet']/string"/></xsl:if>
259        </xsl:attribute>
260    </xsl:template>
261
262    <xsl:template name="stretch">
263        <xsl:param name="stretch"/>
264        <xsl:param name="desired"/>
265        <xsl:param name="index" select="0"/>
266
267        <xsl:if test="string-length($stretch) > 0">
268            <xsl:choose>
269                <xsl:when test="$index = $desired">
270                    <xsl:variable name="value" select="substring-before(concat($stretch, ','), ',')"/>
271                    <xsl:if test="$value != '0'">
272                        <xsl:attribute name="style">flex-grow: <xsl:value-of select="$value"/></xsl:attribute>
273                    </xsl:if>
274                </xsl:when>
275
276                <xsl:otherwise>
277                    <xsl:call-template name="stretch">
278                        <xsl:with-param name="stretch" select="substring-after($stretch, ',')"/>
279                        <xsl:with-param name="desired" select="$desired"/>
280                        <xsl:with-param name="index" select="$index + 1"/>
281                    </xsl:call-template>
282                </xsl:otherwise>
283            </xsl:choose>
284        </xsl:if>
285    </xsl:template>
286
287    <xsl:template name="hotkey">
288        <xsl:param name="label"/>
289
290        <xsl:choose>
291            <xsl:when test="contains($label, '&amp;')">
292                <xsl:variable name="pre" select="substring-before($label, '&amp;')"/>
293                <xsl:variable name="key" select="substring($label, string-length($pre)+2, 1)"/>
294                <xsl:variable name="post" select="substring($label, string-length($pre) + 3)"/>
295                <xsl:value-of select="$pre"/><code><xsl:value-of select="$key"/></code><xsl:value-of select="$post"/>
296            </xsl:when>
297            <xsl:otherwise>
298                <xsl:value-of select="$label"/>
299            </xsl:otherwise>
300        </xsl:choose>
301    </xsl:template>
302
303
304
305
306</xsl:stylesheet>
307
Note: See TracBrowser for help on using the repository browser.