Directory: | ./ |
---|---|
File: | src/MessageModel.cpp |
Date: | 2025-07-04 12:28:41 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 142 | 239 | 59.4% |
Branches: | 144 | 434 | 33.2% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | /***************************************************************************** | ||
2 | * | ||
3 | * Copyright (C) 2009 - 2022 Florian Pose <fp@igh.de> | ||
4 | * | ||
5 | * This file is part of the QtPdCom library. | ||
6 | * | ||
7 | * The QtPdCom library is free software: you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU Lesser General Public License as published by | ||
9 | * the Free Software Foundation, either version 3 of the License, or (at your | ||
10 | * option) any later version. | ||
11 | * | ||
12 | * The QtPdCom library is distributed in the hope that it will be useful, but | ||
13 | * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY | ||
14 | * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public | ||
15 | * License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU Lesser General Public License | ||
18 | * along with the QtPdCom Library. If not, see <http://www.gnu.org/licenses/>. | ||
19 | * | ||
20 | ****************************************************************************/ | ||
21 | |||
22 | #include "MessageModel.h" | ||
23 | using QtPdCom::MessageModel; | ||
24 | |||
25 | #include "MessageImpl.h" | ||
26 | #include "MessageItem.h" | ||
27 | #include "MessageManager.h" | ||
28 | #include "MessageModelImpl.h" | ||
29 | #include "Process.h" | ||
30 | |||
31 | #include <QEvent> | ||
32 | #include <QFile> | ||
33 | #include <QDomDocument> | ||
34 | #include <QMetaEnum> | ||
35 | #include <QtGlobal> | ||
36 | |||
37 | /****************************************************************************/ | ||
38 | |||
39 | /** Constructor. | ||
40 | */ | ||
41 | 14 | MessageModel::MessageModel(QObject *parent): | |
42 | QAbstractTableModel(parent), | ||
43 |
2/4✓ Branch 2 taken 14 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 14 times.
✗ Branch 6 not taken.
|
14 | impl(std::unique_ptr<Impl>(new MessageModel::Impl(this))) |
44 | 14 | {} | |
45 | |||
46 | /****************************************************************************/ | ||
47 | |||
48 | /** Destructor. | ||
49 | */ | ||
50 | 35 | MessageModel::~MessageModel() | |
51 | { | ||
52 | 14 | clear(); | |
53 | 21 | } | |
54 | |||
55 | /****************************************************************************/ | ||
56 | |||
57 | /** Loads messages from an Xml file. | ||
58 | */ | ||
59 | 3 | void MessageModel::load( | |
60 | const QString &path, /**< Path to Xml file. */ | ||
61 | const QString &lang, /**< Language identifier. */ | ||
62 | const QString &pathPrefix /**< Prefix to path (with leading /). */ | ||
63 | ) | ||
64 | { | ||
65 |
1/2✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
|
6 | QFile file(path); |
66 |
1/2✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
|
6 | QDomDocument doc; |
67 |
1/2✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
|
6 | QDomElement docElem; |
68 | |||
69 |
2/4✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
|
3 | if (!file.open(QIODevice::ReadOnly)) { |
70 | ✗ | throw Exception(QtPdCom::MessageModel::tr("Failed to open %1.") | |
71 | ✗ | .arg(file.fileName())); | |
72 | } | ||
73 | |||
74 | #if QT_VERSION < 0x060500 | ||
75 | { | ||
76 | 6 | QString errorMessage; | |
77 | 3 | int errorRow, errorColumn; | |
78 |
2/4✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
|
3 | if (!doc.setContent(&file, &errorMessage, &errorRow, &errorColumn)) { |
79 | throw Exception( | ||
80 | ✗ | QtPdCom::MessageModel::tr("Failed to parse %1, line %2," | |
81 | " column %3: %4") | ||
82 | ✗ | .arg(file.fileName()) | |
83 | ✗ | .arg(errorRow) | |
84 | ✗ | .arg(errorColumn) | |
85 | ✗ | .arg(errorMessage)); | |
86 | } | ||
87 | } | ||
88 | #else | ||
89 | { | ||
90 | QDomDocument::ParseResult res = doc.setContent(&file); | ||
91 | if (not res) { | ||
92 | throw Exception( | ||
93 | QtPdCom::MessageModel::tr("Failed to parse %1, line %2," | ||
94 | " column %3: %4") | ||
95 | .arg(file.fileName()) | ||
96 | .arg(res.errorLine) | ||
97 | .arg(res.errorColumn) | ||
98 | .arg(res.errorMessage)); | ||
99 | } | ||
100 | } | ||
101 | #endif | ||
102 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
3 | file.close(); |
103 | |||
104 |
2/4✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
|
3 | docElem = doc.documentElement(); |
105 | |||
106 |
3/6✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
|
3 | if (docElem.tagName() != "EtherLabPlainMessages") { |
107 | throw Exception( | ||
108 | ✗ | QtPdCom::MessageModel::tr("Failed to process %1:" | |
109 | ✗ | " No plain message file (%2)!")); | |
110 | } | ||
111 | |||
112 |
1/2✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
|
6 | QDomNodeList children = docElem.childNodes(); |
113 |
1/2✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
|
6 | QDomNode node; |
114 |
1/2✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
|
6 | QDomElement child; |
115 | |||
116 |
3/4✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 3 times.
|
9 | for (int i = 0; i < children.size(); i++) { |
117 |
2/4✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
|
6 | node = children.item(i); |
118 |
2/4✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
|
6 | if (node.isElement()) { |
119 |
2/4✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
|
6 | child = node.toElement(); |
120 |
3/6✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 6 times.
✗ Branch 10 not taken.
|
6 | if (child.tagName() == "Message") { |
121 | try { | ||
122 | 6 | QString path = Message::Impl::pathFromPlainXmlElement( | |
123 | child, | ||
124 |
2/6✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
|
12 | pathPrefix); |
125 | 6 | int index = | |
126 |
2/4✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
|
6 | Message::Impl::indexFromPlainXmlElement(child); |
127 | |||
128 |
2/4✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
|
6 | Message *&msg = impl->messageMap[path][index]; |
129 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
6 | if (!msg) { |
130 |
2/4✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
|
6 | msg = new Message(); |
131 | } | ||
132 |
2/4✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
|
6 | msg->impl->fromPlainXmlElement(child, pathPrefix); |
133 |
3/6✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 6 times.
✗ Branch 9 not taken.
|
12 | QObject::connect( |
134 | msg, | ||
135 | SIGNAL(stateChanged()), | ||
136 | 6 | impl.get(), | |
137 | SLOT(stateChanged())); | ||
138 | } | ||
139 | ✗ | catch (Message::Exception &e) { | |
140 | ✗ | qWarning() << e.msg; | |
141 | } | ||
142 | } | ||
143 | } | ||
144 | } | ||
145 | |||
146 | 3 | impl->lang = lang; | |
147 | 3 | } | |
148 | |||
149 | /****************************************************************************/ | ||
150 | |||
151 | /** Clears the messages. | ||
152 | */ | ||
153 | 21 | void MessageModel::clear() | |
154 | { | ||
155 |
2/2✓ Branch 1 taken 7 times.
✓ Branch 2 taken 14 times.
|
21 | if (impl->announcedMessageItem) { |
156 | 7 | impl->announcedMessageItem = nullptr; | |
157 | #if PD_DEBUG_MESSAGE_MODEL | ||
158 |
3/6✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
|
7 | qDebug() << __func__ << "currentMessage null"; |
159 | #endif | ||
160 | 7 | emit currentMessage(nullptr); | |
161 | } | ||
162 | |||
163 |
2/2✓ Branch 2 taken 13 times.
✓ Branch 3 taken 8 times.
|
21 | if (impl->messageItemList.count()) { |
164 | 13 | beginResetModel(); | |
165 | 13 | qDeleteAll(impl->messageItemList); | |
166 | 13 | impl->messageItemList.clear(); | |
167 | 13 | endResetModel(); | |
168 | } | ||
169 | |||
170 |
5/8✓ Branch 3 taken 21 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 21 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 23 times.
✓ Branch 11 taken 21 times.
✓ Branch 14 taken 23 times.
✗ Branch 15 not taken.
|
44 | for (auto &h : impl->messageMap) { |
171 |
1/2✓ Branch 1 taken 23 times.
✗ Branch 2 not taken.
|
23 | qDeleteAll(h); |
172 | } | ||
173 | |||
174 | 21 | impl->messageMap.clear(); | |
175 | 21 | } | |
176 | |||
177 | /****************************************************************************/ | ||
178 | |||
179 | /** Sets the maximum number of rows to fetch. | ||
180 | */ | ||
181 | ✗ | void MessageModel::setRowLimit(int limit /**< Maximum number of rows. */) | |
182 | { | ||
183 | ✗ | impl->rowLimit = limit; | |
184 | } | ||
185 | |||
186 | /****************************************************************************/ | ||
187 | |||
188 | /** Gets the maxium number of rows to fetch. | ||
189 | */ | ||
190 | ✗ | int MessageModel::getRowLimit() const | |
191 | { | ||
192 | ✗ | return impl->rowLimit; | |
193 | } | ||
194 | |||
195 | /****************************************************************************/ | ||
196 | |||
197 | /** Connects messages to the given process. | ||
198 | */ | ||
199 | 15 | void MessageModel::connect(QtPdCom::Process *process /**< PdCom process. */ | |
200 | ) | ||
201 | { | ||
202 |
2/2✓ Branch 1 taken 1 times.
✓ Branch 2 taken 14 times.
|
15 | if (impl->messageManager) { |
203 | 3 | disconnect( | |
204 | 1 | impl->messageManager, | |
205 | &MessageManager::processMessageSignal, | ||
206 | 1 | impl.get(), | |
207 | &Impl::processMessage); | ||
208 | 2 | disconnect( | |
209 | process, | ||
210 | &Process::processConnected, | ||
211 | 1 | impl.get(), | |
212 | &Impl::reloadActiveMessages); | ||
213 | 3 | disconnect( | |
214 | 1 | impl->messageManager, | |
215 | &MessageManager::processResetSignal, | ||
216 | 1 | impl.get(), | |
217 | &Impl::processReset); | ||
218 | } | ||
219 | |||
220 | 15 | impl->processReset(); | |
221 | 15 | impl->messageManager = nullptr; | |
222 | 15 | impl->process = process; | |
223 | |||
224 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 14 times.
|
15 | if (!process) { |
225 | 1 | return; | |
226 | } | ||
227 | |||
228 | 14 | impl->messageManager = | |
229 |
1/2✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
|
14 | dynamic_cast<MessageManager *>(process->getMessageManager()); |
230 |
1/2✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
|
14 | if (impl->messageManager) { |
231 | 42 | QObject::connect( | |
232 | 14 | impl->messageManager, | |
233 | &MessageManager::processMessageSignal, | ||
234 | 14 | impl.get(), | |
235 | &Impl::processMessage); | ||
236 | 28 | QObject::connect( | |
237 | process, | ||
238 | &Process::processConnected, | ||
239 | 14 | impl.get(), | |
240 | &Impl::reloadActiveMessages); | ||
241 | 42 | QObject::connect( | |
242 | 14 | impl->messageManager, | |
243 | &MessageManager::processResetSignal, | ||
244 | 14 | impl.get(), | |
245 | &Impl::processReset); | ||
246 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 14 times.
|
14 | if (process->isConnected()) { |
247 | ✗ | impl->reloadActiveMessages(); | |
248 | } | ||
249 | } | ||
250 | else { | ||
251 | ✗ | qWarning() << QtPdCom::MessageModel::tr( | |
252 | "Failed to connect to message manager."); | ||
253 | } | ||
254 | |||
255 |
6/10✓ Branch 3 taken 14 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 14 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✓ Branch 11 taken 14 times.
✓ Branch 15 taken 6 times.
✗ Branch 16 not taken.
✓ Branch 20 taken 6 times.
✗ Branch 21 not taken.
|
20 | for (auto h : impl->messageMap) { |
256 | 6 | Impl::MessageHash::iterator i; | |
257 |
5/8✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 12 taken 6 times.
✗ Branch 13 not taken.
|
12 | for (i = h.begin(); i != h.end(); ++i) { |
258 |
2/4✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
|
6 | if (i.key() != -1) { /* FIXME vector messages */ |
259 | ✗ | continue; | |
260 | } | ||
261 |
1/2✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
|
6 | Message *msg = i.value(); |
262 |
2/4✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
|
12 | PdCom::Selector selector; |
263 | |||
264 |
2/4✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
|
6 | if (msg->getIndex() > -1) { |
265 | ✗ | selector = PdCom::ScalarSelector({msg->getIndex()}); | |
266 | } | ||
267 | #if PD_DEBUG_MESSAGE_MODEL | ||
268 |
6/12✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 6 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 6 times.
✗ Branch 20 not taken.
|
6 | qDebug() << "Subscribing to" << msg->getPath() << msg->getIndex(); |
269 | #endif | ||
270 | try { | ||
271 |
3/8✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 6 times.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
12 | msg->impl->variable.setVariable( |
272 | process, | ||
273 | msg->getPath(), | ||
274 | 6 | selector); | |
275 | } | ||
276 | ✗ | catch (AbstractScalarVariable::Exception &e) { | |
277 | ✗ | qWarning() << QtPdCom::MessageModel::tr( | |
278 | "Failed to subscribe to %1: %2") | ||
279 | ✗ | .arg(msg->getPath()) | |
280 | ✗ | .arg(e.msg); | |
281 | } | ||
282 | } | ||
283 | } | ||
284 | } | ||
285 | |||
286 | /****************************************************************************/ | ||
287 | |||
288 | ✗ | QtPdCom::Process *MessageModel::getProcess() const | |
289 | { | ||
290 | ✗ | return impl->process; | |
291 | } | ||
292 | |||
293 | /****************************************************************************/ | ||
294 | |||
295 | /** Sets a new language and notifies views. | ||
296 | */ | ||
297 | ✗ | void MessageModel::translate(const QString &lang) | |
298 | { | ||
299 | ✗ | impl->lang = lang; | |
300 | |||
301 | ✗ | for (int i = 0; i < impl->messageItemList.count(); i++) { | |
302 | ✗ | QModelIndex idx = index(i, 0); // only text column | |
303 | ✗ | emit dataChanged(idx, idx); | |
304 | } | ||
305 | |||
306 | ✗ | if (impl->announcedMessageItem) { | |
307 | #if PD_DEBUG_MESSAGE_MODEL | ||
308 | ✗ | qDebug() << __func__ << "currentMessage" << impl->announcedMessageItem | |
309 | ✗ | << impl->announcedMessageItem->message; | |
310 | #endif | ||
311 | ✗ | emit currentMessage(impl->announcedMessageItem->message); | |
312 | } | ||
313 | } | ||
314 | |||
315 | /****************************************************************************/ | ||
316 | |||
317 | /** Sets an icon for a specific message type. | ||
318 | */ | ||
319 | ✗ | void MessageModel::setIcon(Message::Type type, const QIcon &icon) | |
320 | { | ||
321 | ✗ | impl->iconHash[type] = icon; | |
322 | ✗ | if (rowCount({}) > 0) { | |
323 | ✗ | emit dataChanged( | |
324 | ✗ | index(0, TextColumn), | |
325 | ✗ | index(rowCount({}) - 1, TextColumn), | |
326 | {Qt::DecorationRole}); | ||
327 | } | ||
328 | } | ||
329 | |||
330 | /****************************************************************************/ | ||
331 | |||
332 | /** \return Icon for given message type. | ||
333 | */ | ||
334 | ✗ | const QIcon &MessageModel::getIcon(Message::Type type) const | |
335 | { | ||
336 | ✗ | return impl->iconHash[type]; | |
337 | } | ||
338 | |||
339 | /****************************************************************************/ | ||
340 | |||
341 | /** Sets the path (url) to an icon for a specific message type. | ||
342 | If the model is used with QML views this is the only way | ||
343 | to store the icon information. | ||
344 | */ | ||
345 | ✗ | void MessageModel::setIconPath(Message::Type type, const QString &iconPath) | |
346 | { | ||
347 | ✗ | impl->iconPathHash[type] = iconPath; | |
348 | // and also add it to the iconHash | ||
349 | ✗ | setIcon(type, QIcon(iconPath)); | |
350 | /* vice versa would be nice, but does not work because | ||
351 | to a QIcon the Path is not known */ | ||
352 | } | ||
353 | |||
354 | /****************************************************************************/ | ||
355 | |||
356 | ✗ | QVariantMap QtPdCom::MessageModel::getIconPathMap() const | |
357 | { | ||
358 | ✗ | const auto metaEnum = QMetaEnum::fromType<Message::Type>(); | |
359 | ✗ | QVariantMap ans; | |
360 | ✗ | for (auto it = impl->iconPathHash.keyBegin(); | |
361 | ✗ | it != impl->iconPathHash.keyEnd(); | |
362 | ++it) { | ||
363 | ✗ | ans[QString(metaEnum.valueToKey(*it))] = impl->iconPathHash[*it]; | |
364 | } | ||
365 | ✗ | return ans; | |
366 | } | ||
367 | |||
368 | /****************************************************************************/ | ||
369 | |||
370 | ✗ | void QtPdCom::MessageModel::setIconPathMap(QVariantMap const map) | |
371 | { | ||
372 | ✗ | const auto metaEnum = QMetaEnum::fromType<Message::Type>(); | |
373 | ✗ | bool ok = false; | |
374 | ✗ | for (auto it = map.keyBegin(); it != map.keyEnd(); ++it) { | |
375 | const auto key_enum = | ||
376 | ✗ | metaEnum.keyToValue(it->toStdString().c_str(), &ok); | |
377 | ✗ | if (ok) { | |
378 | ✗ | setIconPath( | |
379 | static_cast<QtPdCom::Message::Type>(key_enum), | ||
380 | ✗ | map[*it].toString()); | |
381 | } | ||
382 | } | ||
383 | } | ||
384 | |||
385 | /****************************************************************************/ | ||
386 | |||
387 | /** Implements the model interface. | ||
388 | * | ||
389 | * \returns Number of active messages. | ||
390 | */ | ||
391 | 3395 | int MessageModel::rowCount(const QModelIndex &index) const | |
392 | { | ||
393 |
2/2✓ Branch 1 taken 3140 times.
✓ Branch 2 taken 255 times.
|
3395 | if (!index.isValid()) { |
394 | 3140 | return impl->messageItemList.count(); | |
395 | } | ||
396 | else { | ||
397 | 255 | return 0; | |
398 | } | ||
399 | } | ||
400 | |||
401 | /****************************************************************************/ | ||
402 | |||
403 | /** Implements the model interface. | ||
404 | * | ||
405 | * \returns Number of columns. | ||
406 | */ | ||
407 | 2525 | int MessageModel::columnCount(const QModelIndex &index) const | |
408 | { | ||
409 | Q_UNUSED(index); | ||
410 | 2525 | return 3; | |
411 | } | ||
412 | |||
413 | /****************************************************************************/ | ||
414 | |||
415 | /** Implements the Model interface. | ||
416 | */ | ||
417 | 393 | QVariant MessageModel::data(const QModelIndex &index, int role) const | |
418 | { | ||
419 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 393 times.
|
393 | if (!index.isValid()) { |
420 | ✗ | return QVariant(); | |
421 | } | ||
422 | |||
423 | 393 | auto msgItem = impl->messageItemList[index.row()]; | |
424 | |||
425 |
3/4✓ Branch 1 taken 339 times.
✓ Branch 2 taken 38 times.
✓ Branch 3 taken 16 times.
✗ Branch 4 not taken.
|
393 | switch (index.column()) { |
426 | 339 | case TextColumn: // text | |
427 |
3/8✓ Branch 0 taken 94 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 35 times.
✓ Branch 7 taken 210 times.
|
339 | switch (role) { |
428 | 94 | case Qt::DisplayRole: | |
429 |
1/2✓ Branch 4 taken 94 times.
✗ Branch 5 not taken.
|
94 | return msgItem->getText(impl->lang); |
430 | ✗ | case Qt::DecorationRole: | |
431 | ✗ | return impl->iconHash[msgItem->getType()]; | |
432 | ✗ | case DecorationPathRole: | |
433 | ✗ | return impl->iconPathHash[msgItem->getType()]; | |
434 | ✗ | case TimeStringRole: | |
435 | // it is necessary to return other columns under | ||
436 | // column 0 because in QML a View can't address | ||
437 | // from column but only from roles | ||
438 | ✗ | return msgItem->getTimeString(); | |
439 | ✗ | case ResetTimeStringRole: | |
440 | ✗ | return msgItem->getResetTimeString(); | |
441 | ✗ | case MessageTypeRole: | |
442 | ✗ | return msgItem->getType(); | |
443 | 35 | case Qt::ToolTipRole: | |
444 | 35 | return impl->wrapText( | |
445 |
2/4✓ Branch 5 taken 35 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 35 times.
✗ Branch 9 not taken.
|
35 | msgItem->getDescription(impl->lang)); |
446 | 210 | default: | |
447 | 210 | return QVariant(); | |
448 | } | ||
449 | break; | ||
450 | |||
451 | 38 | case TimeOccurredColumn: // set time | |
452 |
1/3✓ Branch 0 taken 38 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
38 | switch (role) { |
453 | 38 | case Qt::DisplayRole: | |
454 |
1/2✓ Branch 3 taken 38 times.
✗ Branch 4 not taken.
|
38 | return msgItem->getTimeString(); |
455 | ✗ | case Qt::UserRole + 1: | |
456 | ✗ | return ""; | |
457 | ✗ | default: | |
458 | ✗ | return QVariant(); | |
459 | } | ||
460 | break; | ||
461 | |||
462 | 16 | case TimeResetColumn: // reset time | |
463 |
1/3✓ Branch 0 taken 16 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
16 | switch (role) { |
464 | 16 | case Qt::DisplayRole: | |
465 |
1/2✓ Branch 3 taken 16 times.
✗ Branch 4 not taken.
|
16 | return msgItem->getResetTimeString(); |
466 | ✗ | case Qt::UserRole + 1: | |
467 | ✗ | return ""; | |
468 | ✗ | default: | |
469 | ✗ | return QVariant(); | |
470 | } | ||
471 | break; | ||
472 | |||
473 | ✗ | default: | |
474 | ✗ | return QVariant(); | |
475 | } | ||
476 | } | ||
477 | |||
478 | /****************************************************************************/ | ||
479 | |||
480 | /** Implements the Model interface. | ||
481 | */ | ||
482 | QVariant | ||
483 | ✗ | MessageModel::headerData(int section, Qt::Orientation o, int role) const | |
484 | { | ||
485 | ✗ | if (role == Qt::DisplayRole && o == Qt::Horizontal) { | |
486 | ✗ | switch (section) { | |
487 | ✗ | case TextColumn: | |
488 | ✗ | return QtPdCom::MessageModel::tr("Message"); | |
489 | |||
490 | ✗ | case TimeOccurredColumn: | |
491 | ✗ | return QtPdCom::MessageModel::tr("Time"); | |
492 | |||
493 | ✗ | case TimeResetColumn: | |
494 | ✗ | return QtPdCom::MessageModel::tr("Reset"); | |
495 | |||
496 | ✗ | default: | |
497 | ✗ | return QVariant(); | |
498 | } | ||
499 | } | ||
500 | else { | ||
501 | ✗ | return QVariant(); | |
502 | } | ||
503 | } | ||
504 | |||
505 | /****************************************************************************/ | ||
506 | |||
507 | /** Implements the Model interface. | ||
508 | */ | ||
509 | 119 | Qt::ItemFlags MessageModel::flags(const QModelIndex &index) const | |
510 | { | ||
511 |
2/2✓ Branch 1 taken 79 times.
✓ Branch 2 taken 40 times.
|
119 | if (!index.isValid()) { |
512 | 79 | return Qt::ItemFlags(); | |
513 | } | ||
514 | |||
515 | 40 | auto msgItem {impl->messageItemList[index.row()]}; | |
516 |
2/2✓ Branch 1 taken 22 times.
✓ Branch 2 taken 18 times.
|
40 | return msgItem->isActive() ? Qt::ItemIsEnabled : Qt::ItemFlags(); |
517 | } | ||
518 | |||
519 | /****************************************************************************/ | ||
520 | |||
521 | /** Additional Rolename for decoration for use in QML views | ||
522 | */ | ||
523 | |||
524 | 79 | QHash<int, QByteArray> MessageModel::roleNames() const | |
525 | { | ||
526 | // default role names | ||
527 | 79 | QHash<int, QByteArray> roles = QAbstractTableModel::roleNames(); | |
528 | |||
529 | // extended role names | ||
530 |
2/4✓ Branch 2 taken 79 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 79 times.
✗ Branch 6 not taken.
|
79 | roles[DecorationPathRole] = "decorationPath"; |
531 |
2/4✓ Branch 2 taken 79 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 79 times.
✗ Branch 6 not taken.
|
79 | roles[TimeStringRole] = "timeString"; |
532 |
2/4✓ Branch 2 taken 79 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 79 times.
✗ Branch 6 not taken.
|
79 | roles[ResetTimeStringRole] = "resetTimeString"; |
533 |
2/4✓ Branch 2 taken 79 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 79 times.
✗ Branch 6 not taken.
|
79 | roles[MessageTypeRole] = "messageTyp"; |
534 | 79 | return roles; | |
535 | } | ||
536 | |||
537 | /****************************************************************************/ | ||
538 | |||
539 | 81 | void MessageModel::fetchMore(const QModelIndex &parent) | |
540 | { | ||
541 | #if PD_DEBUG_MESSAGE_MODEL | ||
542 |
3/6✓ Branch 6 taken 81 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 81 times.
✗ Branch 10 not taken.
✓ Branch 13 taken 81 times.
✗ Branch 14 not taken.
|
81 | qDebug() << __func__ << parent; |
543 | #endif | ||
544 |
2/2✓ Branch 1 taken 4 times.
✓ Branch 2 taken 77 times.
|
81 | if (canFetchMore(parent)) { |
545 | #if PD_DEBUG_MESSAGE_MODEL | ||
546 |
4/8✓ Branch 6 taken 4 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 4 times.
✗ Branch 10 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 4 times.
✗ Branch 17 not taken.
|
4 | qDebug() << __func__ << parent << "fetching"; |
547 | #endif | ||
548 | 4 | impl->getHistoryMessage(); | |
549 | } | ||
550 | 81 | } | |
551 | |||
552 | /****************************************************************************/ | ||
553 | |||
554 | 197 | bool MessageModel::canFetchMore(const QModelIndex &parent) const | |
555 | { | ||
556 |
2/2✓ Branch 2 taken 8 times.
✓ Branch 3 taken 189 times.
|
394 | bool ret = !parent.isValid() and impl->canFetchMore |
557 |
1/2✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
|
8 | and impl->historicSeqNo |
558 |
2/4✓ Branch 0 taken 197 times.
✗ Branch 1 not taken.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
|
205 | and impl->messageItemList.count() < impl->rowLimit; |
559 | #if PD_DEBUG_MESSAGE_MODEL | ||
560 |
6/12✓ Branch 5 taken 197 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 197 times.
✗ Branch 9 not taken.
✓ Branch 12 taken 197 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 197 times.
✗ Branch 16 not taken.
✓ Branch 19 taken 197 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 197 times.
✗ Branch 23 not taken.
|
394 | qDebug() << __func__ << parent << "can" << impl->canFetchMore << "hist" |
561 |
2/4✓ Branch 2 taken 197 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 197 times.
✗ Branch 6 not taken.
|
197 | << impl->historicSeqNo << "space" |
562 |
2/4✓ Branch 4 taken 197 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 197 times.
✗ Branch 8 not taken.
|
197 | << (impl->messageItemList.count() < impl->rowLimit) << "ret" |
563 |
1/2✓ Branch 2 taken 197 times.
✗ Branch 3 not taken.
|
394 | << ret; |
564 | #endif | ||
565 | 197 | return ret; | |
566 | } | ||
567 | |||
568 | /****************************************************************************/ | ||
569 | |||
570 | /** Event handler. | ||
571 | */ | ||
572 | ✗ | bool MessageModel::event(QEvent *event /**< Paint event flags. */ | |
573 | ) | ||
574 | { | ||
575 | ✗ | if (event->type() == QEvent::LanguageChange) { | |
576 | ✗ | emit headerDataChanged(Qt::Horizontal, 0, 1); | |
577 | } | ||
578 | |||
579 | ✗ | return QAbstractTableModel::event(event); | |
580 | } | ||
581 | |||
582 | /****************************************************************************/ | ||
583 |