Merge lp:~julia-segal/cdts/ui_work into lp:cdts

Proposed by Julia Segal
Status: Merged
Merged at revision: 2237
Proposed branch: lp:~julia-segal/cdts/ui_work
Merge into: lp:cdts
Diff against target: 3583 lines (+2360/-385)
39 files modified
plainbox-gui/gui-ihv/commandtool.cpp (+15/-0)
plainbox-gui/gui-ihv/commandtool.h (+40/-0)
plainbox-gui/gui-ihv/gui-ihv.pro (+9/-4)
plainbox-gui/gui-ihv/main.cpp (+39/-8)
plainbox-gui/gui-ihv/qml/FileDialog.qml (+6/-0)
plainbox-gui/gui-ihv/qml/outline/FIleDialog.qml (+6/-0)
plainbox-gui/gui-ihv/qml/outline/LogViewer.qml (+129/-0)
plainbox-gui/gui-ihv/qml/outline/ManualInteractionDialog.qml (+169/-0)
plainbox-gui/gui-ihv/qml/outline/OldMainButtons.qml (+0/-87)
plainbox-gui/gui-ihv/qml/outline/Progress.qml (+3/-3)
plainbox-gui/gui-ihv/qml/outline/RunManagerButtons.qml (+30/-6)
plainbox-gui/gui-ihv/qml/outline/RunManagerListView.qml (+91/-90)
plainbox-gui/gui-ihv/qml/outline/RunManagerSuiteDelegate.qml (+165/-0)
plainbox-gui/gui-ihv/qml/outline/RunManagerTestDelegate.qml (+219/-58)
plainbox-gui/gui-ihv/qml/outline/RunManagerView.qml (+279/-13)
plainbox-gui/gui-ihv/qml/outline/SubmissionDialog.qml (+90/-0)
plainbox-gui/gui-ihv/qml/outline/SuiteSelectionDelegate.qml (+1/-5)
plainbox-gui/gui-ihv/qml/outline/SuiteSelectionView.qml (+3/-19)
plainbox-gui/gui-ihv/qml/outline/TestSelectionDetails.qml (+3/-7)
plainbox-gui/gui-ihv/qml/outline/TestSelectionListView.qml (+124/-30)
plainbox-gui/gui-ihv/qml/outline/TestSelectionSuiteDelegate.qml (+25/-18)
plainbox-gui/gui-ihv/qml/outline/TestSelectionSummary.qml (+16/-2)
plainbox-gui/gui-ihv/qml/outline/TestSelectionTestDelegate.qml (+29/-9)
plainbox-gui/gui-ihv/qml/outline/TestSelectionView.qml (+24/-11)
plainbox-gui/gui-ihv/qml/outline/WelcomeView.qml (+88/-11)
plainbox-gui/gui-ihv/qml/outline/artwork/details.svg (+68/-0)
plainbox-gui/gui-ihv/qml/outline/artwork/error.svg (+37/-0)
plainbox-gui/gui-ihv/qml/outline/artwork/failed.svg (+33/-0)
plainbox-gui/gui-ihv/qml/outline/artwork/passed.svg (+23/-0)
plainbox-gui/gui-ihv/qml/outline/artwork/rerun.svg (+201/-0)
plainbox-gui/gui-ihv/qml/outline/artwork/rerunq.svg (+158/-0)
plainbox-gui/gui-ihv/qml/outline/artwork/skipped.svg (+45/-0)
plainbox-gui/gui-ihv/qml/outline/artwork/test.txt (+6/-0)
plainbox-gui/gui-ihv/qml/outline/artwork/userreq.svg (+31/-0)
plainbox-gui/gui-ihv/qml/outline/gui-ihv.qml (+1/-1)
plainbox-gui/gui-ihv/savefiledlg.cpp (+37/-0)
plainbox-gui/gui-ihv/savefiledlg.h (+45/-0)
plainbox-gui/gui-ihv/testsuiteitem.cpp (+48/-1)
plainbox-gui/gui-ihv/testsuiteitem.h (+24/-2)
To merge this branch: bzr merge lp:~julia-segal/cdts/ui_work
Reviewer Review Type Date Requested Status
Daniel Manrique (community) Approve
Review via email: mp+176712@code.launchpad.net

Description of the change

Added
- Welcome Screen
- Log Viewer
- Warnings
- Manual Interaction (invoke it on the details icon on the RunManager)
Clean up on test selection

To post a comment you must log in.
Revision history for this message
Andrew Haigh (andrew-haigh-b) wrote :

I suggest this is merged first, and I will update my engine branch and resolve the handful of conflicts and propose a re-merge of that.

Revision history for this message
Daniel Manrique (roadmr) wrote :

Looks good! I have two comments:

- When I first start the GUI, I get a "ghost" window (seems to be a copy of the qtcreator window, but once I move it around it redraws its content correctly). This happened only the first time I did it. Then, every time I also get an error:

file:///checkboxes/checkbox-ihv-ng/trunk/build-plainbox-gui-Desktop-Debug/gui-ihv/qml/outline/WelcomeView.qml:30:5: QML QQuickImage: Cannot open: file:///checkboxes/checkbox-ihv-ng/trunk/build-plainbox-gui-Desktop-Debug/gui-ihv/qml/outline/artwork/checkbox-qt-head.png

- When I click on Results, then View Results, I get:
file:///media/bulk/checkboxes/checkbox-ihv-ng/trunk/build-plainbox-gui-Desktop-Debug/gui-ihv/qml/outline/SubmissionDialog.qml:50: ReferenceError: gedit is not defined
/media/bulk/checkboxes/checkbox-ihv-ng/trunk/build-plainbox-gui-Desktop-Debug/gui-ihv/gui-ihv exited with code 0

I don't know enough QML to know what this means (maybe a component that's not defined?).

None of these are showstoppers at this stage, so I'll approve this to unblock Andrew, but we should get these fixed at some point.

