Upload
jaider-contreras
View
46
Download
3
Embed Size (px)
Citation preview
Qt XML to ExtJS Rendering script
The TBD script has to take a Qt XML .ui file describing a dialog, parse it and generate a
javascript file that builds the same dialog using ExtJS 3. Also, a set of dialogs already
implemented in a native application that will be provided (only the compiled version), have to
be replicated using QtDesigner and the TBD script.
It has to be implemented in a way that the Qt XML parsing is independent from the ExtJS
rendering, because it will be extended to support other widget frameworks for other platforms
(native code, not only web).
There are three containing windows, with about 150 forms that use about 25 different
widgets, some of which are not implemented by Ext. These dialogs are going to be integrated
in a web application developed outside of this project.
The script is to be run only when a modification to the dialogs is made by the designers. It
should not be part of the runtime of the external web application.
The three containing windows look like the above, having a tree at the left acting as an index.
For performance reasons, the dialogs have to be assembled in a way that every form is
rendered as needed (when clicked in the tree index, not all at once). Other optimizations are
welcome.
The script will also take as input a set of XML files describing the data types of the fields in the
forms, each one identified by a unique id. This description may include the type (integer,
string, etc.), valid values or ranges, etc. The fields of the resulting dialogs have to use the tools
provided by ExtJS to check the user input according to the definitions given in the XML files.
Functional requirements
• The script has to be easily run with only the following input:
o The unmodified Qt XML files (.ui).
o The XML files defining the data types.
• The output has to be JavaScript file(s) (.js) with the definition of the dialogs. These files
will be included without modification in the application. They don’t have to include
ExtJS or any reference to it, nor any HTML surrounding structure.
• The output has to render ExtJS dialogs with the same controls, structure and behavior
(connections between components inside the dialogs) than their Qt counterparts.
Subtle visual differences corresponding to the different style of the widgets
frameworks are allowed, but the dialogs have to be functionally and structurally
equivalent.
• The output will consist of only JavaScript code, and any visual output has to be done
using ExtJS and any extensions developed. It is also possible to include 3rd
party
extensions if and only if those are stable, actively maintained and compatible in
licensing terms.
• The generated JavaScript code has to be clean and compliant to the standards. It has
to work on all major browsers, including all browsers supported by ExtJS.
• The dialogs have to be assembled in a way that every form is rendered as needed
(when clicked in the tree index, not all at once).
• The renderers (only the ExtJS one for this project) have to be developed in a plug-in
structure in order to make it easy to develop new ones with ease.
• The code of the script has to be well structured and commented in order to ease
maintaining task as well as future extensions and improvements.
• The deliverables include:
o All source code of the script.
o Qt XML files (.ui) corresponding to the dialogs to replicate, that renders cleanly
with the script into JavaScript/ExtJS (.js).
o Documentation.
Widgets needed
• Window.
• Tabbed section.
• Wizard.
• Label: Stylable, supporting drawing a horiozontal line to divide sections. Can include
other widgets like locks and links.
• Lock: Lock icon that doesn’t interact directly with the user, but can show
locked/unlocked and active/inactive.
• CheckBox: Tri-state, supporting the state “some” checked (gray, ticked).
• Labeled boxed groups for form elements. Can include other widgets like locks and
checkboxes.
• RadioButton.
• Button: Stylable: with/without icon or text.
• Horizontal slider: Stylable: with/without tickmarks.
• Dropdown Menu (ComboBox).
• TextBox
• LineEdit
• IP LineEdit: IPv4 and IPv6 versions.
• SpinBox: supporting numbers and time values
• Browse Button: It has to support not only the standard HTML functionality, but also
other functionalities, like adding paths to a list in a grid.
• TreeView: with support for icons, checkboxes and contextual menu, depending on
item clicked.
• GridView: supporting colums with text, icons and tree-like indentation.
NOTE: Reasonable equivalent controls already existing ExtJS are accepted. Not all of these
widgets require customizations as long as the Developer proposes an ExtJS equivalent that
provides the same functionality despite having some look&feel differences.
Example of a Qt XML file This files are created by QtDesigner (.ui) when saving interface design projects. The following is
a draft example that shows how the interface design XML will look like. It codes for this dialog,
here rendered using QT (just to show the general look):
The second text field is enabled only if the checkbox is checked. Initially it’s disabled.
Some remarks follow:
• There is an easy GUI way to set custom properties for widgets, so CKEYID (needed for
integration with the rest of the project), maximum and minimum values and other
properties can be expressed easily in the XML element.
• Connections between widgets are expressed in the <connections> element. In the
example developed, the checkbox enables and disables one of the line edit fields.
• The <hints> element is a GUI feature that makes it easy for the designer to see
graphically the connections between widgets. It is not parsed to generate any
functional code.
• Widgets geometry is absolute (position/size).
• CSS style sheets can be attached to any widget for customizing its look.
The GUI generated XML for the dialog:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>example_dialog</class>
<widget class="QDialog" name="example_dialog">
<property name="enabled">
<bool>true</bool>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>283</width>
<height>126</height>
</rect>
</property>
<property name="windowTitle">
<string>Example Dialog</string>
</property>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>20</x>
<y>20</y>
<width>60</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>Something</string>
</property>
</widget>
<widget class="QLabel" name="label_2">
<property name="geometry">
<rect>
<x>20</x>
<y>50</y>
<width>101</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>Something optional</string>
</property>
</widget>
<widget class="QLineEdit" name="something">
<property name="geometry">
<rect>
<x>119</x>
<y>20</y>
<width>131</width>
<height>21</height>
</rect>
</property>
<property name="CKEYID" stdset="0">
<string>CKEY_username</string>
</property>
<property name="type" stdset="0">
<string>STRING</string>
</property>
<property name="max" stdset="0">
<string/>
</property>
</widget>
<widget class="QCheckBox" name="use_optional">
<property name="geometry">
<rect>
<x>120</x>
<y>50</y>
<width>16</width>
<height>20</height>
</rect>
</property>
</widget>
<widget class="QLineEdit" name="something_optional">
<property name="enabled">
<bool>false</bool>
</property>
<property name="geometry">
<rect>
<x>140</x>
<y>50</y>
<width>111</width>
<height>20</height>
</rect>
</property>
<property name="CKEYID" stdset="0">
<string>CKEY_password</string>
</property>
<property name="type" stdset="0">
<string>STRING</string>
</property>
<property name="max" stdset="0">
<string/>
</property>
</widget>
<widget class="QPushButton" name="button_ok">
<property name="geometry">
<rect>
<x>200</x>
<y>90</y>
<width>70</width>
<height>24</height>
</rect>
</property>
<property name="styleSheet">
<string>a_style.css</string>
</property>
<property name="text">
<string>OK</string>
</property>
</widget>
<widget class="QPushButton" name="button_cancel">
<property name="geometry">
<rect>
<x>120</x>
<y>90</y>
<width>70</width>
<height>24</height>
</rect>
</property>
<property name="styleSheet">
<string>a_style.css</string>
</property>
<property name="text">
<string>Cancel</string>
</property>
</widget>
</widget>
<resources/>
<connections>
<connection>
<sender>use_optional</sender>
<signal>clicked(bool)</signal>
<receiver>something_optional</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>98</x>
<y>60</y>
</hint>
<hint type="destinationlabel">
<x>136</x>
<y>61</y>
</hint>
</hints>
</connection>
</connections>
</ui>