testexecutor-ui 0.6.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. testexecutor/VERSION +1 -0
  2. testexecutor/__init__.py +6 -0
  3. testexecutor/control/TestListenerApi.py +56 -0
  4. testexecutor/control/TestSuiteListener.py +249 -0
  5. testexecutor/control/__init__.py +0 -0
  6. testexecutor/model/GenericListModel.py +63 -0
  7. testexecutor/model/InstructionsModel.py +351 -0
  8. testexecutor/model/KeyValueModel.py +177 -0
  9. testexecutor/model/MultiTestWindowModel.py +184 -0
  10. testexecutor/model/ResultModel.py +314 -0
  11. testexecutor/model/TestSuiteControlModel.py +139 -0
  12. testexecutor/model/TestSuiteGroup.py +105 -0
  13. testexecutor/model/TestSuiteModel.py +301 -0
  14. testexecutor/model/__init__.py +0 -0
  15. testexecutor/model/selector/FilterGroupModel.py +90 -0
  16. testexecutor/model/selector/FilterModel.py +251 -0
  17. testexecutor/model/selector/MultiSelectDetails.py +106 -0
  18. testexecutor/model/selector/MultiSelectListModel.py +48 -0
  19. testexecutor/model/selector/__init__.py +0 -0
  20. testexecutor/ui/IdentificationWidget.qml +40 -0
  21. testexecutor/ui/InputWidget.qml +74 -0
  22. testexecutor/ui/InstructionWidget.qml +185 -0
  23. testexecutor/ui/KeyValueItem.qml +194 -0
  24. testexecutor/ui/KeyValueItemConfig.qml +41 -0
  25. testexecutor/ui/KeyValueList.qml +49 -0
  26. testexecutor/ui/MultiTestWidget.qml +48 -0
  27. testexecutor/ui/MultiTestWindow.qml +88 -0
  28. testexecutor/ui/ResultItem.qml +199 -0
  29. testexecutor/ui/ResultItemConfig.qml +46 -0
  30. testexecutor/ui/ResultList.qml +58 -0
  31. testexecutor/ui/TestSuiteConfig.qml +95 -0
  32. testexecutor/ui/TestSuiteController.qml +54 -0
  33. testexecutor/ui/TestSuiteWidget.qml +350 -0
  34. testexecutor/ui/selector/FilterItem.qml +75 -0
  35. testexecutor/ui/selector/FilterItemConfig.qml +24 -0
  36. testexecutor/ui/selector/FilterMultiSelectorItem.qml +169 -0
  37. testexecutor/ui/selector/FilterMultiSelectorItemConfig.qml +22 -0
  38. testexecutor/ui/selector/FilterMultiSelectorList.qml +50 -0
  39. testexecutor/ui/selector/HeaderConfig.qml +24 -0
  40. testexecutor/ui/selector/SectionConfig.qml +24 -0
  41. testexecutor/ui/selector/SectionDelegate.qml +85 -0
  42. testexecutor/ui/selector/SelectorHeader.qml +43 -0
  43. testexecutor/ui/selector/SuiteList.qml +150 -0
  44. testexecutor/ui/selector/SuiteSelector.qml +71 -0
  45. testexecutor/ui/selector/SuiteSelectorConfig.qml +38 -0
  46. testexecutor/ui/selector/TestConfig.qml +22 -0
  47. testexecutor/ui/selector/TestDelegate.qml +75 -0
  48. testexecutor/ui/te-64x64.ico +0 -0
  49. testexecutor_ui-0.6.1.dist-info/LICENSE +204 -0
  50. testexecutor_ui-0.6.1.dist-info/METADATA +27 -0
  51. testexecutor_ui-0.6.1.dist-info/NOTICE +3 -0
  52. testexecutor_ui-0.6.1.dist-info/RECORD +54 -0
  53. testexecutor_ui-0.6.1.dist-info/WHEEL +5 -0
  54. testexecutor_ui-0.6.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,185 @@
