Merge lp:~larryprice/libertine/operation-details into lp:libertine

Proposed by Larry Price
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
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.

To post a comment you must log in.
Revision history for this message
Libertine CI Bot (libertine-ci-bot) wrote :
review: Approve (continuous-integration)
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

Revision history for this message
Libertine CI Bot (libertine-ci-bot) wrote :
review: Approve (continuous-integration)
Revision history for this message
Libertine CI Bot (libertine-ci-bot) wrote :
review: Approve (continuous-integration)
Revision history for this message
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/qml/ContainerPasswordDialog.qml:93: ReferenceError: mainview is not defined

Let's get these fixed and I'll review again:)

review: Needs Fixing
246. By Larry Price

fix copy-pasta errors

Revision history for this message
Libertine CI Bot (libertine-ci-bot) wrote :
review: Approve (continuous-integration)
Revision history for this message
Christopher Townsend (townsend) wrote :

Ok, works fine now. Thanks!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'libertine/ContainerManager.cpp'
--- libertine/ContainerManager.cpp 2016-06-07 15:37:12 +0000
+++ libertine/ContainerManager.cpp 2016-06-10 13:23:18 +0000
@@ -80,12 +80,20 @@
80void ContainerManagerWorker::80void ContainerManagerWorker::
81createContainer(const QString& id, const QString& name, const QString& distro, bool multiarch, const QString& password)81createContainer(const QString& id, const QString& name, const QString& distro, bool multiarch, const QString& password)
82{82{
83 connect(&process_, &QProcess::readyRead, [=](){
84 auto output = process_.readAllStandardOutput();
85 if (!output.isEmpty())
86 {
87 emit updateOperationDetails(id, "", output);
88 }
89 });
83 connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),90 connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
84 [=](int exitCode, QProcess::ExitStatus){91 [=](int exitCode, QProcess::ExitStatus){
85 if (exitCode != 0)92 if (exitCode != 0)
86 {93 {
87 emit error(CONTAINER_CREATE_FAILED.arg(id), process_.readAllStandardError());94 emit error(CONTAINER_CREATE_FAILED.arg(id), process_.readAllStandardError());
88 }95 }
96 emit operationFinished(id, "");
89 });97 });
90 connect(&process_, &QProcess::started, [=]() {98 connect(&process_, &QProcess::started, [=]() {
91 process_.write(password.toUtf8());99 process_.write(password.toUtf8());
@@ -134,7 +142,7 @@
134 auto output = process_.readAllStandardOutput();142 auto output = process_.readAllStandardOutput();
135 if (!output.isEmpty())143 if (!output.isEmpty())
136 {144 {
137 emit updatePackageOperationDetails(container_id, package_name, output);145 emit updateOperationDetails(container_id, package_name, output);
138 process_output_ += output;146 process_output_ += output;
139 }147 }
140 });148 });
@@ -145,7 +153,7 @@
145 auto stderr = process_.readAllStandardError();153 auto stderr = process_.readAllStandardError();
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);
147 }155 }
148 emit packageOperationFinished(container_id, package_name);156 emit operationFinished(container_id, package_name);
149 });157 });
150158
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"});
@@ -159,7 +167,7 @@
159 auto output = process_.readAllStandardOutput();167 auto output = process_.readAllStandardOutput();
160 if (!output.isEmpty())168 if (!output.isEmpty())
161 {169 {
162 emit updatePackageOperationDetails(container_id, package_name, output);170 emit updateOperationDetails(container_id, package_name, output);
163 process_output_ += output;171 process_output_ += output;
164 }172 }
165 });173 });
@@ -169,6 +177,7 @@
169 {177 {
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_);
171 }179 }
180 emit operationFinished(container_id, package_name);
172 });181 });
173182
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"});
@@ -212,12 +221,20 @@
212void ContainerManagerWorker::221void ContainerManagerWorker::
213updateContainer(const QString& container_id, const QString& container_name)222updateContainer(const QString& container_id, const QString& container_name)
214{223{
224 connect(&process_, &QProcess::readyRead, [=](){
225 auto output = process_.readAllStandardOutput();
226 if (!output.isEmpty())
227 {
228 emit updateOperationDetails(container_id, "", output);
229 }
230 });
215 connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),231 connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
216 [=](int exitCode, QProcess::ExitStatus){232 [=](int exitCode, QProcess::ExitStatus){
217 if (exitCode != 0)233 if (exitCode != 0)
218 {234 {
219 emit error(CONTAINER_UPDATE_FAILED.arg(container_name), readAllStdOutOrStdErr(process_));235 emit error(CONTAINER_UPDATE_FAILED.arg(container_name), readAllStdOutOrStdErr(process_));
220 }236 }
237 emit operationFinished(container_id, "");
221 });238 });
222239
223 process_.start(libertine_container_manager_tool, QStringList{"update", "-i", container_id});240 process_.start(libertine_container_manager_tool, QStringList{"update", "-i", container_id});
@@ -246,6 +263,13 @@
246void ContainerManagerWorker::263void ContainerManagerWorker::
247configureContainer(const QString& container_id, const QString& container_name, const QStringList& configure_command)264configureContainer(const QString& container_id, const QString& container_name, const QStringList& configure_command)
248{265{
266 connect(&process_, &QProcess::readyRead, [=](){
267 auto output = process_.readAllStandardOutput();
268 if (!output.isEmpty())
269 {
270 emit updateOperationDetails(container_id, "", output);
271 }
272 });
249 connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),273 connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
250 [=](int exitCode, QProcess::ExitStatus){274 [=](int exitCode, QProcess::ExitStatus){
251 if (exitCode != 0)275 if (exitCode != 0)
@@ -256,6 +280,7 @@
256 {280 {
257 emit finishedConfigure();281 emit finishedConfigure();
258 }282 }
283 emit operationFinished(container_id, "");
259 });284 });
260285
261 QStringList args{"configure", "-i", container_id};286 QStringList args{"configure", "-i", container_id};
262287
=== modified file 'libertine/ContainerManager.h'
--- libertine/ContainerManager.h 2016-06-07 15:37:12 +0000
+++ libertine/ContainerManager.h 2016-06-10 13:23:18 +0000
@@ -66,8 +66,8 @@
66 void finishedSearch(QList<QString> packageList);66 void finishedSearch(QList<QString> packageList);
67 void finishedCommand(QString const& command_output);67 void finishedCommand(QString const& command_output);
68 void finishedConfigure();68 void finishedConfigure();
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);
70 void packageOperationFinished(const QString& container_id, const QString& package_name);70 void operationFinished(const QString& container_id, const QString& package_name);
7171
72 void error(const QString& short_description, const QString& details);72 void error(const QString& short_description, const QString& details);
73};73};
7474
=== modified file 'libertine/qml/ContainerInfoView.qml'
--- libertine/qml/ContainerInfoView.qml 2016-05-06 21:13:01 +0000
+++ libertine/qml/ContainerInfoView.qml 2016-06-10 13:23:18 +0000
@@ -27,14 +27,16 @@
27 id: containerInfoView27 id: containerInfoView
28 header: PageHeader {28 header: PageHeader {
29 id: pageHeader29 id: pageHeader
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))
31 }31 }
3232
33 property string currentContainer: mainView.currentContainer33 property string currentContainer: null
34 property string containerDistroText: containerConfigList.getContainerDistro(currentContainer)34 property string containerDistroText: containerConfigList.getContainerDistro(currentContainer)
35 property string containerNameText: containerConfigList.getContainerName(currentContainer)35 property string containerNameText: containerConfigList.getContainerName(currentContainer)
36 property string containerIdText: currentContainer36 property string containerIdText: currentContainer
37 property var statusText: containerConfigList.getContainerStatus(currentContainer)37 property var statusText: containerConfigList.getContainerStatus(currentContainer)
38 property bool showDetails: false
39 property string operationDetails: ""
3840
39 Flickable {41 Flickable {
40 anchors {42 anchors {
@@ -50,6 +52,7 @@
50 anchors.right: parent.right52 anchors.right: parent.right
5153
52 ListItem.Standard {54 ListItem.Standard {
55 id: idView
53 text: i18n.tr("ID")56 text: i18n.tr("ID")
54 control: Label {57 control: Label {
55 text: containerIdText58 text: containerIdText
@@ -57,6 +60,7 @@
57 }60 }
5861
59 ListItem.Standard {62 ListItem.Standard {
63 id: nameView
60 text: i18n.tr("Name")64 text: i18n.tr("Name")
61 control: Label {65 control: Label {
62 text: containerNameText66 text: containerNameText
@@ -64,6 +68,7 @@
64 }68 }
6569
66 ListItem.Standard {70 ListItem.Standard {
71 id: distroView
67 text: i18n.tr("Distribution")72 text: i18n.tr("Distribution")
68 control: Label {73 control: Label {
69 text: containerDistroText74 text: containerDistroText
@@ -71,22 +76,67 @@
71 }76 }
7277
73 ListItem.Standard {78 ListItem.Standard {
79 id: statusView
74 text: i18n.tr("Status")80 text: i18n.tr("Status")
75 control: Label {81 control: Label {
76 text: statusText82 text: statusText
77 }83 }
78 }84 }
85
86 ListItem.Standard {
87 id: showDetailsView
88 control: Button {
89 text: enabled ?
90 showDetails ? i18n.tr('Hide') : i18n.tr('Show')
91 : i18n.tr('None')
92 enabled: operationDetails != ""
93 onClicked: {
94 showDetails = !showDetails
95 }
96 }
97 text: i18n.tr("Operation details")
98 }
99
100 TextArea {
101 id: operationDetailsView
102 visible: showDetails
103 anchors.left: parent.left
104 anchors.right: parent.right
105 height: Math.max(containerInfoView.height - pageHeader.height - idView.height - nameView.height - distroView.height
106 - statusView.height - showDetailsView.height,
107 units.gu(35))
108 readOnly: true
109 text: operationDetails
110 }
79 }111 }
80 }112 }
81113
82 Component.onCompleted: {114 Component.onCompleted: {
83 containerConfigList.configChanged.connect(reloadStatus)115 containerConfigList.configChanged.connect(reloadStatus)
116
117 var worker = Qt.createComponent("ContainerManager.qml").createObject(mainView)
118
119 operationDetails = mainView.getOperationDetails(currentContainer)
120 operationDetailsView.cursorPosition = operationDetailsView.length
121 if (operationDetails != "") {
122 showDetails = !showDetails
123 }
124
125 mainView.operationDetailsUpdated.connect(updateDetails)
84 }126 }
85127
86 Component.onDestruction: {128 Component.onDestruction: {
129 mainView.operationDetailsUpdated.disconnect(updateDetails)
87 containerConfigList.configChanged.disconnect(reloadStatus)130 containerConfigList.configChanged.disconnect(reloadStatus)
88 }131 }
89132
133 function updateDetails(container_id, package_name, details) {
134 if (container_id === currentContainer && package_name === "") {
135 operationDetails += details
136 operationDetailsView.cursorPosition = operationDetailsView.length
137 }
138 }
139
90 function reloadStatus() {140 function reloadStatus() {
91 statusText = containerConfigList.getContainerStatus(currentContainer)141 statusText = containerConfigList.getContainerStatus(currentContainer)
92 if (!statusText) {142 if (!statusText) {
93143
=== modified file 'libertine/qml/ContainerPasswordDialog.qml'
--- libertine/qml/ContainerPasswordDialog.qml 2016-05-19 17:56:43 +0000
+++ libertine/qml/ContainerPasswordDialog.qml 2016-06-10 13:23:18 +0000
@@ -87,6 +87,11 @@
87 var container_id = containerConfigList.addNewContainer("lxc", containerName)87 var container_id = containerConfigList.addNewContainer("lxc", containerName)
88 var comp = Qt.createComponent("ContainerManager.qml")88 var comp = Qt.createComponent("ContainerManager.qml")
89 var worker = comp.createObject(mainView)89 var worker = comp.createObject(mainView)
90
91 worker.updateOperationDetails.connect(mainView.updateOperationDetails)
92 worker.operationFinished.connect(mainView.resetOperationDetails)
93 worker.error.connect(mainView.error)
94
90 worker.createContainer(container_id, containerConfigList.getContainerName(container_id),95 worker.createContainer(container_id, containerConfigList.getContainerName(container_id),
91 containerConfigList.getContainerDistro(container_id), enableMultiarch, password)96 containerConfigList.getContainerDistro(container_id), enableMultiarch, password)
92 }97 }
9398
=== modified file 'libertine/qml/ContainersView.qml'
--- libertine/qml/ContainersView.qml 2016-05-19 17:56:43 +0000
+++ libertine/qml/ContainersView.qml 2016-06-10 13:23:18 +0000
@@ -92,8 +92,7 @@
92 text: i18n.tr("delete")92 text: i18n.tr("delete")
93 description: i18n.tr("Delete Container")93 description: i18n.tr("Delete Container")
94 onTriggered: {94 onTriggered: {
95 var comp = Qt.createComponent("ContainerManager.qml")95 var worker = Qt.createComponent("ContainerManager.qml").createObject(mainView)
96 var worker = comp.createObject(mainView)
97 worker.destroyContainer(containerId)96 worker.destroyContainer(containerId)
98 mainView.currentContainer = containerId97 mainView.currentContainer = containerId
99 }98 }
@@ -109,7 +108,7 @@
109 description: i18n.tr("Container Info")108 description: i18n.tr("Container Info")
110 onTriggered: {109 onTriggered: {
111 mainView.currentContainer = containerId110 mainView.currentContainer = containerId
112 pageStack.push(Qt.resolvedUrl("ContainerInfoView.qml"))111 pageStack.push(Qt.resolvedUrl("ContainerInfoView.qml"), {currentContainer: containerId})
113 }112 }
114 },113 },
115 Action {114 Action {
116115
=== modified file 'libertine/qml/HomeView.qml'
--- libertine/qml/HomeView.qml 2016-05-19 18:49:06 +0000
+++ libertine/qml/HomeView.qml 2016-06-10 13:23:18 +0000
@@ -39,7 +39,7 @@
39 }39 }
40 ]40 ]
41 }41 }
42 property var currentContainer: null42 property string currentContainer: null
4343
44 Component {44 Component {
45 id: enterPackagePopup45 id: enterPackagePopup
@@ -103,13 +103,13 @@
103 Action {103 Action {
104 text: i18n.tr("Manage Container")104 text: i18n.tr("Manage Container")
105 onTriggered: {105 onTriggered: {
106 pageStack.push(Qt.resolvedUrl("ManageContainer.qml"))106 pageStack.push(Qt.resolvedUrl("ManageContainer.qml"), {currentContainer: currentContainer})
107 }107 }
108 }108 }
109 Action {109 Action {
110 text: i18n.tr("Container Information")110 text: i18n.tr("Container Information")
111 onTriggered: {111 onTriggered: {
112 pageStack.push(Qt.resolvedUrl("ContainerInfoView.qml"))112 pageStack.push(Qt.resolvedUrl("ContainerInfoView.qml"), {currentContainer: currentContainer})
113 }113 }
114 }114 }
115 Action {115 Action {
@@ -244,9 +244,9 @@
244 var comp = Qt.createComponent("ContainerManager.qml")244 var comp = Qt.createComponent("ContainerManager.qml")
245 var worker = comp.createObject(mainView)245 var worker = comp.createObject(mainView)
246 worker.error.connect(mainView.error)246 worker.error.connect(mainView.error)
247 worker.updatePackageOperationDetails.connect(mainView.updatePackageOperationDetails)247 worker.updateOperationDetails.connect(mainView.updateOperationDetails)
248 mainView.packageOperationInteraction.connect(worker.packageOperationInteraction)248 mainView.packageOperationInteraction.connect(worker.packageOperationInteraction)
249 worker.packageOperationFinished.connect(mainView.resetPackageDetails)249 worker.operationFinished.connect(mainView.resetOperationDetails)
250 return worker250 return worker
251 }251 }
252252
253253
=== modified file 'libertine/qml/ManageContainer.qml'
--- libertine/qml/ManageContainer.qml 2016-06-07 18:23:48 +0000
+++ libertine/qml/ManageContainer.qml 2016-06-10 13:23:18 +0000
@@ -26,10 +26,11 @@
26 id: manageView26 id: manageView
27 header: PageHeader {27 header: PageHeader {
28 id: pageHeader28 id: pageHeader
29 title: i18n.tr("Manage %1").arg(containerConfigList.getContainerName(mainView.currentContainer))29 title: i18n.tr("Manage %1").arg(containerConfigList.getContainerName(currentContainer))
30 }30 }
31 property bool isDefaultContainer: null31 property bool isDefaultContainer: null
32 property bool isMultiarchEnabled: null32 property bool isMultiarchEnabled: null
33 property string currentContainer: null
3334
34 Flickable {35 Flickable {
35 anchors {36 anchors {
@@ -49,16 +50,19 @@
49 control: CheckBox {50 control: CheckBox {
50 checked: isMultiarchEnabled51 checked: isMultiarchEnabled
51 onClicked: {52 onClicked: {
52 var comp = Qt.createComponent("ContainerManager.qml")53 var worker = Qt.createComponent("ContainerManager.qml").createObject(mainView)
54
55 worker.updateOperationDetails.connect(mainView.updateOperationDetails)
56 worker.operationFinished.connect(mainView.resetOperationDetails)
57
53 if (checked) {58 if (checked) {
54 comp.createObject(mainView).configureContainer(mainView.currentContainer,59 worker.configureContainer(currentContainer,
55 containerConfigList.getContainerName(mainView.currentContainer),60 containerConfigList.getContainerName(currentContainer),
56 ["--multiarch", "enable"])61 ["--multiarch", "enable"])
57 }62 } else {
58 else {63 worker.configureContainer(currentContainer,
59 comp.createObject(mainView).configureContainer(mainView.currentContainer,64 containerConfigList.getContainerName(currentContainer),
60 containerConfigList.getContainerName(mainView.currentContainer),65 ["--multiarch", "disable"])
61 ["--multiarch", "disable"])
62 }66 }
63 }67 }
64 }68 }
@@ -69,7 +73,7 @@
69 text: i18n.tr("Additional archives and PPAs")73 text: i18n.tr("Additional archives and PPAs")
70 progression: true74 progression: true
71 onClicked: {75 onClicked: {
72 containerArchivesList.setContainerArchives(mainView.currentContainer)76 containerArchivesList.setContainerArchives(currentContainer)
73 pageStack.push(Qt.resolvedUrl("ExtraArchivesView.qml"))77 pageStack.push(Qt.resolvedUrl("ExtraArchivesView.qml"))
74 }78 }
75 }79 }
@@ -78,7 +82,7 @@
78 control: Button {82 control: Button {
79 id: updateButton83 id: updateButton
80 text: i18n.tr("Update…")84 text: i18n.tr("Update…")
81 visible: (containerConfigList.getContainerStatus(mainView.currentContainer) === i18n.tr("ready")) ? true : false85 visible: (containerConfigList.getContainerStatus(currentContainer) === i18n.tr("ready")) ? true : false
82 onClicked: {86 onClicked: {
83 updateContainer()87 updateContainer()
84 }88 }
@@ -90,7 +94,7 @@
90 right: parent.right94 right: parent.right
91 rightMargin: units.gu(2)95 rightMargin: units.gu(2)
92 }96 }
93 visible: (containerConfigList.getContainerStatus(mainView.currentContainer) === i18n.tr("updating")) ? true : false97 visible: (containerConfigList.getContainerStatus(currentContainer) === i18n.tr("updating")) ? true : false
94 running: updateActivity.visible98 running: updateActivity.visible
95 }99 }
96 text: i18n.tr("Update container")100 text: i18n.tr("Update container")
@@ -107,7 +111,7 @@
107 worker.error.connect(function() {111 worker.error.connect(function() {
108 checked = fallback112 checked = fallback
109 })113 })
110 worker.setDefaultContainer(mainView.currentContainer, !checked)114 worker.setDefaultContainer(currentContainer, !checked)
111 }115 }
112 }116 }
113 text: i18n.tr("Default container")117 text: i18n.tr("Default container")
@@ -125,24 +129,27 @@
125 }129 }
126130
127 function updateContainer() {131 function updateContainer() {
128 var comp = Qt.createComponent("ContainerManager.qml")132 var worker = Qt.createComponent("ContainerManager.qml").createObject(mainView)
129 var worker = comp.createObject(mainView)
130 worker.error.connect(mainView.error);133 worker.error.connect(mainView.error);
131 worker.updateContainer(mainView.currentContainer, containerConfigList.getContainerName(mainView.currentContainer))134
135 worker.updateOperationDetails.connect(mainView.updateOperationDetails)
136 worker.operationFinished.connect(mainView.resetOperationDetails)
137
138 worker.updateContainer(currentContainer, containerConfigList.getContainerName(currentContainer))
132 }139 }
133140
134 function updateContainerInfo() {141 function updateContainerInfo() {
135 updateStatus()142 updateStatus()
136 isDefaultContainer = containerConfigList.defaultContainerId === mainView.currentContainer143 isDefaultContainer = containerConfigList.defaultContainerId === currentContainer
137 isMultiarchEnabled = containerConfigList.getContainerMultiarchSupport(mainView.currentContainer) === 'enabled'144 isMultiarchEnabled = containerConfigList.getContainerMultiarchSupport(currentContainer) === 'enabled'
138 }145 }
139146
140 function updateStatus() {147 function updateStatus() {
141 if (containerConfigList.getContainerStatus(mainView.currentContainer) === i18n.tr("updating")) {148 if (containerConfigList.getContainerStatus(currentContainer) === i18n.tr("updating")) {
142 updateButton.visible = false149 updateButton.visible = false
143 updateActivity.visible = true150 updateActivity.visible = true
144 }151 }
145 else if (containerConfigList.getContainerStatus(mainView.currentContainer) === i18n.tr("ready")) {152 else if (containerConfigList.getContainerStatus(currentContainer) === i18n.tr("ready")) {
146 updateButton.visible = true153 updateButton.visible = true
147 updateActivity.visible = false154 updateActivity.visible = false
148 }155 }
149156
=== modified file 'libertine/qml/PackageInfoView.qml'
--- libertine/qml/PackageInfoView.qml 2016-06-07 17:48:12 +0000
+++ libertine/qml/PackageInfoView.qml 2016-06-10 13:23:18 +0000
@@ -35,6 +35,7 @@
35 property var packageVersionText: i18n.tr("Obtaining package version…")35 property var packageVersionText: i18n.tr("Obtaining package version…")
36 property string packageOperationDetails: ""36 property string packageOperationDetails: ""
37 property var worker: null37 property var worker: null
38 property bool showDetails: false
3839
39 signal sendOperationInteraction(string text)40 signal sendOperationInteraction(string text)
4041
@@ -70,18 +71,33 @@
70 }71 }
71 }72 }
7273
74 ListItem.Standard {
75 id: showDetailsView
76 control: Button {
77 text: enabled ?
78 showDetails ? i18n.tr('Hide') : i18n.tr('Show')
79 : i18n.tr('None')
80 enabled: packageOperationDetails != ""
81 onClicked: {
82 showDetails = !showDetails
83 }
84 }
85 text: i18n.tr("Operation details")
86 }
87
73 TextArea {88 TextArea {
74 id: packageDetailsView89 id: packageDetailsView
75 visible: text !== ""90 visible: showDetails
76 anchors.left: parent.left91 anchors.left: parent.left
77 anchors.right: parent.right92 anchors.right: parent.right
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))
79 readOnly: true94 readOnly: true
80 text: packageOperationDetails95 text: packageOperationDetails
81 }96 }
8297
83 TextField {98 TextField {
84 visible: packageDetailsView.visible && (statusText === "installing" || statusText === "removing")99 id: packageInputField
100 visible: showDetails && (statusText === "installing" || statusText === "removing")
85 anchors.left: parent.left101 anchors.left: parent.left
86 anchors.right: parent.right102 anchors.right: parent.right
87 text: ""103 text: ""
@@ -99,20 +115,22 @@
99 var worker = Qt.createComponent("ContainerManager.qml").createObject(mainView)115 var worker = Qt.createComponent("ContainerManager.qml").createObject(mainView)
100 worker.finishedCommand.connect(getPackageVersion)116 worker.finishedCommand.connect(getPackageVersion)
101117
102 packageOperationDetails = mainView.getPackageOperationDetails(currentContainer, currentPackage)118 packageOperationDetails = mainView.getOperationDetails(currentContainer, currentPackage)
103 packageDetailsView.cursorPosition = packageDetailsView.length119 packageDetailsView.cursorPosition = packageDetailsView.length
120 if (packageOperationDetails != "") {
121 showDetails = !showDetails
122 }
104123
105 mainView.updatePackageDetails.connect(updatePackageDetails)124 mainView.operationDetailsUpdated.connect(updatePackageDetails)
106 sendOperationInteraction.connect(mainView.packageOperationInteraction)125 sendOperationInteraction.connect(mainView.packageOperationInteraction)
107126
108 worker.error.connect(mainView.error)
109 worker.error.connect(onError)127 worker.error.connect(onError)
110 worker.runCommand(currentContainer, containerConfigList.getContainerName(currentContainer), command)128 worker.runCommand(currentContainer, containerConfigList.getContainerName(currentContainer), command)
111 }129 }
112130
113 Component.onDestruction: {131 Component.onDestruction: {
114 containerConfigList.configChanged.disconnect(reloadStatus)132 containerConfigList.configChanged.disconnect(reloadStatus)
115 mainView.updatePackageDetails.disconnect(updatePackageDetails)133 mainView.operationDetailsUpdated.disconnect(updatePackageDetails)
116 sendOperationInteraction.disconnect(mainView.packageOperationInteraction)134 sendOperationInteraction.disconnect(mainView.packageOperationInteraction)
117 }135 }
118136
@@ -132,7 +150,9 @@
132 }150 }
133151
134 function getPackageVersion(command_output) {152 function getPackageVersion(command_output) {
135 packageVersionText = containerConfigList.getAppVersion(command_output, statusText === "installed")153 if (packageInfoView) {
154 packageVersionText = containerConfigList.getAppVersion(command_output, statusText === "installed")
155 }
136 }156 }
137157
138 function onError() {158 function onError() {
139159
=== modified file 'libertine/qml/libertine.qml'
--- libertine/qml/libertine.qml 2016-06-02 18:02:50 +0000
+++ libertine/qml/libertine.qml 2016-06-10 13:23:18 +0000
@@ -29,10 +29,10 @@
29 width: units.gu(90)29 width: units.gu(90)
30 height: units.gu(75)30 height: units.gu(75)
31 property var currentContainer: undefined31 property var currentContainer: undefined
32 property var packageOperationDetails: undefined32 property var operationDetails: undefined
3333
34 signal error(string short_description, string details)34 signal error(string short_description, string details)
35 signal updatePackageDetails(string container_id, string package_name, string details)35 signal operationDetailsUpdated(string container_id, string package_name, string details)
36 signal packageOperationInteraction(string data)36 signal packageOperationInteraction(string data)
3737
38 PageStack {38 PageStack {
@@ -48,7 +48,7 @@
48 pageStack.push(Qt.resolvedUrl("ContainersView.qml"))48 pageStack.push(Qt.resolvedUrl("ContainersView.qml"))
49 if (mainView.currentContainer) {49 if (mainView.currentContainer) {
50 containerAppsList.setContainerApps(mainView.currentContainer)50 containerAppsList.setContainerApps(mainView.currentContainer)
51 pageStack.push(Qt.resolvedUrl("HomeView.qml"), {"currentContainer": mainView.currentContainer})51 pageStack.push(Qt.resolvedUrl("HomeView.qml"), {currentContainer: mainView.currentContainer})
52 }52 }
53 }53 }
54 else {54 else {
@@ -61,33 +61,58 @@
61 {"short_description": short_description, "details": details})61 {"short_description": short_description, "details": details})
62 }62 }
6363
64 function updatePackageOperationDetails(container_id, package_name, details) {64 function initializeDetails(container_id, package_name) {
65 if (!operationDetails) {
66 operationDetails = {}
67 }
68 if (!operationDetails[container_id]) {
69 operationDetails[container_id] = {packages: {}, details: ""}
70 }
71 if (!operationDetails[container_id].details) {
72 operationDetails[container_id].details = ""
73 }
74 if (package_name && !operationDetails[container_id].packages[package_name]) {
75 operationDetails[container_id].packages[package_name] = ""
76 }
77 }
78
79 function updateOperationDetails(container_id, package_name, details) {
65 if (!mainView) {80 if (!mainView) {
66 return81 return
67 }82 }
68 if (!packageOperationDetails) {83
69 packageOperationDetails = {}84 initializeDetails(container_id, package_name)
70 }85
71 if (!packageOperationDetails[container_id]) {86 if (package_name) {
72 packageOperationDetails[container_id] = {}87 operationDetails[container_id].packages[package_name] += details
73 }88 } else {
74 if (!packageOperationDetails[container_id][package_name]) {89 operationDetails[container_id].details += details
75 packageOperationDetails[container_id][package_name] = ""90 }
76 }91
77 packageOperationDetails[container_id][package_name] += details92 operationDetailsUpdated(container_id, package_name, details)
7893 }
79 updatePackageDetails(container_id, package_name, details)94
80 }95 function resetOperationDetails(container_id, package_name) {
8196 if (mainView && operationDetails && operationDetails[container_id]) {
82 function resetPackageDetails(container_id, package_name) {97 if (package_name) {
83 if (mainView && packageOperationDetails && packageOperationDetails[container_id] && packageOperationDetails[container_id][package_name]) {98 if (operationDetails[container_id].packages[package_name]) {
84 delete packageOperationDetails[container_id][package_name]99 delete operationDetails[container_id].packages[package_name]
85 }100 }
86 }101 } else {
87102 delete operationDetails[container_id].details
88 function getPackageOperationDetails(container_id, package_name) {103 }
89 if (packageOperationDetails && packageOperationDetails[container_id] && packageOperationDetails[container_id][package_name]) {104 }
90 return packageOperationDetails[container_id][package_name]105 }
106
107 function getOperationDetails(container_id, package_name) {
108 if (operationDetails && operationDetails[container_id]) {
109 if (package_name) {
110 if (operationDetails[container_id].packages[package_name]) {
111 return operationDetails[container_id].packages[package_name]
112 }
113 } else if (operationDetails[container_id].details) {
114 return operationDetails[container_id].details
115 }
91 }116 }
92 return ""117 return ""
93 }118 }

Subscribers

People subscribed via source and target branches