Merge lp:~ahayzen/ubuntu-settings-components/defaults-emit-to-qml-printermodel-getter-and-multi-remove-fix into lp:~phablet-team/ubuntu-settings-components/printer-components

Proposed by Andrew Hayzen
Status: Merged
Approved by: Jonas G. Drange
Approved revision: 211
Merged at revision: 208
Proposed branch: lp:~ahayzen/ubuntu-settings-components/defaults-emit-to-qml-printermodel-getter-and-multi-remove-fix
Merge into: lp:~phablet-team/ubuntu-settings-components/printer-components
Diff against target: 266 lines (+95/-15)
9 files modified
plugins/Ubuntu/Settings/Printers/models/printermodel.cpp (+25/-7)
plugins/Ubuntu/Settings/Printers/models/printermodel.h (+5/-1)
plugins/Ubuntu/Settings/Printers/printer/printer.cpp (+12/-0)
plugins/Ubuntu/Settings/Printers/printer/printer.h (+2/-2)
plugins/Ubuntu/Settings/Printers/printer/printerinfo.h (+1/-0)
plugins/Ubuntu/Settings/Printers/printer/printerinfo_impl.cpp (+10/-5)
plugins/Ubuntu/Settings/Printers/printer/printerinfo_impl.h (+2/-0)
tests/unittests/Printers/mockprinterinfo.h (+5/-0)
tests/unittests/Printers/tst_printermodel.cpp (+33/-0)
To merge this branch: bzr merge lp:~ahayzen/ubuntu-settings-components/defaults-emit-to-qml-printermodel-getter-and-multi-remove-fix
Reviewer Review Type Date Requested Status
Konrad Zapałowicz (community) code Approve
Jonas G. Drange (community) Approve
Review via email: mp+315114@code.launchpad.net

Commit message

* Add getter method to PrinterModel
* Fix issue in update when removing multiple rows (also added regression test)
* Add refresh command to PrinterInfo
* Add ability for setting defaults to emit signals, so when a default is set it remains set on the QML side

Description of the change

* Add getter method to PrinterModel
* Fix issue in update when removing multiple rows (also added regression test)
* Add refresh command to PrinterInfo
* Add ability for setting defaults to emit signals, so when a default is set it remains set on the QML side

To post a comment you must log in.
208. By Andrew Hayzen

* Remove count() as that is done in the other branch

Revision history for this message
Konrad Zapałowicz (kzapalowicz) wrote :

LGTM however it seems like the getter could be const. Is that possible?

review: Needs Information (code)
209. By Andrew Hayzen

* Change PrinterModel::get and PrinterFilter::get to const

210. By Andrew Hayzen

* Make PrinterInfoImpl constructor use refresh to create it's QPrinterInfo, so we don't have duplicate code

Revision history for this message
Andrew Hayzen (ahayzen) wrote :

Nice catch, I've changed PrinterModel::get and PrinterFilter::get to be consts :-)

Revision history for this message
Jonas G. Drange (jonas-drange) wrote :

Looks good. Nitpick: I would make refresh() a slot that you connect e.g. descriptionChanged to. Makes the setters less knowledgeable.

review: Approve
Revision history for this message
Konrad Zapałowicz (kzapalowicz) wrote :

Ack

review: Approve (code)
211. By Andrew Hayzen