1
+ /*
2
+ * Copyright 2020 Direkt, Australia
3
+ * Copyright 2021 Direkt Embedded Pty Ltd
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ import QtQuick
19
+ import QtQuick.Controls
20
+ import QtQuick.Layouts
21
+
22
+ Item {
23
+ id: instructionWidget
24
+ width: parent.width
25
+ height: parent.height
26
+ property var color: "yellow"
27
+ property var proportion: {"header": 0.1, "textHeight": 0.05, "control": 0.1}
28
+ property var model
29
+ property var control_enabled: controlEnabled()
30
+
31
+ Binding {
32
+ target: model
33
+ property: "enabled"
34
+ value: instructionWidget.enabled
35
+ }
36
+
37
+ Rectangle {
38
+ id: rectangleBase
39
+ width: parent.width
40
+ height: parent.height
41
+ color: "#f4f2f2"
42
+ Layout.fillHeight: true
43
+ Layout.fillWidth: true
44
+ Layout.alignment: Qt.AlignLeft | Qt.AlignTop
45
+
46
+ GridLayout {
47
+ id: userInput
48
+ anchors.fill: parent
49
+ transformOrigin: Item.Center
50
+ Layout.fillWidth: true
51
+ flow: Grid.LeftToRight
52
+ rows: 2
53
+ columns: 2
54
+
55
+ Item {
56
+ Layout.fillHeight: true
57
+ Layout.fillWidth: true
58
+ Layout.columnSpan: 2
59
+ Rectangle {
60
+ id: rectangleText
61
+ anchors.fill: parent
62
+ color: backColour(model)
63
+ ColumnLayout {
64
+ id: instructionBox
65
+ anchors.fill: parent
66
+ spacing: 4
67
+ TextEdit {
68
+ id: instructionTitle
69
+ visible: (Boolean(model) && model.instructionTitle) ? true : false
70
+ Layout.preferredHeight: parent.height * proportion.header
71
+ Layout.minimumHeight: 0
72
+ Layout.maximumHeight: parent.height * proportion.header * 2
73
+ Layout.fillWidth: true
74
+ clip: true
75
+ text: model ? model.instructionTitle : ""
76
+ textFormat: Text.AutoText
77
+ font.pixelSize: parent.height * proportion.header * 0.9
78
+ wrapMode: TextEdit.Wrap
79
+ readOnly: true
80
+ selectByMouse: true
81
+ }
82
+ ScrollView {
83
+ Layout.fillHeight: true
84
+ Layout.fillWidth: true
85
+ TextArea {
86
+ id: userInstruct
87
+ text: model ? model.instructionText : ""
88
+ textFormat: Text.AutoText
89
+ font.pixelSize: instructionBox.height * proportion.textHeight
90
+ color: instructionTitle.color
91
+ leftPadding: instructionPadding(model)
92
+ rightPadding: instructionPadding(model)
93
+ topPadding: instructionPadding(model)
94
+ bottomPadding: instructionPadding(model)
95
+ wrapMode: TextArea.WordWrap
96
+ readOnly: true
97
+ selectByMouse: true
98
+ }
99
+ }
100
+ }
101
+ }
102
+ }
103
+
104
+ Item {
105
+ Layout.fillWidth: true
106
+ Layout.preferredHeight: parent.height * proportion.control
107
+ Layout.minimumHeight: 30
108
+ Layout.maximumHeight: 100
109
+ Button {
110
+ anchors.fill: parent
111
+ id: leftButton
112
+ text: model ? model.control.leftButton.text : ""
113
+ enabled: model ? model.control.leftButton.enabled : false
114
+ font.pixelSize: parent.height * 0.7
115
+ onClicked: {
116
+ onControlClick(model.control.leftButton.text)
117
+ }
118
+ contentItem: Text {
119
+ text: leftButton.text
120
+ font: leftButton.font
121
+ opacity: enabled ? 1.0 : 0.3
122
+ horizontalAlignment: Text.AlignHCenter
123
+ verticalAlignment: Text.AlignVCenter
124
+ elide: Text.ElideNone
125
+ clip: true
126
+ }
127
+ }
128
+ }
129
+
130
+ Item {
131
+ Layout.fillWidth: true
132
+ Layout.preferredHeight: parent.height * proportion.control
133
+ Layout.minimumHeight: 30
134
+ Layout.maximumHeight: 100
135
+ Button {
136
+ id: rightButton
137
+ anchors.fill: parent
138
+ text: model ? model.control.rightButton.text : ""
139
+ enabled: model ? model.control.rightButton.enabled : false
140
+ antialiasing: true
141
+ transformOrigin: Item.Right
142
+ checkable: false
143
+ checked: false
144
+ highlighted: true
145
+ font.pixelSize: parent.height * 0.7
146
+ onClicked: onControlClick(model.control.rightButton.text)
147
+ contentItem: Text {
148
+ text: rightButton.text
149
+ font: rightButton.font
150
+ opacity: enabled ? 1.0 : 0.3
151
+ horizontalAlignment: Text.AlignHCenter
152
+ verticalAlignment: Text.AlignVCenter
153
+ elide: Text.ElideNone
154
+ clip: true
155
+ }
156
+ }
157
+ }
158
+ }
159
+ }
160
+ function onControlClick(control) {
161
+ model.control.onControl(control)
162
+ }
163
+ function backColour(model) {
164
+ var colour = rectangleBase.color
165
+ if (Boolean(model) && model.instructionTitle === "ERROR" ) {
166
+ colour = instructionWidget.color
167
+ } else if (Boolean(model) && model.enabled && model.instructionText) {
168
+ colour = instructionWidget.color
169
+ }
170
+ return (colour)
171
+ }
172
+ function instructionPadding(model) {
173
+ var padding = 4
174
+ if (Boolean(model) && model.enabled && model.instructionText) {
175
+ var instruction = model.instructionText.toLowerCase()
176
+ if (instruction.includes("html")) {
177
+ padding = 0
178
+ }
179
+ }
180
+ return (padding)
181
+ }
182
+ function controlEnabled() {
183
+ return (model && (model.control.rightButton.enabled || model.control.leftButton.enabled))
184
+ }
185
+ }
@@ -0,0 +1,194 @@
1
+ /*
2
+ * Copyright 2020 Direkt, Australia
3
+ * Copyright 2021 Direkt Embedded Pty Ltd
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ import QtQuick
19
+ import QtQuick.Layouts
20
+ import QtQuick.Controls
21
+
22
+ Item {
23
+ id: keyValueItem
24
+ width:parent.width
25
+ height: 40
26
+ clip: true
27
+ property var config: KeyValueItemConfig {}
28
+
29
+ Binding {
30
+ target: model.value
31
+ property: "value"
32
+ value: valueIsArray() ? comboControl.currentText : identifier.text
33
+ }
34
+
35
+ Rectangle {
36
+ id: rectangle
37
+ width: parent.width
38
+ color: config.color
39
+ border.width: 1
40
+ border.color: config.border.color
41
+ anchors.fill: parent
42
+
43
+ RowLayout {
44
+ id: row
45
+ height: parent.height
46
+ spacing: 1.5
47
+ anchors.fill: parent
48
+
49
+ Rectangle {
50
+ id: keyLabelRectangle
51
+ Layout.preferredWidth: parent.width * config.proportion.name
52
+ color: config.name.color
53
+ Layout.alignment: Qt.AlignLeft | Qt.AlignTop
54
+ border.color: config.name.border.color
55
+ border.width: 1
56
+ Layout.fillHeight: true
57
+
58
+ Text {
59
+ id: identifierName
60
+ color: config.name.text.color
61
+ text: value.label
62
+ verticalAlignment: Text.AlignVCenter
63
+ anchors.rightMargin: 2
64
+ anchors.fill: parent
65
+ font.pixelSize: parent.height * 0.7
66
+ minimumPixelSize: 10
67
+ elide: Text.ElideLeft
68
+ horizontalAlignment: Text.AlignRight
69
+ ToolTip {
70
+ visible: identifierName.truncated ? mouseArea.containsMouse : false
71
+ timeout: 3000
72
+ delay: 500
73
+ contentItem:
74
+ Column {
75
+ Text {
76
+ text: identifierName.text
77
+ font.pixelSize: identifier.height
78
+ font.weight: Font.ExtraBold
79
+ }
80
+ }
81
+ }
82
+ MouseArea {
83
+ id: mouseArea
84
+ anchors.fill: parent
85
+ hoverEnabled: true
86
+ }
87
+ }
88
+ }
89
+
90
+ Rectangle {
91
+ id: valueRectangle
92
+ Layout.fillHeight: true
93
+ color: config.value.color
94
+ Layout.fillWidth: true
95
+ border.width: 1
96
+ border.color: config.value.border.color
97
+ ComboBox {
98
+ id: comboControl
99
+ implicitHeight: parent.height
100
+ height: parent.height * 1.2
101
+ width: parent.width
102
+ font.pixelSize: parent.height * 0.85
103
+ model: possibles
104
+ visible: valueIsArray()
105
+ bottomPadding: height * 0.3
106
+ leftPadding: 2
107
+ rightPadding: 0
108
+ contentItem: Text {
109
+ leftPadding: 0
110
+ rightPadding: comboControl.indicator ? comboControl.indicator.width + comboControl.spacing : 0
111
+ text: comboControl.displayText
112
+ font: comboControl.font
113
+ verticalAlignment: Text.AlignVCenter
114
+ elide: Text.ElideRight
115
+ }
116
+ ToolTip {
117
+ visible: comboControl.currentText ? comboControl.hovered : false
118
+ timeout: 3000
119
+ delay: 500
120
+ contentItem:
121
+ Column {
122
+ Text {
123
+ text: comboControl.currentText
124
+ font.pixelSize: identifier.height
125
+ font.weight: Font.ExtraBold
126
+ }
127
+ }
128
+ }
129
+
130
+ delegate: ItemDelegate {
131
+ width: comboControl.width
132
+ contentItem: Text {
133
+ text: modelData
134
+ font: comboControl.font
135
+ elide: Text.ElideRight
136
+ verticalAlignment: Text.AlignVCenter
137
+ padding: 0
138
+ }
139
+ highlighted: comboControl.highlightedIndex === index
140
+ }
141
+ background: Rectangle {
142
+ border.width: 1
143
+ border.color: config.value.border.color
144
+ }
145
+ }
146
+
147
+ TextInput {
148
+ id: identifier
149
+ text: value.value
150
+ color: config.value.text.color
151
+ visible: !valueIsArray()
152
+ activeFocusOnPress: false
153
+ autoScroll: true
154
+ clip: true
155
+ font.pixelSize: parent.height / 1.2
156
+ anchors.rightMargin: 0
157
+ anchors.leftMargin: 3
158
+ anchors.fill: parent
159
+ ToolTip {
160
+ visible: parent.text ? identifierMouseArea.containsMouse : false
161
+ timeout: 3000
162
+ delay: 500
163
+ contentItem:
164
+ Column {
165
+ Text {
166
+ text: identifier.text
167
+ font.pixelSize: identifier.height
168
+ font.weight: Font.ExtraBold
169
+ }
170
+ }
171
+ }
172
+ MouseArea {
173
+ id: identifierMouseArea
174
+ anchors.fill: parent
175
+ hoverEnabled: true
176
+ }
177
+ }
178
+ }
179
+ }
180
+ }
181
+
182
+ Component.onCompleted: parseConfigStr()
183
+
184
+ function valueIsArray() {
185
+ return (possibles.length > 1) ? true : false;
186
+ }
187
+ function parseConfigStr() {
188
+ if (typeof contextKeyValueItemConfig !== "undefined") {
189
+ var json = JSON.parse(contextKeyValueItemConfig)
190
+ keyValueItem.config = json
191
+ }
192
+ }
193
+ }
194
+
@@ -0,0 +1,41 @@
1
+ /*
2
+ * Copyright 2020 Direkt, Australia
3
+ * Copyright 2021 Direkt Embedded Pty Ltd
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ import QtQuick
19
+
20
+ Item {
21
+ /*
22
+ * Define the proportions for the widths of the test result items.
23
+ * The feedback area is not defined and will fill any remaining area.
24
+ */
25
+ property var proportion: {
26
+ "name": 0.3
27
+ // value fill remaining space
28
+ }
29
+ property var color: "#605b5b"
30
+ property var border: {"color": "#00000000"}
31
+ property var name: {
32
+ "color": "#00000000",
33
+ "text": {"color": "#e5e2e2"},
34
+ "border": {"color": "#00000000"},
35
+ }
36
+ property var value: {
37
+ "color": "#ffffff",
38
+ "border": {"color": "#b9e5e2e2"},
39
+ "text": {"color": "black"}
40
+ }
41
+ }
@@ -0,0 +1,49 @@
1
+ /*
2
+ * Copyright 2020 Direkt, Australia
3
+ * Copyright 2021 Direkt Embedded Pty Ltd
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ import QtQuick
19
+
20
+ Item {
21
+ id: keyValueList
22
+ width: 400
23
+ clip: true
24
+ property var keyvalues
25
+ property int viewableCount: -1
26
+ property var itemConfig
27
+
28
+ Rectangle {
29
+ id: keyValueRectangle
30
+ anchors.fill: parent
31
+
32
+ ListView {
33
+ id: keyValueListView
34
+ clip: true
35
+ snapMode: ListView.NoSnap
36
+ boundsBehavior: Flickable.StopAtBounds
37
+ anchors.fill: parent
38
+ delegate: KeyValueItem {
39
+ height: (viewableCount <= 0) ? (keyValueListView.height / keyValueListView.count) : (keyValueListView.height / viewableCount)
40
+ Component.onCompleted: {
41
+ if (keyValueList.itemConfig) {
42
+ config = keyValueList.itemConfig
43
+ }
44
+ }
45
+ }
46
+ model: keyvalues
47
+ }
48
+ }
49
+ }
@@ -0,0 +1,48 @@
1
+ /*
2
+ * Copyright 2020 Direkt, Australia
3
+ * Copyright 2021 Direkt Embedded Pty Ltd
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ import QtQuick
19
+
20
+ Item {
21
+ property var test_suites
22
+ anchors.fill: parent
23
+ Row {
24
+ id: suiteRows
25
+ spacing: 2
26
+ clip: false
27
+ anchors.fill: parent
28
+ Repeater {
29
+ id: testSuiteRepeater
30
+ anchors.fill: parent
31
+ model: test_suites
32
+ delegate: TestSuiteController {
33
+ tswModel: model
34
+ cntrlModel: model.testsuite.controller
35
+ width: parent.width / testSuiteRepeater.count - 1
36
+ height: parent.height
37
+ Component.onCompleted: {
38
+ if (app_model.config) {
39
+ var json = JSON.parse(app_model.config)
40
+ config = json
41
+ controllerConfig = json.controller
42
+ }
43
+ about = app_model.about
44
+ }
45
+ }
46
+ }
47
+ }
48
+ }
@@ -0,0 +1,88 @@
1
+ /*
2
+ * Copyright 2020 Direkt, Australia
3
+ * Copyright 2021 Direkt Embedded Pty Ltd
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ import QtQuick
19
+ import QtQuick.Controls
20
+ import QtQuick.Dialogs
21
+
22
+ ApplicationWindow {
23
+ id: application
24
+ title: (app_model) ? app_model.title : "Test Executor"
25
+ visible: true
26
+ width: 1200
27
+ height: 800
28
+ visibility: (app_model && app_model.visibility) ? app_model.visibility : "Maximized"
29
+ MultiTestWidget {
30
+ test_suites: model_list
31
+ }
32
+ onClosing: function(close) {
33
+ if (model_list.active_suites) {
34
+ close.accepted = false
35
+ if (Boolean(app_model) && app_model.allowAbort) {
36
+ activeSuitesDialog.open()
37
+ } else {
38
+ closeToolTip.open()
39
+ }
40
+ } else {
41
+ app_model.abortAll(true)
42
+ close.accepted = true
43
+ }
44
+ }
45
+
46
+ ToolTip {
47
+ id: closeToolTip
48
+ timeout: 2000
49
+ background: Rectangle {
50
+ border.color: "red"
51
+ color: "yellow"
52
+ }
53
+ contentItem:
54
+ Column {
55
+ Text {
56
+ text: (app_model) ? app_model.closeHeading : "There Are Still Tests Running"
57
+ font.pixelSize: application.height * 0.03
58
+ font.weight: Font.ExtraBold
59
+ }
60
+ Text {
61
+ text: (app_model) ? app_model.closeText : "Stop all suites if you want to quit"
62
+ font.pixelSize: application.height * 0.03
63
+ font.weight: Font.ExtraBold
64
+ }
65
+ }
66
+ }
67
+
68
+ Dialog {
69
+ id: activeSuitesDialog
70
+ title: (app_model) ? app_model.closeHeading : "There Are Still Tests Running"
71
+ Label {
72
+ id: label
73
+ text: (app_model) ? app_model.closeText : "Do you want to abort all tests?"
74
+ font.pixelSize: application.width * 0.02 > 11 ? application.width * 0.02:11
75
+ }
76
+ font.pixelSize: application.width * 0.02 > 11 ? application.width * 0.02:11
77
+ standardButtons: Dialog.Yes | Dialog.No
78
+ onAccepted: {
79
+ app_model.abortAll(false)
80
+ app_model.abortAll(false)
81
+ }
82
+ width: label.width * 1.05
83
+ x: (parent.width - width) / 2
84
+ y: (parent.height - height) / 2
85
+ implicitWidth: width
86
+ }
87
+ }
88
+