Merge lp:~larryprice/libertine/operation-details into lp:libertine
- operation-details
- Merge into devel
Status: | Merged |
---|---|
Approved by: | Christopher Townsend |
Approved revision: | 246 |
Merged at revision: | 242 |
Proposed branch: | lp:~larryprice/libertine/operation-details |
Merge into: | lp:libertine |
Diff against target: |
625 lines (+202/-71) 9 files modified
libertine/ContainerManager.cpp (+28/-3) libertine/ContainerManager.h (+2/-2) libertine/qml/ContainerInfoView.qml (+52/-2) libertine/qml/ContainerPasswordDialog.qml (+5/-0) libertine/qml/ContainersView.qml (+2/-3) libertine/qml/HomeView.qml (+5/-5) libertine/qml/ManageContainer.qml (+28/-21) libertine/qml/PackageInfoView.qml (+28/-8) libertine/qml/libertine.qml (+52/-27) |
To merge this branch: | bzr merge lp:~larryprice/libertine/operation-details |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Christopher Townsend (community) | Approve | ||
Libertine CI Bot | continuous-integration | Approve | |
Review via email: mp+296937@code.launchpad.net |
Commit message
Show operation details for create container, update container, enable multiarch, install package, and remove package.
Description of the change
Show operation details for create container, update container, enable multiarch, install package, and remove package.
I briefly added "destroy" but there isn't any interesting output and it always seems to be quite fast right now.
Libertine CI Bot (libertine-ci-bot) wrote : | # |
- 244. By Larry Price
-
Show/Hide button should be disabled instead of hidden when no details available
- 245. By Larry Price
-
Try to display error on container creation
Libertine CI Bot (libertine-ci-bot) wrote : | # |
PASSED: Continuous integration, rev:244
https:/
Executed test runs:
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
None: https:/
Click here to trigger a rebuild:
https:/
Libertine CI Bot (libertine-ci-bot) wrote : | # |
PASSED: Continuous integration, rev:245
https:/
Executed test runs:
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
None: https:/
Click here to trigger a rebuild:
https:/
Christopher Townsend (townsend) wrote : | # |
Hmm, the Package Information view still has an active Show/Hide button even when no operation is going on.
Also, when I'm trying to enter the password for creating a container, there is a problem:
libertine/
Let's get these fixed and I'll review again:)
- 246. By Larry Price
-
fix copy-pasta errors
Libertine CI Bot (libertine-ci-bot) wrote : | # |
PASSED: Continuous integration, rev:246
https:/
Executed test runs:
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
None: https:/
Click here to trigger a rebuild:
https:/
Christopher Townsend (townsend) wrote : | # |
Ok, works fine now. Thanks!
Preview Diff
1 | === modified file 'libertine/ContainerManager.cpp' | |||
2 | --- libertine/ContainerManager.cpp 2016-06-07 15:37:12 +0000 | |||
3 | +++ libertine/ContainerManager.cpp 2016-06-10 13:23:18 +0000 | |||
4 | @@ -80,12 +80,20 @@ | |||
5 | 80 | void ContainerManagerWorker:: | 80 | void ContainerManagerWorker:: |
6 | 81 | createContainer(const QString& id, const QString& name, const QString& distro, bool multiarch, const QString& password) | 81 | createContainer(const QString& id, const QString& name, const QString& distro, bool multiarch, const QString& password) |
7 | 82 | { | 82 | { |
8 | 83 | connect(&process_, &QProcess::readyRead, [=](){ | ||
9 | 84 | auto output = process_.readAllStandardOutput(); | ||
10 | 85 | if (!output.isEmpty()) | ||
11 | 86 | { | ||
12 | 87 | emit updateOperationDetails(id, "", output); | ||
13 | 88 | } | ||
14 | 89 | }); | ||
15 | 83 | connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), | 90 | connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), |
16 | 84 | [=](int exitCode, QProcess::ExitStatus){ | 91 | [=](int exitCode, QProcess::ExitStatus){ |
17 | 85 | if (exitCode != 0) | 92 | if (exitCode != 0) |
18 | 86 | { | 93 | { |
19 | 87 | emit error(CONTAINER_CREATE_FAILED.arg(id), process_.readAllStandardError()); | 94 | emit error(CONTAINER_CREATE_FAILED.arg(id), process_.readAllStandardError()); |
20 | 88 | } | 95 | } |
21 | 96 | emit operationFinished(id, ""); | ||
22 | 89 | }); | 97 | }); |
23 | 90 | connect(&process_, &QProcess::started, [=]() { | 98 | connect(&process_, &QProcess::started, [=]() { |
24 | 91 | process_.write(password.toUtf8()); | 99 | process_.write(password.toUtf8()); |
25 | @@ -134,7 +142,7 @@ | |||
26 | 134 | auto output = process_.readAllStandardOutput(); | 142 | auto output = process_.readAllStandardOutput(); |
27 | 135 | if (!output.isEmpty()) | 143 | if (!output.isEmpty()) |
28 | 136 | { | 144 | { |
30 | 137 | emit updatePackageOperationDetails(container_id, package_name, output); | 145 | emit updateOperationDetails(container_id, package_name, output); |
31 | 138 | process_output_ += output; | 146 | process_output_ += output; |
32 | 139 | } | 147 | } |
33 | 140 | }); | 148 | }); |
34 | @@ -145,7 +153,7 @@ | |||
35 | 145 | auto stderr = process_.readAllStandardError(); | 153 | auto stderr = process_.readAllStandardError(); |
36 | 146 | emit error(PACKAGE_INSTALLATION_FAILED.arg(package_name), stderr.isEmpty() ? process_output_ : stderr); | 154 | emit error(PACKAGE_INSTALLATION_FAILED.arg(package_name), stderr.isEmpty() ? process_output_ : stderr); |
37 | 147 | } | 155 | } |
39 | 148 | emit packageOperationFinished(container_id, package_name); | 156 | emit operationFinished(container_id, package_name); |
40 | 149 | }); | 157 | }); |
41 | 150 | 158 | ||
42 | 151 | process_.start(libertine_container_manager_tool, QStringList{"install-package", "-i", container_id, "-p", package_name, "-r"}); | 159 | process_.start(libertine_container_manager_tool, QStringList{"install-package", "-i", container_id, "-p", package_name, "-r"}); |
43 | @@ -159,7 +167,7 @@ | |||
44 | 159 | auto output = process_.readAllStandardOutput(); | 167 | auto output = process_.readAllStandardOutput(); |
45 | 160 | if (!output.isEmpty()) | 168 | if (!output.isEmpty()) |
46 | 161 | { | 169 | { |
48 | 162 | emit updatePackageOperationDetails(container_id, package_name, output); | 170 | emit updateOperationDetails(container_id, package_name, output); |
49 | 163 | process_output_ += output; | 171 | process_output_ += output; |
50 | 164 | } | 172 | } |
51 | 165 | }); | 173 | }); |
52 | @@ -169,6 +177,7 @@ | |||
53 | 169 | { | 177 | { |
54 | 170 | emit error(PACKAGE_INSTALLATION_FAILED.arg(package_name), process_output_.isEmpty() ? process_.readAllStandardError() : process_output_); | 178 | emit error(PACKAGE_INSTALLATION_FAILED.arg(package_name), process_output_.isEmpty() ? process_.readAllStandardError() : process_output_); |
55 | 171 | } | 179 | } |
56 | 180 | emit operationFinished(container_id, package_name); | ||
57 | 172 | }); | 181 | }); |
58 | 173 | 182 | ||
59 | 174 | process_.start(libertine_container_manager_tool, QStringList{"remove-package", "-i", container_id, "-p", package_name, "-r"}); | 183 | process_.start(libertine_container_manager_tool, QStringList{"remove-package", "-i", container_id, "-p", package_name, "-r"}); |
60 | @@ -212,12 +221,20 @@ | |||
61 | 212 | void ContainerManagerWorker:: | 221 | void ContainerManagerWorker:: |
62 | 213 | updateContainer(const QString& container_id, const QString& container_name) | 222 | updateContainer(const QString& container_id, const QString& container_name) |
63 | 214 | { | 223 | { |
64 | 224 | connect(&process_, &QProcess::readyRead, [=](){ | ||
65 | 225 | auto output = process_.readAllStandardOutput(); | ||
66 | 226 | if (!output.isEmpty()) | ||
67 | 227 | { | ||
68 | 228 | emit updateOperationDetails(container_id, "", output); | ||
69 | 229 | } | ||
70 | 230 | }); | ||
71 | 215 | connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), | 231 | connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), |
72 | 216 | [=](int exitCode, QProcess::ExitStatus){ | 232 | [=](int exitCode, QProcess::ExitStatus){ |
73 | 217 | if (exitCode != 0) | 233 | if (exitCode != 0) |
74 | 218 | { | 234 | { |
75 | 219 | emit error(CONTAINER_UPDATE_FAILED.arg(container_name), readAllStdOutOrStdErr(process_)); | 235 | emit error(CONTAINER_UPDATE_FAILED.arg(container_name), readAllStdOutOrStdErr(process_)); |
76 | 220 | } | 236 | } |
77 | 237 | emit operationFinished(container_id, ""); | ||
78 | 221 | }); | 238 | }); |
79 | 222 | 239 | ||
80 | 223 | process_.start(libertine_container_manager_tool, QStringList{"update", "-i", container_id}); | 240 | process_.start(libertine_container_manager_tool, QStringList{"update", "-i", container_id}); |
81 | @@ -246,6 +263,13 @@ | |||
82 | 246 | void ContainerManagerWorker:: | 263 | void ContainerManagerWorker:: |
83 | 247 | configureContainer(const QString& container_id, const QString& container_name, const QStringList& configure_command) | 264 | configureContainer(const QString& container_id, const QString& container_name, const QStringList& configure_command) |
84 | 248 | { | 265 | { |
85 | 266 | connect(&process_, &QProcess::readyRead, [=](){ | ||
86 | 267 | auto output = process_.readAllStandardOutput(); | ||
87 | 268 | if (!output.isEmpty()) | ||
88 | 269 | { | ||
89 | 270 | emit updateOperationDetails(container_id, "", output); | ||
90 | 271 | } | ||
91 | 272 | }); | ||
92 | 249 | connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), | 273 | connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), |
93 | 250 | [=](int exitCode, QProcess::ExitStatus){ | 274 | [=](int exitCode, QProcess::ExitStatus){ |
94 | 251 | if (exitCode != 0) | 275 | if (exitCode != 0) |
95 | @@ -256,6 +280,7 @@ | |||
96 | 256 | { | 280 | { |
97 | 257 | emit finishedConfigure(); | 281 | emit finishedConfigure(); |
98 | 258 | } | 282 | } |
99 | 283 | emit operationFinished(container_id, ""); | ||
100 | 259 | }); | 284 | }); |
101 | 260 | 285 | ||
102 | 261 | QStringList args{"configure", "-i", container_id}; | 286 | QStringList args{"configure", "-i", container_id}; |
103 | 262 | 287 | ||
104 | === modified file 'libertine/ContainerManager.h' | |||
105 | --- libertine/ContainerManager.h 2016-06-07 15:37:12 +0000 | |||
106 | +++ libertine/ContainerManager.h 2016-06-10 13:23:18 +0000 | |||
107 | @@ -66,8 +66,8 @@ | |||
108 | 66 | void finishedSearch(QList<QString> packageList); | 66 | void finishedSearch(QList<QString> packageList); |
109 | 67 | void finishedCommand(QString const& command_output); | 67 | void finishedCommand(QString const& command_output); |
110 | 68 | void finishedConfigure(); | 68 | void finishedConfigure(); |
113 | 69 | void updatePackageOperationDetails(const QString& container_id, const QString& package_name, const QString& details); | 69 | void updateOperationDetails(const QString& container_id, const QString& package_name, const QString& details); |
114 | 70 | void packageOperationFinished(const QString& container_id, const QString& package_name); | 70 | void operationFinished(const QString& container_id, const QString& package_name); |
115 | 71 | 71 | ||
116 | 72 | void error(const QString& short_description, const QString& details); | 72 | void error(const QString& short_description, const QString& details); |
117 | 73 | }; | 73 | }; |
118 | 74 | 74 | ||
119 | === modified file 'libertine/qml/ContainerInfoView.qml' | |||
120 | --- libertine/qml/ContainerInfoView.qml 2016-05-06 21:13:01 +0000 | |||
121 | +++ libertine/qml/ContainerInfoView.qml 2016-06-10 13:23:18 +0000 | |||
122 | @@ -27,14 +27,16 @@ | |||
123 | 27 | id: containerInfoView | 27 | id: containerInfoView |
124 | 28 | header: PageHeader { | 28 | header: PageHeader { |
125 | 29 | id: pageHeader | 29 | id: pageHeader |
127 | 30 | title: i18n.tr("Container information for %1").arg(containerConfigList.getContainerName(mainView.currentContainer)) | 30 | title: i18n.tr("Container information for %1").arg(containerConfigList.getContainerName(currentContainer)) |
128 | 31 | } | 31 | } |
129 | 32 | 32 | ||
131 | 33 | property string currentContainer: mainView.currentContainer | 33 | property string currentContainer: null |
132 | 34 | property string containerDistroText: containerConfigList.getContainerDistro(currentContainer) | 34 | property string containerDistroText: containerConfigList.getContainerDistro(currentContainer) |
133 | 35 | property string containerNameText: containerConfigList.getContainerName(currentContainer) | 35 | property string containerNameText: containerConfigList.getContainerName(currentContainer) |
134 | 36 | property string containerIdText: currentContainer | 36 | property string containerIdText: currentContainer |
135 | 37 | property var statusText: containerConfigList.getContainerStatus(currentContainer) | 37 | property var statusText: containerConfigList.getContainerStatus(currentContainer) |
136 | 38 | property bool showDetails: false | ||
137 | 39 | property string operationDetails: "" | ||
138 | 38 | 40 | ||
139 | 39 | Flickable { | 41 | Flickable { |
140 | 40 | anchors { | 42 | anchors { |
141 | @@ -50,6 +52,7 @@ | |||
142 | 50 | anchors.right: parent.right | 52 | anchors.right: parent.right |
143 | 51 | 53 | ||
144 | 52 | ListItem.Standard { | 54 | ListItem.Standard { |
145 | 55 | id: idView | ||
146 | 53 | text: i18n.tr("ID") | 56 | text: i18n.tr("ID") |
147 | 54 | control: Label { | 57 | control: Label { |
148 | 55 | text: containerIdText | 58 | text: containerIdText |
149 | @@ -57,6 +60,7 @@ | |||
150 | 57 | } | 60 | } |
151 | 58 | 61 | ||
152 | 59 | ListItem.Standard { | 62 | ListItem.Standard { |
153 | 63 | id: nameView | ||
154 | 60 | text: i18n.tr("Name") | 64 | text: i18n.tr("Name") |
155 | 61 | control: Label { | 65 | control: Label { |
156 | 62 | text: containerNameText | 66 | text: containerNameText |
157 | @@ -64,6 +68,7 @@ | |||
158 | 64 | } | 68 | } |
159 | 65 | 69 | ||
160 | 66 | ListItem.Standard { | 70 | ListItem.Standard { |
161 | 71 | id: distroView | ||
162 | 67 | text: i18n.tr("Distribution") | 72 | text: i18n.tr("Distribution") |
163 | 68 | control: Label { | 73 | control: Label { |
164 | 69 | text: containerDistroText | 74 | text: containerDistroText |
165 | @@ -71,22 +76,67 @@ | |||
166 | 71 | } | 76 | } |
167 | 72 | 77 | ||
168 | 73 | ListItem.Standard { | 78 | ListItem.Standard { |
169 | 79 | id: statusView | ||
170 | 74 | text: i18n.tr("Status") | 80 | text: i18n.tr("Status") |
171 | 75 | control: Label { | 81 | control: Label { |
172 | 76 | text: statusText | 82 | text: statusText |
173 | 77 | } | 83 | } |
174 | 78 | } | 84 | } |
175 | 85 | |||
176 | 86 | ListItem.Standard { | ||
177 | 87 | id: showDetailsView | ||
178 | 88 | control: Button { | ||
179 | 89 | text: enabled ? | ||
180 | 90 | showDetails ? i18n.tr('Hide') : i18n.tr('Show') | ||
181 | 91 | : i18n.tr('None') | ||
182 | 92 | enabled: operationDetails != "" | ||
183 | 93 | onClicked: { | ||
184 | 94 | showDetails = !showDetails | ||
185 | 95 | } | ||
186 | 96 | } | ||
187 | 97 | text: i18n.tr("Operation details") | ||
188 | 98 | } | ||
189 | 99 | |||
190 | 100 | TextArea { | ||
191 | 101 | id: operationDetailsView | ||
192 | 102 | visible: showDetails | ||
193 | 103 | anchors.left: parent.left | ||
194 | 104 | anchors.right: parent.right | ||
195 | 105 | height: Math.max(containerInfoView.height - pageHeader.height - idView.height - nameView.height - distroView.height | ||
196 | 106 | - statusView.height - showDetailsView.height, | ||
197 | 107 | units.gu(35)) | ||
198 | 108 | readOnly: true | ||
199 | 109 | text: operationDetails | ||
200 | 110 | } | ||
201 | 79 | } | 111 | } |
202 | 80 | } | 112 | } |
203 | 81 | 113 | ||
204 | 82 | Component.onCompleted: { | 114 | Component.onCompleted: { |
205 | 83 | containerConfigList.configChanged.connect(reloadStatus) | 115 | containerConfigList.configChanged.connect(reloadStatus) |
206 | 116 | |||
207 | 117 | var worker = Qt.createComponent("ContainerManager.qml").createObject(mainView) | ||
208 | 118 | |||
209 | 119 | operationDetails = mainView.getOperationDetails(currentContainer) | ||
210 | 120 | operationDetailsView.cursorPosition = operationDetailsView.length | ||
211 | 121 | if (operationDetails != "") { | ||
212 | 122 | showDetails = !showDetails | ||
213 | 123 | } | ||
214 | 124 | |||
215 | 125 | mainView.operationDetailsUpdated.connect(updateDetails) | ||
216 | 84 | } | 126 | } |
217 | 85 | 127 | ||
218 | 86 | Component.onDestruction: { | 128 | Component.onDestruction: { |
219 | 129 | mainView.operationDetailsUpdated.disconnect(updateDetails) | ||
220 | 87 | containerConfigList.configChanged.disconnect(reloadStatus) | 130 | containerConfigList.configChanged.disconnect(reloadStatus) |
221 | 88 | } | 131 | } |
222 | 89 | 132 | ||
223 | 133 | function updateDetails(container_id, package_name, details) { | ||
224 | 134 | if (container_id === currentContainer && package_name === "") { | ||
225 | 135 | operationDetails += details | ||
226 | 136 | operationDetailsView.cursorPosition = operationDetailsView.length | ||
227 | 137 | } | ||
228 | 138 | } | ||
229 | 139 | |||
230 | 90 | function reloadStatus() { | 140 | function reloadStatus() { |
231 | 91 | statusText = containerConfigList.getContainerStatus(currentContainer) | 141 | statusText = containerConfigList.getContainerStatus(currentContainer) |
232 | 92 | if (!statusText) { | 142 | if (!statusText) { |
233 | 93 | 143 | ||
234 | === modified file 'libertine/qml/ContainerPasswordDialog.qml' | |||
235 | --- libertine/qml/ContainerPasswordDialog.qml 2016-05-19 17:56:43 +0000 | |||
236 | +++ libertine/qml/ContainerPasswordDialog.qml 2016-06-10 13:23:18 +0000 | |||
237 | @@ -87,6 +87,11 @@ | |||
238 | 87 | var container_id = containerConfigList.addNewContainer("lxc", containerName) | 87 | var container_id = containerConfigList.addNewContainer("lxc", containerName) |
239 | 88 | var comp = Qt.createComponent("ContainerManager.qml") | 88 | var comp = Qt.createComponent("ContainerManager.qml") |
240 | 89 | var worker = comp.createObject(mainView) | 89 | var worker = comp.createObject(mainView) |
241 | 90 | |||
242 | 91 | worker.updateOperationDetails.connect(mainView.updateOperationDetails) | ||
243 | 92 | worker.operationFinished.connect(mainView.resetOperationDetails) | ||
244 | 93 | worker.error.connect(mainView.error) | ||
245 | 94 | |||
246 | 90 | worker.createContainer(container_id, containerConfigList.getContainerName(container_id), | 95 | worker.createContainer(container_id, containerConfigList.getContainerName(container_id), |
247 | 91 | containerConfigList.getContainerDistro(container_id), enableMultiarch, password) | 96 | containerConfigList.getContainerDistro(container_id), enableMultiarch, password) |
248 | 92 | } | 97 | } |
249 | 93 | 98 | ||
250 | === modified file 'libertine/qml/ContainersView.qml' | |||
251 | --- libertine/qml/ContainersView.qml 2016-05-19 17:56:43 +0000 | |||
252 | +++ libertine/qml/ContainersView.qml 2016-06-10 13:23:18 +0000 | |||
253 | @@ -92,8 +92,7 @@ | |||
254 | 92 | text: i18n.tr("delete") | 92 | text: i18n.tr("delete") |
255 | 93 | description: i18n.tr("Delete Container") | 93 | description: i18n.tr("Delete Container") |
256 | 94 | onTriggered: { | 94 | onTriggered: { |
259 | 95 | var comp = Qt.createComponent("ContainerManager.qml") | 95 | var worker = Qt.createComponent("ContainerManager.qml").createObject(mainView) |
258 | 96 | var worker = comp.createObject(mainView) | ||
260 | 97 | worker.destroyContainer(containerId) | 96 | worker.destroyContainer(containerId) |
261 | 98 | mainView.currentContainer = containerId | 97 | mainView.currentContainer = containerId |
262 | 99 | } | 98 | } |
263 | @@ -109,7 +108,7 @@ | |||
264 | 109 | description: i18n.tr("Container Info") | 108 | description: i18n.tr("Container Info") |
265 | 110 | onTriggered: { | 109 | onTriggered: { |
266 | 111 | mainView.currentContainer = containerId | 110 | mainView.currentContainer = containerId |
268 | 112 | pageStack.push(Qt.resolvedUrl("ContainerInfoView.qml")) | 111 | pageStack.push(Qt.resolvedUrl("ContainerInfoView.qml"), {currentContainer: containerId}) |
269 | 113 | } | 112 | } |
270 | 114 | }, | 113 | }, |
271 | 115 | Action { | 114 | Action { |
272 | 116 | 115 | ||
273 | === modified file 'libertine/qml/HomeView.qml' | |||
274 | --- libertine/qml/HomeView.qml 2016-05-19 18:49:06 +0000 | |||
275 | +++ libertine/qml/HomeView.qml 2016-06-10 13:23:18 +0000 | |||
276 | @@ -39,7 +39,7 @@ | |||
277 | 39 | } | 39 | } |
278 | 40 | ] | 40 | ] |
279 | 41 | } | 41 | } |
281 | 42 | property var currentContainer: null | 42 | property string currentContainer: null |
282 | 43 | 43 | ||
283 | 44 | Component { | 44 | Component { |
284 | 45 | id: enterPackagePopup | 45 | id: enterPackagePopup |
285 | @@ -103,13 +103,13 @@ | |||
286 | 103 | Action { | 103 | Action { |
287 | 104 | text: i18n.tr("Manage Container") | 104 | text: i18n.tr("Manage Container") |
288 | 105 | onTriggered: { | 105 | onTriggered: { |
290 | 106 | pageStack.push(Qt.resolvedUrl("ManageContainer.qml")) | 106 | pageStack.push(Qt.resolvedUrl("ManageContainer.qml"), {currentContainer: currentContainer}) |
291 | 107 | } | 107 | } |
292 | 108 | } | 108 | } |
293 | 109 | Action { | 109 | Action { |
294 | 110 | text: i18n.tr("Container Information") | 110 | text: i18n.tr("Container Information") |
295 | 111 | onTriggered: { | 111 | onTriggered: { |
297 | 112 | pageStack.push(Qt.resolvedUrl("ContainerInfoView.qml")) | 112 | pageStack.push(Qt.resolvedUrl("ContainerInfoView.qml"), {currentContainer: currentContainer}) |
298 | 113 | } | 113 | } |
299 | 114 | } | 114 | } |
300 | 115 | Action { | 115 | Action { |
301 | @@ -244,9 +244,9 @@ | |||
302 | 244 | var comp = Qt.createComponent("ContainerManager.qml") | 244 | var comp = Qt.createComponent("ContainerManager.qml") |
303 | 245 | var worker = comp.createObject(mainView) | 245 | var worker = comp.createObject(mainView) |
304 | 246 | worker.error.connect(mainView.error) | 246 | worker.error.connect(mainView.error) |
306 | 247 | worker.updatePackageOperationDetails.connect(mainView.updatePackageOperationDetails) | 247 | worker.updateOperationDetails.connect(mainView.updateOperationDetails) |
307 | 248 | mainView.packageOperationInteraction.connect(worker.packageOperationInteraction) | 248 | mainView.packageOperationInteraction.connect(worker.packageOperationInteraction) |
309 | 249 | worker.packageOperationFinished.connect(mainView.resetPackageDetails) | 249 | worker.operationFinished.connect(mainView.resetOperationDetails) |
310 | 250 | return worker | 250 | return worker |
311 | 251 | } | 251 | } |
312 | 252 | 252 | ||
313 | 253 | 253 | ||
314 | === modified file 'libertine/qml/ManageContainer.qml' | |||
315 | --- libertine/qml/ManageContainer.qml 2016-06-07 18:23:48 +0000 | |||
316 | +++ libertine/qml/ManageContainer.qml 2016-06-10 13:23:18 +0000 | |||
317 | @@ -26,10 +26,11 @@ | |||
318 | 26 | id: manageView | 26 | id: manageView |
319 | 27 | header: PageHeader { | 27 | header: PageHeader { |
320 | 28 | id: pageHeader | 28 | id: pageHeader |
322 | 29 | title: i18n.tr("Manage %1").arg(containerConfigList.getContainerName(mainView.currentContainer)) | 29 | title: i18n.tr("Manage %1").arg(containerConfigList.getContainerName(currentContainer)) |
323 | 30 | } | 30 | } |
324 | 31 | property bool isDefaultContainer: null | 31 | property bool isDefaultContainer: null |
325 | 32 | property bool isMultiarchEnabled: null | 32 | property bool isMultiarchEnabled: null |
326 | 33 | property string currentContainer: null | ||
327 | 33 | 34 | ||
328 | 34 | Flickable { | 35 | Flickable { |
329 | 35 | anchors { | 36 | anchors { |
330 | @@ -49,16 +50,19 @@ | |||
331 | 49 | control: CheckBox { | 50 | control: CheckBox { |
332 | 50 | checked: isMultiarchEnabled | 51 | checked: isMultiarchEnabled |
333 | 51 | onClicked: { | 52 | onClicked: { |
335 | 52 | var comp = Qt.createComponent("ContainerManager.qml") | 53 | var worker = Qt.createComponent("ContainerManager.qml").createObject(mainView) |
336 | 54 | |||
337 | 55 | worker.updateOperationDetails.connect(mainView.updateOperationDetails) | ||
338 | 56 | worker.operationFinished.connect(mainView.resetOperationDetails) | ||
339 | 57 | |||
340 | 53 | if (checked) { | 58 | if (checked) { |
349 | 54 | comp.createObject(mainView).configureContainer(mainView.currentContainer, | 59 | worker.configureContainer(currentContainer, |
350 | 55 | containerConfigList.getContainerName(mainView.currentContainer), | 60 | containerConfigList.getContainerName(currentContainer), |
351 | 56 | ["--multiarch", "enable"]) | 61 | ["--multiarch", "enable"]) |
352 | 57 | } | 62 | } else { |
353 | 58 | else { | 63 | worker.configureContainer(currentContainer, |
354 | 59 | comp.createObject(mainView).configureContainer(mainView.currentContainer, | 64 | containerConfigList.getContainerName(currentContainer), |
355 | 60 | containerConfigList.getContainerName(mainView.currentContainer), | 65 | ["--multiarch", "disable"]) |
348 | 61 | ["--multiarch", "disable"]) | ||
356 | 62 | } | 66 | } |
357 | 63 | } | 67 | } |
358 | 64 | } | 68 | } |
359 | @@ -69,7 +73,7 @@ | |||
360 | 69 | text: i18n.tr("Additional archives and PPAs") | 73 | text: i18n.tr("Additional archives and PPAs") |
361 | 70 | progression: true | 74 | progression: true |
362 | 71 | onClicked: { | 75 | onClicked: { |
364 | 72 | containerArchivesList.setContainerArchives(mainView.currentContainer) | 76 | containerArchivesList.setContainerArchives(currentContainer) |
365 | 73 | pageStack.push(Qt.resolvedUrl("ExtraArchivesView.qml")) | 77 | pageStack.push(Qt.resolvedUrl("ExtraArchivesView.qml")) |
366 | 74 | } | 78 | } |
367 | 75 | } | 79 | } |
368 | @@ -78,7 +82,7 @@ | |||
369 | 78 | control: Button { | 82 | control: Button { |
370 | 79 | id: updateButton | 83 | id: updateButton |
371 | 80 | text: i18n.tr("Update…") | 84 | text: i18n.tr("Update…") |
373 | 81 | visible: (containerConfigList.getContainerStatus(mainView.currentContainer) === i18n.tr("ready")) ? true : false | 85 | visible: (containerConfigList.getContainerStatus(currentContainer) === i18n.tr("ready")) ? true : false |
374 | 82 | onClicked: { | 86 | onClicked: { |
375 | 83 | updateContainer() | 87 | updateContainer() |
376 | 84 | } | 88 | } |
377 | @@ -90,7 +94,7 @@ | |||
378 | 90 | right: parent.right | 94 | right: parent.right |
379 | 91 | rightMargin: units.gu(2) | 95 | rightMargin: units.gu(2) |
380 | 92 | } | 96 | } |
382 | 93 | visible: (containerConfigList.getContainerStatus(mainView.currentContainer) === i18n.tr("updating")) ? true : false | 97 | visible: (containerConfigList.getContainerStatus(currentContainer) === i18n.tr("updating")) ? true : false |
383 | 94 | running: updateActivity.visible | 98 | running: updateActivity.visible |
384 | 95 | } | 99 | } |
385 | 96 | text: i18n.tr("Update container") | 100 | text: i18n.tr("Update container") |
386 | @@ -107,7 +111,7 @@ | |||
387 | 107 | worker.error.connect(function() { | 111 | worker.error.connect(function() { |
388 | 108 | checked = fallback | 112 | checked = fallback |
389 | 109 | }) | 113 | }) |
391 | 110 | worker.setDefaultContainer(mainView.currentContainer, !checked) | 114 | worker.setDefaultContainer(currentContainer, !checked) |
392 | 111 | } | 115 | } |
393 | 112 | } | 116 | } |
394 | 113 | text: i18n.tr("Default container") | 117 | text: i18n.tr("Default container") |
395 | @@ -125,24 +129,27 @@ | |||
396 | 125 | } | 129 | } |
397 | 126 | 130 | ||
398 | 127 | function updateContainer() { | 131 | function updateContainer() { |
401 | 128 | var comp = Qt.createComponent("ContainerManager.qml") | 132 | var worker = Qt.createComponent("ContainerManager.qml").createObject(mainView) |
400 | 129 | var worker = comp.createObject(mainView) | ||
402 | 130 | worker.error.connect(mainView.error); | 133 | worker.error.connect(mainView.error); |
404 | 131 | worker.updateContainer(mainView.currentContainer, containerConfigList.getContainerName(mainView.currentContainer)) | 134 | |
405 | 135 | worker.updateOperationDetails.connect(mainView.updateOperationDetails) | ||
406 | 136 | worker.operationFinished.connect(mainView.resetOperationDetails) | ||
407 | 137 | |||
408 | 138 | worker.updateContainer(currentContainer, containerConfigList.getContainerName(currentContainer)) | ||
409 | 132 | } | 139 | } |
410 | 133 | 140 | ||
411 | 134 | function updateContainerInfo() { | 141 | function updateContainerInfo() { |
412 | 135 | updateStatus() | 142 | updateStatus() |
415 | 136 | isDefaultContainer = containerConfigList.defaultContainerId === mainView.currentContainer | 143 | isDefaultContainer = containerConfigList.defaultContainerId === currentContainer |
416 | 137 | isMultiarchEnabled = containerConfigList.getContainerMultiarchSupport(mainView.currentContainer) === 'enabled' | 144 | isMultiarchEnabled = containerConfigList.getContainerMultiarchSupport(currentContainer) === 'enabled' |
417 | 138 | } | 145 | } |
418 | 139 | 146 | ||
419 | 140 | function updateStatus() { | 147 | function updateStatus() { |
421 | 141 | if (containerConfigList.getContainerStatus(mainView.currentContainer) === i18n.tr("updating")) { | 148 | if (containerConfigList.getContainerStatus(currentContainer) === i18n.tr("updating")) { |
422 | 142 | updateButton.visible = false | 149 | updateButton.visible = false |
423 | 143 | updateActivity.visible = true | 150 | updateActivity.visible = true |
424 | 144 | } | 151 | } |
426 | 145 | else if (containerConfigList.getContainerStatus(mainView.currentContainer) === i18n.tr("ready")) { | 152 | else if (containerConfigList.getContainerStatus(currentContainer) === i18n.tr("ready")) { |
427 | 146 | updateButton.visible = true | 153 | updateButton.visible = true |
428 | 147 | updateActivity.visible = false | 154 | updateActivity.visible = false |
429 | 148 | } | 155 | } |
430 | 149 | 156 | ||
431 | === modified file 'libertine/qml/PackageInfoView.qml' | |||
432 | --- libertine/qml/PackageInfoView.qml 2016-06-07 17:48:12 +0000 | |||
433 | +++ libertine/qml/PackageInfoView.qml 2016-06-10 13:23:18 +0000 | |||
434 | @@ -35,6 +35,7 @@ | |||
435 | 35 | property var packageVersionText: i18n.tr("Obtaining package version…") | 35 | property var packageVersionText: i18n.tr("Obtaining package version…") |
436 | 36 | property string packageOperationDetails: "" | 36 | property string packageOperationDetails: "" |
437 | 37 | property var worker: null | 37 | property var worker: null |
438 | 38 | property bool showDetails: false | ||
439 | 38 | 39 | ||
440 | 39 | signal sendOperationInteraction(string text) | 40 | signal sendOperationInteraction(string text) |
441 | 40 | 41 | ||
442 | @@ -70,18 +71,33 @@ | |||
443 | 70 | } | 71 | } |
444 | 71 | } | 72 | } |
445 | 72 | 73 | ||
446 | 74 | ListItem.Standard { | ||
447 | 75 | id: showDetailsView | ||
448 | 76 | control: Button { | ||
449 | 77 | text: enabled ? | ||
450 | 78 | showDetails ? i18n.tr('Hide') : i18n.tr('Show') | ||
451 | 79 | : i18n.tr('None') | ||
452 | 80 | enabled: packageOperationDetails != "" | ||
453 | 81 | onClicked: { | ||
454 | 82 | showDetails = !showDetails | ||
455 | 83 | } | ||
456 | 84 | } | ||
457 | 85 | text: i18n.tr("Operation details") | ||
458 | 86 | } | ||
459 | 87 | |||
460 | 73 | TextArea { | 88 | TextArea { |
461 | 74 | id: packageDetailsView | 89 | id: packageDetailsView |
463 | 75 | visible: text !== "" | 90 | visible: showDetails |
464 | 76 | anchors.left: parent.left | 91 | anchors.left: parent.left |
465 | 77 | anchors.right: parent.right | 92 | anchors.right: parent.right |
467 | 78 | height: Math.max(packageInfoView.height - pageHeader.height - packageListItem.height - statusListItem.height - 35, units.gu(35)) | 93 | height: Math.max(packageInfoView.height - pageHeader.height - packageListItem.height - showDetailsView.height - statusListItem.height - 35, units.gu(35)) |
468 | 79 | readOnly: true | 94 | readOnly: true |
469 | 80 | text: packageOperationDetails | 95 | text: packageOperationDetails |
470 | 81 | } | 96 | } |
471 | 82 | 97 | ||
472 | 83 | TextField { | 98 | TextField { |
474 | 84 | visible: packageDetailsView.visible && (statusText === "installing" || statusText === "removing") | 99 | id: packageInputField |
475 | 100 | visible: showDetails && (statusText === "installing" || statusText === "removing") | ||
476 | 85 | anchors.left: parent.left | 101 | anchors.left: parent.left |
477 | 86 | anchors.right: parent.right | 102 | anchors.right: parent.right |
478 | 87 | text: "" | 103 | text: "" |
479 | @@ -99,20 +115,22 @@ | |||
480 | 99 | var worker = Qt.createComponent("ContainerManager.qml").createObject(mainView) | 115 | var worker = Qt.createComponent("ContainerManager.qml").createObject(mainView) |
481 | 100 | worker.finishedCommand.connect(getPackageVersion) | 116 | worker.finishedCommand.connect(getPackageVersion) |
482 | 101 | 117 | ||
484 | 102 | packageOperationDetails = mainView.getPackageOperationDetails(currentContainer, currentPackage) | 118 | packageOperationDetails = mainView.getOperationDetails(currentContainer, currentPackage) |
485 | 103 | packageDetailsView.cursorPosition = packageDetailsView.length | 119 | packageDetailsView.cursorPosition = packageDetailsView.length |
486 | 120 | if (packageOperationDetails != "") { | ||
487 | 121 | showDetails = !showDetails | ||
488 | 122 | } | ||
489 | 104 | 123 | ||
491 | 105 | mainView.updatePackageDetails.connect(updatePackageDetails) | 124 | mainView.operationDetailsUpdated.connect(updatePackageDetails) |
492 | 106 | sendOperationInteraction.connect(mainView.packageOperationInteraction) | 125 | sendOperationInteraction.connect(mainView.packageOperationInteraction) |
493 | 107 | 126 | ||
494 | 108 | worker.error.connect(mainView.error) | ||
495 | 109 | worker.error.connect(onError) | 127 | worker.error.connect(onError) |
496 | 110 | worker.runCommand(currentContainer, containerConfigList.getContainerName(currentContainer), command) | 128 | worker.runCommand(currentContainer, containerConfigList.getContainerName(currentContainer), command) |
497 | 111 | } | 129 | } |
498 | 112 | 130 | ||
499 | 113 | Component.onDestruction: { | 131 | Component.onDestruction: { |
500 | 114 | containerConfigList.configChanged.disconnect(reloadStatus) | 132 | containerConfigList.configChanged.disconnect(reloadStatus) |
502 | 115 | mainView.updatePackageDetails.disconnect(updatePackageDetails) | 133 | mainView.operationDetailsUpdated.disconnect(updatePackageDetails) |
503 | 116 | sendOperationInteraction.disconnect(mainView.packageOperationInteraction) | 134 | sendOperationInteraction.disconnect(mainView.packageOperationInteraction) |
504 | 117 | } | 135 | } |
505 | 118 | 136 | ||
506 | @@ -132,7 +150,9 @@ | |||
507 | 132 | } | 150 | } |
508 | 133 | 151 | ||
509 | 134 | function getPackageVersion(command_output) { | 152 | function getPackageVersion(command_output) { |
511 | 135 | packageVersionText = containerConfigList.getAppVersion(command_output, statusText === "installed") | 153 | if (packageInfoView) { |
512 | 154 | packageVersionText = containerConfigList.getAppVersion(command_output, statusText === "installed") | ||
513 | 155 | } | ||
514 | 136 | } | 156 | } |
515 | 137 | 157 | ||
516 | 138 | function onError() { | 158 | function onError() { |
517 | 139 | 159 | ||
518 | === modified file 'libertine/qml/libertine.qml' | |||
519 | --- libertine/qml/libertine.qml 2016-06-02 18:02:50 +0000 | |||
520 | +++ libertine/qml/libertine.qml 2016-06-10 13:23:18 +0000 | |||
521 | @@ -29,10 +29,10 @@ | |||
522 | 29 | width: units.gu(90) | 29 | width: units.gu(90) |
523 | 30 | height: units.gu(75) | 30 | height: units.gu(75) |
524 | 31 | property var currentContainer: undefined | 31 | property var currentContainer: undefined |
526 | 32 | property var packageOperationDetails: undefined | 32 | property var operationDetails: undefined |
527 | 33 | 33 | ||
528 | 34 | signal error(string short_description, string details) | 34 | signal error(string short_description, string details) |
530 | 35 | signal updatePackageDetails(string container_id, string package_name, string details) | 35 | signal operationDetailsUpdated(string container_id, string package_name, string details) |
531 | 36 | signal packageOperationInteraction(string data) | 36 | signal packageOperationInteraction(string data) |
532 | 37 | 37 | ||
533 | 38 | PageStack { | 38 | PageStack { |
534 | @@ -48,7 +48,7 @@ | |||
535 | 48 | pageStack.push(Qt.resolvedUrl("ContainersView.qml")) | 48 | pageStack.push(Qt.resolvedUrl("ContainersView.qml")) |
536 | 49 | if (mainView.currentContainer) { | 49 | if (mainView.currentContainer) { |
537 | 50 | containerAppsList.setContainerApps(mainView.currentContainer) | 50 | containerAppsList.setContainerApps(mainView.currentContainer) |
539 | 51 | pageStack.push(Qt.resolvedUrl("HomeView.qml"), {"currentContainer": mainView.currentContainer}) | 51 | pageStack.push(Qt.resolvedUrl("HomeView.qml"), {currentContainer: mainView.currentContainer}) |
540 | 52 | } | 52 | } |
541 | 53 | } | 53 | } |
542 | 54 | else { | 54 | else { |
543 | @@ -61,33 +61,58 @@ | |||
544 | 61 | {"short_description": short_description, "details": details}) | 61 | {"short_description": short_description, "details": details}) |
545 | 62 | } | 62 | } |
546 | 63 | 63 | ||
548 | 64 | function updatePackageOperationDetails(container_id, package_name, details) { | 64 | function initializeDetails(container_id, package_name) { |
549 | 65 | if (!operationDetails) { | ||
550 | 66 | operationDetails = {} | ||
551 | 67 | } | ||
552 | 68 | if (!operationDetails[container_id]) { | ||
553 | 69 | operationDetails[container_id] = {packages: {}, details: ""} | ||
554 | 70 | } | ||
555 | 71 | if (!operationDetails[container_id].details) { | ||
556 | 72 | operationDetails[container_id].details = "" | ||
557 | 73 | } | ||
558 | 74 | if (package_name && !operationDetails[container_id].packages[package_name]) { | ||
559 | 75 | operationDetails[container_id].packages[package_name] = "" | ||
560 | 76 | } | ||
561 | 77 | } | ||
562 | 78 | |||
563 | 79 | function updateOperationDetails(container_id, package_name, details) { | ||
564 | 65 | if (!mainView) { | 80 | if (!mainView) { |
565 | 66 | return | 81 | return |
566 | 67 | } | 82 | } |
590 | 68 | if (!packageOperationDetails) { | 83 | |
591 | 69 | packageOperationDetails = {} | 84 | initializeDetails(container_id, package_name) |
592 | 70 | } | 85 | |
593 | 71 | if (!packageOperationDetails[container_id]) { | 86 | if (package_name) { |
594 | 72 | packageOperationDetails[container_id] = {} | 87 | operationDetails[container_id].packages[package_name] += details |
595 | 73 | } | 88 | } else { |
596 | 74 | if (!packageOperationDetails[container_id][package_name]) { | 89 | operationDetails[container_id].details += details |
597 | 75 | packageOperationDetails[container_id][package_name] = "" | 90 | } |
598 | 76 | } | 91 | |
599 | 77 | packageOperationDetails[container_id][package_name] += details | 92 | operationDetailsUpdated(container_id, package_name, details) |
600 | 78 | 93 | } | |
601 | 79 | updatePackageDetails(container_id, package_name, details) | 94 | |
602 | 80 | } | 95 | function resetOperationDetails(container_id, package_name) { |
603 | 81 | 96 | if (mainView && operationDetails && operationDetails[container_id]) { | |
604 | 82 | function resetPackageDetails(container_id, package_name) { | 97 | if (package_name) { |
605 | 83 | if (mainView && packageOperationDetails && packageOperationDetails[container_id] && packageOperationDetails[container_id][package_name]) { | 98 | if (operationDetails[container_id].packages[package_name]) { |
606 | 84 | delete packageOperationDetails[container_id][package_name] | 99 | delete operationDetails[container_id].packages[package_name] |
607 | 85 | } | 100 | } |
608 | 86 | } | 101 | } else { |
609 | 87 | 102 | delete operationDetails[container_id].details | |
610 | 88 | function getPackageOperationDetails(container_id, package_name) { | 103 | } |
611 | 89 | if (packageOperationDetails && packageOperationDetails[container_id] && packageOperationDetails[container_id][package_name]) { | 104 | } |
612 | 90 | return packageOperationDetails[container_id][package_name] | 105 | } |
613 | 106 | |||
614 | 107 | function getOperationDetails(container_id, package_name) { | ||
615 | 108 | if (operationDetails && operationDetails[container_id]) { | ||
616 | 109 | if (package_name) { | ||
617 | 110 | if (operationDetails[container_id].packages[package_name]) { | ||
618 | 111 | return operationDetails[container_id].packages[package_name] | ||
619 | 112 | } | ||
620 | 113 | } else if (operationDetails[container_id].details) { | ||
621 | 114 | return operationDetails[container_id].details | ||
622 | 115 | } | ||
623 | 91 | } | 116 | } |
624 | 92 | return "" | 117 | return "" |
625 | 93 | } | 118 | } |
PASSED: Continuous integration, rev:243 /jenkins. canonical. com/libertine/ job/libertine- ci-verify- mp/252/ /jenkins. canonical. com/libertine/ job/generic- ci-generate- dsc/255 /jenkins. canonical. com/libertine/ job/libertine- ci-build- and-test- dsc/architectur e=amd64, distribution= vivid,label_ exp=jenkins- slave-0% 20%7C%7C% 20jenkins- slave-2/ 214 /jenkins. canonical. com/libertine/ job/libertine- ci-build- and-test- dsc/architectur e=amd64, distribution= xenial, label_exp= jenkins- slave-0% 20%7C%7C% 20jenkins- slave-2/ 214 /jenkins. canonical. com/libertine/ job/libertine- ci-build- and-test- dsc/architectur e=i386, distribution= vivid,label_ exp=jenkins- slave-0% 20%7C%7C% 20jenkins- slave-2/ 214 /jenkins. canonical. com/libertine/ job/libertine- ci-build- and-test- dsc/architectur e=i386, distribution= xenial, label_exp= jenkins- slave-0% 20%7C%7C% 20jenkins- slave-2/ 214 /jenkins. canonical. com/libertine/ job/libertine- ci-update- mp/1150/ console
https:/
Executed test runs:
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
None: https:/
Click here to trigger a rebuild: /jenkins. canonical. com/libertine/ job/libertine- ci-verify- mp/252/ rebuild
https:/