Thanks!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file 'plainbox-gui/gui-ihv/commandtool.cpp'
2--- plainbox-gui/gui-ihv/commandtool.cpp 1970-01-01 00:00:00 +0000
3+++ plainbox-gui/gui-ihv/commandtool.cpp 2013-07-24 15:37:30 +0000
4@@ -0,0 +1,15 @@
5+#include "commandtool.h"
6+
7+CommandTool::CommandTool(QObject *parent) :
8+ QObject(parent),
9+ m_process(new QProcess(this))
10+{
11+}
12+
13+
14+void CommandTool::exec(const QString& cmd, const QString& args)
15+{
16+ QStringList arguments;
17+ arguments << args;
18+ m_process->start(cmd, arguments);
19+}
20
21=== added file 'plainbox-gui/gui-ihv/commandtool.h'
22--- plainbox-gui/gui-ihv/commandtool.h 1970-01-01 00:00:00 +0000
23+++ plainbox-gui/gui-ihv/commandtool.h 2013-07-24 15:37:30 +0000
24@@ -0,0 +1,40 @@
25+/*
26+ * This file is part of plainbox-gui
27+ *
28+ * Copyright 2013 Canonical Ltd.
29+ *
30+ * Authors:
31+ * - Julia Segal <julia.segal@cellsoftware.co.uk>
32+ *
33+ * This program is free software; you can redistribute it and/or modify
34+ * it under the terms of the GNU General Public License as published by
35+ * the Free Software Foundation; version 3.
36+ *
37+ * This program is distributed in the hope that it will be useful,
38+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
39+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
40+ * GNU General Public License for more details.
41+ *
42+ * You should have received a copy of the GNU General Public License
43+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
44+ */
45+
46+#ifndef COMMANDTOOL_H
47+#define COMMANDTOOL_H
48+
49+#include <QObject>
50+#include <QProcess>
51+#include <qdebug.h>
52+
53+class CommandTool : public QObject
54+{
55+ Q_OBJECT
56+public:
57+ explicit CommandTool(QObject *parent = 0);
58+ Q_INVOKABLE void exec(const QString& cmd, const QString &args);
59+
60+private:
61+ QProcess *m_process;
62+};
63+
64+#endif // COMMAND_H
65
66=== modified file 'plainbox-gui/gui-ihv/gui-ihv.pro'
67--- plainbox-gui/gui-ihv/gui-ihv.pro 2013-07-17 14:23:54 +0000
68+++ plainbox-gui/gui-ihv/gui-ihv.pro 2013-07-24 15:37:30 +0000
69@@ -28,7 +28,9 @@
70
71 SOURCES += main.cpp \
72 testsuiteitem.cpp \
73- listmodel.cpp
74+ listmodel.cpp \
75+ savefiledlg.cpp \
76+ commandtool.cpp
77
78 # Please do not modify the following two lines. Required for deployment.
79 include(qtquick2applicationviewer/qtquick2applicationviewer.pri)
80@@ -36,17 +38,20 @@
81
82 HEADERS += \
83 testsuiteitem.h \
84- listmodel.h
85+ listmodel.h \
86+ savefiledlg.h \
87+ commandtool.h
88
89 OTHER_FILES += \
90 qml/outline/DummyListModel.qml \
91 qml/outline/TestSelectionButtons.qml \
92 qml/outline/TestSelectionView.qml \
93- qml/outline/OldMainButtons.qml \
94 qml/outline/TestSelectionListView.qml \
95 qml/outline/TestSelectionSuiteDelegate.qml \
96 qml/outline/TestSelectionTestDelegate.qml \
97 qml/outline/SuiteSelectionDelegate.qml \
98 qml/outline/SuiteSelectionView.qml \
99- qml/outline/RunManagerView.qml
100+ qml/outline/RunManagerView.qml \
101+ qml/outline/RunManagerSuiteDelegate.qml \
102+ qml/outline/SubmissionDialog.qml
103
104
105=== modified file 'plainbox-gui/gui-ihv/main.cpp'
106--- plainbox-gui/gui-ihv/main.cpp 2013-07-16 15:49:19 +0000
107+++ plainbox-gui/gui-ihv/main.cpp 2013-07-24 15:37:30 +0000
108@@ -25,6 +25,7 @@
109 #include <QDir>
110 #include <QtQml>
111 #include "qtquick2applicationviewer.h"
112+#include "commandtool.h"
113 #include "listmodel.h"
114 #include "testsuiteitem.h"
115
116@@ -33,14 +34,40 @@
117 ListModel* CreateTestSuiteModel(){
118 //QList<QObject*> list;
119 ListModel *model = new ListModel(new TestSuiteItem, qApp);
120- model->appendRow(new TestSuiteItem("Informational tests", "SATA/IDE devive information.", 60, "Automatic", model));
121- model->appendRow(new TestSuiteItem("Hibernation tests", "power-management/hibernate_advanced", 22, "Manual", model));
122- model->appendRow(new TestSuiteItem("Wireless networking tests", "wireless/wireless_scanning", 360, "Automatic", model));
123- model->appendRow(new TestSuiteItem("Wireless networking tests", "wireless/wireless_connection", 600, "Automatic", model));
124- model->appendRow(new TestSuiteItem("LED tests", "led/wireless", 200, "Manual",model));
125- model->appendRow(new TestSuiteItem("Benchmarks tests", "benchmarks/network/network-loopback", 100, "Manual",model));
126- model->appendRow(new TestSuiteItem("Suspend tests", "suspend/led_after_suspend/wireless", 1, "Manual",model));
127- model->appendRow(new TestSuiteItem("Suspend tests", "suspend/wireless_after_suspenspeded", 2, "Manual",model));
128+ for (int i = 0; i < 5; i++){
129+ QString s;
130+ QTextStream(&s) << i << " SATA/IDE devive information.";
131+ model->appendRow(new TestSuiteItem("Informational tests", s, 60, "Automatic", model));
132+ }
133+ for (int i = 0; i < 5; i++){
134+ QString s;
135+ QTextStream(&s) << i << " power-management/hibernate_advanced";
136+ model->appendRow(new TestSuiteItem("Hibernation tests", s, 60, "Automatic", model));
137+ }
138+
139+ for (int i = 0; i < 3; i++){
140+ QString s;
141+ QTextStream(&s) << i << " wireless/wireless_scanning";
142+ model->appendRow(new TestSuiteItem("Wireless networking tests", s, 360, "Automatic", model));
143+ }
144+
145+ for (int i = 0; i < 3; i++){
146+ QString s;
147+ QTextStream(&s) << i << " led/wireless";
148+ model->appendRow(new TestSuiteItem("LED tests", s, 360, "Automatic", model));
149+ }
150+
151+ for (int i = 0; i < 5; i++){
152+ QString s;
153+ QTextStream(&s) << i << " benchmarks/network/network-loopback";
154+ model->appendRow(new TestSuiteItem("Benchmarks tests", s, 360, "Automatic", model));
155+ }
156+
157+ for (int i = 0; i < 3; i++){
158+ QString s;
159+ QTextStream(&s) << i << " suspend/led_after_suspend/wireless";
160+ model->appendRow(new TestSuiteItem("Suspend tests", s, 1, "Manual",model));
161+ }
162
163 return model;
164 }
165@@ -48,6 +75,7 @@
166
167
168
169+
170 int main(int argc, char *argv[])
171 {
172 QGuiApplication app(argc, argv);
173@@ -66,6 +94,9 @@
174 QtQuick2ApplicationViewer viewer;
175 viewer.rootContext()->setContextProperty("testSuiteModel", CreateTestSuiteModel());
176
177+ CommandTool cmdTool;
178+ viewer.rootContext()->setContextProperty("cmdTool", &cmdTool);
179+
180 viewer.setMainQmlFile(QStringLiteral("qml/outline/gui-ihv.qml"));
181 viewer.showExpanded();
182
183
184=== added file 'plainbox-gui/gui-ihv/qml/FileDialog.qml'
185--- plainbox-gui/gui-ihv/qml/FileDialog.qml 1970-01-01 00:00:00 +0000
186+++ plainbox-gui/gui-ihv/qml/FileDialog.qml 2013-07-24 15:37:30 +0000
187@@ -0,0 +1,6 @@
188+import QtQuick 2.0
189+
190+Rectangle {
191+ width: 100
192+ height: 62
193+}
194
195=== added file 'plainbox-gui/gui-ihv/qml/outline/FIleDialog.qml'
196--- plainbox-gui/gui-ihv/qml/outline/FIleDialog.qml 1970-01-01 00:00:00 +0000
197+++ plainbox-gui/gui-ihv/qml/outline/FIleDialog.qml 2013-07-24 15:37:30 +0000
198@@ -0,0 +1,6 @@
199+import QtQuick 2.0
200+
201+Rectangle {
202+ width: 100
203+ height: 62
204+}
205
206=== added file 'plainbox-gui/gui-ihv/qml/outline/LogViewer.qml'
207--- plainbox-gui/gui-ihv/qml/outline/LogViewer.qml 1970-01-01 00:00:00 +0000
208+++ plainbox-gui/gui-ihv/qml/outline/LogViewer.qml 2013-07-24 15:37:30 +0000
209@@ -0,0 +1,129 @@
210+/*
211+ * This file is part of plainbox-gui
212+ *
213+ * Copyright 2013 Canonical Ltd.
214+ *
215+ * Authors:
216+ * - Julia Segal <julia.segal@cellsoftware.co.uk>
217+ *
218+ * This program is free software; you can redistribute it and/or modify
219+ * it under the terms of the GNU General Public License as published by
220+ * the Free Software Foundation; version 3.
221+ *
222+ * This program is distributed in the hope that it will be useful,
223+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
224+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
225+ * GNU General Public License for more details.
226+ *
227+ * You should have received a copy of the GNU General Public License
228+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
229+ */
230+
231+
232+import QtQuick 2.0
233+import Ubuntu.Components 0.1
234+import Ubuntu.Components.Popups 0.1
235+
236+
237+Dialog {
238+ id: dialog
239+
240+ title: i18n.tr("Log Viewer")
241+ text: i18n.tr("")
242+
243+ property alias logText: logtext.text
244+ property alias showTroubleShootingLink: troubleButton.visible
245+
246+ Button {
247+ id: troubleButton
248+ text: i18n.tr("Trouble Shooting")
249+ color: UbuntuColors.orange
250+ onClicked: {
251+ // TODO put in real url!!
252+ cmdTool.exec("xdg-open", "https://wiki.ubuntu.com/Testing/Automation/Checkbox/");
253+ }
254+ }
255+
256+ Rectangle{
257+ height: units.gu(60)
258+ color: Theme.palette.normal.base
259+
260+ Flickable {
261+ id: flick
262+
263+ width: logtext.width;
264+ height: parent.height;
265+ contentWidth: logtext.paintedWidth
266+ contentHeight: logtext.paintedHeight
267+ clip: true
268+
269+ function ensureVisible(r)
270+ {
271+ if (contentX >= r.x)
272+ contentX = r.x;
273+ else if (contentX+width <= r.x+r.width)
274+ contentX = r.x+r.width-width;
275+ if (contentY >= r.y)
276+ contentY = r.y;
277+ else if (contentY+height <= r.y+r.height)
278+ contentY = r.y+r.height-height;
279+ }
280+
281+ TextEdit{
282+ id: logtext
283+ text: "Load this up with text\nhere's a url: <a href=\"http://www.ubuntu.com\">Visit Ubuntu</a>
284+ even more even more \n even more even more \n even more even more \n
285+ even more even more \n even more even more \n even more even more \n"
286+
287+ height: units.gu(60)
288+ width: units.gu(30)
289+ cursorVisible : true
290+ readOnly: true
291+ selectByMouse : true
292+ textFormat: TextEdit.RichText
293+ wrapMode: TextEdit.Wrap
294+ focus: true
295+ color: Theme.palette.normal.foregroundText
296+ selectedTextColor: Theme.palette.selected.foregroundText
297+ selectionColor: Theme.palette.selected.foreground
298+ font.pixelSize: FontUtils.sizeToPixels("medium")
299+
300+ onCursorRectangleChanged: flick.ensureVisible(cursorRectangle)
301+
302+ onLinkActivated: {
303+ cmdTool.exec("xdg-open", link)
304+ }
305+
306+ }
307+ }
308+
309+ }
310+
311+ Button {
312+ id: copyButton
313+ text: i18n.tr("Copy")
314+ color: UbuntuColors.lightAubergine
315+ onClicked: {
316+ logtext.selectAll();
317+ logtext.copy();
318+ }
319+ }
320+
321+ Button {
322+ id: doneButton
323+ text: i18n.tr("Done")
324+ color: UbuntuColors.warmGrey
325+ onClicked: {
326+ PopupUtils.close(dialog)
327+ }
328+ }
329+
330+}
331+
332+
333+
334+
335+
336+
337+
338+
339
340=== added file 'plainbox-gui/gui-ihv/qml/outline/ManualInteractionDialog.qml'
341--- plainbox-gui/gui-ihv/qml/outline/ManualInteractionDialog.qml 1970-01-01 00:00:00 +0000
342+++ plainbox-gui/gui-ihv/qml/outline/ManualInteractionDialog.qml 2013-07-24 15:37:30 +0000
343@@ -0,0 +1,169 @@
344+/*
345+ * This file is part of plainbox-gui
346+ *
347+ * Copyright 2013 Canonical Ltd.
348+ *
349+ * Authors:
350+ * - Julia Segal <julia.segal@cellsoftware.co.uk>
351+ *
352+ * This program is free software; you can redistribute it and/or modify
353+ * it under the terms of the GNU General Public License as published by
354+ * the Free Software Foundation; version 3.
355+ *
356+ * This program is distributed in the hope that it will be useful,
357+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
358+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
359+ * GNU General Public License for more details.
360+ *
361+ * You should have received a copy of the GNU General Public License
362+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
363+ */
364+
365+
366+import QtQuick 2.0
367+import Ubuntu.Components 0.1
368+import Ubuntu.Components.Popups 0.1
369+
370+
371+Dialog {
372+ id: dialog
373+
374+ title: i18n.tr("Manual Test")
375+ text: i18n.tr("Name of the Test.")
376+
377+
378+ TextArea{
379+ id: instructions
380+ text: "This is where we put our instructions\n2- This is 1\n3 -This is where we put our instructions\n4- This is where we put our instructions\n5 -where we put our instructions\n"
381+ Text { font.family: "Helvetica"; font.pointSize: 13; font.bold: true }
382+ color: "green"
383+ height: units.gu(24)
384+ }
385+
386+ Button {
387+ text: i18n.tr("Test")
388+ color: UbuntuColors.orange
389+ onClicked: {
390+ console.log("Test")
391+ }
392+ }
393+
394+ Row {
395+ spacing: units.gu(8)
396+ CheckBox {
397+ id: yescheck
398+ text: i18n.tr("Yes")
399+ checked: true
400+ onClicked: {
401+ if (checked){
402+ nocheck.checked = !checked
403+ skipcheck.checked = !checked
404+ }
405+ else
406+ checked = true;
407+ }
408+ Label{
409+ anchors.left: yescheck.right
410+ anchors.verticalCenter: parent.verticalCenter
411+ anchors.leftMargin: units.gu(1)
412+ text: i18n.tr("Yes")
413+ }
414+ }
415+
416+ CheckBox {
417+ id: nocheck
418+ text: i18n.tr("No")
419+ checked: false
420+ onClicked: {
421+ if (checked){
422+ yescheck.checked = !checked
423+ skipcheck.checked = !checked
424+ }
425+ else
426+ checked = true;
427+ }
428+ Label{
429+ anchors.left: nocheck.right
430+ anchors.verticalCenter: parent.verticalCenter
431+ anchors.leftMargin: units.gu(1)
432+ text: i18n.tr("No")
433+ }
434+ }
435+
436+ CheckBox {
437+ id: skipcheck
438+ text: i18n.tr("Skip")
439+ checked: false
440+ onClicked: {
441+ if (checked){
442+ nocheck.checked = !checked
443+ yescheck.checked = !checked
444+ }
445+ else
446+ checked = true;
447+ }
448+ Label{
449+ anchors.left: skipcheck.right
450+ anchors.verticalCenter: parent.verticalCenter
451+ anchors.leftMargin: units.gu(1)
452+ text: i18n.tr("Skip")
453+ }
454+ }
455+ }
456+
457+
458+ Column {
459+ Label{
460+ text: i18n.tr("Comments")
461+ }
462+
463+ TextArea {
464+ id: comments
465+ text: ""
466+ }
467+ }
468+
469+
470+
471+
472+ Button {
473+ id: continuebutton
474+ text: i18n.tr("Continue")
475+ color: UbuntuColors.warmGrey
476+ onClicked: {
477+ console.log("Continue")
478+ if (skipcheck.checked && comments.text === "")
479+ {
480+ PopupUtils.open(skip_warning_dialog, continuebutton);
481+ }
482+
483+ else
484+ PopupUtils.close(dialog)
485+ }
486+ }
487+
488+
489+
490+ Component {
491+ id: skip_warning_dialog
492+ WarningDialog{
493+ text: i18n.tr("Skipping a test requires a reason to be entered in the Comments field. Please update that field and click 'Continue' again.");
494+
495+ showCancel: false
496+ showContinue: false
497+ showCheckbox: false
498+
499+ onOk: {
500+ console.log("ok clicked");
501+ }
502+ }
503+ }
504+}
505+
506+
507+
508+
509+
510+
511+
512+
513
514=== removed file 'plainbox-gui/gui-ihv/qml/outline/OldMainButtons.qml'
515--- plainbox-gui/gui-ihv/qml/outline/OldMainButtons.qml 2013-07-12 14:18:25 +0000
516+++ plainbox-gui/gui-ihv/qml/outline/OldMainButtons.qml 1970-01-01 00:00:00 +0000
517@@ -1,87 +0,0 @@
518-/*
519- * This file is part of plainbox-gui
520- *
521- * Copyright 2013 Canonical Ltd.
522- *
523- * Authors:
524- * - Julia Segal <julia.segal@cellsoftware.co.uk>
525- *
526- * This program is free software; you can redistribute it and/or modify
527- * it under the terms of the GNU General Public License as published by
528- * the Free Software Foundation; version 3.
529- *
530- * This program is distributed in the hope that it will be useful,
531- * but WITHOUT ANY WARRANTY; without even the implied warranty of
532- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
533- * GNU General Public License for more details.
534- *
535- * You should have received a copy of the GNU General Public License
536- * along with this program. If not, see <http://www.gnu.org/licenses/>.
537- */
538-
539-import QtQuick 2.0
540-import Ubuntu.Components 0.1
541-
542-
543-
544-Row {
545- id: buttons
546- state: "SELECTION"
547-
548- signal actionChanged(string actionState)
549-
550- width: parent.width - units.gu(20)
551- spacing: (parent.width - (units.gu(16)*3))/4
552- Button {
553- id:selectionButton
554- text: i18n.tr("selection")
555- width: units.gu(16)
556- onClicked: {
557- buttons.state = "SELECTION";
558- buttons.actionChanged(buttons.state);
559- }
560- }
561- Button {
562- id: runButton
563- text: i18n.tr("run")
564- width: units.gu(16)
565- onClicked:{
566- buttons.state = "RUN";
567- buttons.actionChanged(buttons.state);
568- }
569-
570- }
571- Button {
572- id: resultsButton
573- text: i18n.tr("results")
574- width: units.gu(16)
575- onClicked:{
576- buttons.state = "RESULTS"
577- buttons.actionChanged(buttons.state);
578- }
579- }
580-
581- states: [
582- State {
583- name: "SELECTION"
584- PropertyChanges { target: selectionButton; color: UbuntuColors.orange}
585- PropertyChanges { target: runButton; color: UbuntuColors.warmGrey}
586- PropertyChanges { target: resultsButton; color: UbuntuColors.warmGrey}
587- },
588- State {
589- name: "RUN"
590- PropertyChanges { target: selectionButton; color: UbuntuColors.warmGrey}
591- PropertyChanges { target: runButton; color: UbuntuColors.orange}
592- PropertyChanges { target: resultsButton; color: UbuntuColors.warmGrey}
593-
594- },
595- State {
596- name: "RESULTS"
597- PropertyChanges { target: selectionButton; color: UbuntuColors.warmGrey}
598- PropertyChanges { target: runButton; color: UbuntuColors.warmGrey}
599- PropertyChanges { target: resultsButton; color: UbuntuColors.orange}
600- }
601-
602- ]
603-
604-}
605
606=== modified file 'plainbox-gui/gui-ihv/qml/outline/Progress.qml'
607--- plainbox-gui/gui-ihv/qml/outline/Progress.qml 2013-07-08 10:12:50 +0000
608+++ plainbox-gui/gui-ihv/qml/outline/Progress.qml 2013-07-24 15:37:30 +0000
609@@ -25,12 +25,12 @@
610
611 Item {
612 property alias title: progresslabel.text
613- property alias indeterminate: progressbar.indeterminate
614 property alias value: progressbar.value
615+ property alias maxValue: progressbar.maximumValue
616
617 Label {
618 id: progresslabel
619- text: i18n.tr("System Testing");
620+ text: ""
621 anchors.left: parent.left
622 }
623
624@@ -42,7 +42,7 @@
625 indeterminate: false
626 minimumValue: 0
627 maximumValue: 100
628- value: 50
629+ value: 0
630 anchors.left: parent.left
631 }
632 }
633
634=== modified file 'plainbox-gui/gui-ihv/qml/outline/RunManagerButtons.qml'
635--- plainbox-gui/gui-ihv/qml/outline/RunManagerButtons.qml 2013-07-17 14:23:54 +0000
636+++ plainbox-gui/gui-ihv/qml/outline/RunManagerButtons.qml 2013-07-24 15:37:30 +0000
637@@ -28,28 +28,52 @@
638 id: bottombuttons
639 spacing: units.gu(12)
640
641- signal cancel
642+ property alias pauseButtonEnabled: pauseButton.enabled
643+ property alias resultsButtonEnabled: resultsButton.enabled
644+
645+
646+ signal exit
647 signal pauseTest
648+ signal resumeTest
649+ signal results
650
651
652 Button {
653 id:cancelButton
654- text: i18n.tr("Cancel")
655+ text: i18n.tr("Exit")
656 color: UbuntuColors.warmGrey
657 width: units.gu(18)
658 onClicked: {
659- bottombuttons.cancel();
660+ bottombuttons.exit();
661 }
662 }
663
664 Button {
665 id: pauseButton
666- text: i18n.tr("Pause")
667+ property bool showPause: true // either Pause or Resume
668+ enabled: true
669+ text: showPause ? i18n.tr("Pause") : i18n.tr("Resume")
670 color: UbuntuColors.lightAubergine
671 width: units.gu(18)
672+
673 onClicked:{
674- bottombuttons.pauseTest();
675- }
676+ showPause?pauseTest():resumeTest()
677+ showPause = !showPause
678+
679+ }
680+
681+ }
682+
683+ Button {
684+ id: resultsButton
685+ enabled: false
686+ text: i18n.tr("Results")
687+ color: UbuntuColors.orange
688+ width: units.gu(18)
689+ onClicked: {
690+ bottombuttons.results()
691+ }
692+
693 }
694
695
696
697=== modified file 'plainbox-gui/gui-ihv/qml/outline/RunManagerListView.qml'
698--- plainbox-gui/gui-ihv/qml/outline/RunManagerListView.qml 2013-07-18 10:41:06 +0000
699+++ plainbox-gui/gui-ihv/qml/outline/RunManagerListView.qml 2013-07-24 15:37:30 +0000
700@@ -29,19 +29,25 @@
701
702 Rectangle {
703 id: runmanagerrect
704+
705+ property alias itemindex: groupedList.currentIndex // use this to change the current selection
706+ property alias curSectionTested: groupedList.curSectionTested // used by suite delegate to display 1 of 4 when tests are executed
707+ property alias curTest: groupedList.curTest // used by suite delegate to display first number of 1 of 4
708+
709 color: "white"
710 height: parent.height
711 width: parent.width
712
713
714+
715 Flickable {
716 id: listflick
717 anchors.fill: parent
718 height: parent.height
719-
720- clip: true
721 contentHeight: groupedList.height
722 boundsBehavior : Flickable.StopAtBounds
723+ clip: true
724+ interactive: true
725
726 Component {
727 id: highlight
728@@ -52,96 +58,57 @@
729 radius: 5
730 }
731 }
732-
733-
734-
735 ListView {
736 id: groupedList
737+
738+ property int sectionCount: 0 // contain the number of sections for calculating height
739+ property int closedCount: 0 // contains number of closed items for calculating height
740+ property bool userChangingIndex: false // indicates if user is changing index so 1 of 4 heading doesn't get messed up
741+ property string curSectionTested: currentSection // which section is currently under test
742+ property int curTest: 0 // test index of test in relation to section
743+
744+ interactive: false
745 width: parent.width
746- height: units.gu(12) * groupedList.count + units.gu(1)
747- interactive: false
748+ height:units.gu(7) * (groupedList.count + groupedList.sectionCount - groupedList.closedCount)
749+
750 model: testSuiteModel
751+ highlight: highlight
752+ highlightFollowsCurrentItem: true
753
754 delegate: RunManagerTestDelegate {}
755
756 section {
757 property: "group"
758 criteria: ViewSection.FullString
759- delegate: TestSelectionSuiteDelegate{}
760- }
761-
762- highlight: highlight
763- highlightFollowsCurrentItem: true
764-
765-
766-
767-
768- // when a group item is checked/unchecked the subitems are checked/unchecked
769- function selectGroup(groupName, sel){
770- for (var i = testSuiteModel.count - 1; i >=0; i--){
771- var item = testSuiteModel.get(i);
772- if (item.group === groupName)
773- testSuiteModel.setProperty(i, "check", sel);
774- }
775-
776- // this is to select the group items and to make sure data is updated
777- var oldCurrent = currentIndex
778- currentIndex = -1
779- for (var i = 0; i < groupedList.contentItem.children.length; i++)
780- {
781- var curItem = groupedList.contentItem.children[i];
782- //console.log(i,": ", curItem, "=", curItem.groupname);
783-
784- if (curItem.groupname === groupName)
785- curItem.checked = sel;
786- }
787- currentIndex = oldCurrent
788- }
789-
790- // determines if one or more subitems are checked
791- // if at least one subitem is checked, the group is checked
792- function setGroupCheck(groupName){
793- var oldCurrent = currentIndex
794- currentIndex = -1
795- var setCheck = false
796- var i = groupedList.contentItem.children.length - 1
797-
798- for (;i >= 0 && setCheck === false; i--)
799- {
800- var curItem = groupedList.contentItem.children[i];
801-
802- // determine if subitem is checked
803- if (curItem.groupname === groupName && curItem.labelname !== groupName)
804- if (curItem.checked === true)
805- setCheck = true;
806-
807- }
808-
809- for (i = groupedList.contentItem.children.length - 1; i >= 0; i--)
810- {
811- curItem = groupedList.contentItem.children[i];
812- if (curItem.labelname === groupName)
813- curItem.checked = setCheck
814- }
815-
816- currentIndex = oldCurrent;
817- }
818-
819- // If any subitems are selected, group should be selected.
820- function isGroupSelected(section){
821- var isSel = false;
822- for (var i = testSuiteModel.count - 1; i >=0 && isSel === false; i--)
823- {
824- var curItem = testSuiteModel.get(i);
825- //console.log("Section: ", section, " ", i,": ", curItem, "=", curItem.group, " check:", curItem.check);
826-
827- if (curItem.group === section && curItem.check === "true"){
828- isSel = true;
829+ delegate: RunManagerSuiteDelegate{}
830+ }
831+
832+
833+ Component.onCompleted:{
834+ sectionCount = getSectionCount()
835+ }
836+
837+ onCurrentIndexChanged: {
838+ // This code is used for counting up tests in the section for 1 of 5 header
839+ // when incrementing through test. If index is being changed
840+ // by the user, don't mess up the group summary
841+ if (!userChangingIndex){
842+ if (currentIndex != -1){
843+ var item = testSuiteModel.get(currentIndex);
844+ if (item.group === groupedList.curSectionTested){
845+ groupedList.curTest++;
846+ }
847+ else {
848+ groupedList.curSectionTested = item.group
849+ groupedList.curTest = 1
850+ }
851 }
852 }
853- return isSel;
854 }
855
856+
857+
858+
859 // Open/Close gruops
860 function openShutSubgroup(groupName, sel){
861 var oldCurrent = currentIndex;
862@@ -149,29 +116,63 @@
863 for (var i = 0; i < groupedList.contentItem.children.length; i++)
864 {
865 var curItem = groupedList.contentItem.children[i];
866- //console.log(i,": ", curItem, "=", curItem.groupname);
867- //console.log(i,": ", sel, "=", sel, " height = ", curItem.height);
868
869 if (curItem.groupname === groupName && curItem.labelname !== groupName){
870 curItem.height = sel? units.gu(7):units.gu(0);
871 curItem.visible = sel;
872- groupedList.height += sel?units.gu(7):-units.gu(7)
873+ if (sel)
874+ closedCount--;
875+ else
876+ closedCount++;
877 }
878 }
879 currentIndex = oldCurrent;
880 }
881
882- // functions to do something across the whole list
883- function getEstimatedTime(section){
884- return "";
885- }
886+ // counts the total test in the group
887+ function getTotalTests(groupName){
888+ var testcnt = 0
889+ for (var i = testSuiteModel.count - 1; i >= 0; i--){
890+ var item = testSuiteModel.get(i);
891+ if (item.group === groupName)
892+ testcnt++;
893+ }
894+ return testcnt;
895+ }
896+
897+ function groupStatus(section){
898+ var grpstatus = 0
899+ for (var i = testSuiteModel.count - 1; i >= 0; i--){
900+ var item = testSuiteModel.get(i);
901+ if (item.group === section){
902+ grpstatus = item.groupstatus;
903+ i = -1;
904+ }
905+ }
906+ return grpstatus
907+ }
908+
909+
910+ function getSectionCount(){
911+ // if this is the first time called, count the number of sections
912+ var secCnt = sectionCount
913+ if (secCnt === 0){
914+ var curItem = testSuiteModel.get(0);
915+ var curSec = curItem.group;
916+ secCnt = 1;
917+ for (var i = 1; i < testSuiteModel.count; i++){
918+ curItem = testSuiteModel.get(i);
919+ if (curItem.group !== curSec){
920+ curSec = curItem.group
921+ secCnt++;
922+ }
923+ }
924+ }
925+ return secCnt;
926+ }
927+
928 }
929-
930-
931-
932-
933 }
934-
935 Scrollbar {
936 flickableItem: listflick
937 align: Qt.AlignTrailing
938
939=== added file 'plainbox-gui/gui-ihv/qml/outline/RunManagerSuiteDelegate.qml'
940--- plainbox-gui/gui-ihv/qml/outline/RunManagerSuiteDelegate.qml 1970-01-01 00:00:00 +0000
941+++ plainbox-gui/gui-ihv/qml/outline/RunManagerSuiteDelegate.qml 2013-07-24 15:37:30 +0000
942@@ -0,0 +1,165 @@
943+/*
944+ * This file is part of plainbox-gui
945+ *
946+ * Copyright 2013 Canonical Ltd.
947+ *
948+ * Authors:
949+ * - Julia Segal <julia.segal@cellsoftware.co.uk>
950+ *
951+ * This program is free software; you can redistribute it and/or modify
952+ * it under the terms of the GNU General Public License as published by
953+ * the Free Software Foundation; version 3.
954+ *
955+ * This program is distributed in the hope that it will be useful,
956+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
957+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
958+ * GNU General Public License for more details.
959+ *
960+ * You should have received a copy of the GNU General Public License
961+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
962+ */
963+
964+
965+import QtQuick 2.0
966+import Ubuntu.Components 0.1
967+import Ubuntu.Components.ListItems 0.1 as ListItem
968+import "."
969+
970+Component {
971+ id: groupDelegate
972+
973+ Item {
974+ id: itemdelegate
975+ width: parent.width
976+ height: units.gu(7)
977+
978+ // properties for opening/closing sections
979+ property string groupname: section
980+ property string labelname: section
981+ property bool open: true
982+
983+ onOpenChanged: {
984+ open?progressIcon.source = "artwork/DownArrow.png":progressIcon.source = "artwork/RightArrow.png"
985+ }
986+
987+ MouseArea {
988+ width: parent.width
989+ height: parent.height
990+ anchors.fill: parent
991+
992+ onClicked: {
993+ groupedList.userChangingIndex = true;
994+ itemdelegate.open = !itemdelegate.open
995+ groupedList.openShutSubgroup(section, itemdelegate.open)
996+ //console.log("Open/Shut items below")
997+ groupedList.userChangingIndex = false;
998+ }
999+ }
1000+
1001+ Item {
1002+ id: groupfiller
1003+ width: units.gu(2)
1004+ }
1005+
1006+ Image {
1007+ id: progressIcon
1008+ source: "artwork/DownArrow.png"
1009+ width: units.gu(2)
1010+ height: units.gu(2)
1011+ anchors {
1012+ verticalCenter: parent.verticalCenter
1013+ left: groupfiller.left
1014+
1015+ }
1016+ opacity: enabled ? 1.0 : 0.5
1017+ }
1018+
1019+
1020+ Text {
1021+ id: grouptext
1022+ text: section
1023+ width: units.gu(20)
1024+ anchors{
1025+ verticalCenter: parent.verticalCenter
1026+ left: progressIcon.right
1027+ leftMargin: units.gu(1)
1028+ }
1029+ font.bold: true
1030+ color: UbuntuColors.coolGrey
1031+ }
1032+
1033+ Item {
1034+ id: progressfiller
1035+ width: units.gu(22)
1036+ anchors.left: grouptext.right
1037+ }
1038+
1039+ Text {
1040+ id: progresstext
1041+
1042+ property int totalTests: groupedList.getTotalTests(section)
1043+ property int testCnt: groupedList.curTest
1044+ property bool inTest: (section === groupedList.curSectionTested)
1045+
1046+
1047+ text: {inTest && !groupedList.testsComplete ? testCnt + " of " + totalTests: ""}
1048+ width: units.gu(10)
1049+ anchors.left: progressfiller.right
1050+ anchors.verticalCenter: parent.verticalCenter
1051+ horizontalAlignment: Text.AlignHCenter
1052+ color: "green"
1053+ font.bold : true
1054+ }
1055+
1056+ Image {
1057+ id: statusicon
1058+ property int testStatus: {
1059+ if (!progresstext.inTest)
1060+ return groupedList.groupStatus(section);
1061+ return 0;
1062+ }
1063+
1064+
1065+ width: units.gu(3)
1066+ height: units.gu(3)
1067+ anchors{
1068+ left: progressfiller.right
1069+ verticalCenter: parent.verticalCenter
1070+ leftMargin: units.gu(3)
1071+ }
1072+ source: ""
1073+
1074+ onTestStatusChanged: {
1075+ // TODO these number are made up, change to what comes out of plainbox
1076+ switch (testStatus){
1077+ case 0:
1078+ // not executed
1079+ source = ""
1080+ break;
1081+ case 1:
1082+ source = "./artwork/skipped.svg"
1083+ break;
1084+ case 2: // pass
1085+ source = "./artwork/passed.svg"
1086+ break;
1087+ case 3: // fail
1088+ source = "./artwork/failed.svg"
1089+ break;
1090+ case 4: // error
1091+ source = "./artwork/error.svg"
1092+ break;
1093+ case 5: // user info required
1094+ source = "./artwork/userreq.svg"
1095+ break;
1096+ default:
1097+ source = ""
1098+ break;
1099+ }
1100+
1101+ }
1102+
1103+ }
1104+ ListItem.ThinDivider {}
1105+ }
1106+}
1107+
1108
1109=== modified file 'plainbox-gui/gui-ihv/qml/outline/RunManagerTestDelegate.qml'
1110--- plainbox-gui/gui-ihv/qml/outline/RunManagerTestDelegate.qml 2013-07-17 14:23:54 +0000
1111+++ plainbox-gui/gui-ihv/qml/outline/RunManagerTestDelegate.qml 2013-07-24 15:37:30 +0000
1112@@ -23,6 +23,7 @@
1113 import QtQuick 2.0
1114 import Ubuntu.Components 0.1
1115 import Ubuntu.Components.ListItems 0.1 as ListItem
1116+import Ubuntu.Components.Popups 0.1
1117 import "./artwork"
1118
1119 Component {
1120@@ -32,86 +33,246 @@
1121 id: testitem
1122 width: parent.width
1123 height: units.gu(7)
1124+
1125 property string groupname: group
1126- property alias checked: itemcheckbox.checked
1127 property string labelname: testname
1128
1129
1130 MouseArea {
1131- width: parent.width - itemcheckbox.width
1132+ width: parent.width;
1133 height: parent.height
1134- anchors.right: parent.right
1135+ anchors.fill: parent
1136
1137 onClicked: {
1138- testdetails.testItem = testSuiteModel.get(index);
1139+ groupedList.userChangingIndex = true;
1140 groupedList.currentIndex = index;
1141+ groupedList.userChangingIndex = false;
1142 }
1143 }
1144
1145 Item {
1146+ id: testitemview
1147 anchors.fill: parent
1148
1149 Item {
1150 id: filler
1151- width: itemcheckbox.width
1152+ width: units.gu(6)
1153 }
1154
1155- CheckBox {
1156- id: itemcheckbox
1157+ Text {
1158+ id: namelabel
1159+ text: testname
1160+ width: units.gu(42)
1161 anchors.verticalCenter: parent.verticalCenter
1162 anchors.left: filler.right
1163- anchors.leftMargin: units.gu(2)
1164- checked: check
1165- onClicked: {
1166- testSuiteModel.setProperty(index, "check", checked);
1167- groupedList.setGroupCheck(group)
1168- }
1169- }
1170-
1171-
1172- Text {
1173- id: nameLabel
1174- text: testname
1175- width: units.gu(40)
1176- anchors.verticalCenter: parent.verticalCenter
1177- anchors.left: itemcheckbox.right
1178- anchors.leftMargin: units.gu(1)
1179- }
1180-
1181- Item {
1182- id: typefiller
1183- width: units.gu(2)
1184- anchors.left: nameLabel.right
1185- }
1186-
1187- Text {
1188- id: typelabel
1189- text: ""//type
1190- width: units.gu(10)
1191- anchors.left: typefiller.right
1192- anchors.verticalCenter: parent.verticalCenter
1193- horizontalAlignment: Text.AlignHCenter
1194-
1195- }
1196-
1197- Item {
1198- id: descfiller
1199- width: units.gu(20)
1200- anchors.left: typelabel.right
1201- }
1202-
1203- Text {
1204- id: descLabel
1205- text: ""
1206- width: units.gu(10)
1207- anchors.left: descfiller.right
1208- anchors.verticalCenter: parent.verticalCenter
1209- horizontalAlignment: Text.AlignHCenter
1210-
1211- }
1212-
1213-
1214+ }
1215+
1216+ Item {
1217+ id: statusFiller
1218+ width: units.gu(12)
1219+ anchors.left: namelabel.right
1220+ }
1221+
1222+ Image {
1223+ id: statusicon
1224+ property int testStatus: runstatus// TODO this should be coming from the testitem status
1225+
1226+ width: units.gu(3)
1227+ height: units.gu(3)
1228+ anchors.left: namelabel.right
1229+ anchors.verticalCenter: parent.verticalCenter
1230+ source: ""
1231+
1232+
1233+
1234+ MouseArea {
1235+ anchors.fill: parent
1236+
1237+ onClicked:{
1238+ // set user so the iterating tests continue
1239+ // change currentindex to cause selection to move
1240+ groupedList.userChangingIndex = true;
1241+ groupedList.currentIndex = index
1242+
1243+ switch (statusicon.testStatus){
1244+
1245+ case 2: // passed
1246+ PopupUtils.open(log_viewer, statusicon);
1247+ break;
1248+ case 3: // failed
1249+ case 4: // error
1250+ PopupUtils.open(log_viewer_with_trouble, statusicon);
1251+ break;
1252+ case 5: // user interaction req.
1253+ PopupUtils.open(manual_dialog, statusicon);
1254+ break;
1255+ case 1:
1256+ default://skipped
1257+ break;
1258+ }
1259+
1260+ // TODO remove this --- this is just to try out the different icons behaviour
1261+ // THIS should NOT really happen!!!!
1262+ //if (statusicon.testStatus < 6)
1263+ // statusicon.testStatus++
1264+ //else
1265+ // statusicon.testStatus = 1
1266+ // TODO remove items above to the TODO!!!
1267+
1268+ groupedList.userChangingIndex = false; }
1269+ }
1270+
1271+ onTestStatusChanged: {
1272+ // TODO these number are made up, change to what comes out of plainbox
1273+ switch (testStatus){
1274+ case 0:
1275+ // not executed
1276+ source = ""
1277+ break;
1278+ case 1:
1279+ source = "./artwork/skipped.svg"
1280+ break;
1281+ case 2: // pass
1282+ source = "./artwork/passed.svg"
1283+ break;
1284+ case 3: // fail
1285+ source = "./artwork/failed.svg"
1286+ break;
1287+ case 4: // error
1288+ source = "./artwork/error.svg"
1289+ break;
1290+ case 5: // user info required
1291+ source = "./artwork/userreq.svg"
1292+ break;
1293+ default:
1294+ source = ""
1295+ break;
1296+ }
1297+
1298+ }
1299+
1300+ }
1301+
1302+ Item {
1303+ id: timefiller
1304+ width: units.gu(10)
1305+ anchors.left: statusicon.right
1306+ }
1307+
1308+ Text {
1309+ id: timelabel
1310+ text: {!elapsedtime ? "" : utils.formatElapsedTime(elapsedtime)}
1311+ width: units.gu(10)
1312+ anchors.left: timefiller.right
1313+ anchors.verticalCenter: parent.verticalCenter
1314+ horizontalAlignment: Text.AlignRight
1315+
1316+ }
1317+
1318+ Item {
1319+ id: actionsfiller
1320+ width: units.gu(12)
1321+ anchors.left: timelabel.right
1322+ }
1323+
1324+ Image {
1325+ id: rerunicon
1326+ property int rerunStatus: !runstatus?0:1 // TODO this should be coming if the test has run or not
1327+ // currently assumes 0 = not run yet, 1 == completed 2 == queued for rerun
1328+
1329+ width: units.gu(3)
1330+ height: units.gu(3)
1331+ anchors.left: actionsfiller.right
1332+ anchors.verticalCenter: parent.verticalCenter
1333+ source: ""
1334+
1335+ MouseArea {
1336+ anchors.fill: parent
1337+ onClicked:{
1338+ groupedList.userChangingIndex = true;
1339+ groupedList.currentIndex = index
1340+
1341+ if (rerunicon.rerunStatus == 1)
1342+ rerunicon.rerunStatus = 2;
1343+
1344+ groupedList.userChangingIndex = false;
1345+ }
1346+ }
1347+
1348+ onRerunStatusChanged:{
1349+ if (rerunStatus == 0) // not run
1350+ source = ""
1351+ if (rerunStatus == 1) // completed
1352+ source = "./artwork/rerun.svg"
1353+ else if (rerunStatus == 2){ // queued for rerun
1354+ source = "./artwork/rerunq.svg"
1355+ // reset other icons to blank
1356+ statusicon.testStatus = 0
1357+ detailsicon.detailsStatus = false
1358+ timelabel.text = ""
1359+ testSuiteModel.setProperty(index, "groupstatus", 0); // group
1360+ }
1361+ }
1362+ }
1363+
1364+ Item {
1365+ id: detailsfiller
1366+ width: units.gu(13)
1367+ anchors.left: rerunicon.right
1368+ }
1369+
1370+ Image {
1371+ id: detailsicon
1372+ property bool detailsStatus: {!runstatus?false:true} // TODO this should be coming if the test has run or not
1373+ // currently assumes 0 = not run yet, 1 == completed
1374+
1375+ width: units.gu(3)
1376+ height: units.gu(3)
1377+ anchors.left: detailsfiller.right
1378+ anchors.verticalCenter: parent.verticalCenter
1379+ source: ""
1380+
1381+ MouseArea {
1382+ anchors.fill: parent
1383+
1384+ onClicked:{
1385+ groupedList.userChangingIndex = true;
1386+ groupedList.currentIndex = index;
1387+ //cmdTool.exec("gedit", logfileName)
1388+
1389+ // TODO change this back to the log_viewer, this opens the manual_dialog for testing only!
1390+ //PopupUtils.open(log_viewer, detailsicon);
1391+ if (detailsicon.detailsStatus == true)
1392+ PopupUtils.open(manual_dialog, detailsicon);
1393+ groupedList.userChangingIndex = false;
1394+ }
1395+ }
1396+
1397+ onDetailsStatusChanged:{
1398+ if (detailsStatus) // completed
1399+ source = "./artwork/details.svg"
1400+ else // not run yet
1401+ source = ""
1402+ }
1403+
1404+ }
1405 }
1406 ListItem.ThinDivider {}
1407+
1408+ Component {
1409+ id: log_viewer
1410+ LogViewer{
1411+ showTroubleShootingLink: false
1412+ }
1413+ }
1414+
1415+ Component {
1416+ id: log_viewer_with_trouble
1417+ LogViewer{
1418+ showTroubleShootingLink: true
1419+ }
1420+ }
1421 }
1422+
1423+
1424 }
1425
1426=== modified file 'plainbox-gui/gui-ihv/qml/outline/RunManagerView.qml'
1427--- plainbox-gui/gui-ihv/qml/outline/RunManagerView.qml 2013-07-17 14:23:54 +0000
1428+++ plainbox-gui/gui-ihv/qml/outline/RunManagerView.qml 2013-07-24 15:37:30 +0000
1429@@ -22,6 +22,7 @@
1430
1431 import QtQuick 2.0
1432 import Ubuntu.Components 0.1
1433+import Ubuntu.Components.Popups 0.1
1434 import "."
1435
1436
1437@@ -29,29 +30,186 @@
1438
1439
1440 Page {
1441+ id: runmanagerview
1442 title: i18n.tr("Run Manager")
1443
1444+ property bool reportIsSaved: false;
1445+ property bool testingComplete: false
1446+
1447+ // TODO - this timer keeps track of time passing
1448+ // When using plainbox, get tests and advance using it
1449+ // currently itemindex is advanced at each timer interval
1450+ // and the runstatus is updated... which is FAKE.
1451+
1452+ // Need to do:
1453+ // set testsuitelist.itemindex to the index of the current item in the ModelSectionCounter
1454+ // testsuitelist.curSectionTested = "" when done completed
1455+ // and item is the current item in the view.
1456+ Timer {
1457+ id: timer
1458+ property int testIndex: 0 // which test we are running from the list
1459+ property int totalTests: testSuiteModel.count
1460+ property var startTime: new Date()
1461+ property var testStartTime: new Date()
1462+
1463+
1464+
1465+ interval:1000;
1466+ running: true;
1467+ repeat: true
1468+
1469+
1470+ onTriggered: {
1471+ if (testIndex == totalTests ){
1472+ // All tests are done
1473+ runmanagerview.testingComplete = true;
1474+ // update ui
1475+ runbuttons.pauseButtonEnabled = false;
1476+ runbuttons.resultsButtonEnabled = true;
1477+ progress.title = "Completed (" + utils.formatElapsedTime((new Date() - timer.startTime)) + ")";
1478+ progress.enabled = false;
1479+ running = false;
1480+
1481+ // set flags in list (for group details)
1482+ testsuitelist.curSectionTested = ""; // set this as there is no more tested
1483+ }
1484+ else {
1485+ // TODO - this is hardcoding the properties.... PB shuold be doing this
1486+ testSuiteModel.setProperty(testIndex, "runstatus", 2); // this will come from Plainbox
1487+ // set the group status to the worst runstatus outcome ... failure? userreq?, check runstatus
1488+ testSuiteModel.setProperty(testIndex, "groupstatus", 2);
1489+
1490+ testsuitelist.itemindex = testIndex; // tell list which item to select
1491+
1492+ // set elapsed time
1493+ var stopTime = new Date();
1494+ testSuiteModel.setProperty(testIndex, "elapsedtime", stopTime - timer.testStartTime);
1495+
1496+ testStartTime = stopTime;
1497+ progress.value = testIndex + 1;
1498+ var testname = testSuiteModel.get(testIndex).testname;
1499+ progress.title = "Running " + (testIndex + 1)
1500+ + " of "+ testSuiteModel.count
1501+ + " (" + utils.formatElapsedTime(stopTime - timer.startTime) + ")"
1502+ + " " + testname;
1503+ }
1504+ testIndex++;
1505+ }
1506+ }
1507+
1508 Item {
1509 id: filler
1510 height: units.gu(0)
1511- }
1512-
1513+ anchors.top: parent.top
1514+ }
1515+
1516+
1517+
1518+ Item {
1519+ id: runmanagerlistheaders
1520+ width: parent.width - units.gu(4)
1521+ height: units.gu(3)
1522+
1523+ anchors {
1524+ horizontalCenter: parent.horizontalCenter
1525+ top: filler.bottom
1526+ margins: units.gu(2)
1527+ }
1528+
1529+ Item {
1530+ id: testcasenamefiller
1531+ width: units.gu(8)
1532+ anchors.left: parent.left
1533+ }
1534+ Text {
1535+ id: testcasenamelabel
1536+ width: units.gu(12)
1537+ text: i18n.tr("Test Case Name")
1538+ anchors.left: testcasenamefiller.right
1539+ }
1540+ Item {
1541+ id: statusfiller
1542+ width: units.gu(15)
1543+ anchors.left: testcasenamelabel.right
1544+ }
1545+
1546+ Text {
1547+ id: statuslabel
1548+ text: i18n.tr("Status")
1549+ anchors.left: statusfiller.right
1550+ anchors.leftMargin: units.gu(12)
1551+ horizontalAlignment: Text.AlignHCenter
1552+ }
1553+
1554+ Item {
1555+ id: eslapsedtimefiller
1556+ width: units.gu(2)
1557+ anchors.left: statuslabel.right
1558+ }
1559+
1560+ Text {
1561+ id: eslapsedtimelabel
1562+ text: i18n.tr("Elapsed Time")
1563+ anchors.left: eslapsedtimefiller.right
1564+ anchors.leftMargin: units.gu(10)
1565+ horizontalAlignment: Text.AlignHCenter
1566+ }
1567+
1568+ Item {
1569+ id: actionsfiller
1570+ width: units.gu(6)
1571+ anchors.left: eslapsedtimelabel.right
1572+ }
1573+ Text {
1574+ id: actionslabel
1575+ width: units.gu(10)
1576+ text: i18n.tr("Actions")
1577+ horizontalAlignment: Text.AlignHCenter
1578+ anchors.left: actionsfiller.right
1579+ }
1580+
1581+ Item {
1582+ id: detailsfiller
1583+ width: units.gu(6)
1584+ anchors.left: actionslabel.right
1585+ }
1586+ Text {
1587+ id: detailslabel
1588+ width: units.gu(10)
1589+ text: i18n.tr("Details")
1590+ horizontalAlignment: Text.AlignHCenter
1591+ anchors.left: detailsfiller.right
1592+ }
1593+ }
1594
1595
1596 RunManagerListView {
1597 id: testsuitelist
1598-
1599 width: parent.width - units.gu(4)
1600-
1601 anchors{
1602 horizontalCenter: parent.horizontalCenter
1603- top: filler.bottom
1604+ top: runmanagerlistheaders.bottom
1605+ bottom: progress.top
1606+ bottomMargin: units.gu(2)
1607+ }
1608+ }
1609+
1610+ Progress {
1611+ id: progress
1612+ height: units.gu(4)-1
1613+ width: parent.width - units.gu(20)
1614+
1615+ anchors {
1616 bottom: runbuttons.top
1617- margins: units.gu(2)
1618+ bottomMargin: units.gu(4)
1619+ horizontalCenter: parent.horizontalCenter
1620 }
1621+ title: i18n.tr("Running")
1622+ maxValue: testSuiteModel.count //TODO put the number of tests here
1623+ value: 0
1624+
1625 }
1626
1627-
1628 RunManagerButtons {
1629 id: runbuttons
1630
1631@@ -61,13 +219,121 @@
1632 margins: units.gu(2)
1633 }
1634
1635- onCancel:{
1636- console.log("On Cancel")
1637+ onExit:{
1638+ if (!runmanagerview.testingComplete){
1639+ PopupUtils.open(incomplete_warning_dialog, runbuttons);
1640+ pause();
1641+ }
1642+ else if (!reportIsSaved)
1643+ PopupUtils.open(submission_warning_dialog, runbuttons);
1644+ else
1645+ Qt.quit();
1646 }
1647
1648 onPauseTest: {
1649- console.log("Pause")
1650- }
1651- }
1652-
1653+ pause();
1654+ }
1655+ onResumeTest: {
1656+ resume();
1657+ }
1658+ onResults: {
1659+ PopupUtils.open(submission_dialog, runbuttons);
1660+ }
1661+
1662+ function resume(){
1663+ // TODO call into plainbox to resume
1664+ timer.testStartTime = new Date()
1665+ timer.running = true;
1666+ timer.repeat = true;
1667+ console.log("Resume...")
1668+ }
1669+
1670+ function pause(){
1671+ // TODO call into plainbox to pause
1672+ timer.running = false;
1673+ timer.repeat = false;
1674+ progress.title = progress.title.replace("Running", "Paused ")
1675+ console.log("Pause...")
1676+ }
1677+
1678+ Component {
1679+ id: submission_dialog
1680+ SubmissionDialog{
1681+ }
1682+ }
1683+
1684+ Component {
1685+ id: manual_dialog
1686+ ManualInteractionDialog{
1687+ }
1688+ }
1689+
1690+ Component {
1691+ id: submission_warning_dialog
1692+ WarningDialog{
1693+ text: i18n.tr("You are about to exit this test run without saving your results report. Do you want to save the report?");
1694+
1695+ showContinue: false
1696+ showCheckbox: false
1697+
1698+ onOk:PopupUtils.open(submission_dialog, runbuttons);
1699+
1700+ onCancel: Qt.quit();
1701+ }
1702+ }
1703+
1704+ Component {
1705+ id: incomplete_warning_dialog
1706+ WarningDialog{
1707+ text: i18n.tr("You are about to cancel an active test run. Your system might be left in an unstable state. Are you sure you want to exit?");
1708+ showOK: true
1709+ showCancel: true
1710+ showContinue: false
1711+ showCheckbox: false
1712+
1713+ onOk: {
1714+ Qt.quit();
1715+ }
1716+
1717+ onCancel: {
1718+ // resume
1719+ runbuttons.resume()
1720+ }
1721+ }
1722+ }
1723+
1724+
1725+
1726+ Item {
1727+ id: utils
1728+ function formatElapsedTime(elap){
1729+ // strip the miliseconds
1730+ elap = parseInt(elap / 1000);
1731+
1732+ // get seconds (Original had 'round' which incorrectly counts 0:28, 0:29, 1:30 ... 1:59, 1:0)
1733+ var seconds = parseInt(Math.round(elap % 60));
1734+
1735+ // remove seconds from the date
1736+ elap = parseInt(Math.floor(elap / 60));
1737+
1738+ // get minutes
1739+ var minutes = parseInt(Math.round(elap % 60));
1740+
1741+ // remove minutes from the date
1742+ elap = parseInt(Math.floor(elap / 60));
1743+
1744+
1745+ // get hours
1746+ var hours = parseInt(Math.round(elap % 24));
1747+
1748+ var timeStr = ""
1749+
1750+ if (hours)
1751+ timeStr = hours + ":";
1752+ timeStr = timeStr + ("0" + minutes).slice(-2) + ":" + ("0" + seconds).slice(-2);
1753+
1754+ return timeStr;
1755+ }
1756+ }
1757+ }
1758 }
1759
1760=== added file 'plainbox-gui/gui-ihv/qml/outline/SubmissionDialog.qml'
1761--- plainbox-gui/gui-ihv/qml/outline/SubmissionDialog.qml 1970-01-01 00:00:00 +0000
1762+++ plainbox-gui/gui-ihv/qml/outline/SubmissionDialog.qml 2013-07-24 15:37:30 +0000
1763@@ -0,0 +1,90 @@
1764+/*
1765+ * This file is part of plainbox-gui
1766+ *
1767+ * Copyright 2013 Canonical Ltd.
1768+ *
1769+ * Authors:
1770+ * - Julia Segal <julia.segal@cellsoftware.co.uk>
1771+ *
1772+ * This program is free software; you can redistribute it and/or modify
1773+ * it under the terms of the GNU General Public License as published by
1774+ * the Free Software Foundation; version 3.
1775+ *
1776+ * This program is distributed in the hope that it will be useful,
1777+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
1778+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1779+ * GNU General Public License for more details.
1780+ *
1781+ * You should have received a copy of the GNU General Public License
1782+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
1783+ */
1784+
1785+
1786+import QtQuick 2.0
1787+import Ubuntu.Components 0.1
1788+import Ubuntu.Components.Popups 0.1
1789+
1790+
1791+
1792+Dialog {
1793+ id: dialog
1794+
1795+ title: i18n.tr("Report")
1796+ text: i18n.tr("The following report has be generated for submission to the Launchpad hardware database.")
1797+
1798+
1799+ Button {
1800+ id: savebutton
1801+ text: i18n.tr("Save Results")
1802+ color: UbuntuColors.orange
1803+ onClicked: {
1804+ runmanagerview.reportIsSaved = true;
1805+ }
1806+ }
1807+ Button {
1808+ id: viewbutton
1809+ text: i18n.tr("View Results")
1810+ color: UbuntuColors.lightAubergine
1811+ onClicked: {
1812+ onClicked:{
1813+ gedit.launch("./qml/outline/artwork/test.txt")
1814+ }
1815+ }
1816+ }
1817+ Button {
1818+ id: donebutton
1819+ text: i18n.tr("Done")
1820+ color: UbuntuColors.warmGrey
1821+ onClicked: {
1822+ if (!runmanagerview.reportIsSaved)
1823+ PopupUtils.open(submission_warning_dialog, donebutton);
1824+ else
1825+ PopupUtils.close(dialog)
1826+ }
1827+ }
1828+
1829+ Component {
1830+ id: submission_warning_dialog
1831+ WarningDialog{
1832+ text: i18n.tr("You are about to exit this test run without saving your results report. Do you want to save the report?");
1833+
1834+ showContinue: false
1835+ showCheckbox: false
1836+
1837+ //onOk:// do nothing and return to submission dialog
1838+
1839+ onCancel: PopupUtils.close(dialog)
1840+ }
1841+ }
1842+
1843+
1844+
1845+}
1846+
1847+
1848+
1849+
1850+
1851+
1852+
1853+
1854
1855=== modified file 'plainbox-gui/gui-ihv/qml/outline/SuiteSelectionDelegate.qml'
1856--- plainbox-gui/gui-ihv/qml/outline/SuiteSelectionDelegate.qml 2013-07-17 11:02:13 +0000
1857+++ plainbox-gui/gui-ihv/qml/outline/SuiteSelectionDelegate.qml 2013-07-24 15:37:30 +0000
1858@@ -31,7 +31,6 @@
1859 width: parent.width
1860 height: units.gu(7)
1861
1862- signal selectSuite(string suite, bool sel)
1863
1864 Item {
1865 id: suitefiller
1866@@ -43,15 +42,12 @@
1867 anchors.verticalCenter: parent.verticalCenter
1868 anchors.left: suitefiller.right
1869 checked: true
1870- onClicked: {
1871- itemdelegate.selectSuite(section, checked);
1872- }
1873 }
1874
1875
1876 Text {
1877 id: suitetext
1878- text: section
1879+ text: testname
1880 anchors.verticalCenter: parent.verticalCenter
1881 anchors.left: suitecheckbox.right
1882 anchors.leftMargin: units.gu(1)
1883
1884=== modified file 'plainbox-gui/gui-ihv/qml/outline/SuiteSelectionView.qml'
1885--- plainbox-gui/gui-ihv/qml/outline/SuiteSelectionView.qml 2013-07-18 10:41:06 +0000
1886+++ plainbox-gui/gui-ihv/qml/outline/SuiteSelectionView.qml 2013-07-24 15:37:30 +0000
1887@@ -57,25 +57,9 @@
1888 boundsBehavior : Flickable.StopAtBounds
1889 model: testSuiteModel
1890
1891- delegate: Item {}
1892-
1893- section {
1894- property: "group"
1895- criteria: ViewSection.FullString
1896- delegate: SuiteSelectionDelegate{
1897-
1898- onSelectSuite: {
1899- // This is using the prototype list,
1900- // In the model, select all tests in the suite
1901- for (var i = testSuiteModel.count - 1; i >= 0; i--){
1902- var item = testSuiteModel.get(i);
1903- if (item.group === suite)
1904- testSuiteModel.setProperty(i, "check", sel);
1905- }
1906- }
1907- }
1908- }
1909+ delegate: SuiteSelectionDelegate{}
1910 }
1911+
1912 Scrollbar {
1913 flickableItem: testselection
1914 align: Qt.AlignTrailing
1915@@ -85,7 +69,7 @@
1916
1917 Button {
1918 id: okbutton
1919- width: units.gu(20)
1920+ width: parent.width - units.gu(4)
1921 anchors {
1922 horizontalCenter:parent.horizontalCenter
1923 bottom: parent.bottom
1924
1925=== modified file 'plainbox-gui/gui-ihv/qml/outline/TestSelectionDetails.qml'
1926--- plainbox-gui/gui-ihv/qml/outline/TestSelectionDetails.qml 2013-07-18 09:18:31 +0000
1927+++ plainbox-gui/gui-ihv/qml/outline/TestSelectionDetails.qml 2013-07-24 15:37:30 +0000
1928@@ -26,7 +26,7 @@
1929 id: testseldetails
1930 property var testItem;
1931 property bool showDetails;
1932- property int openHeight: units.gu(18)
1933+ property int openHeight: units.gu(15)
1934
1935
1936 onTestItemChanged: {
1937@@ -38,12 +38,10 @@
1938 if (showDetails){
1939 progressIcon.source = "artwork/DownArrow.png";
1940 detailsFlick.height = openHeight
1941- testsuitelist.height -= openHeight
1942 }
1943 else{
1944 progressIcon.source = "artwork/RightArrow.png";
1945 detailsFlick.height = 0
1946- testsuitelist.height += openHeight
1947 }
1948 }
1949
1950@@ -71,10 +69,8 @@
1951 top: parent.top
1952 margins: units.gu(1)
1953 }
1954-
1955- opacity: enabled ? 1.0 : 0.5
1956-
1957 }
1958+
1959 MouseArea {
1960 anchors.fill: detailsItem
1961 onClicked: {showDetails = !showDetails}
1962@@ -88,7 +84,7 @@
1963 id: detailsFlick
1964 anchors.left: detailsItem.right
1965 anchors.top: parent.top
1966- anchors.leftMargin: units.gu(2)
1967+ anchors.leftMargin: units.gu(1)
1968 width: parent.width - detailsItem.width - units.gu(2)
1969 height: 0 // initialize to closed
1970 contentHeight: detailsblock.height
1971
1972=== modified file 'plainbox-gui/gui-ihv/qml/outline/TestSelectionListView.qml'
1973--- plainbox-gui/gui-ihv/qml/outline/TestSelectionListView.qml 2013-07-18 10:41:06 +0000
1974+++ plainbox-gui/gui-ihv/qml/outline/TestSelectionListView.qml 2013-07-24 15:37:30 +0000
1975@@ -23,6 +23,7 @@
1976 import QtQuick 2.0
1977 import Ubuntu.Components 0.1
1978 import Ubuntu.Components.ListItems 0.1 as ListItem
1979+import Ubuntu.Components.Popups 0.1
1980 import "."
1981
1982
1983@@ -47,6 +48,7 @@
1984 contentHeight: groupedList.height
1985 boundsBehavior : Flickable.StopAtBounds
1986
1987+
1988 Component {
1989 id: highlight
1990 Rectangle {
1991@@ -55,6 +57,7 @@
1992 color: "lightsteelblue";
1993 radius: 5
1994 }
1995+
1996 }
1997
1998
1999@@ -62,10 +65,14 @@
2000 ListView {
2001 id: groupedList
2002 width: parent.width
2003- height: units.gu(12) * groupedList.count + units.gu(1)
2004+ height: units.gu(7) * (groupedList.count + groupedList.sectionCount - groupedList.closedCount)
2005 interactive: false
2006 model: testSuiteModel
2007
2008+ property int sectionCount: 0// this will contain the number of sections
2009+ property int closedCount: 0 // this contains nuber of closed items
2010+ property bool displayWarnings: true
2011+
2012 delegate: TestSelectionTestDelegate {}
2013
2014 section {
2015@@ -77,7 +84,16 @@
2016 highlight: highlight
2017 highlightFollowsCurrentItem: true
2018
2019- Component.onCompleted: testdetails.testItem = testSuiteModel.get(currentItem);
2020+ Component.onCompleted: {
2021+ testdetails.testItem = testSuiteModel.get(currentItem);
2022+ sectionCount = getSectionCount()
2023+ setListSummary();
2024+ }
2025+
2026+ function showWarning(caller_button){
2027+ if (displayWarnings === true)
2028+ PopupUtils.open(warning_dialog, caller_button);
2029+ }
2030
2031 // functions to do something across the whole list
2032
2033@@ -86,7 +102,7 @@
2034 for (var i = testSuiteModel.count - 1; i >=0; i--)
2035 testSuiteModel.setProperty(i, "check", sel);
2036
2037- // this is to select the group items and to make sure data is updated
2038+ // make sure the UI is updated
2039 var oldCurrent = currentIndex
2040 currentIndex = -1
2041 for (var j = 0; j < groupedList.contentItem.children.length; j++){
2042@@ -94,29 +110,32 @@
2043 curItem.checked = sel;
2044 }
2045 currentIndex = oldCurrent
2046+
2047+ // reset the summary
2048+ setListSummary()
2049 }
2050
2051
2052 // when a group item is checked/unchecked the subitems are checked/unchecked
2053 function selectGroup(groupName, sel){
2054+ // select in the model
2055 for (var i = testSuiteModel.count - 1; i >=0; i--){
2056- var item = testSuiteModel.get(i);
2057+ var item = testSuiteModel.get(i);
2058 if (item.group === groupName)
2059 testSuiteModel.setProperty(i, "check", sel);
2060 }
2061
2062- // this is to select the group items and to make sure data is updated
2063+ // make sure data is updated on the UI
2064 var oldCurrent = currentIndex
2065 currentIndex = -1
2066- for (var i = 0; i < groupedList.contentItem.children.length; i++)
2067+ for (i = 0; i < groupedList.contentItem.children.length; i++)
2068 {
2069 var curItem = groupedList.contentItem.children[i];
2070- //console.log(i,": ", curItem, "=", curItem.groupname);
2071-
2072 if (curItem.groupname === groupName)
2073 curItem.checked = sel;
2074 }
2075 currentIndex = oldCurrent
2076+ setListSummary()
2077 }
2078
2079 // determines if one or more subitems are checked
2080@@ -141,41 +160,34 @@
2081 for (i = groupedList.contentItem.children.length - 1; i >= 0; i--)
2082 {
2083 curItem = groupedList.contentItem.children[i];
2084- if (curItem.labelname === groupName)
2085+ if (curItem.labelname === groupName){
2086 curItem.checked = setCheck
2087+ i = -1;
2088+ }
2089
2090 }
2091-
2092 currentIndex = oldCurrent;
2093- }
2094-
2095- // If any subitems are selected, group should be selected.
2096- function isGroupSelected(section){
2097- var isSel = false;
2098- for (var i = testSuiteModel.count - 1; i >=0 && isSel === false; i--)
2099- {
2100- var curItem = testSuiteModel.get(i);
2101- //console.log("Section: ", section, " ", i,": ", curItem, "=", curItem.group, " check:", curItem.check);
2102-
2103- if (curItem.group === section && curItem.check === "true"){
2104- isSel = true;
2105- }
2106- }
2107- return isSel;
2108+
2109 }
2110
2111 // Add up all the selected tests in a group
2112 function getEstimatedTime(section){
2113+ var start = new Date();
2114 var estTimeStr = "";
2115 var estTimeInt=0;
2116+ var foundGroup = false; // list is ordered in groups, after whole group found return
2117
2118- for (var i = testSuiteModel.count - 1; i >=0; i--)
2119+ for (var i = 0; i <testSuiteModel.count; i++)
2120 {
2121 var curItem = testSuiteModel.get(i);
2122
2123 //console.log("curItem.group:", curItem.group, "check", curItem.check)
2124- if (curItem.group === section && curItem.check === "true")
2125+ if (curItem.group === section && curItem.check === "true"){
2126+ foundGroup = true;
2127 estTimeInt = parseInt(curItem.duration) + parseInt(estTimeInt);
2128+ }
2129+ if (foundGroup && curItem.group != section)
2130+ i = testSuiteModel.count;
2131
2132 }
2133 if (estTimeInt == 0)
2134@@ -188,11 +200,14 @@
2135 if (durMinutes > 1)
2136 estTimeStr += 's';
2137 }
2138+ var end = new Date();
2139+ console.log("Time for estimated groups:", section, end.getMilliseconds() - start.getMilliseconds());
2140 return estTimeStr;
2141 }
2142
2143 // Open/Close gruops
2144 function openShutSubgroup(groupName, sel){
2145+
2146 var oldCurrent = currentIndex;
2147 currentIndex = -1
2148 for (var i = 0; i < groupedList.contentItem.children.length; i++)
2149@@ -204,21 +219,100 @@
2150 if (curItem.groupname === groupName && curItem.labelname !== groupName){
2151 curItem.height = sel? units.gu(7):units.gu(0);
2152 curItem.visible = sel;
2153- groupedList.height += sel?units.gu(7):-units.gu(7)
2154+ if (sel)
2155+ closedCount--;
2156+ else closedCount++;
2157 }
2158 }
2159 currentIndex = oldCurrent;
2160 }
2161
2162+ function updateListSummary(testItem, sel){
2163+ if (sel){
2164+ summary.totalTests += 1;
2165+ summary.totalTimeEst = parseInt(summary.totalTimeEst ) + parseInt(testItem.duration);
2166+ if (testItem.type === "Manual")
2167+ summary.totalManualTests += 1;
2168+ }
2169+ else {
2170+ summary.totalTests -= 1;
2171+ summary.totalTimeEst = parseInt(summary.totalTimeEst ) - testItem.duration;
2172+ if (testItem.type === "Manual")
2173+ summary.totalManualTests -= 1
2174+ }
2175+ }
2176+
2177+
2178+ function setListSummary(){
2179+ var start = new Date();
2180+ // TODO count how many manuals testSuiteModel
2181+ var testCnt = 0;
2182+ var manualCnt = 0;
2183+
2184+ var estTimeInt=0;
2185+
2186+ for (var i = testSuiteModel.count - 1; i >=0; i--)
2187+ {
2188+ var curItem = testSuiteModel.get(i);
2189+ if ( curItem.check === "true"){
2190+ testCnt++;
2191+ if (curItem.type === "Manual")
2192+ manualCnt++;
2193+ estTimeInt = parseInt(curItem.duration) + parseInt(estTimeInt);
2194+ }
2195+ }
2196+ summary.totalTests = testCnt;
2197+ summary.totalManualTests = manualCnt;
2198+ summary.totalTimeEst = estTimeInt;
2199+ var end = new Date();
2200+ console.log("Time for summary:", end.getMilliseconds() - start.getMilliseconds());
2201+
2202+ }
2203+
2204+ function getSectionCount(){
2205+ var start = new Date();
2206+ // if this is the first time called, find all sections
2207+ var secCnt = sectionCount
2208+ if (secCnt === 0){
2209+ var curItem = testSuiteModel.get(0);
2210+ var curSec = curItem.group;
2211+ secCnt = 1;
2212+ for (var i = 1; i < testSuiteModel.count; i++){
2213+ curItem = testSuiteModel.get(i);
2214+ if (curItem.group !== curSec){
2215+ curSec = curItem.group
2216+ secCnt++;
2217+ }
2218+ }
2219+ }
2220+ var end = new Date();
2221+ console.log("Time for Section Count:", end.getMilliseconds() - start.getMilliseconds());
2222+ return secCnt;
2223+ }
2224 }
2225-
2226-
2227 }
2228
2229 Scrollbar {
2230 flickableItem: listflick
2231 align: Qt.AlignTrailing
2232 }
2233+
2234+ Component {
2235+ id: warning_dialog
2236+ WarningDialog{
2237+ text: i18n.tr("Deselecting tests may reduce your ability to detect potential problems with the device driver.");
2238+ showOK: true
2239+ showCancel: false
2240+ showContinue: false
2241+ showCheckbox: true
2242+
2243+ onOk: {
2244+ if (isChecked)
2245+ groupedList.displayWarnings = false;
2246+ console.log("ok clicked");
2247+ }
2248+ }
2249+ }
2250 }
2251
2252
2253
2254=== modified file 'plainbox-gui/gui-ihv/qml/outline/TestSelectionSuiteDelegate.qml'
2255--- plainbox-gui/gui-ihv/qml/outline/TestSelectionSuiteDelegate.qml 2013-07-18 10:41:06 +0000
2256+++ plainbox-gui/gui-ihv/qml/outline/TestSelectionSuiteDelegate.qml 2013-07-24 15:37:30 +0000
2257@@ -40,11 +40,11 @@
2258 property bool open: true
2259
2260 onOpenChanged: {
2261- open?progressIcon.source = "artwork/DownArrow.png":progressIcon.source = "artwork/RightArrow.png"
2262+ open?openshutIcon.source = "artwork/DownArrow.png":openshutIcon.source = "artwork/RightArrow.png"
2263 }
2264
2265 MouseArea {
2266- width: parent.width - groupcheckbox.width
2267+ width: parent.width// - groupcheckbox.width
2268 height: parent.height
2269 anchors.right: parent.right
2270
2271@@ -57,16 +57,33 @@
2272
2273 Item {
2274 id: groupfiller
2275- width: units.gu(1)
2276+ width: units.gu(2)
2277+ }
2278+
2279+ Image {
2280+ id: openshutIcon
2281+ source: "artwork/DownArrow.png"
2282+ width: units.gu(2)
2283+ height: units.gu(2)
2284+ anchors {
2285+ verticalCenter: parent.verticalCenter
2286+ left: groupfiller.left
2287+ }
2288+
2289+ opacity: enabled ? 1.0 : 0.5
2290 }
2291
2292 CheckBox {
2293 id: groupcheckbox
2294 anchors.verticalCenter: parent.verticalCenter
2295- anchors.left: groupfiller.right
2296+ anchors.left: openshutIcon.right
2297 anchors.leftMargin: units.gu(1)
2298- checked: groupedList.isGroupSelected(section)
2299- onClicked: groupedList.selectGroup(section, checked)
2300+ checked: true
2301+ onClicked: {
2302+ groupedList.selectGroup(section, checked)
2303+ if (!checked)
2304+ groupedList.showWarning(groupcheckbox);
2305+ }
2306 }
2307
2308
2309@@ -81,14 +98,14 @@
2310
2311 Item {
2312 id: estfiller
2313- width: units.gu(55)
2314+ width: units.gu(38)
2315 anchors.left: grouptext.right
2316 }
2317
2318 Text {
2319 id: estimatedTimeText
2320 text: groupedList.getEstimatedTime(section)
2321- width: units.gu(12)
2322+ width: units.gu(10)
2323 anchors.left: estfiller.right
2324 anchors.verticalCenter: parent.verticalCenter
2325 horizontalAlignment: Text.AlignHCenter
2326@@ -96,17 +113,7 @@
2327 font.bold : true
2328 }
2329
2330- Image {
2331- id: progressIcon
2332- source: "artwork/DownArrow.png"
2333- anchors {
2334- verticalCenter: parent.verticalCenter
2335- right: parent.right
2336- rightMargin: units.gu(1)
2337- }
2338
2339- opacity: enabled ? 1.0 : 0.5
2340- }
2341
2342 ListItem.ThinDivider {}
2343 }
2344
2345=== modified file 'plainbox-gui/gui-ihv/qml/outline/TestSelectionSummary.qml'
2346--- plainbox-gui/gui-ihv/qml/outline/TestSelectionSummary.qml 2013-07-18 10:41:06 +0000
2347+++ plainbox-gui/gui-ihv/qml/outline/TestSelectionSummary.qml 2013-07-24 15:37:30 +0000
2348@@ -26,7 +26,7 @@
2349 Rectangle {
2350 id: summary
2351
2352- property string totalTimeStr: "26 minutes"
2353+ property int totalTimeEst: 0
2354 property int totalTests: 6
2355 property int totalManualTests: 2
2356
2357@@ -39,13 +39,27 @@
2358
2359 Text {
2360 id: estimatedTimeText
2361- text: i18n.tr("Total time: [~" + summary.totalTimeStr + "]")
2362+ text: i18n.tr("Total time: [~" + formatTotalTime(summary.totalTimeStr) + "]")
2363 color: "darkslateblue"
2364 anchors{
2365 verticalCenter: parent.verticalCenter
2366 left: parent.left
2367 leftMargin: units.gu(1)
2368 }
2369+ function formatTotalTime(){
2370+ var estTimeStr = ""
2371+ if (totalTimeEst == 0)
2372+ estTimeStr = i18n.tr("0");
2373+ else if (totalTimeEst/60 < 1)
2374+ estTimeStr = i18n.tr("< 1 minute");
2375+ else {
2376+ var durMinutes = Math.round(totalTimeEst/60);
2377+ estTimeStr = durMinutes.toString() + i18n.tr(" minute");
2378+ if (durMinutes > 1)
2379+ estTimeStr += 's';
2380+ }
2381+ return estTimeStr;
2382+ }
2383 }
2384
2385 Text {
2386
2387=== modified file 'plainbox-gui/gui-ihv/qml/outline/TestSelectionTestDelegate.qml'
2388--- plainbox-gui/gui-ihv/qml/outline/TestSelectionTestDelegate.qml 2013-07-18 10:41:06 +0000
2389+++ plainbox-gui/gui-ihv/qml/outline/TestSelectionTestDelegate.qml 2013-07-24 15:37:30 +0000
2390@@ -53,7 +53,7 @@
2391
2392 Item {
2393 id: filler
2394- width: itemcheckbox.width
2395+ width: itemcheckbox.width + units.gu(2)
2396 }
2397
2398 CheckBox {
2399@@ -64,7 +64,10 @@
2400 checked: check
2401 onClicked: {
2402 testSuiteModel.setProperty(index, "check", checked);
2403- groupedList.setGroupCheck(group)
2404+ groupedList.setGroupCheck(group);
2405+ groupedList.updateListSummary(testSuiteModel.get(index), checked);
2406+ if (!checked)
2407+ groupedList.showWarning(itemcheckbox);
2408 }
2409 }
2410
2411@@ -72,7 +75,8 @@
2412 Text {
2413 id: nameLabel
2414 text: testname
2415- width: units.gu(40)
2416+ width: units.gu(28)
2417+ elide: Text.ElideRight
2418 anchors.verticalCenter: parent.verticalCenter
2419 anchors.left: itemcheckbox.right
2420 anchors.leftMargin: units.gu(1)
2421@@ -80,7 +84,7 @@
2422
2423 Item {
2424 id: typefiller
2425- width: units.gu(2)
2426+ width: units.gu(4)
2427 anchors.left: nameLabel.right
2428 }
2429
2430@@ -95,16 +99,16 @@
2431 }
2432
2433 Item {
2434- id: descfiller
2435- width: units.gu(20)
2436+ id: esttimefiller
2437+ width: units.gu(11)
2438 anchors.left: typelabel.right
2439 }
2440
2441 Text {
2442- id: descLabel
2443+ id: esttimelabel
2444 text: convertToText(duration)
2445 width: units.gu(10)
2446- anchors.left: descfiller.right
2447+ anchors.left: esttimefiller.right
2448 anchors.verticalCenter: parent.verticalCenter
2449 horizontalAlignment: Text.AlignHCenter
2450
2451@@ -119,7 +123,23 @@
2452 timeStr += 's';
2453 }
2454 return timeStr;
2455- }
2456+ } }
2457+
2458+ Item {
2459+ id: descfiller
2460+ width: units.gu(12)
2461+ anchors.left: esttimelabel.right
2462+ }
2463+
2464+ Text {
2465+ id: descLabel
2466+ text: "blahsdfgkjl abdefghijklmnopqrstuvwxyz asdf the flkjsdf t lwjerlkjaf boo\n\n" // TODO put descrition property here
2467+ width: units.gu(14)
2468+ elide: Text.ElideRight
2469+ maximumLineCount: 1
2470+ anchors.left: descfiller.right
2471+ anchors.verticalCenter: parent.verticalCenter
2472+ horizontalAlignment: Text.AlignHCenter
2473 }
2474
2475
2476
2477=== modified file 'plainbox-gui/gui-ihv/qml/outline/TestSelectionView.qml'
2478--- plainbox-gui/gui-ihv/qml/outline/TestSelectionView.qml 2013-07-17 15:49:03 +0000
2479+++ plainbox-gui/gui-ihv/qml/outline/TestSelectionView.qml 2013-07-24 15:37:30 +0000
2480@@ -65,7 +65,7 @@
2481 }
2482 Item {
2483 id: typefiller
2484- width: units.gu(28)
2485+ width: units.gu(20)
2486 anchors.left: complabel.right
2487 }
2488
2489@@ -78,9 +78,23 @@
2490 }
2491
2492 Item {
2493+ id: esttimefiller
2494+ width: units.gu(4)
2495+ anchors.left: typelabel.right
2496+ }
2497+
2498+ Text {
2499+ id: esttimelabel
2500+ text: i18n.tr("Estimated Time")
2501+ anchors.left: esttimefiller.right
2502+ anchors.leftMargin: units.gu(10)
2503+ horizontalAlignment: Text.AlignHCenter
2504+ }
2505+
2506+ Item {
2507 id: descfiller
2508- width: units.gu(24)
2509- anchors.left: typelabel.right
2510+ width: units.gu(12)
2511+ anchors.left: esttimelabel.right
2512 }
2513 Text {
2514 id: descriptionlabel
2515@@ -93,8 +107,8 @@
2516
2517 TestSelectionListView {
2518 id: testsuitelist
2519- height: parent.height - filler.height - testlistheaders.height - summary.height - testbuttons.height - units.gu(12)
2520-
2521+ height: parent.height - filler.height - testlistheaders.height - testdetails.height - testbuttons.height - summary.height - units.gu(8)
2522+ //height: units.gu(60)
2523 width: testlistheaders.width
2524
2525 anchors{
2526@@ -104,16 +118,15 @@
2527 }
2528
2529
2530-
2531 TestSelectionDetails {
2532 id: testdetails
2533- height: units.gu(4)
2534+ height: openHeight
2535 width: testlistheaders.width
2536
2537 anchors{
2538 horizontalCenter: parent.horizontalCenter
2539 top: testsuitelist.bottom
2540- topMargin: units.gu(1)
2541+ topMargin: units.gu(2)
2542 }
2543 }
2544
2545@@ -122,8 +135,8 @@
2546 id: testbuttons
2547 anchors{
2548 horizontalCenter: parent.horizontalCenter
2549- bottom: parent.bottom
2550- bottomMargin: units.gu(4)
2551+ bottom: summary.top
2552+ bottomMargin: units.gu(2)
2553 }
2554
2555 onSelectAll:{
2556@@ -135,7 +148,6 @@
2557 }
2558
2559 onStartTesting: {
2560- // CHANGE THIS TO NEXT PAGE TO BRING UP
2561 mainView.state = "RUNMANAGER"
2562 console.log("Start Testing")
2563 }
2564@@ -143,6 +155,7 @@
2565
2566 TestSelectionSummary{
2567 id: summary
2568+ height: units.gu(2)
2569 width: parent.width
2570 anchors {
2571 horizontalCenter: parent.horizontalCenter
2572
2573=== modified file 'plainbox-gui/gui-ihv/qml/outline/WelcomeView.qml'
2574--- plainbox-gui/gui-ihv/qml/outline/WelcomeView.qml 2013-07-17 14:23:54 +0000
2575+++ plainbox-gui/gui-ihv/qml/outline/WelcomeView.qml 2013-07-24 15:37:30 +0000
2576@@ -27,15 +27,92 @@
2577 Page {
2578 title: i18n.tr("Welcome!")
2579
2580-
2581-
2582- Button {
2583- anchors.left: parent.left
2584- anchors.right: parent.right
2585- anchors.bottom: parent.bottom
2586- anchors.margins: units.gu(2)
2587- text: i18n.tr("OK")
2588- color: UbuntuColors.lightAubergine
2589- onClicked: {mainView.state = "SUITESELECTION"}
2590- }
2591+ Image {
2592+ id: logo
2593+ anchors {
2594+ left: parent.left
2595+ right: parent.right
2596+ margins: units.gu(2)
2597+ }
2598+ source:"artwork/checkbox-qt-head.png"
2599+ }
2600+
2601+
2602+
2603+ Rectangle{
2604+ color: "white"//Theme.palette.normal.background
2605+ anchors {
2606+ left: parent.left
2607+ right: parent.right
2608+ top: logo.bottom
2609+ bottom: continueButton.top
2610+ margins: units.gu(2)
2611+ }
2612+
2613+ TextEdit{
2614+ id: welcometext
2615+
2616+ anchors {
2617+ fill: parent
2618+ margins: units.gu(2)
2619+ }
2620+
2621+ // TODO load text from Plainbox
2622+ text: "<p>Welcome to the Canonical Hardware Driver Testing.</p>
2623+ <p></p>
2624+ <p>This program contains automated and manual tests to help you discover issues that will arise when running your device drivers on Ubuntu.</p>
2625+ <p></p>
2626+ <p>This application will step the user through these tests in a predetermined order and automatically collect both system information as well as test results. It will also prompt the user for input when manual testing is required.</p>
2627+ <p></p>
2628+ <p>The run time for the tests is determined by which tests you decide to execute. The user will have the opportunity to customize the test run to accommodate the driver and the amount of time available for testing.</p>
2629+ <p></p>
2630+ <p>If you have any questions during or after completing your test run, please do not hesitate to contact your Canonical account representative.</p>
2631+ <p></p>
2632+ <p>To begin, simply click the Continue button below and follow the onscreen instructions.</p>
2633+ <p></p>"
2634+
2635+ // links below are to test if the urls are working properly.
2636+ //<a href=\"mailto:me@here.there\">me@here.there</a>
2637+ //<p></p>
2638+ //<a href=\"http://www.canonical.com\">Canonical</a>"
2639+
2640+
2641+
2642+ height: units.gu(60)
2643+ width: units.gu(30)
2644+ cursorVisible : true
2645+ readOnly: true
2646+ selectByMouse : true
2647+ textFormat: TextEdit.AutoText
2648+ wrapMode: TextEdit.Wrap
2649+ color: "black"//Theme.palette.normal.foregroundText
2650+ selectedTextColor: Theme.palette.selected.foregroundText
2651+ selectionColor: Theme.palette.selected.foreground
2652+ font.pixelSize: FontUtils.sizeToPixels("medium")
2653+
2654+ onLinkActivated: {
2655+ console.log("onLinkActivated")
2656+ cmdTool.exec("xdg-open", link)
2657+ }
2658+
2659+
2660+ }
2661+ }
2662+
2663+
2664+
2665+
2666+Button {
2667+ id: continueButton
2668+ anchors{
2669+ left: parent.left
2670+ right: parent.right
2671+ bottom: parent.bottom
2672+ margins: units.gu(2)
2673+ }
2674+ // TODO load text from plainbox
2675+ text: i18n.tr("Continue")
2676+ color: UbuntuColors.lightAubergine
2677+ onClicked: {mainView.state = "SUITESELECTION"}
2678+}
2679 }
2680
2681=== added file 'plainbox-gui/gui-ihv/qml/outline/artwork/details.svg'
2682--- plainbox-gui/gui-ihv/qml/outline/artwork/details.svg 1970-01-01 00:00:00 +0000
2683+++ plainbox-gui/gui-ihv/qml/outline/artwork/details.svg 2013-07-24 15:37:30 +0000
2684@@ -0,0 +1,68 @@
2685+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2686+<!-- Created with Inkscape (http://www.inkscape.org/) -->
2687+<svg id="svg2" xmlns="http://www.w3.org/2000/svg" height="24" width="24" version="1.0" xmlns:xlink="http://www.w3.org/1999/xlink">
2688+ <defs id="defs4">
2689+ <linearGradient id="linearGradient3779" y2="-.43754" gradientUnits="userSpaceOnUse" x2="20.484" gradientTransform="matrix(0 -.43118 .42426 0 8.8859 25.258)" y1="12.82" x1="20.484">
2690+ <stop id="stop2189" style="stop-color:#fff;stop-opacity:.64341" offset="0"/>
2691+ <stop id="stop2191" style="stop-color:#fff;stop-opacity:0" offset="1"/>
2692+ </linearGradient>
2693+ <linearGradient id="linearGradient3773" y2="15.5" gradientUnits="userSpaceOnUse" x2="-.073089" gradientTransform="matrix(.36202 0 0 .36792 8.2405 6.3535)" y1="15.5" x1="23.997">
2694+ <stop id="stop3700" style="stop-color:#ce7ecc" offset="0"/>
2695+ <stop id="stop3702" style="stop-color:#c056bc;stop-opacity:.81569" offset=".76279"/>
2696+ <stop id="stop3704" style="stop-color:#f8c9f7;stop-opacity:0" offset="1"/>
2697+ </linearGradient>
2698+ <linearGradient id="linearGradient3775" y2="36" gradientUnits="userSpaceOnUse" x2="-.097514" gradientTransform="matrix(.36202 0 0 .36792 8.2405 6.3535)" y1="36" x1="36.5">
2699+ <stop id="stop3916" style="stop-color:#c02cbb" offset="0"/>
2700+ <stop id="stop3918" style="stop-color:#b329ae;stop-opacity:.49804" offset=".79722"/>
2701+ <stop id="stop3920" style="stop-color:#982394;stop-opacity:0" offset="1"/>
2702+ </linearGradient>
2703+ <linearGradient id="linearGradient4543" y2="5.4565" gradientUnits="userSpaceOnUse" x2="36.358" gradientTransform="matrix(.54163 0 0 .52030 -.94021 -.30186)" y1="8.059" x1="32.892">
2704+ <stop id="stop8591" style="stop-color:#fefefe" offset="0"/>
2705+ <stop id="stop8593" style="stop-color:#cbcbcb" offset="1"/>
2706+ </linearGradient>
2707+ <linearGradient id="linearGradient4565" y2="5.8215" gradientUnits="userSpaceOnUse" x2="15.18" y1="2.1849" x1="17.289">
2708+ <stop id="stop4561" style="stop-color:#cacaca" offset="0"/>
2709+ <stop id="stop4563" style="stop-color:#949492" offset="1"/>
2710+ </linearGradient>
2711+ <linearGradient id="linearGradient4545" y2="47.013" gradientUnits="userSpaceOnUse" x2="25.132" gradientTransform="matrix(.54288 0 0 .48891 -1.0291 -.23377)" y1="6.7287" x1="25.132">
2712+ <stop id="stop3602" style="stop-color:#f4f4f4" offset="0"/>
2713+ <stop id="stop3604" style="stop-color:#dbdbdb" offset="1"/>
2714+ </linearGradient>
2715+ <linearGradient id="linearGradient4547" y2="2.9062" gradientUnits="userSpaceOnUse" x2="-51.786" gradientTransform="matrix(.43837 0 0 .45754 31.224 -.77865)" y1="50.786" x1="-51.786">
2716+ <stop id="stop3933" style="stop-color:#8d8f8a" offset="0"/>
2717+ <stop id="stop3935" style="stop-color:#cbcbcb" offset="1"/>
2718+ </linearGradient>
2719+ <linearGradient id="linearGradient4532" y2="609.51" gradientUnits="userSpaceOnUse" x2="302.86" gradientTransform="matrix(2.7744 0 0 1.9697 -1892.2 -872.89)" y1="366.65" x1="302.86">
2720+ <stop id="stop5050" style="stop-opacity:0" offset="0"/>
2721+ <stop id="stop5056" offset=".5"/>
2722+ <stop id="stop5052" style="stop-opacity:0" offset="1"/>
2723+ </linearGradient>
2724+ <radialGradient id="radialGradient4534" xlink:href="#linearGradient5060" gradientUnits="userSpaceOnUse" cy="486.65" cx="605.71" gradientTransform="matrix(2.7744 0 0 1.9697 -1891.6 -872.89)" r="117.14"/>
2725+ <linearGradient id="linearGradient5060">
2726+ <stop id="stop5062" offset="0"/>
2727+ <stop id="stop5064" style="stop-opacity:0" offset="1"/>
2728+ </linearGradient>
2729+ <radialGradient id="radialGradient4536" xlink:href="#linearGradient5060" gradientUnits="userSpaceOnUse" cy="486.65" cx="605.71" gradientTransform="matrix(-2.7744 0 0 1.9697 112.76 -872.89)" r="117.14"/>
2730+ </defs>
2731+ <g id="layer1">
2732+ <g id="g3490" style="stroke-width:1.8826" transform="matrix(.54593 0 0 .51685 -.96573 -.57818)">
2733+ <g id="g5022" style="stroke-width:104.96" transform="matrix(.021652 0 0 .014857 43.008 42.685)">
2734+ <rect id="rect4173" style="opacity:.40206;fill:url(#linearGradient4532)" height="478.36" width="1339.6" y="-150.7" x="-1559.3"/>
2735+ <path id="path5058" style="opacity:.40206;fill:url(#radialGradient4534)" d="m-219.62-150.68v478.33c142.87 0.90045 345.4-107.17 345.4-239.2s-159.44-239.13-345.4-239.13z"/>
2736+ <path id="path5018" style="opacity:.40206;fill:url(#radialGradient4536)" d="m-1559.3-150.68v478.33c-142.87 0.90045-345.4-107.17-345.4-239.2s159.44-239.13 345.4-239.13z"/>
2737+ </g>
2738+ </g>
2739+ <path id="rect2594" style="stroke-linejoin:round;stroke:url(#linearGradient4547);stroke-width:.99914;fill:url(#linearGradient4545)" d="m2.4996 0.49957h13.062c0.7638 0.23731 4.8672 2.9408 5.9387 4.8128v17.188h-19.001v-22.001z"/>
2740+ <path id="path12038" style="stroke-linejoin:round;fill-rule:evenodd;stroke:url(#linearGradient4565);fill:url(#linearGradient4543)" d="m15.5 0.5v5h6c0-0.83659-4.8205-4.9857-6-5z"/>
2741+ <rect id="rect2870" style="fill:#babdb6" rx=".25" ry=".5" height="1" width="4" y="3" x="10"/>
2742+ <rect id="rect2874" style="opacity:.8;fill:#babdb6" rx="0.25" ry=".5" height="1" width="14" y="7" x="5"/>
2743+ <rect id="rect2892" style="opacity:.8;fill:#babdb6" rx="0.25" ry=".5" height="1" width="14" y="9" x="5"/>
2744+ <rect id="rect2894" style="opacity:.8;fill:#babdb6" rx="0.25" ry=".5" height="1" width="14" y="13" x="5"/>
2745+ <rect id="rect1984" style="opacity:.8;fill:#babdb6" rx="0.25" ry=".5" height="1" width="14" y="11" x="5"/>
2746+ <rect id="rect1988" style="fill:#babdb6" rx=".25" ry=".5" height="1" width="4" y="5" x="10"/>
2747+ <rect id="rect2887" style="opacity:.8;fill:#babdb6" height="3.4" width="4.2667" y="2.4857" x="5"/>
2748+ <path id="rect1990" style="opacity:.3;fill:#cf8e72" d="m4 2v4.6394h10.656v-4.6394h-10.656z"/>
2749+ <path id="path1432" style="stroke-linejoin:round;stroke:url(#linearGradient3775);stroke-linecap:round;display:block;fill:url(#linearGradient3773)" d="m17.5 7.4997 6 5.3693-6 5.631v-3.0006h-9.9996v-4.999h9.9996v-3.0006z"/>
2750+ <path id="path3777" style="opacity:.4;stroke:url(#linearGradient3779);display:block;fill:none" d="m18.531 8.7812v1.2188a0.51754 0.51754 0 0 1 -0.531 0.531h-8.5625l0.03125 2.9375h8.5312a0.51754 0.51754 0 0 1 0.531 0.532v1.1562l3.469-3.281-3.469-3.0938z" transform="translate(0 .99987)"/>
2751+ </g>
2752+</svg>
2753
2754=== added file 'plainbox-gui/gui-ihv/qml/outline/artwork/error.svg'
2755--- plainbox-gui/gui-ihv/qml/outline/artwork/error.svg 1970-01-01 00:00:00 +0000
2756+++ plainbox-gui/gui-ihv/qml/outline/artwork/error.svg 2013-07-24 15:37:30 +0000
2757@@ -0,0 +1,37 @@
2758+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2759+<!-- Created with Inkscape (http://www.inkscape.org/) -->
2760+<svg id="svg2" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="24" width="24" version="1.0" xmlns:cc="http://creativecommons.org/ns#" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/">
2761+ <metadata id="metadata29">
2762+ <rdf:RDF>
2763+ <cc:Work rdf:about="">
2764+ <dc:format>image/svg+xml</dc:format>
2765+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
2766+ </cc:Work>
2767+ </rdf:RDF>
2768+ </metadata>
2769+ <defs id="defs4">
2770+ <linearGradient id="linearGradient2407" y2="5.4676" gradientUnits="userSpaceOnUse" x2="63.397" gradientTransform="matrix(1.0863 0 0 1.0862 -55.567 15.814)" y1="-12.489" x1="63.397">
2771+ <stop id="stop4875" style="stop-color:#fff" offset="0"/>
2772+ <stop id="stop4877" style="stop-color:#fff;stop-opacity:0" offset="1"/>
2773+ </linearGradient>
2774+ <radialGradient id="radialGradient2410" gradientUnits="userSpaceOnUse" cy="3.99" cx="23.896" gradientTransform="matrix(0 1.2316 -1.6257 0 18.487 -28.721)" r="20.397">
2775+ <stop id="stop3244" style="stop-color:#f8b17e" offset="0"/>
2776+ <stop id="stop3246" style="stop-color:#e35d4f" offset=".26238"/>
2777+ <stop id="stop3248" style="stop-color:#c6262e" offset=".66094"/>
2778+ <stop id="stop3250" style="stop-color:#690b54" offset="1"/>
2779+ </radialGradient>
2780+ <linearGradient id="linearGradient2412" y2="3.0816" gradientUnits="userSpaceOnUse" x2="18.379" gradientTransform="matrix(.51604 0 0 .51604 -.38499 -.38499)" y1="44.98" x1="18.379">
2781+ <stop id="stop2492" style="stop-color:#791235" offset="0"/>
2782+ <stop id="stop2494" style="stop-color:#dd3b27" offset="1"/>
2783+ </linearGradient>
2784+ <radialGradient id="radialGradient2415" gradientUnits="userSpaceOnUse" cy="4.625" cx="62.625" gradientTransform="matrix(1.1294 0 0 .28235 -58.729 19.694)" r="10.625">
2785+ <stop id="stop8840" offset="0"/>
2786+ <stop id="stop8842" style="stop-opacity:0" offset="1"/>
2787+ </radialGradient>
2788+ </defs>
2789+ <path id="path8836" style="opacity:.3;fill-rule:evenodd;fill:url(#radialGradient2415)" d="m24 21c0 1.657-5.373 3-12 3-6.6274 0-12-1.343-12-3-2.5e-7 -1.657 5.3726-3 12-3 6.627 0 12 1.343 12 3z"/>
2790+ <path id="path2555" style="stroke-linejoin:round;stroke:url(#linearGradient2412);stroke-linecap:round;stroke-width:1.0037;fill:url(#radialGradient2410)" d="m12 1.5018c-5.7926 0-10.498 4.7056-10.498 10.498-0.0002 5.793 4.7054 10.498 10.498 10.498 5.793 0 10.498-4.705 10.498-10.498 0-5.7926-4.705-10.498-10.498-10.498z"/>
2791+ <path id="path2463" style="opacity:.4;stroke:url(#linearGradient2407);fill:none" d="m21.5 12c0 5.247-4.254 9.5-9.5 9.5-5.2466 0-9.5-4.254-9.5-9.5 0-5.247 4.2534-9.5 9.5-9.5 5.246 0 9.5 4.253 9.5 9.5z"/>
2792+ <path id="path3295" style="opacity:.2" d="m10.599 5.2867c0.332 2.8104 0.712 5.6013 0.995 8.4233h0.902c0.234-2.71 0.612-5.4029 0.885-8.1091 0.139-0.6407-0.241-1.4015-1.021-1.5572-0.772-0.1955-1.634 0.2886-1.736 0.9801-0.017 0.0868-0.025 0.1749-0.025 0.2629zm-0.098 11.426c-0.035 0.837 1.027 1.493 1.933 1.227 0.879-0.194 1.341-1.151 0.891-1.831-0.403-0.703-1.584-0.935-2.264-0.396-0.343 0.244-0.571 0.609-0.56 1z"/>
2793+ <path id="text2315" style="fill:#fff" d="m10.599 6.2867c0.332 2.8104 0.712 5.6013 0.995 8.4233h0.902c0.234-2.71 0.612-5.4029 0.885-8.1091 0.139-0.6407-0.241-1.4015-1.021-1.5572-0.772-0.1955-1.634 0.2886-1.736 0.9801-0.017 0.0868-0.025 0.1749-0.025 0.2629zm-0.098 11.426c-0.035 0.837 1.027 1.493 1.933 1.227 0.879-0.194 1.341-1.151 0.891-1.831-0.403-0.703-1.584-0.935-2.264-0.396-0.343 0.244-0.571 0.609-0.56 1z"/>
2794+</svg>
2795
2796=== added file 'plainbox-gui/gui-ihv/qml/outline/artwork/failed.svg'
2797--- plainbox-gui/gui-ihv/qml/outline/artwork/failed.svg 1970-01-01 00:00:00 +0000
2798+++ plainbox-gui/gui-ihv/qml/outline/artwork/failed.svg 2013-07-24 15:37:30 +0000
2799@@ -0,0 +1,33 @@
2800+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2801+<!-- Created with Inkscape (http://www.inkscape.org/) -->
2802+<svg id="svg2" xmlns="http://www.w3.org/2000/svg" height="24" width="24" version="1.0" xmlns:xlink="http://www.w3.org/1999/xlink">
2803+ <defs id="defs4">
2804+ <linearGradient id="linearGradient2411" y2="5.4676" gradientUnits="userSpaceOnUse" x2="63.397" gradientTransform="matrix(1.0863 0 0 1.0862 -55.567 15.814)" y1="-12.489" x1="63.397">
2805+ <stop id="stop4875" style="stop-color:#fff" offset="0"/>
2806+ <stop id="stop4877" style="stop-color:#fff;stop-opacity:0" offset="1"/>
2807+ </linearGradient>
2808+ <linearGradient id="linearGradient2416" y2="3.0816" gradientUnits="userSpaceOnUse" x2="18.379" gradientTransform="matrix(.51604 0 0 .51604 -.38499 -.38499)" y1="44.98" x1="18.379">
2809+ <stop id="stop2492" style="stop-color:#791235" offset="0"/>
2810+ <stop id="stop2494" style="stop-color:#dd3b27" offset="1"/>
2811+ </linearGradient>
2812+ <radialGradient id="radialGradient2414" gradientUnits="userSpaceOnUse" cy="3.99" cx="23.896" gradientTransform="matrix(0 1.2316 -1.6257 0 18.487 -28.721)" r="20.397">
2813+ <stop id="stop3244" style="stop-color:#f8b17e" offset="0"/>
2814+ <stop id="stop3246" style="stop-color:#e35d4f" offset=".26238"/>
2815+ <stop id="stop3248" style="stop-color:#c6262e" offset=".66094"/>
2816+ <stop id="stop3250" style="stop-color:#690b54" offset="1"/>
2817+ </radialGradient>
2818+ <radialGradient id="radialGradient2419" gradientUnits="userSpaceOnUse" cy="4.625" cx="62.625" gradientTransform="matrix(1.1294 0 0 .28235 -58.729 19.694)" r="10.625">
2819+ <stop id="stop8840" offset="0"/>
2820+ <stop id="stop8842" style="stop-opacity:0" offset="1"/>
2821+ </radialGradient>
2822+ </defs>
2823+ <g id="layer1">
2824+ <g id="g2580">
2825+ <path id="path8836" style="opacity:.3;fill-rule:evenodd;fill:url(#radialGradient2419)" d="m24 21c0 1.657-5.373 3-12 3-6.6274 0-12-1.343-12-3-2.5e-7 -1.657 5.3726-3 12-3 6.627 0 12 1.343 12 3z"/>
2826+ <path id="path2555" style="stroke-linejoin:round;stroke:url(#linearGradient2416);stroke-linecap:round;stroke-width:1.0037;fill:url(#radialGradient2414)" d="m12 1.5018c-5.7926 0-10.498 4.7056-10.498 10.498-0.0002 5.793 4.7054 10.498 10.498 10.498 5.793 0 10.498-4.705 10.498-10.498 0-5.7926-4.705-10.498-10.498-10.498z"/>
2827+ <path id="path2463" style="opacity:.4;stroke:url(#linearGradient2411);fill:none" d="m21.5 12c0 5.247-4.254 9.5-9.5 9.5-5.2466 0-9.5-4.254-9.5-9.5 0-5.247 4.2534-9.5 9.5-9.5 5.246 0 9.5 4.253 9.5 9.5z"/>
2828+ </g>
2829+ <path id="path3243" style="opacity:.2;fill-rule:evenodd" d="m8.5781 6l-1.5781 1.5781 3.256 3.2389c0.1 0.102 0.1 0.264 0 0.366l-3.256 3.239 1.5781 1.578 3.2389-3.239c0.102-0.1 0.264-0.1 0.366 0l3.239 3.239 1.578-1.578-3.239-3.239c-0.1-0.102-0.1-0.264 0-0.366l3.239-3.2389-1.578-1.5781-3.239 3.2392c-0.102 0.1-0.264 0.1-0.366 0l-3.2389-3.2392z"/>
2830+ <path id="path3256" style="fill:#fff;fill-rule:evenodd" d="m8.5781 7l-1.5781 1.5781 3.256 3.2389c0.1 0.102 0.1 0.264 0 0.366l-3.256 3.239 1.5781 1.578 3.2389-3.239c0.102-0.1 0.264-0.1 0.366 0l3.239 3.239 1.578-1.578-3.239-3.239c-0.1-0.102-0.1-0.264 0-0.366l3.239-3.2389-1.578-1.5781-3.239 3.239c-0.102 0.1-0.264 0.1-0.366 0l-3.2389-3.239z"/>
2831+ </g>
2832+</svg>
2833
2834=== added file 'plainbox-gui/gui-ihv/qml/outline/artwork/passed.svg'
2835--- plainbox-gui/gui-ihv/qml/outline/artwork/passed.svg 1970-01-01 00:00:00 +0000
2836+++ plainbox-gui/gui-ihv/qml/outline/artwork/passed.svg 2013-07-24 15:37:30 +0000
2837@@ -0,0 +1,23 @@
2838+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2839+<!-- Created with Inkscape (http://www.inkscape.org/) -->
2840+<svg id="svg2841" xmlns="http://www.w3.org/2000/svg" height="24" width="24" version="1.0" xmlns:xlink="http://www.w3.org/1999/xlink">
2841+ <defs id="defs2843">
2842+ <radialGradient id="radialGradient4811" gradientUnits="userSpaceOnUse" cy="19.031" cx="11.25" gradientTransform="matrix(1 0 0 .28295 0 13.646)" r="8.0625">
2843+ <stop id="stop2487" style="stop-color:#0d0d0d" offset="0"/>
2844+ <stop id="stop2489" style="stop-color:#0d0d0d;stop-opacity:0" offset="1"/>
2845+ </radialGradient>
2846+ <linearGradient id="linearGradient4813" y2="31.138" gradientUnits="userSpaceOnUse" x2="-93.088" gradientTransform="matrix(.51128 -.12167 .12241 .50821 56.783 -3.2077)" y1="2.0691" x1="-86.129">
2847+ <stop id="stop2266" style="stop-color:#d7e866" offset="0"/>
2848+ <stop id="stop2268" style="stop-color:#8cab2a" offset="1"/>
2849+ </linearGradient>
2850+ <linearGradient id="linearGradient3597" y2="47.76" gradientUnits="userSpaceOnUse" x2="20.494" gradientTransform="matrix(.50259 0 0 .49957 1.194 .76653)" y1="6.0098" x1="20.494">
2851+ <stop id="stop3402" style="stop-color:#fff" offset="0"/>
2852+ <stop id="stop3404" style="stop-color:#fff;stop-opacity:0" offset="1"/>
2853+ </linearGradient>
2854+ </defs>
2855+ <g id="layer1">
2856+ <path id="path4346" style="opacity:.16292;fill:url(#radialGradient4811)" d="m19.312 19.031a8.0625 2.2812 0 1 1 -16.125 0 8.0625 2.2812 0 1 1 16.125 0z" transform="matrix(1.4884 0 0 1.4466 -4.7442 -6.8302)"/>
2857+ <path id="path1542" style="stroke-linejoin:round;stroke:#699536;stroke-linecap:round;stroke-width:1.0028;fill:url(#linearGradient4813)" d="m18.175 3.5051c-0.28132-0.028378-0.561 0.10858-0.70554 0.3715l-6.158 11.2-3.9593-3.13c-0.3527-0.191-0.7927-0.068-0.9855 0.283l-1.7756 2.2659c-0.19272 0.35056-0.063069 0.78783 0.28962 0.97939 0 0 7.2294 5.935 7.2384 5.9394 0.08266 0.0449 0.1691 0.06749 0.25697 0.07853 0.28704 0.03605 0.58079-0.098 0.72834-0.3664l8.305-15.105c0.19272-0.35057 0.06307-0.78783-0.28962-0.97939l-2.664-1.4539c-0.08817-0.047891-0.186-0.074167-0.27977-0.083626z"/>
2858+ <path id="path1544" style="opacity:.4;stroke:url(#linearGradient3597);stroke-linecap:round;stroke-width:1.0028;fill:none" d="m18.214 4.6151-6.593 11.979-4.578-3.601c-0.5 0.6-0.8489 1.092-1.4161 1.8 0 0 6.6812 5.4506 6.7617 5.5344 0.25102-0.4046 7.8917-14.328 8.0035-14.541-0.16743-0.11534-2.1201-1.1252-2.1778-1.1715z"/>
2859+ </g>
2860+</svg>
2861
2862=== added file 'plainbox-gui/gui-ihv/qml/outline/artwork/rerun.svg'
2863--- plainbox-gui/gui-ihv/qml/outline/artwork/rerun.svg 1970-01-01 00:00:00 +0000
2864+++ plainbox-gui/gui-ihv/qml/outline/artwork/rerun.svg 2013-07-24 15:37:30 +0000
2865@@ -0,0 +1,201 @@
2866+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2867+<!-- Created with Inkscape (http://www.inkscape.org/) -->
2868+
2869+<svg
2870+ xmlns:svg="http://www.w3.org/2000/svg"
2871+ xmlns="http://www.w3.org/2000/svg"
2872+ xmlns:xlink="http://www.w3.org/1999/xlink"
2873+ version="1.0"
2874+ width="24"
2875+ height="24"
2876+ id="svg2449">
2877+ <defs
2878+ id="defs2451">
2879+ <linearGradient
2880+ id="linearGradient3827">
2881+ <stop
2882+ id="stop3835"
2883+ style="stop-color:#6396cd;stop-opacity:1"
2884+ offset="0" />
2885+ <stop
2886+ id="stop3831"
2887+ style="stop-color:#7ba7d5;stop-opacity:0"
2888+ offset="1" />
2889+ </linearGradient>
2890+ <linearGradient
2891+ id="linearGradient3803">
2892+ <stop
2893+ id="stop3805"
2894+ style="stop-color:#538ec6;stop-opacity:1"
2895+ offset="0" />
2896+ <stop
2897+ id="stop3807"
2898+ style="stop-color:#538ec6;stop-opacity:0"
2899+ offset="1" />
2900+ </linearGradient>
2901+ <linearGradient
2902+ id="linearGradient3533">
2903+ <stop
2904+ id="stop3535"
2905+ style="stop-color:#93b9dd;stop-opacity:1"
2906+ offset="0" />
2907+ <stop
2908+ id="stop3545"
2909+ style="stop-color:#6396cd;stop-opacity:1"
2910+ offset="1" />
2911+ </linearGradient>
2912+ <linearGradient
2913+ x1="108.97875"
2914+ y1="185.10141"
2915+ x2="111.16116"
2916+ y2="193.85185"
2917+ id="linearGradient5584"
2918+ xlink:href="#linearGradient5578"
2919+ gradientUnits="userSpaceOnUse"
2920+ gradientTransform="matrix(1.0000213,0,0,0.99999945,-102.00336,-174.00344)" />
2921+ <linearGradient
2922+ id="linearGradient5578">
2923+ <stop
2924+ id="stop5580"
2925+ style="stop-color:#ffffff;stop-opacity:1"
2926+ offset="0" />
2927+ <stop
2928+ id="stop5582"
2929+ style="stop-color:#ffffff;stop-opacity:0"
2930+ offset="1" />
2931+ </linearGradient>
2932+ <linearGradient
2933+ x1="113.66741"
2934+ y1="189.97391"
2935+ x2="112.51836"
2936+ y2="187"
2937+ id="linearGradient5554"
2938+ xlink:href="#linearGradient5548"
2939+ gradientUnits="userSpaceOnUse"
2940+ gradientTransform="matrix(1.0000213,0,0,0.99999945,-102.00336,-174.00344)" />
2941+ <linearGradient
2942+ id="linearGradient5548">
2943+ <stop
2944+ id="stop5550"
2945+ style="stop-color:#ffffff;stop-opacity:1"
2946+ offset="0" />
2947+ <stop
2948+ id="stop5552"
2949+ style="stop-color:#ffffff;stop-opacity:0"
2950+ offset="1" />
2951+ </linearGradient>
2952+ <linearGradient
2953+ x1="116.4927"
2954+ y1="198.96754"
2955+ x2="110.65003"
2956+ y2="177.1624"
2957+ id="linearGradient5374"
2958+ xlink:href="#linearGradient4022-6-5-6"
2959+ gradientUnits="userSpaceOnUse" />
2960+ <linearGradient
2961+ id="linearGradient4022-6-5-6">
2962+ <stop
2963+ id="stop4024-1-5-3"
2964+ style="stop-color:#555753;stop-opacity:1"
2965+ offset="0" />
2966+ <stop
2967+ id="stop4026-2-3-1"
2968+ style="stop-color:#babdb6;stop-opacity:1"
2969+ offset="1" />
2970+ </linearGradient>
2971+ <linearGradient
2972+ x1="114.86526"
2973+ y1="192.53191"
2974+ x2="119.53192"
2975+ y2="187.86525"
2976+ id="linearGradient3809"
2977+ xlink:href="#linearGradient3803"
2978+ gradientUnits="userSpaceOnUse" />
2979+ <linearGradient
2980+ x1="109.00001"
2981+ y1="177"
2982+ x2="113.00001"
2983+ y2="196"
2984+ id="linearGradient3817"
2985+ xlink:href="#linearGradient3533"
2986+ gradientUnits="userSpaceOnUse" />
2987+ <linearGradient
2988+ x1="113.93192"
2989+ y1="192.53191"
2990+ x2="120.46526"
2991+ y2="189.73192"
2992+ id="linearGradient3833"
2993+ xlink:href="#linearGradient3827"
2994+ gradientUnits="userSpaceOnUse" />
2995+ <linearGradient
2996+ x1="109.00001"
2997+ y1="177"
2998+ x2="112.11741"
2999+ y2="188.79379"
3000+ id="linearGradient3883"
3001+ xlink:href="#linearGradient3533"
3002+ gradientUnits="userSpaceOnUse" />
3003+ <linearGradient
3004+ x1="109.00001"
3005+ y1="177"
3006+ x2="113.00001"
3007+ y2="196"
3008+ id="linearGradient3885"
3009+ xlink:href="#linearGradient3533"
3010+ gradientUnits="userSpaceOnUse" />
3011+ </defs>
3012+ <g
3013+ transform="matrix(1.0000213,0,0,0.99999945,-102.00336,-174.00344)"
3014+ id="g5364"
3015+ style="stroke:url(#linearGradient5374);display:inline;enable-background:new">
3016+ <path
3017+ d="m 112.44761,192.97817 a 7,7 0 1 1 5.7872,-11.6254"
3018+ transform="matrix(1.0714286,0,0,1.0714286,-7.0699096,-12.284198)"
3019+ id="path3159-8"
3020+ style="color:#000000;fill:none;stroke:#538ec6;stroke-width:4.66666651;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
3021+ <path
3022+ d="m 121,179 0,0 0,5 -5,0"
3023+ id="path3957-8"
3024+ style="fill:none;stroke:#538ec6;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;enable-background:new" />
3025+ <path
3026+ d="m 119.19847,189.25253 a 7,7 0 0 1 -9.49902,2.92051"
3027+ transform="matrix(1.0714286,0,0,1.0714286,-7.0699096,-12.284198)"
3028+ id="path3801"
3029+ style="color:#000000;fill:none;stroke:url(#linearGradient3809);stroke-width:4.66666651;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
3030+ </g>
3031+ <g
3032+ transform="matrix(1.0000213,0,0,0.99999945,-102.00336,-174.00344)"
3033+ id="g5315"
3034+ style="fill-opacity:1;stroke:url(#linearGradient3817);stroke-opacity:1;display:inline;enable-background:new">
3035+ <path
3036+ d="m 112.17502,192.95122 a 7,7 0 1 1 6.05979,-11.59845"
3037+ transform="matrix(1.0714286,0,0,1.0714286,-7.0699104,-12.284198)"
3038+ id="path3159"
3039+ style="color:#000000;fill:none;stroke:url(#linearGradient3883);stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
3040+ <path
3041+ d="m 121,179 0,0 0,5 -5,0"
3042+ id="path3957-7-3"
3043+ style="fill:none;stroke:url(#linearGradient3885);stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;enable-background:new" />
3044+ <path
3045+ d="m 119.19728,189.25479 a 7,7 0 0 1 -10.70311,2.10222"
3046+ transform="matrix(1.0714286,0,0,1.0714286,-7.0699104,-12.284198)"
3047+ id="path3823"
3048+ style="color:#000000;fill:none;stroke:url(#linearGradient3833);stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
3049+ </g>
3050+ <path
3051+ d="m 17.749194,15.99646 c -0.340462,0.647683 -0.77176,1.215015 -1.270184,1.6936 -1.954963,1.877154 -4.939072,2.390862 -7.4800025,1.056399 C 5.8102596,17.07177 4.5742332,13.185142 6.2489489,9.9964646 7.9236746,6.807786 11.810397,5.5717867 14.999136,7.2464657 c 0.614773,0.3228699 1.174775,0.7544396 1.656285,1.2499994 m 0.843768,-1.968749 C 17.023499,6.1235364 16.493078,5.7574466 15.936656,5.4652167 14.900234,4.920897 13.818101,4.6186772 12.717837,4.5277172 c -0.206294,-0.0171 -0.415259,-0.0323 -0.625013,-0.0312 -0.209756,10e-4 -0.42031,0.0182 -0.625014,0.0312 C 8.601989,4.7096971 5.8965114,6.3384162 4.467661,9.0589648 2.2903547,13.204562 3.9157901,18.350447 8.0614875,20.527708 c 3.2323445,1.697581 7.0727905,1.083478 9.6400985,-1.234453 0.725431,-0.654965 1.348937,-1.446112 1.828896,-2.359295"
3052+ id="path3159-1"
3053+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:0.15;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.00001037;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Abandoned Bitplane;-inkscape-font-specification:Abandoned Bitplane" />
3054+ <path
3055+ d="m 16.499168,9.4964645 -2.500054,0 c -0.264165,-0.004 -0.50713,0.2358199 -0.50713,0.5000001 M 18.905469,4.4964672 C 18.676264,4.5401672 18.4951,4.7631671 18.49921,4.996467 l 0,2.4999986"
3056+ id="path3957-7-5-1"
3057+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:0.3;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.00001037;stroke-linecap:round;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Abandoned Bitplane;-inkscape-font-specification:Abandoned Bitplane" />
3058+ <path
3059+ d="m 15.079062,18.712861 c -1.826712,0.990175 -4.08939,1.079069 -6.0800545,0.0336 C 5.8102596,17.071772 4.5742332,13.185144 6.2489489,9.9964666 7.9236746,6.807788 11.810397,5.5717887 14.999136,7.2464677 c 0.614773,0.3228699 1.174775,0.7544396 1.656285,1.2499994"
3060+ id="path3159-1-7"
3061+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:0.23999999;color:#000000;fill:none;stroke:url(#linearGradient5554);stroke-width:1.00001037;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Abandoned Bitplane;-inkscape-font-specification:Abandoned Bitplane" />
3062+ <path
3063+ d="M 17.499189,6.5277161 C 17.023499,6.1235364 16.493078,5.7574466 15.936656,5.4652167 14.900234,4.920897 13.818101,4.6186772 12.717837,4.5277172 c -0.206294,-0.0171 -0.415259,-0.0323 -0.625013,-0.0312 -0.209756,10e-4 -0.42031,0.0182 -0.625014,0.0312 C 8.601989,4.7096971 5.8965114,6.3384162 4.467661,9.0589648 2.2903547,13.204562 3.9157892,18.350449 8.0614875,20.527708"
3064+ id="path3159-1-9"
3065+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:0.23999999;color:#000000;fill:none;stroke:url(#linearGradient5584);stroke-width:1.00001037;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Abandoned Bitplane;-inkscape-font-specification:Abandoned Bitplane" />
3066+</svg>
3067
3068=== added file 'plainbox-gui/gui-ihv/qml/outline/artwork/rerunq.svg'
3069--- plainbox-gui/gui-ihv/qml/outline/artwork/rerunq.svg 1970-01-01 00:00:00 +0000
3070+++ plainbox-gui/gui-ihv/qml/outline/artwork/rerunq.svg 2013-07-24 15:37:30 +0000
3071@@ -0,0 +1,158 @@
3072+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
3073+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3074+
3075+<svg
3076+ xmlns:svg="http://www.w3.org/2000/svg"
3077+ xmlns="http://www.w3.org/2000/svg"
3078+ xmlns:xlink="http://www.w3.org/1999/xlink"
3079+ version="1.0"
3080+ width="16"
3081+ height="16"
3082+ id="svg3151">
3083+ <defs
3084+ id="defs3153">
3085+ <linearGradient
3086+ id="linearGradient3931">
3087+ <stop
3088+ id="stop3933"
3089+ style="stop-color:#8d8f8a;stop-opacity:1"
3090+ offset="0" />
3091+ <stop
3092+ id="stop3935"
3093+ style="stop-color:#c1c1c1;stop-opacity:1"
3094+ offset="1" />
3095+ </linearGradient>
3096+ <linearGradient
3097+ x1="-51.786404"
3098+ y1="50.786446"
3099+ x2="-51.786404"
3100+ y2="2.9062471"
3101+ id="linearGradient4547"
3102+ xlink:href="#linearGradient3931"
3103+ gradientUnits="userSpaceOnUse"
3104+ gradientTransform="matrix(0.3000362,0,0,0.3120485,22.157141,-0.3741276)" />
3105+ <linearGradient
3106+ id="linearGradient3600">
3107+ <stop
3108+ id="stop3602"
3109+ style="stop-color:#f4f4f4;stop-opacity:1"
3110+ offset="0" />
3111+ <stop
3112+ id="stop3604"
3113+ style="stop-color:#dbdbdb;stop-opacity:1"
3114+ offset="1" />
3115+ </linearGradient>
3116+ <linearGradient
3117+ x1="25.132275"
3118+ y1="6.7287393"
3119+ x2="25.132275"
3120+ y2="47.013336"
3121+ id="linearGradient4545"
3122+ xlink:href="#linearGradient3600"
3123+ gradientUnits="userSpaceOnUse"
3124+ gradientTransform="matrix(0.3715633,0,0,0.3334383,0.08247942,-0.0025171)" />
3125+ <linearGradient
3126+ id="linearGradient4559">
3127+ <stop
3128+ id="stop4561"
3129+ style="stop-color:#c0c0c0;stop-opacity:1"
3130+ offset="0" />
3131+ <stop
3132+ id="stop4563"
3133+ style="stop-color:#949492;stop-opacity:1"
3134+ offset="1" />
3135+ </linearGradient>
3136+ <linearGradient
3137+ id="linearGradient8589">
3138+ <stop
3139+ id="stop8591"
3140+ style="stop-color:#fefefe;stop-opacity:1"
3141+ offset="0" />
3142+ <stop
3143+ id="stop8593"
3144+ style="stop-color:#cbcbcb;stop-opacity:1"
3145+ offset="1" />
3146+ </linearGradient>
3147+ <linearGradient
3148+ x1="15.372947"
3149+ y1="5.0471625"
3150+ x2="15.372947"
3151+ y2="22.599676"
3152+ id="linearGradient2510"
3153+ xlink:href="#linearGradient3533"
3154+ gradientUnits="userSpaceOnUse"
3155+ gradientTransform="matrix(0.3167426,0,0,0.310739,6.197645,1.9825705)" />
3156+ <linearGradient
3157+ id="linearGradient3533">
3158+ <stop
3159+ id="stop3535"
3160+ style="stop-color:#93b9dd;stop-opacity:1"
3161+ offset="0" />
3162+ <stop
3163+ id="stop3545"
3164+ style="stop-color:#6396cd;stop-opacity:1"
3165+ offset="1" />
3166+ </linearGradient>
3167+ <linearGradient
3168+ id="linearGradient4873">
3169+ <stop
3170+ id="stop4875"
3171+ style="stop-color:#ffffff;stop-opacity:1"
3172+ offset="0" />
3173+ <stop
3174+ id="stop4877"
3175+ style="stop-color:#ffffff;stop-opacity:0"
3176+ offset="1" />
3177+ </linearGradient>
3178+ <linearGradient
3179+ x1="21.628975"
3180+ y1="2.1102102"
3181+ x2="21.628975"
3182+ y2="32.628334"
3183+ id="linearGradient2867"
3184+ xlink:href="#linearGradient4873"
3185+ gradientUnits="userSpaceOnUse"
3186+ gradientTransform="matrix(0.3167426,0,0,0.310739,6.197645,1.9825705)" />
3187+ <linearGradient
3188+ x1="32.892288"
3189+ y1="8.0590115"
3190+ x2="36.358372"
3191+ y2="5.4565363"
3192+ id="linearGradient2885"
3193+ xlink:href="#linearGradient8589"
3194+ gradientUnits="userSpaceOnUse"
3195+ gradientTransform="matrix(0.3707081,0,0,0.3548465,0.14334242,-0.04895116)" />
3196+ <linearGradient
3197+ x1="17.288921"
3198+ y1="2.184907"
3199+ x2="15.179585"
3200+ y2="5.8214641"
3201+ id="linearGradient2887"
3202+ xlink:href="#linearGradient4559"
3203+ gradientUnits="userSpaceOnUse"
3204+ gradientTransform="matrix(0.6844293,0,0,0.6820072,0.78684802,0.1569169)" />
3205+ </defs>
3206+ <g
3207+ id="layer1">
3208+ <path
3209+ d="m 4.4976268,0.49762721 5.9176882,0 c 0.522766,0.16184396 4.353689,2.61362219 5.087059,3.89029659 l 0,11.1144502 -11.0047472,0 0,-15.00474679 z"
3210+ id="rect2594"
3211+ style="fill:url(#linearGradient4545);fill-opacity:1;stroke:url(#linearGradient4547);stroke-width:0.9952535;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" />
3212+ <path
3213+ d="M 10.5,0.4979205 C 10.5,2.041279 10.5,4.5 10.5,4.5 c 0,0 4.080603,0 5.00208,0 0,-1.9018156 -3.00574,-4.0020795 -5.00208,-4.0020795 z"
3214+ id="path12038"
3215+ style="fill:url(#linearGradient2885);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2887);stroke-width:0.9952535;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
3216+ <g
3217+ transform="translate(-7,4)"
3218+ id="layer1-9">
3219+ <path
3220+ d="m 7.9909525,11.554187 c 3.3833855,-0.109576 2.7564735,-0.524099 2.5278895,-1.029604 -0.228584,-0.505505 -0.308819,-1.0950109 -0.326354,-1.7112158 0.02384,-1.6999234 2.06212,-3.7959351 3.548285,-3.7959351 0.784598,0 1.721174,-0.058719 3.461118,1.2392474 l -1.701894,1.3020196 4.997879,0 c 0,0 0,-5.0566994 0,-5.0566994 l -1.842622,1.829721 C 17.424536,3.1452458 16.001893,2.5235558 14.185511,2.5039421 10.490419,2.4640418 7.5434021,5.4170561 7.5025494,9.0260496 7.4923364,9.9282984 7.6663904,10.78141 7.9909525,11.554187 z"
3221+ id="path3372"
3222+ style="fill:url(#linearGradient2510);fill-opacity:1;stroke:#538ec6;stroke-width:1.00424814;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
3223+ <path
3224+ d="m 19.499995,6.9704638 c 0,0 0,-2.1496387 0,-2.1496387 l -0.798744,0.8329834 c -1.175555,-1.2864028 -2.732001,-2.153933 -4.570884,-2.153933 -3.213254,0 -5.6303675,2.6084507 -5.6303675,5.5609426 0,0.8547717 0.1756802,1.6220989 0.4827333,2.2922799"
3225+ id="path3370"
3226+ style="opacity:0.4;fill:none;stroke:url(#linearGradient2867);stroke-width:1.00424814;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
3227+ </g>
3228+ </g>
3229+</svg>
3230
3231=== added file 'plainbox-gui/gui-ihv/qml/outline/artwork/skipped.svg'
3232--- plainbox-gui/gui-ihv/qml/outline/artwork/skipped.svg 1970-01-01 00:00:00 +0000
3233+++ plainbox-gui/gui-ihv/qml/outline/artwork/skipped.svg 2013-07-24 15:37:30 +0000
3234@@ -0,0 +1,45 @@
3235+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
3236+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3237+<svg id="svg3734" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="24" width="24" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/">
3238+ <metadata id="metadata29">
3239+ <rdf:RDF>
3240+ <cc:Work rdf:about="">
3241+ <dc:format>image/svg+xml</dc:format>
3242+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
3243+ <dc:title/>
3244+ </cc:Work>
3245+ </rdf:RDF>
3246+ </metadata>
3247+ <defs id="defs3736">
3248+ <linearGradient id="linearGradient4456">
3249+ <stop id="stop4458" style="stop-color:#f6daae" offset="0"/>
3250+ <stop id="stop4460" style="stop-color:#f0c178;stop-opacity:0" offset="1"/>
3251+ </linearGradient>
3252+ <linearGradient id="linearGradient3390-178-986-453-4-5">
3253+ <stop id="stop3624-8-6" style="stop-color:#bb2b12" offset="0"/>
3254+ <stop id="stop3626-1-1" style="stop-color:#cd7233" offset="1"/>
3255+ </linearGradient>
3256+ <linearGradient id="linearGradient3732" y2="176.46" xlink:href="#linearGradient3390-178-986-453-4-5" gradientUnits="userSpaceOnUse" x2="-41.204" gradientTransform="matrix(.92957 0 0 .99594 51.302 -181.74)" y1="198.54" x1="-48.735"/>
3257+ <linearGradient id="linearGradient4322" y2="196.54" gradientUnits="userSpaceOnUse" x2="-48.735" gradientTransform="matrix(.92957 0 0 .99594 51.302 -181.74)" y1="180.47" x1="-42.28">
3258+ <stop id="stop3029" style="stop-color:#f0c178" offset="0"/>
3259+ <stop id="stop3031" style="stop-color:#e18941" offset=".57724"/>
3260+ <stop id="stop3033" style="stop-color:#ec4f18" offset="1"/>
3261+ </linearGradient>
3262+ <linearGradient id="linearGradient4324" y2="196.54" gradientUnits="userSpaceOnUse" x2="-48.735" gradientTransform="matrix(.92957 0 0 .99594 51.302 -181.74)" y1="179.47" x1="-42.28">
3263+ <stop id="stop3618-1-9" style="stop-color:#f0c178" offset="0"/>
3264+ <stop id="stop3270-5-6" style="stop-color:#e18941" offset=".59026"/>
3265+ <stop id="stop3620-9-3" style="stop-color:#ec4f18" offset="1"/>
3266+ </linearGradient>
3267+ <linearGradient id="linearGradient4462" y2="16" xlink:href="#linearGradient4456" gradientUnits="userSpaceOnUse" x2="6" y1="-3" x1="12"/>
3268+ <linearGradient id="linearGradient3026" y2="16" xlink:href="#linearGradient4456" gradientUnits="userSpaceOnUse" x2="6" y1="-3" x1="11"/>
3269+ </defs>
3270+ <g id="layer1" transform="matrix(-1 0 0 1 23 7.0004)">
3271+ <path id="path3169-2-3" style="stroke-linejoin:round;stroke-width:5;stroke:url(#linearGradient3732);stroke-linecap:round;enable-background:new;fill:none" d="m8.4802-1.4936-5.9802 6.4935 5.9802 6.4941"/>
3272+ <path id="path3765" style="stroke-linejoin:round;enable-background:new;stroke:url(#linearGradient3732);stroke-linecap:round;stroke-width:6;fill:none" d="m19 5-12.5-0.0001"/>
3273+ <path id="path4277" style="stroke-linejoin:round;stroke-width:3;stroke:url(#linearGradient4322);stroke-linecap:round;enable-background:new;fill:none" d="m8.5111-1.5245-6.0111 6.5244 6.0112 6.5241"/>
3274+ <path id="path4279" style="stroke-linejoin:round;stroke-width:4;stroke:url(#linearGradient4324);stroke-linecap:round;enable-background:new;fill:none" d="m19 5-12.5-0.0001"/>
3275+ <path id="path4454" style="opacity:.4;stroke-linejoin:round;stroke:url(#linearGradient3026);stroke-linecap:round;enable-background:new;fill:none" d="m9.0423 10.543-2.5423-2.543c-0.9998-1.0002 0-1.5 1.5-1.5h10.5c3 0 2.5-3 0-3h-10c-1.5 0-3 0-2-1.5l2.3356-2.3382c1.5-2-0.5-2.5-1.5-1.5l-5.3356 5.8382c-0.5 0.5-0.5276 1.3333 0 2l5.5423 6.0431c1 1 2.9997 0.000254 1.5-1.5z"/>
3276+ <path id="path4464" style="opacity:.4;stroke-linejoin:round;stroke:url(#linearGradient4462);stroke-linecap:round;enable-background:new;fill:none" d="m6.5 2 2.4035-2.1981c1.5-2-0.5-2.5-1.5-1.5l-5.4035 5.6981c-0.5 0.5-0.5276 1.3333 0 2l4.7125 5.2812c1 1 2.9702 0.02922 1.5-1.5l-1.7125-1.781"/>
3277+ <path id="path4466" style="opacity:0.24;stroke-linejoin:round;stroke:#f6daae;stroke-linecap:round;enable-background:new;fill:none" d="m7.2625-1.35-5.2625 5.35"/>
3278+ </g>
3279+</svg>
3280
3281=== added file 'plainbox-gui/gui-ihv/qml/outline/artwork/test.txt'
3282--- plainbox-gui/gui-ihv/qml/outline/artwork/test.txt 1970-01-01 00:00:00 +0000
3283+++ plainbox-gui/gui-ihv/qml/outline/artwork/test.txt 2013-07-24 15:37:30 +0000
3284@@ -0,0 +1,6 @@
3285+Hello world.
3286+This file has opened.
3287+
3288+Yippee!
3289+Goodbye...
3290+
3291
3292=== added file 'plainbox-gui/gui-ihv/qml/outline/artwork/userreq.svg'
3293--- plainbox-gui/gui-ihv/qml/outline/artwork/userreq.svg 1970-01-01 00:00:00 +0000
3294+++ plainbox-gui/gui-ihv/qml/outline/artwork/userreq.svg 2013-07-24 15:37:30 +0000
3295@@ -0,0 +1,31 @@
3296+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
3297+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3298+<svg id="svg2" xmlns="http://www.w3.org/2000/svg" height="24" width="24" version="1.0" xmlns:xlink="http://www.w3.org/1999/xlink">
3299+ <defs id="defs4">
3300+ <radialGradient id="radialGradient2501" gradientUnits="userSpaceOnUse" cy="4.625" cx="62.625" gradientTransform="matrix(1.1294 0 0 .28235 -58.729 19.694)" r="10.625">
3301+ <stop id="stop8840" offset="0"/>
3302+ <stop id="stop8842" style="stop-opacity:0" offset="1"/>
3303+ </radialGradient>
3304+ <linearGradient id="linearGradient2498" y2="3.0816" gradientUnits="userSpaceOnUse" x2="18.379" gradientTransform="matrix(.51604 0 0 .51604 -.38499 -.38499)" y1="44.98" x1="18.379">
3305+ <stop id="stop2788" style="stop-color:#1f4b6a" offset="0"/>
3306+ <stop id="stop2790" style="stop-color:#4083c2" offset="1"/>
3307+ </linearGradient>
3308+ <radialGradient id="radialGradient2496" gradientUnits="userSpaceOnUse" cy="3.99" cx="23.896" gradientTransform="matrix(0 1.2316 -1.6257 0 18.487 -28.721)" r="20.397">
3309+ <stop id="stop2778" style="stop-color:#8badea" offset="0"/>
3310+ <stop id="stop2780" style="stop-color:#6396cd" offset=".26238"/>
3311+ <stop id="stop2782" style="stop-color:#3b7caf" offset=".66094"/>
3312+ <stop id="stop2784" style="stop-color:#194c70" offset="1"/>
3313+ </radialGradient>
3314+ <linearGradient id="linearGradient2493" y2="5.4676" gradientUnits="userSpaceOnUse" x2="63.397" gradientTransform="matrix(1.0863 0 0 1.0862 -55.567 15.814)" y1="-12.489" x1="63.397">
3315+ <stop id="stop4875" style="stop-color:#fff" offset="0"/>
3316+ <stop id="stop4877" style="stop-color:#fff;stop-opacity:0" offset="1"/>
3317+ </linearGradient>
3318+ </defs>
3319+ <g id="layer1">
3320+ <path id="path8836" style="opacity:.3;fill-rule:evenodd;fill:url(#radialGradient2501)" d="m24 21c0 1.657-5.373 3-12 3-6.6274 0-12-1.343-12-3-2.5e-7 -1.657 5.3726-3 12-3 6.627 0 12 1.343 12 3z"/>
3321+ <path id="path2555" style="stroke-linejoin:round;stroke:url(#linearGradient2498);stroke-linecap:round;stroke-width:1.0037;fill:url(#radialGradient2496)" d="m12 1.5018c-5.7926 0-10.498 4.7056-10.498 10.498-0.0002 5.793 4.7054 10.498 10.498 10.498 5.793 0 10.498-4.705 10.498-10.498 0-5.7926-4.705-10.498-10.498-10.498z"/>
3322+ <path id="path2463" style="opacity:.4;stroke:url(#linearGradient2493);fill:none" d="m21.5 12c0 5.247-4.254 9.5-9.5 9.5-5.2466 0-9.5-4.254-9.5-9.5 0-5.247 4.2534-9.5 9.5-9.5 5.246 0 9.5 4.253 9.5 9.5z"/>
3323+ <path id="path3295" style="opacity:.2" d="m10.599 5.2867c0.332 2.8104 0.712 5.6013 0.995 8.4233h0.902c0.234-2.71 0.612-5.4029 0.885-8.1091 0.139-0.6407-0.241-1.4015-1.021-1.5572-0.772-0.1955-1.634 0.2886-1.736 0.9801-0.017 0.0868-0.025 0.1749-0.025 0.2629zm-0.098 11.426c-0.035 0.837 1.027 1.493 1.933 1.227 0.879-0.194 1.341-1.151 0.891-1.831-0.403-0.703-1.584-0.935-2.264-0.396-0.343 0.244-0.571 0.609-0.56 1z"/>
3324+ <path id="text2315" style="fill:#fff" d="m10.599 6.2867c0.332 2.8104 0.712 5.6013 0.995 8.4233h0.902c0.234-2.71 0.612-5.4029 0.885-8.1091 0.139-0.6407-0.241-1.4015-1.021-1.5572-0.772-0.1955-1.634 0.2886-1.736 0.9801-0.017 0.0868-0.025 0.1749-0.025 0.2629zm-0.098 11.426c-0.035 0.837 1.027 1.493 1.933 1.227 0.879-0.194 1.341-1.151 0.891-1.831-0.403-0.703-1.584-0.935-2.264-0.396-0.343 0.244-0.571 0.609-0.56 1z"/>
3325+ </g>
3326+</svg>
3327
3328=== modified file 'plainbox-gui/gui-ihv/qml/outline/gui-ihv.qml'
3329--- plainbox-gui/gui-ihv/qml/outline/gui-ihv.qml 2013-07-17 14:23:54 +0000
3330+++ plainbox-gui/gui-ihv/qml/outline/gui-ihv.qml 2013-07-24 15:37:30 +0000
3331@@ -35,7 +35,7 @@
3332 PageStack {
3333 id: pageStack
3334 state: "WELCOME"
3335- property string pageName: "DemoWarnings.qml" // initial state
3336+ property string pageName: "WelcomeView.qml" // initial state
3337
3338 Component.onCompleted: {
3339 push(Qt.resolvedUrl(pageName))
3340
3341=== added file 'plainbox-gui/gui-ihv/savefiledlg.cpp'
3342--- plainbox-gui/gui-ihv/savefiledlg.cpp 1970-01-01 00:00:00 +0000
3343+++ plainbox-gui/gui-ihv/savefiledlg.cpp 2013-07-24 15:37:30 +0000
3344@@ -0,0 +1,37 @@
3345+/*
3346+ * This file is part of plainbox-gui
3347+ *
3348+ * Copyright 2013 Canonical Ltd.
3349+ *
3350+ * Authors:
3351+ * - Julia Segal <julia.segal@cellsoftware.co.uk>
3352+ *
3353+ * This program is free software; you can redistribute it and/or modify
3354+ * it under the terms of the GNU General Public License as published by
3355+ * the Free Software Foundation; version 3.
3356+ *
3357+ * This program is distributed in the hope that it will be useful,
3358+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
3359+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3360+ * GNU General Public License for more details.
3361+ *
3362+ * You should have received a copy of the GNU General Public License
3363+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
3364+ */
3365+
3366+#include "savefiledlg.h"
3367+
3368+SaveFileDlg::SaveFileDlg(QObject *parent) :
3369+ QObject(parent)
3370+{
3371+
3372+}
3373+
3374+void SaveFileDlg::save(){
3375+ // TODO save the file
3376+ //QString dir = QFileDialog::getExistingDirectory(this, tr("Open Directory"),
3377+ // "/home",
3378+ // QFileDialog::ShowDirsOnly
3379+ // | QFileDialog::DontResolveSymlinks);
3380+ //emit saveDir();
3381+}
3382
3383=== added file 'plainbox-gui/gui-ihv/savefiledlg.h'
3384--- plainbox-gui/gui-ihv/savefiledlg.h 1970-01-01 00:00:00 +0000
3385+++ plainbox-gui/gui-ihv/savefiledlg.h 2013-07-24 15:37:30 +0000
3386@@ -0,0 +1,45 @@
3387+/*
3388+ * This file is part of plainbox-gui
3389+ *
3390+ * Copyright 2013 Canonical Ltd.
3391+ *
3392+ * Authors:
3393+ * - Julia Segal <julia.segal@cellsoftware.co.uk>
3394+ *
3395+ * This program is free software; you can redistribute it and/or modify
3396+ * it under the terms of the GNU General Public License as published by
3397+ * the Free Software Foundation; version 3.
3398+ *
3399+ * This program is distributed in the hope that it will be useful,
3400+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
3401+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3402+ * GNU General Public License for more details.
3403+ *
3404+ * You should have received a copy of the GNU General Public License
3405+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
3406+ */
3407+
3408+
3409+#ifndef SAVEFILEDLG_H
3410+#define SAVEFILEDLG_H
3411+
3412+#include <QObject>
3413+#include <QQmlComponent>
3414+#include <qdebug.h>
3415+
3416+class SaveFileDlg : public QObject
3417+{
3418+ Q_OBJECT
3419+public:
3420+ explicit SaveFileDlg(QObject *parent = 0);
3421+ Q_INVOKABLE void save();//const QString& filename);
3422+
3423+signals:
3424+ void saveDir();
3425+
3426+private:
3427+ //QFileDialog m_fileDialog;
3428+};
3429+
3430+
3431+#endif // SAVEFILEDLG_H
3432
3433=== modified file 'plainbox-gui/gui-ihv/testsuiteitem.cpp'
3434--- plainbox-gui/gui-ihv/testsuiteitem.cpp 2013-07-17 10:50:10 +0000
3435+++ plainbox-gui/gui-ihv/testsuiteitem.cpp 2013-07-24 15:37:30 +0000
3436@@ -29,7 +29,10 @@
3437 m_testName(testName),
3438 m_check(true),
3439 m_duration(duration),
3440- m_type(type)
3441+ m_type(type),
3442+ m_runstatus(0),
3443+ m_elapsedtime(0),
3444+ m_groupstatus(0)
3445 {
3446 }
3447
3448@@ -42,6 +45,9 @@
3449 names[CheckRole] = "check";
3450 names[DurationRole] = "duration";
3451 names[TypeRole] = "type";
3452+ names[RunstatusRole] = "runstatus";
3453+ names[ElapsedtimeRole] = "elapsedtime";
3454+ names[GroupstatusRole] = "groupstatus";
3455 return names;
3456 }
3457
3458@@ -58,6 +64,12 @@
3459 return duration();
3460 case TypeRole:
3461 return type();
3462+ case RunstatusRole:
3463+ return runstatus();
3464+ case ElapsedtimeRole:
3465+ return elapsedtime();
3466+ case GroupstatusRole:
3467+ return groupstatus();
3468 default:
3469 return QVariant();
3470 }
3471@@ -77,6 +89,15 @@
3472 case DurationRole:
3473 setDuration(value.toInt());
3474 break;
3475+ case RunstatusRole:
3476+ setRunstatus(value.toInt());
3477+ break;
3478+ case ElapsedtimeRole:
3479+ setElapsedtime(value.toInt());
3480+ break;
3481+ case GroupstatusRole:
3482+ setGroupstatus(value.toInt());
3483+ break;
3484 }
3485
3486 }
3487@@ -117,3 +138,29 @@
3488 }
3489 }
3490
3491+void TestSuiteItem::setRunstatus(int runstatus){
3492+ if (runstatus != m_runstatus){
3493+ m_runstatus = runstatus;
3494+ emit runstatusChanged();
3495+ emit dataChanged();
3496+ //qDebug()<<"status changed";
3497+ }
3498+}
3499+
3500+
3501+void TestSuiteItem::setElapsedtime(int elapsedtime){
3502+ if (elapsedtime != m_elapsedtime){
3503+ m_elapsedtime = elapsedtime;
3504+ emit elapsedtimeChanged();
3505+ emit dataChanged();
3506+ }
3507+}
3508+
3509+void TestSuiteItem::setGroupstatus(int groupstatus){
3510+ if (groupstatus != m_groupstatus){
3511+ m_groupstatus = groupstatus;
3512+ emit groupstatusChanged();
3513+ emit dataChanged();
3514+ }
3515+}
3516+
3517
3518=== modified file 'plainbox-gui/gui-ihv/testsuiteitem.h'
3519--- plainbox-gui/gui-ihv/testsuiteitem.h 2013-07-16 15:49:19 +0000
3520+++ plainbox-gui/gui-ihv/testsuiteitem.h 2013-07-24 15:37:30 +0000
3521@@ -31,6 +31,9 @@
3522 Q_PROPERTY(bool check READ check WRITE setCheck NOTIFY checkChanged)
3523 Q_PROPERTY(int duration READ duration WRITE setDuration NOTIFY durationChanged)
3524 Q_PROPERTY(QString type READ type)
3525+ Q_PROPERTY(int runStatus READ runstatus WRITE setRunstatus NOTIFY runstatusChanged)
3526+ Q_PROPERTY(int elapsedtime READ elapsedtime WRITE setElapsedtime NOTIFY elapsedtimeChanged)
3527+ Q_PROPERTY(int groupstatus READ groupstatus WRITE setGroupstatus NOTIFY groupstatusChanged)
3528
3529
3530
3531@@ -39,6 +42,9 @@
3532 void testnameChanged();
3533 void checkChanged();
3534 void durationChanged();
3535+ void runstatusChanged();
3536+ void elapsedtimeChanged();
3537+ void groupstatusChanged();
3538
3539 public:
3540 enum Roles {
3541@@ -46,12 +52,15 @@
3542 TestNameRole,
3543 CheckRole,
3544 DurationRole,
3545- TypeRole
3546+ TypeRole,
3547+ RunstatusRole,
3548+ ElapsedtimeRole,
3549+ GroupstatusRole
3550 };
3551
3552
3553 public:
3554- TestSuiteItem(QObject * parent = 0 ) : ListItem(parent), m_check(true){}
3555+ TestSuiteItem(QObject * parent = 0 ) : ListItem(parent), m_check(true), m_runstatus(0), m_elapsedtime(0), m_groupstatus(0){}
3556 TestSuiteItem(const QString &groupName, const QString &testname, int durationInSeconds, const QString &type, QObject * parent = 0 );
3557
3558 QVariant data(int role) const;
3559@@ -74,6 +83,16 @@
3560
3561 inline QString type() const {return m_type; }
3562
3563+ inline int runstatus() const { return m_runstatus; }
3564+ void setRunstatus(int runstatus);
3565+
3566+ inline int elapsedtime() const { return m_elapsedtime; }
3567+ void setElapsedtime(int elapsedtime);
3568+
3569+ inline int groupstatus() const {return m_groupstatus; }
3570+ void setGroupstatus(int groupstatus);
3571+
3572+
3573
3574 private:
3575 QString m_group;
3576@@ -81,6 +100,9 @@
3577 bool m_check;
3578 int m_duration;
3579 QString m_type;
3580+ int m_runstatus;
3581+ int m_elapsedtime;
3582+ int m_groupstatus;
3583 };
3584
3585

Subscribers

People subscribed via source and target branches