Merge lp:~zeller-benjamin/qtcreator-plugin-ubuntu/devicespage2 into lp:qtcreator-plugin-ubuntu
- devicespage2
- Merge into trunk
Proposed by
Benjamin Zeller
Status: | Merged | ||||
---|---|---|---|---|---|
Approved by: | Zoltan Balogh | ||||
Approved revision: | 281 | ||||
Merged at revision: | 279 | ||||
Proposed branch: | lp:~zeller-benjamin/qtcreator-plugin-ubuntu/devicespage2 | ||||
Merge into: | lp:qtcreator-plugin-ubuntu | ||||
Prerequisite: | lp:~zeller-benjamin/qtcreator-plugin-ubuntu/deployandrunbug | ||||
Diff against target: |
888 lines (+431/-377) 9 files modified
share/qtcreator/ubuntu/devicespage/DeviceAdvancedTab.qml (+0/-92) share/qtcreator/ubuntu/devicespage/DeviceBuilderTab.qml (+0/-42) share/qtcreator/ubuntu/devicespage/DeviceEmulatorTab.qml (+0/-71) share/qtcreator/ubuntu/devicespage/DeviceKitManager.qml (+0/-62) share/qtcreator/ubuntu/devicespage/DeviceLogTab.qml (+0/-12) share/qtcreator/ubuntu/devicespage/DevicePage.qml (+315/-92) share/qtcreator/ubuntu/devicespage/ScrollableView.qml (+55/-0) share/qtcreator/ubuntu/devicespage/SectionItem.qml (+58/-0) src/ubuntu/ubuntu.pro (+3/-6) |
||||
To merge this branch: | bzr merge lp:~zeller-benjamin/qtcreator-plugin-ubuntu/devicespage2 | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Zoltan Balogh | Approve | ||
PS Jenkins bot | continuous-integration | Approve | |
Review via email: mp+237568@code.launchpad.net |
This proposal supersedes a proposal from 2014-10-08.
Commit message
- Refactor UI of devicespage
- Fix Bug #1372633 "Device tab content page needs to allow vertical
scrolling"
Description of the change
- Refactor UI of devicespage
- Fix Bug #1372633 "Device tab content page needs to allow vertical
scrolling"
To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : | # |
review:
Approve
(continuous-integration)
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === removed file 'share/qtcreator/ubuntu/devicespage/DeviceAdvancedTab.qml' | |||
2 | --- share/qtcreator/ubuntu/devicespage/DeviceAdvancedTab.qml 2014-04-25 10:03:59 +0000 | |||
3 | +++ share/qtcreator/ubuntu/devicespage/DeviceAdvancedTab.qml 1970-01-01 00:00:00 +0000 | |||
4 | @@ -1,92 +0,0 @@ | |||
5 | 1 | import QtQuick 2.0 | ||
6 | 2 | import QtQuick.Controls 1.0 as Controls | ||
7 | 3 | import QtQuick.Layouts 1.0 | ||
8 | 4 | import Ubuntu.Components 0.1 | ||
9 | 5 | import Ubuntu.Components.ListItems 0.1 as ListItem | ||
10 | 6 | |||
11 | 7 | |||
12 | 8 | RowLayout { | ||
13 | 9 | Controls.ScrollView { | ||
14 | 10 | Layout.fillHeight: true | ||
15 | 11 | Layout.minimumWidth: units.gu(78) | ||
16 | 12 | UbuntuListView { | ||
17 | 13 | model: VisualItemModel{ | ||
18 | 14 | Label { | ||
19 | 15 | text: "Device Control" | ||
20 | 16 | fontSize: "large" | ||
21 | 17 | anchors.left: parent.left | ||
22 | 18 | } | ||
23 | 19 | ListItem.Standard { | ||
24 | 20 | text:"Clone time config from Host to Device" | ||
25 | 21 | control: Button{ | ||
26 | 22 | text: "Execute" | ||
27 | 23 | enabled: !deviceItemView.deviceBusy | ||
28 | 24 | onClicked: devicesModel.triggerCloneTimeConfig(deviceId) | ||
29 | 25 | } | ||
30 | 26 | } | ||
31 | 27 | ListItem.Standard { | ||
32 | 28 | text:"Enable port forwarding" | ||
33 | 29 | control: Button{ | ||
34 | 30 | text: "Execute" | ||
35 | 31 | enabled: !deviceItemView.deviceBusy | ||
36 | 32 | onClicked: devicesModel.triggerPortForwarding(deviceId) | ||
37 | 33 | } | ||
38 | 34 | } | ||
39 | 35 | ListItem.Standard { | ||
40 | 36 | text:"Setup public key authentication" | ||
41 | 37 | control: Button{ | ||
42 | 38 | text: "Execute" | ||
43 | 39 | enabled: !deviceItemView.deviceBusy | ||
44 | 40 | onClicked: devicesModel.triggerSSHSetup(deviceId) | ||
45 | 41 | } | ||
46 | 42 | } | ||
47 | 43 | ListItem.Standard { | ||
48 | 44 | text:"Open SSH connection to the device" | ||
49 | 45 | control: Button{ | ||
50 | 46 | text: "Execute" | ||
51 | 47 | enabled: !deviceItemView.deviceBusy | ||
52 | 48 | onClicked: devicesModel.triggerSSHConnection(deviceId) | ||
53 | 49 | } | ||
54 | 50 | } | ||
55 | 51 | ListItem.Divider{} | ||
56 | 52 | Label { | ||
57 | 53 | text: "Device Mode" | ||
58 | 54 | fontSize: "large" | ||
59 | 55 | } | ||
60 | 56 | ListItem.Standard { | ||
61 | 57 | text:"Reboot" | ||
62 | 58 | control: Button{ | ||
63 | 59 | text: "Execute" | ||
64 | 60 | enabled: !deviceItemView.deviceBusy | ||
65 | 61 | onClicked: devicesModel.triggerReboot(deviceId) | ||
66 | 62 | } | ||
67 | 63 | } | ||
68 | 64 | ListItem.Standard { | ||
69 | 65 | text:"Reboot to bootloader" | ||
70 | 66 | control: Button{ | ||
71 | 67 | text: "Execute" | ||
72 | 68 | enabled: !deviceItemView.deviceBusy | ||
73 | 69 | onClicked: devicesModel.triggerRebootBootloader(deviceId) | ||
74 | 70 | } | ||
75 | 71 | } | ||
76 | 72 | ListItem.Standard { | ||
77 | 73 | text:"Reboot to recovery" | ||
78 | 74 | control: Button{ | ||
79 | 75 | text: "Execute" | ||
80 | 76 | enabled: !deviceItemView.deviceBusy | ||
81 | 77 | onClicked: devicesModel.triggerRebootRecovery(deviceId) | ||
82 | 78 | } | ||
83 | 79 | } | ||
84 | 80 | ListItem.Standard { | ||
85 | 81 | text:"Shutdown" | ||
86 | 82 | control: Button{ | ||
87 | 83 | text: "Execute" | ||
88 | 84 | enabled: !deviceItemView.deviceBusy | ||
89 | 85 | onClicked: devicesModel.triggerShutdown(deviceId) | ||
90 | 86 | } | ||
91 | 87 | } | ||
92 | 88 | } | ||
93 | 89 | } | ||
94 | 90 | } | ||
95 | 91 | } | ||
96 | 92 | |||
97 | 93 | 0 | ||
98 | === removed file 'share/qtcreator/ubuntu/devicespage/DeviceBuilderTab.qml' | |||
99 | --- share/qtcreator/ubuntu/devicespage/DeviceBuilderTab.qml 2014-04-25 10:03:59 +0000 | |||
100 | +++ share/qtcreator/ubuntu/devicespage/DeviceBuilderTab.qml 1970-01-01 00:00:00 +0000 | |||
101 | @@ -1,42 +0,0 @@ | |||
102 | 1 | import QtQuick 2.0 | ||
103 | 2 | import QtQuick.Controls 1.0 as Controls | ||
104 | 3 | import QtQuick.Layouts 1.0 | ||
105 | 4 | import Ubuntu.Components 0.1 | ||
106 | 5 | import Ubuntu.Components.ListItems 0.1 as ListItem | ||
107 | 6 | |||
108 | 7 | RowLayout { | ||
109 | 8 | spacing: units.gu(1) | ||
110 | 9 | Controls.ScrollView { | ||
111 | 10 | Layout.fillHeight: true | ||
112 | 11 | Layout.minimumWidth: units.gu(78) | ||
113 | 12 | |||
114 | 13 | ColumnLayout { | ||
115 | 14 | Layout.fillWidth: true | ||
116 | 15 | Label { | ||
117 | 16 | text: "Platform development" | ||
118 | 17 | fontSize: "large" | ||
119 | 18 | anchors.left: parent.left | ||
120 | 19 | Layout.fillWidth: true | ||
121 | 20 | } | ||
122 | 21 | Label { | ||
123 | 22 | text: "The connected device can be turned to be a native development environment.\n Use this feature with care and only if you know what are you doing." | ||
124 | 23 | } | ||
125 | 24 | FeatureStateItem { | ||
126 | 25 | text: "Has writeable image" | ||
127 | 26 | input: hasWriteableImage | ||
128 | 27 | inputRole: "hasWriteableImage" | ||
129 | 28 | height: 24 | ||
130 | 29 | width: 300 | ||
131 | 30 | checkable: !deviceItemView.deviceBusy | ||
132 | 31 | } | ||
133 | 32 | FeatureStateItem { | ||
134 | 33 | text: "Has device developer tools" | ||
135 | 34 | input: hasDeveloperTools | ||
136 | 35 | inputRole: "hasDeveloperTools" | ||
137 | 36 | height: 24 | ||
138 | 37 | width: 300 | ||
139 | 38 | checkable: !deviceItemView.deviceBusy | ||
140 | 39 | } | ||
141 | 40 | } | ||
142 | 41 | } | ||
143 | 42 | } | ||
144 | 43 | 0 | ||
145 | === removed file 'share/qtcreator/ubuntu/devicespage/DeviceEmulatorTab.qml' | |||
146 | --- share/qtcreator/ubuntu/devicespage/DeviceEmulatorTab.qml 2014-08-11 10:46:51 +0000 | |||
147 | +++ share/qtcreator/ubuntu/devicespage/DeviceEmulatorTab.qml 1970-01-01 00:00:00 +0000 | |||
148 | @@ -1,71 +0,0 @@ | |||
149 | 1 | import QtQuick 2.0 | ||
150 | 2 | import QtQuick.Layouts 1.0 | ||
151 | 3 | import QtQuick.Controls 1.0 as Controls | ||
152 | 4 | |||
153 | 5 | import Ubuntu.Components 0.1 | ||
154 | 6 | import Ubuntu.Components.ListItems 0.1 as ListItem | ||
155 | 7 | import Ubuntu.Components.Popups 0.1 | ||
156 | 8 | |||
157 | 9 | import Ubuntu.DevicesModel 0.1 | ||
158 | 10 | |||
159 | 11 | ColumnLayout { | ||
160 | 12 | UbuntuListView { | ||
161 | 13 | Layout.alignment: Qt.AlignLeft | Qt.AlignTop | ||
162 | 14 | width: units.gu(50) | ||
163 | 15 | height: childrenRect.height | ||
164 | 16 | model: VisualItemModel { | ||
165 | 17 | ListItem.SingleValue { | ||
166 | 18 | text: i18n.tr("Ubuntu version") | ||
167 | 19 | value: emuUbuntuVersion | ||
168 | 20 | } | ||
169 | 21 | ListItem.SingleValue { | ||
170 | 22 | text: i18n.tr("Device version") | ||
171 | 23 | value: emuDeviceVersion | ||
172 | 24 | } | ||
173 | 25 | ListItem.SingleValue { | ||
174 | 26 | text: i18n.tr("Image version") | ||
175 | 27 | value: emuImageVersion | ||
176 | 28 | } | ||
177 | 29 | ListItem.Standard { | ||
178 | 30 | //show this listitem only when device is not connected | ||
179 | 31 | visible: connectionState !== DeviceConnectionState.ReadyToUse && connectionState !== DeviceConnectionState.Connected | ||
180 | 32 | text: "Scale" | ||
181 | 33 | control: Controls.ComboBox { | ||
182 | 34 | id: emulatorScaleComboBox | ||
183 | 35 | model: ["1.0", "0.9", "0.8", "0.7", "0.6","0.5", "0.4", "0.3", "0.2","0.1"] | ||
184 | 36 | currentIndex: { | ||
185 | 37 | var idx = find(emulatorScaleFactor); | ||
186 | 38 | return idx >= 0 ? idx : 0; | ||
187 | 39 | } | ||
188 | 40 | onActivated: { | ||
189 | 41 | emulatorScaleFactor = textAt(index); | ||
190 | 42 | } | ||
191 | 43 | } | ||
192 | 44 | } | ||
193 | 45 | |||
194 | 46 | ListItem.Standard { | ||
195 | 47 | //show this listitem only when device is not connected | ||
196 | 48 | visible: connectionState !== DeviceConnectionState.ReadyToUse && connectionState !== DeviceConnectionState.Connected | ||
197 | 49 | text: "Memory" | ||
198 | 50 | control: Controls.ComboBox { | ||
199 | 51 | id: emulatorMemoryComboBox | ||
200 | 52 | model: ["512", "768", "1024"] | ||
201 | 53 | |||
202 | 54 | currentIndex: { | ||
203 | 55 | var idx = find(emulatorMemorySetting); | ||
204 | 56 | return idx >= 0 ? idx : 0; | ||
205 | 57 | } | ||
206 | 58 | onActivated: { | ||
207 | 59 | emulatorMemorySetting = textAt(index); | ||
208 | 60 | } | ||
209 | 61 | } | ||
210 | 62 | } | ||
211 | 63 | } | ||
212 | 64 | } | ||
213 | 65 | ListItem.Divider{} | ||
214 | 66 | DeviceKitManager{ | ||
215 | 67 | Layout.alignment: Qt.AlignLeft | Qt.AlignTop | ||
216 | 68 | Layout.fillHeight: true | ||
217 | 69 | width: units.gu(50) | ||
218 | 70 | } | ||
219 | 71 | } | ||
220 | 72 | 0 | ||
221 | === removed file 'share/qtcreator/ubuntu/devicespage/DeviceKitManager.qml' | |||
222 | --- share/qtcreator/ubuntu/devicespage/DeviceKitManager.qml 2014-08-11 10:46:51 +0000 | |||
223 | +++ share/qtcreator/ubuntu/devicespage/DeviceKitManager.qml 1970-01-01 00:00:00 +0000 | |||
224 | @@ -1,62 +0,0 @@ | |||
225 | 1 | import QtQuick 2.0 | ||
226 | 2 | import QtQuick.Controls 1.0 as Controls | ||
227 | 3 | import QtQuick.Layouts 1.0 | ||
228 | 4 | import Ubuntu.Components 0.1 | ||
229 | 5 | import Ubuntu.Components.ListItems 0.1 as ListItem | ||
230 | 6 | import Ubuntu.DevicesModel 0.1 | ||
231 | 7 | |||
232 | 8 | Item { | ||
233 | 9 | ColumnLayout { | ||
234 | 10 | anchors.fill: parent | ||
235 | 11 | Label { | ||
236 | 12 | text: "Device Kits" | ||
237 | 13 | fontSize: "large" | ||
238 | 14 | } | ||
239 | 15 | |||
240 | 16 | Column { | ||
241 | 17 | Layout.fillWidth: true | ||
242 | 18 | Repeater { | ||
243 | 19 | model: kits | ||
244 | 20 | delegate: ListItem.Standard { | ||
245 | 21 | text: modelData.displayName | ||
246 | 22 | Layout.fillWidth: true | ||
247 | 23 | control: Button{ | ||
248 | 24 | text: "Remove" | ||
249 | 25 | enabled: !deviceItemView.deviceBusy | ||
250 | 26 | onClicked: devicesModel.triggerKitRemove(deviceId,modelData.id) | ||
251 | 27 | } | ||
252 | 28 | } | ||
253 | 29 | } | ||
254 | 30 | } | ||
255 | 31 | |||
256 | 32 | Item { | ||
257 | 33 | clip: true | ||
258 | 34 | visible: kits.length === 0 | ||
259 | 35 | Layout.minimumHeight: units.gu(25) | ||
260 | 36 | Layout.fillWidth: true | ||
261 | 37 | Label { | ||
262 | 38 | id:label | ||
263 | 39 | anchors.centerIn: parent | ||
264 | 40 | anchors.bottom: button.top | ||
265 | 41 | fontSize: "large" | ||
266 | 42 | text: "There is currently no Kit defined for your device.\n In order to use the device in your Projects,\n you can either add a existing Kit " | ||
267 | 43 | +"\nor let Qt Creator autocreate one for you." | ||
268 | 44 | } | ||
269 | 45 | Button { | ||
270 | 46 | id: button | ||
271 | 47 | anchors.left: label.left | ||
272 | 48 | anchors.right: label.right | ||
273 | 49 | anchors.top: label.bottom | ||
274 | 50 | anchors.topMargin: units.gu(2) | ||
275 | 51 | text: "Autocreate" | ||
276 | 52 | enabled: !deviceItemView.deviceBusy | ||
277 | 53 | onClicked: devicesModel.triggerKitAutocreate(deviceId) | ||
278 | 54 | } | ||
279 | 55 | } | ||
280 | 56 | |||
281 | 57 | //Spacer Item | ||
282 | 58 | Item { | ||
283 | 59 | Layout.fillHeight: true | ||
284 | 60 | } | ||
285 | 61 | } | ||
286 | 62 | } | ||
287 | 63 | 0 | ||
288 | === removed file 'share/qtcreator/ubuntu/devicespage/DeviceLogTab.qml' | |||
289 | --- share/qtcreator/ubuntu/devicespage/DeviceLogTab.qml 2014-04-22 14:10:22 +0000 | |||
290 | +++ share/qtcreator/ubuntu/devicespage/DeviceLogTab.qml 1970-01-01 00:00:00 +0000 | |||
291 | @@ -1,12 +0,0 @@ | |||
292 | 1 | import QtQuick 2.0 | ||
293 | 2 | import QtQuick.Controls 1.0 as Controls | ||
294 | 3 | import QtQuick.Layouts 1.0 | ||
295 | 4 | import Ubuntu.Components 0.1 | ||
296 | 5 | import Ubuntu.Components.ListItems 0.1 as ListItem | ||
297 | 6 | |||
298 | 7 | |||
299 | 8 | Controls.TextArea { | ||
300 | 9 | readOnly: true | ||
301 | 10 | text: deviceLog | ||
302 | 11 | textFormat: TextEdit.AutoText | ||
303 | 12 | } | ||
304 | 13 | 0 | ||
305 | === modified file 'share/qtcreator/ubuntu/devicespage/DevicePage.qml' | |||
306 | --- share/qtcreator/ubuntu/devicespage/DevicePage.qml 2014-08-11 11:58:08 +0000 | |||
307 | +++ share/qtcreator/ubuntu/devicespage/DevicePage.qml 2014-10-08 10:38:58 +0000 | |||
308 | @@ -153,15 +153,17 @@ | |||
309 | 153 | } | 153 | } |
310 | 154 | } | 154 | } |
311 | 155 | } | 155 | } |
312 | 156 | |||
313 | 156 | Item { | 157 | Item { |
314 | 157 | id: centerItem | 158 | id: centerItem |
315 | 158 | Layout.minimumWidth: 400 | 159 | Layout.minimumWidth: 400 |
316 | 159 | Layout.fillWidth: true | 160 | Layout.fillWidth: true |
318 | 160 | property int currentIndex: devicesList.currentIndex | 161 | |
319 | 161 | Repeater { | 162 | Repeater { |
320 | 163 | property int currentIndex: devicesList.currentIndex | ||
321 | 162 | model: devicesModel | 164 | model: devicesModel |
324 | 163 | anchors.fill: parent | 165 | |
325 | 164 | Rectangle{ | 166 | Rectangle { |
326 | 165 | id: deviceItemView | 167 | id: deviceItemView |
327 | 166 | property bool deviceConnected: connectionState === DeviceConnectionState.ReadyToUse || connectionState === DeviceConnectionState.Connected | 168 | property bool deviceConnected: connectionState === DeviceConnectionState.ReadyToUse || connectionState === DeviceConnectionState.Connected |
328 | 167 | property bool deviceBusy: (detectionState != DeviceDetectionState.Done && detectionState != DeviceDetectionState.NotStarted) | 169 | property bool deviceBusy: (detectionState != DeviceDetectionState.Done && detectionState != DeviceDetectionState.NotStarted) |
329 | @@ -172,6 +174,7 @@ | |||
330 | 172 | color: Qt.rgba(0.0, 0.0, 0.0, 0.01) | 174 | color: Qt.rgba(0.0, 0.0, 0.0, 0.01) |
331 | 173 | visible: index == devicesList.currentIndex | 175 | visible: index == devicesList.currentIndex |
332 | 174 | 176 | ||
333 | 177 | |||
334 | 175 | Controls.ToolBar { | 178 | Controls.ToolBar { |
335 | 176 | id: emulatorToolBar | 179 | id: emulatorToolBar |
336 | 177 | height: visible ? units.gu(5) : 0 | 180 | height: visible ? units.gu(5) : 0 |
337 | @@ -205,95 +208,315 @@ | |||
338 | 205 | } | 208 | } |
339 | 206 | } | 209 | } |
340 | 207 | 210 | ||
430 | 208 | Controls.TabView { | 211 | ScrollableView { |
431 | 209 | id: pagesTabView | 212 | id: deviceView |
432 | 210 | anchors.left: parent.left | 213 | anchors.left: parent.left |
433 | 211 | anchors.right: parent.right | 214 | anchors.right: parent.right |
434 | 212 | anchors.top: emulatorToolBar.bottom | 215 | anchors.top: emulatorToolBar.bottom |
435 | 213 | anchors.bottom: parent.bottom | 216 | anchors.bottom: parent.bottom |
436 | 214 | anchors.margins: 12 | 217 | clip: true |
437 | 215 | visible: deviceConnected && !deviceBooting && !detectionError | 218 | |
438 | 216 | 219 | ListItem.Empty { | |
439 | 217 | Component.onCompleted: { | 220 | divider.visible: false |
440 | 218 | addTab("Device", Qt.createComponent("DeviceStatusTab.qml")) | 221 | visible: detectionError |
441 | 219 | if(machineType === DeviceMachineType.Emulator) | 222 | RowLayout { |
442 | 220 | addTab("Emulator", Qt.createComponent("DeviceEmulatorTab.qml")) | 223 | anchors.fill: parent |
443 | 221 | addTab("Advanced", Qt.createComponent("DeviceAdvancedTab.qml")) | 224 | anchors.leftMargin: units.gu(2) |
444 | 222 | addTab("Builder", Qt.createComponent("DeviceBuilderTab.qml")) | 225 | anchors.rightMargin: units.gu(4) |
445 | 223 | addTab("Log", Qt.createComponent("DeviceLogTab.qml")) | 226 | Icon { |
446 | 224 | } | 227 | id: errorIcon |
447 | 225 | } | 228 | anchors.left: parent.left |
448 | 226 | 229 | name: "security-alert" | |
449 | 227 | ColumnLayout { | 230 | height:parent.height - units.gu(2) |
450 | 228 | visible: !deviceConnected && !deviceBooting && !detectionError && (machineType !== DeviceMachineType.Emulator) | 231 | width: height |
451 | 229 | anchors.left: parent.left | 232 | } |
452 | 230 | anchors.top: emulatorToolBar.bottom | 233 | Label { |
453 | 231 | anchors.bottom: parent.bottom | 234 | id: errorText |
454 | 232 | anchors.margins: 10 | 235 | text: i18n.tr("There was a error in the device detection, check the log for details.") |
455 | 233 | width: units.gu(75) | 236 | fontSize: "large" |
456 | 234 | spacing: units.gu(1) | 237 | wrapMode: Text.Wrap |
457 | 235 | 238 | Layout.fillWidth: true | |
458 | 236 | Label { | 239 | } |
459 | 237 | text:"Device Status: Disconnected" | 240 | Button { |
460 | 238 | fontSize: "large" | 241 | id: deviceRedetectButton |
461 | 239 | Layout.alignment: Qt.AlignLeft | Qt.AlignTop | 242 | text: "Redetect" |
462 | 240 | Layout.fillWidth: true | 243 | onClicked: devicesModel.triggerRedetect(deviceId) |
463 | 241 | } | 244 | } |
464 | 242 | ListItem.SingleValue { | 245 | } |
465 | 243 | Layout.alignment: Qt.AlignLeft | Qt.AlignTop | 246 | } |
466 | 244 | text:i18n.tr("Serial ID") | 247 | |
467 | 245 | Layout.fillWidth: true | 248 | ListItem.Empty { |
468 | 246 | value: serial | 249 | divider.visible: false |
469 | 247 | } | 250 | visible: deviceItemView.deviceBooting |
470 | 248 | ListItem.Divider{} | 251 | RowLayout { |
471 | 249 | DeviceKitManager { | 252 | anchors.fill: parent |
472 | 250 | Layout.alignment: Qt.AlignLeft | Qt.AlignTop | 253 | anchors.leftMargin: units.gu(2) |
473 | 251 | Layout.fillHeight: true | 254 | anchors.rightMargin: units.gu(4) |
474 | 252 | Layout.fillWidth: true | 255 | ActivityIndicator { |
475 | 253 | } | 256 | running: deviceItemView.deviceBooting |
476 | 254 | } | 257 | height:parent.height - units.gu(2) |
477 | 255 | 258 | width: height | |
478 | 256 | DeviceEmulatorTab { | 259 | } |
479 | 257 | id: emuSettings | 260 | Label { |
480 | 258 | visible: !deviceConnected && !deviceBooting && !detectionError && (machineType === DeviceMachineType.Emulator) | 261 | text: i18n.tr("The device is currently booting, if this text is still shown after the device has booted, press the refresh button.") |
481 | 259 | anchors.left: parent.left | 262 | fontSize: "large" |
482 | 260 | anchors.right: parent.right | 263 | wrapMode: Text.Wrap |
483 | 261 | anchors.top: emulatorToolBar.bottom | 264 | Layout.fillWidth: true |
484 | 262 | anchors.bottom: parent.bottom | 265 | } |
485 | 263 | anchors.margins: 10 | 266 | Button { |
486 | 264 | } | 267 | text: "Redetect" |
487 | 265 | 268 | onClicked: devicesModel.triggerRedetect(deviceId) | |
488 | 266 | Column { | 269 | } |
489 | 267 | visible: deviceBooting && !detectionError | 270 | } |
490 | 268 | anchors.centerIn: parent | 271 | } |
491 | 269 | spacing: units.gu(1) | 272 | |
492 | 270 | Label { | 273 | SectionItem { |
493 | 271 | text: i18n.tr("The device is currently booting.") | 274 | title: deviceItemView.deviceConnected ? "Device Status: "+detectionStateString : "Device Status: Disconnected" |
494 | 272 | fontSize: "large" | 275 | expanded: true |
495 | 273 | anchors.horizontalCenter: parent.horizontalCenter | 276 | |
496 | 274 | } | 277 | Column { |
497 | 275 | Label { | 278 | anchors.left: parent.left |
498 | 276 | text: i18n.tr("If this text is still shown after the device has booted, press the refresh button.") | 279 | anchors.right: parent.right |
499 | 277 | anchors.horizontalCenter: parent.horizontalCenter | 280 | |
500 | 278 | } | 281 | ListItem.SingleValue { |
501 | 279 | ActivityIndicator { | 282 | visible: deviceItemView.deviceConnected || machineType !== DeviceMachineType.Emulator |
502 | 280 | running: deviceBooting | 283 | text:i18n.tr("Serial ID") |
503 | 281 | anchors.horizontalCenter: parent.horizontalCenter | 284 | value: serial |
504 | 282 | } | 285 | } |
505 | 283 | } | 286 | ListItem.SingleValue { |
506 | 284 | Column { | 287 | text: i18n.tr("Ubuntu version") |
507 | 285 | visible: detectionError | 288 | value: emuUbuntuVersion |
508 | 286 | anchors.centerIn: parent | 289 | visible: machineType === DeviceMachineType.Emulator |
509 | 287 | spacing: units.gu(1) | 290 | } |
510 | 288 | Label { | 291 | ListItem.SingleValue { |
511 | 289 | text: i18n.tr("There was a error in the device detection, please press the redetect button to try again.") | 292 | text: i18n.tr("Device version") |
512 | 290 | fontSize: "large" | 293 | value: emuDeviceVersion |
513 | 291 | anchors.horizontalCenter: parent.horizontalCenter | 294 | visible: machineType === DeviceMachineType.Emulator |
514 | 292 | } | 295 | } |
515 | 293 | Button { | 296 | ListItem.SingleValue { |
516 | 294 | text: "Redetect" | 297 | text: i18n.tr("Image version") |
517 | 295 | onClicked: devicesModel.triggerRedetect(deviceId) | 298 | value: emuImageVersion |
518 | 296 | anchors.horizontalCenter: parent.horizontalCenter | 299 | visible: machineType === DeviceMachineType.Emulator |
519 | 300 | } | ||
520 | 301 | ListItem.Standard { | ||
521 | 302 | //show this listitem only when device is not connected | ||
522 | 303 | visible: machineType === DeviceMachineType.Emulator && !deviceItemView.deviceConnected | ||
523 | 304 | text: "Scale" | ||
524 | 305 | control: Controls.ComboBox { | ||
525 | 306 | id: emulatorScaleComboBox | ||
526 | 307 | model: ["1.0", "0.9", "0.8", "0.7", "0.6","0.5", "0.4", "0.3", "0.2","0.1"] | ||
527 | 308 | currentIndex: { | ||
528 | 309 | var idx = find(emulatorScaleFactor); | ||
529 | 310 | return idx >= 0 ? idx : 0; | ||
530 | 311 | } | ||
531 | 312 | onActivated: { | ||
532 | 313 | emulatorScaleFactor = textAt(index); | ||
533 | 314 | } | ||
534 | 315 | } | ||
535 | 316 | } | ||
536 | 317 | |||
537 | 318 | ListItem.Standard { | ||
538 | 319 | //show this listitem only when device is not connected | ||
539 | 320 | visible: machineType === DeviceMachineType.Emulator && !deviceItemView.deviceConnected | ||
540 | 321 | text: "Memory" | ||
541 | 322 | control: Controls.ComboBox { | ||
542 | 323 | id: emulatorMemoryComboBox | ||
543 | 324 | model: ["512", "768", "1024"] | ||
544 | 325 | |||
545 | 326 | currentIndex: { | ||
546 | 327 | var idx = find(emulatorMemorySetting); | ||
547 | 328 | return idx >= 0 ? idx : 0; | ||
548 | 329 | } | ||
549 | 330 | onActivated: { | ||
550 | 331 | emulatorMemorySetting = textAt(index); | ||
551 | 332 | } | ||
552 | 333 | } | ||
553 | 334 | } | ||
554 | 335 | ListItem.SingleValue { | ||
555 | 336 | text:i18n.tr("Device") | ||
556 | 337 | value: deviceInfo | ||
557 | 338 | visible: deviceItemView.deviceConnected | ||
558 | 339 | } | ||
559 | 340 | ListItem.SingleValue { | ||
560 | 341 | text:i18n.tr("Model") | ||
561 | 342 | value: modelInfo | ||
562 | 343 | visible: deviceItemView.deviceConnected | ||
563 | 344 | } | ||
564 | 345 | ListItem.SingleValue { | ||
565 | 346 | text:i18n.tr("Product") | ||
566 | 347 | value: productInfo | ||
567 | 348 | visible: deviceItemView.deviceConnected | ||
568 | 349 | } | ||
569 | 350 | |||
570 | 351 | FeatureStateItem { | ||
571 | 352 | text: "Has network connection" | ||
572 | 353 | input: hasNetworkConnection | ||
573 | 354 | inputRole: "hasNetworkConnection" | ||
574 | 355 | checkable: hasNetworkConnection == FeatureState.NotAvailable && !deviceItemView.deviceBusy && !deviceItemView.detectionError | ||
575 | 356 | visible: deviceItemView.deviceConnected | ||
576 | 357 | } | ||
577 | 358 | FeatureStateItem { | ||
578 | 359 | text: "Has devloper mode enabled" | ||
579 | 360 | input: developerModeEnabled | ||
580 | 361 | inputRole: "developerModeEnabled" | ||
581 | 362 | checkable: !deviceItemView.deviceBusy && !deviceItemView.detectionError | ||
582 | 363 | visible: deviceItemView.deviceConnected | ||
583 | 364 | } | ||
584 | 365 | /* | ||
585 | 366 | FeatureStateItem { | ||
586 | 367 | text: "Has writeable image" | ||
587 | 368 | input: hasWriteableImage | ||
588 | 369 | inputRole: "hasWriteableImage" | ||
589 | 370 | checkable: false | ||
590 | 371 | visible: deviceItemView.deviceConnected | ||
591 | 372 | } | ||
592 | 373 | */ | ||
593 | 374 | } | ||
594 | 375 | } | ||
595 | 376 | |||
596 | 377 | SectionItem { | ||
597 | 378 | title: "Kits" | ||
598 | 379 | expanded: true | ||
599 | 380 | |||
600 | 381 | Column { | ||
601 | 382 | anchors.left: parent.left | ||
602 | 383 | anchors.right: parent.right | ||
603 | 384 | |||
604 | 385 | Repeater { | ||
605 | 386 | model: kits | ||
606 | 387 | delegate: ListItem.Standard { | ||
607 | 388 | text: modelData.displayName | ||
608 | 389 | Layout.fillWidth: true | ||
609 | 390 | control: Button{ | ||
610 | 391 | text: "Remove" | ||
611 | 392 | enabled: !deviceItemView.deviceBusy | ||
612 | 393 | onClicked: devicesModel.triggerKitRemove(deviceId,modelData.id) | ||
613 | 394 | } | ||
614 | 395 | } | ||
615 | 396 | } | ||
616 | 397 | |||
617 | 398 | Item { | ||
618 | 399 | clip: true | ||
619 | 400 | visible: kits.length === 0 | ||
620 | 401 | height: label.contentHeight + units.gu(15) | ||
621 | 402 | width: parent.width | ||
622 | 403 | Label { | ||
623 | 404 | id:label | ||
624 | 405 | anchors.centerIn: parent | ||
625 | 406 | anchors.bottom: button.top | ||
626 | 407 | fontSize: "large" | ||
627 | 408 | text: "There is currently no Kit defined for your device.\n In order to use the device in your Projects,\n you can either add a existing Kit " | ||
628 | 409 | +"\nor let Qt Creator autocreate one for you." | ||
629 | 410 | } | ||
630 | 411 | Button { | ||
631 | 412 | id: button | ||
632 | 413 | anchors.left: label.left | ||
633 | 414 | anchors.right: label.right | ||
634 | 415 | anchors.top: label.bottom | ||
635 | 416 | anchors.bottom: parent.bottom | ||
636 | 417 | anchors.topMargin: units.gu(2) | ||
637 | 418 | text: "Autocreate" | ||
638 | 419 | enabled: !deviceItemView.deviceBusy | ||
639 | 420 | onClicked: devicesModel.triggerKitAutocreate(deviceId) | ||
640 | 421 | } | ||
641 | 422 | } | ||
642 | 423 | |||
643 | 424 | |||
644 | 425 | } | ||
645 | 426 | } | ||
646 | 427 | |||
647 | 428 | SectionItem { | ||
648 | 429 | title: "Control" | ||
649 | 430 | visible: deviceItemView.deviceConnected | ||
650 | 431 | |||
651 | 432 | Column { | ||
652 | 433 | anchors.left: parent.left | ||
653 | 434 | anchors.right: parent.right | ||
654 | 435 | |||
655 | 436 | ListItem.Standard { | ||
656 | 437 | text:"Clone time config from Host to Device" | ||
657 | 438 | control: Button{ | ||
658 | 439 | text: "Execute" | ||
659 | 440 | enabled: !deviceItemView.deviceBusy && !deviceItemView.detectionError | ||
660 | 441 | onClicked: devicesModel.triggerCloneTimeConfig(deviceId) | ||
661 | 442 | } | ||
662 | 443 | } | ||
663 | 444 | ListItem.Standard { | ||
664 | 445 | text:"Enable port forwarding" | ||
665 | 446 | control: Button{ | ||
666 | 447 | text: "Execute" | ||
667 | 448 | enabled: !deviceItemView.deviceBusy && !deviceItemView.detectionError | ||
668 | 449 | onClicked: devicesModel.triggerPortForwarding(deviceId) | ||
669 | 450 | } | ||
670 | 451 | } | ||
671 | 452 | ListItem.Standard { | ||
672 | 453 | text:"Setup public key authentication" | ||
673 | 454 | control: Button{ | ||
674 | 455 | text: "Execute" | ||
675 | 456 | enabled: !deviceItemView.deviceBusy && !deviceItemView.detectionError | ||
676 | 457 | onClicked: devicesModel.triggerSSHSetup(deviceId) | ||
677 | 458 | } | ||
678 | 459 | } | ||
679 | 460 | ListItem.Standard { | ||
680 | 461 | text:"Open SSH connection to the device" | ||
681 | 462 | control: Button{ | ||
682 | 463 | text: "Execute" | ||
683 | 464 | enabled: !deviceItemView.deviceBusy && !deviceItemView.detectionError | ||
684 | 465 | onClicked: devicesModel.triggerSSHConnection(deviceId) | ||
685 | 466 | } | ||
686 | 467 | } | ||
687 | 468 | ListItem.Standard { | ||
688 | 469 | text:"Reboot" | ||
689 | 470 | control: Button{ | ||
690 | 471 | text: "Execute" | ||
691 | 472 | enabled: !deviceItemView.deviceBusy && !deviceItemView.detectionError | ||
692 | 473 | onClicked: devicesModel.triggerReboot(deviceId) | ||
693 | 474 | } | ||
694 | 475 | } | ||
695 | 476 | ListItem.Standard { | ||
696 | 477 | text:"Reboot to bootloader" | ||
697 | 478 | control: Button{ | ||
698 | 479 | text: "Execute" | ||
699 | 480 | enabled: !deviceItemView.deviceBusy && !deviceItemView.detectionError | ||
700 | 481 | onClicked: devicesModel.triggerRebootBootloader(deviceId) | ||
701 | 482 | } | ||
702 | 483 | } | ||
703 | 484 | ListItem.Standard { | ||
704 | 485 | text:"Reboot to recovery" | ||
705 | 486 | control: Button{ | ||
706 | 487 | text: "Execute" | ||
707 | 488 | enabled: !deviceItemView.deviceBusy && !deviceItemView.detectionError | ||
708 | 489 | onClicked: devicesModel.triggerRebootRecovery(deviceId) | ||
709 | 490 | } | ||
710 | 491 | } | ||
711 | 492 | ListItem.Standard { | ||
712 | 493 | text:"Shutdown" | ||
713 | 494 | control: Button{ | ||
714 | 495 | text: "Execute" | ||
715 | 496 | enabled: !deviceItemView.deviceBusy && !deviceItemView.detectionError | ||
716 | 497 | onClicked: devicesModel.triggerShutdown(deviceId) | ||
717 | 498 | } | ||
718 | 499 | } | ||
719 | 500 | } | ||
720 | 501 | |||
721 | 502 | } | ||
722 | 503 | |||
723 | 504 | SectionItem { | ||
724 | 505 | title: "Log" | ||
725 | 506 | Column { | ||
726 | 507 | anchors.left: parent.left | ||
727 | 508 | anchors.right: parent.right | ||
728 | 509 | TextArea { | ||
729 | 510 | anchors.left: parent.left | ||
730 | 511 | anchors.right: parent.right | ||
731 | 512 | height: units.gu(60) | ||
732 | 513 | highlighted: true | ||
733 | 514 | |||
734 | 515 | readOnly: true | ||
735 | 516 | text: deviceLog | ||
736 | 517 | textFormat: TextEdit.AutoText | ||
737 | 518 | } | ||
738 | 519 | } | ||
739 | 297 | } | 520 | } |
740 | 298 | } | 521 | } |
741 | 299 | } | 522 | } |
742 | 300 | 523 | ||
743 | === added file 'share/qtcreator/ubuntu/devicespage/ScrollableView.qml' | |||
744 | --- share/qtcreator/ubuntu/devicespage/ScrollableView.qml 1970-01-01 00:00:00 +0000 | |||
745 | +++ share/qtcreator/ubuntu/devicespage/ScrollableView.qml 2014-10-08 10:38:58 +0000 | |||
746 | @@ -0,0 +1,55 @@ | |||
747 | 1 | /* | ||
748 | 2 | * Copyright 2013 Canonical Ltd. | ||
749 | 3 | * | ||
750 | 4 | * This program is free software; you can redistribute it and/or modify | ||
751 | 5 | * it under the terms of the GNU Lesser General Public License as published by | ||
752 | 6 | * the Free Software Foundation; version 3. | ||
753 | 7 | * | ||
754 | 8 | * This program is distributed in the hope that it will be useful, | ||
755 | 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
756 | 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
757 | 11 | * GNU Lesser General Public License for more details. | ||
758 | 12 | * | ||
759 | 13 | * You should have received a copy of the GNU Lesser General Public License | ||
760 | 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
761 | 15 | */ | ||
762 | 16 | |||
763 | 17 | import QtQuick 2.0 | ||
764 | 18 | import Ubuntu.Components 0.1 | ||
765 | 19 | |||
766 | 20 | Item { | ||
767 | 21 | id: template | ||
768 | 22 | |||
769 | 23 | width: units.gu(40) | ||
770 | 24 | height: units.gu(75) | ||
771 | 25 | |||
772 | 26 | default property alias content: layout.children | ||
773 | 27 | property alias spacing: layout.spacing | ||
774 | 28 | property Item tools: null | ||
775 | 29 | property Flickable flickable: flickable | ||
776 | 30 | |||
777 | 31 | Flickable { | ||
778 | 32 | id: flickable | ||
779 | 33 | objectName: "TemplateFlickable" | ||
780 | 34 | anchors.fill: parent | ||
781 | 35 | anchors.topMargin: units.gu(2) | ||
782 | 36 | anchors.bottomMargin: units.gu(2) | ||
783 | 37 | contentHeight: layout.height | ||
784 | 38 | interactive: contentHeight > height | ||
785 | 39 | |||
786 | 40 | Column { | ||
787 | 41 | id: layout | ||
788 | 42 | spacing: units.gu(6) | ||
789 | 43 | anchors.left: parent.left | ||
790 | 44 | anchors.right: parent.right | ||
791 | 45 | anchors.margins: units.gu(2) | ||
792 | 46 | } | ||
793 | 47 | } | ||
794 | 48 | |||
795 | 49 | Scrollbar { | ||
796 | 50 | id: sb | ||
797 | 51 | objectName: "TemplateScrollbar" | ||
798 | 52 | flickableItem: flickable | ||
799 | 53 | property alias interactive: sb.__interactive | ||
800 | 54 | } | ||
801 | 55 | } | ||
802 | 0 | 56 | ||
803 | === added file 'share/qtcreator/ubuntu/devicespage/SectionItem.qml' | |||
804 | --- share/qtcreator/ubuntu/devicespage/SectionItem.qml 1970-01-01 00:00:00 +0000 | |||
805 | +++ share/qtcreator/ubuntu/devicespage/SectionItem.qml 2014-10-08 10:38:58 +0000 | |||
806 | @@ -0,0 +1,58 @@ | |||
807 | 1 | /* | ||
808 | 2 | * Copyright 2013 Canonical Ltd. | ||
809 | 3 | * | ||
810 | 4 | * This program is free software; you can redistribute it and/or modify | ||
811 | 5 | * it under the terms of the GNU Lesser General Public License as published by | ||
812 | 6 | * the Free Software Foundation; version 3. | ||
813 | 7 | * | ||
814 | 8 | * This program is distributed in the hope that it will be useful, | ||
815 | 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
816 | 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
817 | 11 | * GNU Lesser General Public License for more details. | ||
818 | 12 | * | ||
819 | 13 | * You should have received a copy of the GNU Lesser General Public License | ||
820 | 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
821 | 15 | */ | ||
822 | 16 | |||
823 | 17 | import QtQuick 2.0 | ||
824 | 18 | import Ubuntu.Components 0.1 | ||
825 | 19 | import Ubuntu.Components.ListItems 0.1 as ListItem | ||
826 | 20 | |||
827 | 21 | ListItem.Expandable { | ||
828 | 22 | id: expandingColumnItem | ||
829 | 23 | expandedHeight: contentColumn.height + units.gu(1) | ||
830 | 24 | collapsedHeight: headerRow.childrenRect.height | ||
831 | 25 | divider.visible: false | ||
832 | 26 | |||
833 | 27 | property string title | ||
834 | 28 | default property alias data: contentColumn.data | ||
835 | 29 | |||
836 | 30 | onClicked: { | ||
837 | 31 | expanded = !expanded; | ||
838 | 32 | } | ||
839 | 33 | |||
840 | 34 | Column { | ||
841 | 35 | id: contentColumn | ||
842 | 36 | anchors { left: parent.left; right: parent.right } | ||
843 | 37 | Row{ | ||
844 | 38 | id: headerRow | ||
845 | 39 | anchors { left: parent.left; right: parent.right} | ||
846 | 40 | height: childrenRect.height | ||
847 | 41 | Icon { | ||
848 | 42 | name: expandingColumnItem.expanded ? "view-collapse" : "view-expand" | ||
849 | 43 | color: UbuntuColors.orange | ||
850 | 44 | width: 24 | ||
851 | 45 | height: 24 | ||
852 | 46 | } | ||
853 | 47 | Item{ | ||
854 | 48 | width: units.gu(1) | ||
855 | 49 | height: parent.height | ||
856 | 50 | } | ||
857 | 51 | Label { | ||
858 | 52 | id: label | ||
859 | 53 | text: expandingColumnItem.title | ||
860 | 54 | fontSize: "large" | ||
861 | 55 | } | ||
862 | 56 | } | ||
863 | 57 | } | ||
864 | 58 | } | ||
865 | 0 | 59 | ||
866 | === modified file 'src/ubuntu/ubuntu.pro' | |||
867 | --- src/ubuntu/ubuntu.pro 2014-09-30 15:44:15 +0000 | |||
868 | +++ src/ubuntu/ubuntu.pro 2014-10-08 10:38:58 +0000 | |||
869 | @@ -38,16 +38,13 @@ | |||
870 | 38 | $$QML_ROOT/welcome/Link.qml \ | 38 | $$QML_ROOT/welcome/Link.qml \ |
871 | 39 | $$QML_ROOT/welcome/NewsBox.qml\ | 39 | $$QML_ROOT/welcome/NewsBox.qml\ |
872 | 40 | $$QML_ROOT/devicespage/main.qml \ | 40 | $$QML_ROOT/devicespage/main.qml \ |
873 | 41 | $$QML_ROOT/devicespage/DeviceAdvancedTab.qml \ | ||
874 | 42 | $$QML_ROOT/devicespage/DeviceBuilderTab.qml \ | ||
875 | 43 | $$QML_ROOT/devicespage/DeviceLogTab.qml \ | ||
876 | 44 | $$QML_ROOT/devicespage/DevicePage.qml \ | 41 | $$QML_ROOT/devicespage/DevicePage.qml \ |
877 | 45 | $$QML_ROOT/devicespage/DeviceStatusTab.qml \ | 42 | $$QML_ROOT/devicespage/DeviceStatusTab.qml \ |
878 | 46 | $$QML_ROOT/devicespage/FeatureStateItem.qml \ | 43 | $$QML_ROOT/devicespage/FeatureStateItem.qml \ |
879 | 47 | $$QML_ROOT/devicespage/NewEmulatorDialog.qml \ | 44 | $$QML_ROOT/devicespage/NewEmulatorDialog.qml \ |
883 | 48 | $$QML_ROOT/devicespage/LogPage.qml \ | 45 | $$QML_ROOT/devicespage/DeleteEmulatorDialog.qml \ |
884 | 49 | $$QML_ROOT/devicespage/DeviceEmulatorTab.qml \ | 46 | $$QML_ROOT/devicespage/ScrollableView.qml \ |
885 | 50 | $$QML_ROOT/devicespage/DeleteEmulatorDialog.qml | 47 | $$QML_ROOT/devicespage/SectionItem.qml |
886 | 51 | 48 | ||
887 | 52 | OTHER_FILES += \ | 49 | OTHER_FILES += \ |
888 | 53 | UbuntuProject.mimetypes.xml \ | 50 | UbuntuProject.mimetypes.xml \ |
PASSED: Continuous integration, rev:281 jenkins. qa.ubuntu. com/job/ qtcreator- plugin- ubuntu- ci/445/ jenkins. qa.ubuntu. com/job/ qtcreator- plugin- ubuntu- utopic- amd64-ci/ 213 jenkins. qa.ubuntu. com/job/ qtcreator- plugin- ubuntu- utopic- armhf-ci/ 213
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
Click here to trigger a rebuild: s-jenkins. ubuntu- ci:8080/ job/qtcreator- plugin- ubuntu- ci/445/ rebuild
http://