* Merge of upstream

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'plugins/Ubuntu/Settings/Printers/models/printermodel.cpp'
2--- plugins/Ubuntu/Settings/Printers/models/printermodel.cpp 2017-01-19 11:16:13 +0000
3+++ plugins/Ubuntu/Settings/Printers/models/printermodel.cpp 2017-01-19 14:20:00 +0000
4@@ -89,6 +89,8 @@
5 beginRemoveRows(QModelIndex(), i, i);
6 d->printers.removeAt(i);
7 endRemoveRows();
8+
9+ i--; // as we have removed an item decrement
10 }
11 }
12
13@@ -305,16 +307,18 @@
14 return names;
15 }
16
17-QSharedPointer<Printer> PrinterModel::get(const int index)
18+QVariantMap PrinterModel::get(const int row) const
19 {
20- Q_D(const PrinterModel);
21+ QHashIterator<int, QByteArray> iterator(roleNames());
22+ QVariantMap result;
23+ QModelIndex modelIndex = index(row, 0);
24
25- if (index > -1 && index < d->printers.count()) {
26- return d->printers.at(index);
27- } else {
28- qWarning() << "Invalid index:" << index;
29- return QSharedPointer<Printer>(Q_NULLPTR);
30+ while (iterator.hasNext()) {
31+ iterator.next();
32+ result[iterator.value()] = modelIndex.data(iterator.key());
33 }
34+
35+ return result;
36 }
37
38 QSharedPointer<Printer> PrinterModel::getPrinterFromName(const QString &name)
39@@ -333,6 +337,20 @@
40
41 }
42
43+QVariantMap PrinterFilter::get(const int row) const
44+{
45+ QHashIterator<int, QByteArray> iterator(roleNames());
46+ QVariantMap result;
47+ QModelIndex modelIndex = index(row, 0);
48+
49+ while (iterator.hasNext()) {
50+ iterator.next();
51+ result[iterator.value()] = modelIndex.data(iterator.key());
52+ }
53+
54+ return result;
55+}
56+
57 void PrinterFilter::onSourceModelChanged()
58 {
59 connect((PrinterModel*) sourceModel(),
60
61=== modified file 'plugins/Ubuntu/Settings/Printers/models/printermodel.h'
62--- plugins/Ubuntu/Settings/Printers/models/printermodel.h 2017-01-19 11:16:13 +0000
63+++ plugins/Ubuntu/Settings/Printers/models/printermodel.h 2017-01-19 14:20:00 +0000
64@@ -75,7 +75,7 @@
65
66 QSharedPointer<Printer> getPrinterFromName(const QString &name);
67
68- Q_INVOKABLE QSharedPointer<Printer> get(const int index);
69+ Q_INVOKABLE QVariantMap get(const int row) const;
70 private:
71 QScopedPointer<PrinterModelPrivate> const d_ptr;
72 QTimer m_update_timer;
73@@ -95,8 +95,12 @@
74 public:
75 explicit PrinterFilter(QObject *parent = Q_NULLPTR);
76 ~PrinterFilter();
77+
78+ Q_INVOKABLE QVariantMap get(const int row) const;
79+
80 void filterOnState(const PrinterEnum::State &state);
81 void filterOnRecent(const bool recent);
82+
83 int count() const;
84 protected:
85 virtual bool filterAcceptsRow(
86
87=== modified file 'plugins/Ubuntu/Settings/Printers/printer/printer.cpp'
88--- plugins/Ubuntu/Settings/Printers/printer/printer.cpp 2017-01-18 16:25:02 +0000
89+++ plugins/Ubuntu/Settings/Printers/printer/printer.cpp 2017-01-19 14:20:00 +0000
90@@ -206,6 +206,9 @@
91 QStringList vals({Utils::colorModelToPpdColorModel(colorModel)});
92 QString reply = d->cups->printerAddOption(name(), "ColorModel", vals);
93 Q_UNUSED(reply);
94+
95+ d->loadColorModel();
96+ Q_EMIT defaultColorModelChanged();
97 }
98
99 void Printer::setAccessControl(const PrinterEnum::AccessControl &accessControl)
100@@ -217,6 +220,9 @@
101 {
102 Q_D(const Printer);
103 QString answer = d->cups->printerSetInfo(d->info->printerName(), description);
104+
105+ d->info->refresh();
106+ Q_EMIT descriptionChanged();
107 }
108
109 void Printer::setDefaultDuplexMode(const PrinterEnum::DuplexMode &duplexMode)
110@@ -234,6 +240,9 @@
111
112 QStringList vals({Utils::duplexModeToPpdChoice(duplexMode)});
113 QString reply = d->cups->printerAddOption(name(), "Duplex", vals);
114+
115+ d->info->refresh();
116+ Q_EMIT defaultDuplexModeChanged();
117 }
118
119 void Printer::setEnabled(const bool enabled)
120@@ -276,6 +285,9 @@
121
122 QStringList vals({pageSize.key()});
123 QString reply = d->cups->printerAddOption(name(), "PageSize", vals);
124+
125+ d->info->refresh();
126+ Q_EMIT defaultPageSizeChanged();
127 }
128
129 void Printer::addUser(const QString &username)
130
131=== modified file 'plugins/Ubuntu/Settings/Printers/printer/printer.h'
132--- plugins/Ubuntu/Settings/Printers/printer/printer.h 2017-01-18 16:25:02 +0000
133+++ plugins/Ubuntu/Settings/Printers/printer/printer.h 2017-01-19 14:20:00 +0000
134@@ -47,7 +47,7 @@
135 Q_PROPERTY(QString name READ name NOTIFY nameChanged)
136 Q_PROPERTY(PrinterEnum::Quality quality READ quality WRITE setQuality NOTIFY qualityChanged)
137 Q_PROPERTY(QString description READ description WRITE setDescription NOTIFY descriptionChanged)
138- Q_PROPERTY(QPageSize defaultPageSize READ defaultPageSize WRITE setDefaultPageSize NOTIFY pageSizeChanged)
139+ Q_PROPERTY(QPageSize defaultPageSize READ defaultPageSize WRITE setDefaultPageSize NOTIFY defaultPageSizeChanged)
140 Q_PROPERTY(QList<QPageSize> supportedPageSizes READ supportedPageSizes CONSTANT)
141 Q_PROPERTY(PrinterEnum::AccessControl accessControl READ accessControl WRITE setAccessControl NOTIFY accessControlChanged)
142 Q_PROPERTY(PrinterEnum::ErrorPolicy errorPolicy READ errorPolicy WRITE setErrorPolicy NOTIFY errorPolicyChanged)
143@@ -108,7 +108,7 @@
144 void nameChanged();
145 void enabledChanged();
146 void descriptionChanged();
147- void pageSizeChanged();
148+ void defaultPageSizeChanged();
149 void defaultDuplexModeChanged();
150 void defaultColorModelChanged();
151 void qualityChanged();
152
153=== modified file 'plugins/Ubuntu/Settings/Printers/printer/printerinfo.h'
154--- plugins/Ubuntu/Settings/Printers/printer/printerinfo.h 2017-01-18 16:18:40 +0000
155+++ plugins/Ubuntu/Settings/Printers/printer/printerinfo.h 2017-01-19 14:20:00 +0000
156@@ -54,6 +54,7 @@
157 virtual PrinterInfo* printerInfo(const QString &printerName) = 0;
158 virtual QString defaultPrinterName() = 0;
159
160+ virtual void refresh() = 0;
161 protected:
162 const QString m_printerName;
163
164
165=== modified file 'plugins/Ubuntu/Settings/Printers/printer/printerinfo_impl.cpp'
166--- plugins/Ubuntu/Settings/Printers/printer/printerinfo_impl.cpp 2017-01-18 16:25:02 +0000
167+++ plugins/Ubuntu/Settings/Printers/printer/printerinfo_impl.cpp 2017-01-19 14:20:00 +0000
168@@ -23,11 +23,7 @@
169
170 PrinterInfoImpl::PrinterInfoImpl(const QString &name) : PrinterInfo(name)
171 {
172- if (m_printerName.isEmpty()) {
173- m_info = QPrinterInfo();
174- } else {
175- m_info = QPrinterInfo::printerInfo(m_printerName);
176- }
177+ refresh();
178 }
179
180 PrinterInfoImpl::PrinterInfoImpl(QPrinterInfo info)
181@@ -140,3 +136,12 @@
182 {
183 return QPrinterInfo::defaultPrinterName();
184 }
185+
186+void PrinterInfoImpl::refresh()
187+{
188+ if (m_printerName.isEmpty()) {
189+ m_info = QPrinterInfo();
190+ } else {
191+ m_info = QPrinterInfo::printerInfo(m_printerName);
192+ }
193+}
194
195=== modified file 'plugins/Ubuntu/Settings/Printers/printer/printerinfo_impl.h'
196--- plugins/Ubuntu/Settings/Printers/printer/printerinfo_impl.h 2017-01-18 16:18:40 +0000
197+++ plugins/Ubuntu/Settings/Printers/printer/printerinfo_impl.h 2017-01-19 14:20:00 +0000
198@@ -51,6 +51,8 @@
199 virtual PrinterInfo* printerInfo(const QString &printerName) override;
200 virtual QString defaultPrinterName() override;
201
202+ virtual void refresh() override;
203+
204 private:
205 QPrinterInfo m_info;
206 };
207
208=== modified file 'tests/unittests/Printers/mockprinterinfo.h'
209--- tests/unittests/Printers/mockprinterinfo.h 2017-01-18 16:18:40 +0000
210+++ tests/unittests/Printers/mockprinterinfo.h 2017-01-19 14:20:00 +0000
211@@ -129,6 +129,11 @@
212 return m_defaultPrinterName;
213 }
214
215+ virtual void refresh() override
216+ {
217+
218+ }
219+
220 QString m_description = QString::null;
221 QString m_location = QString::null;
222 QString m_makeAndModel = QString::null;
223
224=== modified file 'tests/unittests/Printers/tst_printermodel.cpp'
225--- tests/unittests/Printers/tst_printermodel.cpp 2017-01-17 18:49:15 +0000
226+++ tests/unittests/Printers/tst_printermodel.cpp 2017-01-19 14:20:00 +0000
227@@ -147,6 +147,39 @@
228 QCOMPARE(args.at(1).toInt(), 1);
229 QCOMPARE(args.at(2).toInt(), 1);
230 }
231+ void testUpdateRemoveMulti()
232+ {
233+ // Setup four printers
234+ PrinterInfo* printerA = new MockPrinterInfo("a-printer");
235+ PrinterInfo* printerB = new MockPrinterInfo("b-printer");
236+ PrinterInfo* printerC = new MockPrinterInfo("c-printer");
237+ PrinterInfo* printerD = new MockPrinterInfo("d-printer");
238+ ((MockPrinterInfo*) m_mock_info)->m_availablePrinters << printerA << printerB << printerC << printerD;
239+
240+ QTRY_COMPARE_WITH_TIMEOUT(m_model->count(), 4, 500);
241+
242+ // Setup spy and remove middle two printers
243+ QSignalSpy countSpy(m_model, SIGNAL(countChanged()));
244+ QSignalSpy removeSpy(m_model, SIGNAL(rowsRemoved(const QModelIndex&, int, int)));
245+ ((MockPrinterInfo*) m_mock_info)->m_availablePrinters.removeAt(2);
246+ ((MockPrinterInfo*) m_mock_info)->m_availablePrinters.removeAt(1);
247+
248+ // Wait until one count signal has been fired
249+ // (to ensure this is only one iteration of update)
250+ QTRY_COMPARE_WITH_TIMEOUT(countSpy.count(), 1, 500);
251+ QCOMPARE(m_model->count(), 2);
252+ QCOMPARE(removeSpy.count(), 2);
253+
254+ // Check items were removed from the middle
255+ QList<QVariant> args;
256+ args = removeSpy.at(0);
257+ QCOMPARE(args.at(1).toInt(), 1);
258+ QCOMPARE(args.at(2).toInt(), 1);
259+
260+ args = removeSpy.at(1);
261+ QCOMPARE(args.at(1).toInt(), 1);
262+ QCOMPARE(args.at(2).toInt(), 1);
263+ }
264 private:
265 CupsFacade *m_mock_cups;
266 PrinterInfo *m_mock_info;

Subscribers

People subscribed via source and target branches