##// END OF EJS Templates
graph mode with a "New Zone"
trabillard -
r1377:13ac2b0ff0d5
parent child
Show More
@@ -1,599 +1,617
1 1 #include "Catalogue/CatalogueEventsWidget.h"
2 2 #include "ui_CatalogueEventsWidget.h"
3 3
4 4 #include <Catalogue/CatalogueController.h>
5 5 #include <Catalogue/CatalogueEventsModel.h>
6 6 #include <Catalogue/CatalogueExplorerHelper.h>
7 7 #include <CatalogueDao.h>
8 8 #include <DBCatalogue.h>
9 9 #include <DBEventProduct.h>
10 10 #include <DataSource/DataSourceController.h>
11 11 #include <DataSource/DataSourceItem.h>
12 12 #include <SqpApplication.h>
13 13 #include <Variable/Variable.h>
14 14 #include <Variable/VariableController.h>
15 15 #include <Visualization/VisualizationGraphWidget.h>
16 16 #include <Visualization/VisualizationTabWidget.h>
17 17 #include <Visualization/VisualizationWidget.h>
18 18 #include <Visualization/VisualizationZoneWidget.h>
19 19
20 20 #include <QActionGroup>
21 21 #include <QDialog>
22 22 #include <QDialogButtonBox>
23 23 #include <QKeyEvent>
24 24 #include <QListWidget>
25 25 #include <QMenu>
26 26 #include <QMessageBox>
27 27
28 28 Q_LOGGING_CATEGORY(LOG_CatalogueEventsWidget, "CatalogueEventsWidget")
29 29
30 30 /// Percentage added to the range of a event when it is displayed
31 31 const auto EVENT_RANGE_MARGE = 30; // in %
32 32
33 const QString NEW_ZONE_TEXT = QStringLiteral("New Zone");
34
33 35 struct CatalogueEventsWidget::CatalogueEventsWidgetPrivate {
34 36
35 37 CatalogueEventsModel *m_Model = nullptr;
36 38 QStringList m_ZonesForTimeMode;
37 39 QString m_ZoneForGraphMode;
38 40 QVector<std::shared_ptr<DBCatalogue> > m_DisplayedCatalogues;
39 41 bool m_AllEventDisplayed = false;
40 42 QVector<VisualizationGraphWidget *> m_CustomGraphs;
41 43
42 44 VisualizationWidget *m_VisualizationWidget = nullptr;
43 45
44 46 void setEvents(const QVector<std::shared_ptr<DBEvent> > &events, CatalogueEventsWidget *widget)
45 47 {
46 48 widget->ui->treeView->setSortingEnabled(false);
47 49 m_Model->setSourceCatalogues(m_DisplayedCatalogues);
48 50 m_Model->setEvents(events);
49 51 widget->ui->treeView->setSortingEnabled(true);
50 52
51 53 for (auto event : events) {
52 54 if (sqpApp->catalogueController().eventHasChanges(event)) {
53 55 auto index = m_Model->indexOf(event);
54 56 widget->setEventChanges(event, true);
55 57 }
56 58 }
57 59 }
58 60
59 61 void addEvent(const std::shared_ptr<DBEvent> &event, QTreeView *treeView)
60 62 {
61 63 treeView->setSortingEnabled(false);
62 64 m_Model->addEvent(event);
63 65 treeView->setSortingEnabled(true);
64 66 }
65 67
66 68 void removeEvent(const std::shared_ptr<DBEvent> &event, QTreeView *treeView)
67 69 {
68 70 treeView->setSortingEnabled(false);
69 71 m_Model->removeEvent(event);
70 72 treeView->setSortingEnabled(true);
71 73 }
72 74
73 75 QStringList getAvailableVisualizationZoneList() const
74 76 {
75 77 if (m_VisualizationWidget) {
76 78 if (auto tab = m_VisualizationWidget->currentTabWidget()) {
77 79 return tab->availableZoneWidgets();
78 80 }
79 81 }
80 82
81 83 return QStringList{};
82 84 }
83 85
84 86 QStringList selectZone(QWidget *parent, const QStringList &selectedZones,
85 bool allowMultiSelection, const QPoint &location)
87 bool allowMultiSelection, bool addNewZoneOption, const QPoint &location)
86 88 {
87 89 auto availableZones = getAvailableVisualizationZoneList();
88 if (availableZones.isEmpty()) {
90 if (!addNewZoneOption && availableZones.isEmpty()) {
89 91 return QStringList{};
90 92 }
91 93
92 94 QActionGroup actionGroup{parent};
93 95 actionGroup.setExclusive(!allowMultiSelection);
94 96
97 QVector<QAction *> zoneActions;
98
95 99 QMenu selectionMenu{parent};
100
101 if (addNewZoneOption) {
102 availableZones.prepend(NEW_ZONE_TEXT);
103 }
104
96 105 selectionMenu.addSeparator();
97 QVector<QAction *> zoneActions;
98 106 for (auto zone : availableZones) {
99 107 auto zoneAction = selectionMenu.addAction(zone);
100 108 zoneAction->setCheckable(true);
101 109 zoneAction->setChecked(selectedZones.contains(zone));
102 110 actionGroup.addAction(zoneAction);
103 111 zoneActions << zoneAction;
104 112 }
105 113
106 auto action = selectionMenu.exec(QCursor::pos());
114 auto resultAction = selectionMenu.exec(QCursor::pos());
107 115
108 116 QStringList result;
109 117
110 if (action == nullptr) {
118 if (resultAction == nullptr) {
111 119 result = selectedZones;
112 120 }
113 121 else {
114 122 for (auto zoneAction : zoneActions) {
115 123 if (zoneAction->isChecked()) {
116 124 result << zoneAction->text();
117 125 }
118 126 }
119 127 }
120 128
121 129 return result;
122 130 }
123 131
124 132 void updateForTimeMode(QTreeView *treeView)
125 133 {
126 134 auto selectedRows = treeView->selectionModel()->selectedRows();
127 135
128 136 if (selectedRows.count() == 1) {
129 137 auto event = m_Model->getEvent(selectedRows.first());
130 138 if (event) {
131 139 if (m_VisualizationWidget) {
132 140 if (auto tab = m_VisualizationWidget->currentTabWidget()) {
133 141
134 142 for (auto zoneName : m_ZonesForTimeMode) {
135 143 if (auto zone = tab->getZoneWithName(zoneName)) {
136 144 SqpRange eventRange;
137 145 eventRange.m_TStart = event->getTStart();
138 146 eventRange.m_TEnd = event->getTEnd();
139 147 zone->setZoneRange(eventRange);
140 148 }
141 149 }
142 150 }
143 151 else {
144 152 qCWarning(LOG_CatalogueEventsWidget())
145 153 << "updateTimeZone: no tab found in the visualization";
146 154 }
147 155 }
148 156 else {
149 157 qCWarning(LOG_CatalogueEventsWidget())
150 158 << "updateTimeZone: visualization widget not found";
151 159 }
152 160 }
153 161 }
154 162 else {
155 163 qCWarning(LOG_CatalogueEventsWidget())
156 164 << "updateTimeZone: not compatible with multiple events selected";
157 165 }
158 166 }
159 167
160 168 QVector<SqpRange> getGraphRanges(const std::shared_ptr<DBEvent> &event)
161 169 {
162 170 // Retrieves the range of each product and the maximum size
163 171 QVector<SqpRange> graphRanges;
164 172 double maxDt = 0;
165 173 for (auto eventProduct : event->getEventProducts()) {
166 174 SqpRange eventRange;
167 175 eventRange.m_TStart = eventProduct.getTStart();
168 176 eventRange.m_TEnd = eventProduct.getTEnd();
169 177 graphRanges << eventRange;
170 178
171 179 auto dt = eventRange.m_TEnd - eventRange.m_TStart;
172 180 if (dt > maxDt) {
173 181 maxDt = dt;
174 182 }
175 183 }
176 184
177 185 // Adds the marge
178 186 maxDt *= (100.0 + EVENT_RANGE_MARGE) / 100.0;
179 187
180 188 // Corrects the graph ranges so that they all have the same size
181 189 QVector<SqpRange> correctedGraphRanges;
182 190 for (auto range : graphRanges) {
183 191 auto dt = range.m_TEnd - range.m_TStart;
184 192 auto diff = qAbs((maxDt - dt) / 2.0);
185 193
186 194 SqpRange correctedRange;
187 195 correctedRange.m_TStart = range.m_TStart - diff;
188 196 correctedRange.m_TEnd = range.m_TEnd + diff;
189 197
190 198 correctedGraphRanges << correctedRange;
191 199 }
192 200
193 201 return correctedGraphRanges;
194 202 }
195 203
196 204 void updateForGraphMode(CatalogueEventsWidget *catalogueEventWidget)
197 205 {
198 206 auto selectedRows = catalogueEventWidget->ui->treeView->selectionModel()->selectedRows();
199 207 if (selectedRows.count() != 1) {
200 208 qCWarning(LOG_CatalogueEventsWidget())
201 209 << "updateGraphMode: not compatible with multiple events selected";
202 210 return;
203 211 }
204 212
205 213 if (!m_VisualizationWidget) {
206 214 qCWarning(LOG_CatalogueEventsWidget())
207 215 << "updateGraphMode: visualization widget not found";
208 216 return;
209 217 }
210 218
211 219 auto event = m_Model->getEvent(selectedRows.first());
212 220 if (!event) {
213 221 // A event product is probably selected
214 222 qCInfo(LOG_CatalogueEventsWidget()) << "updateGraphMode: no events are selected";
215 223 return;
216 224 }
217 225
218 226 auto tab = m_VisualizationWidget->currentTabWidget();
219 227 if (!tab) {
220 228 qCWarning(LOG_CatalogueEventsWidget())
221 229 << "updateGraphMode: no tab found in the visualization";
222 230 return;
223 231 }
224 232
233 auto isNewZone = m_ZoneForGraphMode == NEW_ZONE_TEXT;
225 234 auto zone = tab->getZoneWithName(m_ZoneForGraphMode);
226 if (!zone) {
235 if (!isNewZone && !zone) {
227 236 qCWarning(LOG_CatalogueEventsWidget()) << "updateGraphMode: zone not found";
228 237 return;
229 238 }
230 239
231 240 // Closes the previous graph and delete the asociated variables
232 241 for (auto graph : m_CustomGraphs) {
233 242 graph->close();
234 243 auto variables = graph->variables().toVector();
235 244
236 245 QMetaObject::invokeMethod(&sqpApp->variableController(), "deleteVariables",
237 246 Qt::QueuedConnection,
238 247 Q_ARG(QVector<std::shared_ptr<Variable> >, variables));
239 248 }
240 249 m_CustomGraphs.clear();
241 250
242 251 // Closes the remaining graphs inside the zone
243 zone->closeAllGraphs();
252 if (zone) {
253 zone->closeAllGraphs();
254 }
255
256 // Creates the zone if needed
257 if (isNewZone) {
258 zone = tab->createEmptyZone(0);
259 m_ZoneForGraphMode = zone->name();
260 }
244 261
245 262 // Calculates the range of each graph which will be created
246 263 auto graphRange = getGraphRanges(event);
247 264
248 265 // Loops through the event products and create the graph
249 266 auto itRange = graphRange.cbegin();
250 267 for (auto eventProduct : event->getEventProducts()) {
251 268 auto productId = eventProduct.getProductId();
252 269
253 270 auto range = *itRange;
254 271 ++itRange;
255 272
256 273 SqpRange productRange;
257 274 productRange.m_TStart = eventProduct.getTStart();
258 275 productRange.m_TEnd = eventProduct.getTEnd();
259 276
260 277 auto context = new QObject{catalogueEventWidget};
261 278 QObject::connect(
262 279 &sqpApp->variableController(), &VariableController::variableAdded, context,
263 280 [this, catalogueEventWidget, zone, context, event, range, productRange,
264 281 productId](auto variable) {
265 282
266 283 if (variable->metadata().value(DataSourceItem::ID_DATA_KEY).toString()
267 284 == productId) {
268 285 auto graph = zone->createGraph(variable);
269 286 graph->setAutoRangeOnVariableInitialization(false);
270 287
271 288 auto selectionZone
272 289 = graph->addSelectionZone(event->getName(), productRange);
273 290 emit catalogueEventWidget->selectionZoneAdded(event, productId,
274 291 selectionZone);
275 292 m_CustomGraphs << graph;
276 293
277 294 graph->setGraphRange(range, true);
278 295
279 296 // Removes the graph from the graph list if it is closed manually
280 297 QObject::connect(graph, &VisualizationGraphWidget::destroyed,
281 298 [this, graph]() { m_CustomGraphs.removeAll(graph); });
282 299
283 300 delete context; // removes the connection
284 301 }
285 302 },
286 303 Qt::QueuedConnection);
287 304
288 305 QMetaObject::invokeMethod(&sqpApp->dataSourceController(),
289 306 "requestVariableFromProductIdKey", Qt::QueuedConnection,
290 307 Q_ARG(QString, productId));
291 308 }
292 309 }
293 310
294 311 void getSelectedItems(
295 312 QTreeView *treeView, QVector<std::shared_ptr<DBEvent> > &events,
296 313 QVector<QPair<std::shared_ptr<DBEvent>, std::shared_ptr<DBEventProduct> > > &eventProducts)
297 314 {
298 315 for (auto rowIndex : treeView->selectionModel()->selectedRows()) {
299 316 auto itemType = m_Model->itemTypeOf(rowIndex);
300 317 if (itemType == CatalogueEventsModel::ItemType::Event) {
301 318 events << m_Model->getEvent(rowIndex);
302 319 }
303 320 else if (itemType == CatalogueEventsModel::ItemType::EventProduct) {
304 321 eventProducts << qMakePair(m_Model->getParentEvent(rowIndex),
305 322 m_Model->getEventProduct(rowIndex));
306 323 }
307 324 }
308 325 }
309 326 };
310 327
311 328 CatalogueEventsWidget::CatalogueEventsWidget(QWidget *parent)
312 329 : QWidget(parent),
313 330 ui(new Ui::CatalogueEventsWidget),
314 331 impl{spimpl::make_unique_impl<CatalogueEventsWidgetPrivate>()}
315 332 {
316 333 ui->setupUi(this);
317 334
318 335 impl->m_Model = new CatalogueEventsModel{this};
319 336 ui->treeView->setModel(impl->m_Model);
320 337
321 338 ui->treeView->setSortingEnabled(true);
322 339 ui->treeView->setDragDropMode(QAbstractItemView::DragDrop);
323 340 ui->treeView->setDragEnabled(true);
324 341
325 342
326 343 connect(ui->btnTime, &QToolButton::clicked, [this](auto checked) {
327 344 if (checked) {
328 345 ui->btnChart->setChecked(false);
329 346 impl->m_ZonesForTimeMode
330 = impl->selectZone(this, impl->m_ZonesForTimeMode, true,
347 = impl->selectZone(this, impl->m_ZonesForTimeMode, true, false,
331 348 this->mapToGlobal(ui->btnTime->frameGeometry().center()));
332 349
333 350 impl->updateForTimeMode(ui->treeView);
334 351 }
335 352 });
336 353
337 354 connect(ui->btnChart, &QToolButton::clicked, [this](auto checked) {
338 355 if (checked) {
339 356 ui->btnTime->setChecked(false);
357
340 358 impl->m_ZoneForGraphMode
341 = impl->selectZone(this, {impl->m_ZoneForGraphMode}, false,
359 = impl->selectZone(this, {impl->m_ZoneForGraphMode}, false, true,
342 360 this->mapToGlobal(ui->btnChart->frameGeometry().center()))
343 361 .value(0);
344 362
345 363 impl->updateForGraphMode(this);
346 364 }
347 365 });
348 366
349 367 connect(ui->btnRemove, &QToolButton::clicked, [this]() {
350 368 QVector<std::shared_ptr<DBEvent> > events;
351 369 QVector<QPair<std::shared_ptr<DBEvent>, std::shared_ptr<DBEventProduct> > > eventProducts;
352 370 impl->getSelectedItems(ui->treeView, events, eventProducts);
353 371
354 372 if (!events.isEmpty() && eventProducts.isEmpty()) {
355 373
356 374 auto canRemoveEvent
357 375 = !this->isAllEventsDisplayed()
358 376 || (QMessageBox::warning(
359 377 this, tr("Remove Event(s)"),
360 378 tr("The selected event(s) will be permanently removed "
361 379 "from the repository!\nAre you sure you want to continue?"),
362 380 QMessageBox::Yes | QMessageBox::No, QMessageBox::No)
363 381 == QMessageBox::Yes);
364 382
365 383 if (canRemoveEvent) {
366 384 for (auto event : events) {
367 385 if (this->isAllEventsDisplayed()) {
368 386 sqpApp->catalogueController().removeEvent(event);
369 387 impl->removeEvent(event, ui->treeView);
370 388 }
371 389 else {
372 390 QVector<std::shared_ptr<DBCatalogue> > modifiedCatalogues;
373 391 for (auto catalogue : this->displayedCatalogues()) {
374 392 if (catalogue->removeEvent(event->getUniqId())) {
375 393 sqpApp->catalogueController().updateCatalogue(catalogue);
376 394 modifiedCatalogues << catalogue;
377 395 }
378 396 }
379 397 if (!modifiedCatalogues.empty()) {
380 398 emit eventCataloguesModified(modifiedCatalogues);
381 399 }
382 400 }
383 401 impl->m_Model->removeEvent(event);
384 402 }
385 403
386 404
387 405 emit this->eventsRemoved(events);
388 406 }
389 407 }
390 408 });
391 409
392 410 connect(ui->treeView, &QTreeView::clicked, this, &CatalogueEventsWidget::emitSelection);
393 411 connect(ui->treeView->selectionModel(), &QItemSelectionModel::selectionChanged, this,
394 412 &CatalogueEventsWidget::emitSelection);
395 413
396 414 ui->btnRemove->setEnabled(false); // Disabled by default when nothing is selected
397 415 connect(ui->treeView->selectionModel(), &QItemSelectionModel::selectionChanged, [this]() {
398 416 auto isNotMultiSelection = ui->treeView->selectionModel()->selectedRows().count() <= 1;
399 417 ui->btnChart->setEnabled(isNotMultiSelection);
400 418 ui->btnTime->setEnabled(isNotMultiSelection);
401 419
402 420 if (isNotMultiSelection && ui->btnTime->isChecked()) {
403 421 impl->updateForTimeMode(ui->treeView);
404 422 }
405 423 else if (isNotMultiSelection && ui->btnChart->isChecked()) {
406 424 impl->updateForGraphMode(this);
407 425 }
408 426
409 427 QVector<std::shared_ptr<DBEvent> > events;
410 428 QVector<QPair<std::shared_ptr<DBEvent>, std::shared_ptr<DBEventProduct> > > eventProducts;
411 429 impl->getSelectedItems(ui->treeView, events, eventProducts);
412 430 ui->btnRemove->setEnabled(!events.isEmpty() && eventProducts.isEmpty());
413 431 });
414 432
415 433 ui->treeView->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
416 434 ui->treeView->header()->setSectionResizeMode((int)CatalogueEventsModel::Column::Tags,
417 435 QHeaderView::Stretch);
418 436 ui->treeView->header()->setSectionResizeMode((int)CatalogueEventsModel::Column::Validation,
419 437 QHeaderView::ResizeToContents);
420 438 ui->treeView->header()->setSectionResizeMode((int)CatalogueEventsModel::Column::Name,
421 439 QHeaderView::Interactive);
422 440 ui->treeView->header()->setSectionResizeMode((int)CatalogueEventsModel::Column::TStart,
423 441 QHeaderView::ResizeToContents);
424 442 ui->treeView->header()->setSectionResizeMode((int)CatalogueEventsModel::Column::TEnd,
425 443 QHeaderView::ResizeToContents);
426 444 ui->treeView->header()->setSortIndicatorShown(true);
427 445
428 446 connect(impl->m_Model, &CatalogueEventsModel::modelSorted, [this]() {
429 447 auto allEvents = impl->m_Model->events();
430 448 for (auto event : allEvents) {
431 449 setEventChanges(event, sqpApp->catalogueController().eventHasChanges(event));
432 450 }
433 451 });
434 452
435 453 populateWithAllEvents();
436 454 }
437 455
438 456 CatalogueEventsWidget::~CatalogueEventsWidget()
439 457 {
440 458 delete ui;
441 459 }
442 460
443 461 void CatalogueEventsWidget::setVisualizationWidget(VisualizationWidget *visualization)
444 462 {
445 463 impl->m_VisualizationWidget = visualization;
446 464 }
447 465
448 466 void CatalogueEventsWidget::addEvent(const std::shared_ptr<DBEvent> &event)
449 467 {
450 468 impl->addEvent(event, ui->treeView);
451 469 }
452 470
453 471 void CatalogueEventsWidget::setEventChanges(const std::shared_ptr<DBEvent> &event, bool hasChanges)
454 472 {
455 473 impl->m_Model->refreshEvent(event);
456 474
457 475 auto eventIndex = impl->m_Model->indexOf(event);
458 476 auto validationIndex
459 477 = eventIndex.sibling(eventIndex.row(), (int)CatalogueEventsModel::Column::Validation);
460 478
461 479 if (validationIndex.isValid()) {
462 480 if (hasChanges) {
463 481 if (ui->treeView->indexWidget(validationIndex) == nullptr) {
464 482 auto widget = CatalogueExplorerHelper::buildValidationWidget(
465 483 ui->treeView,
466 484 [this, event]() {
467 485 sqpApp->catalogueController().saveEvent(event);
468 486 setEventChanges(event, false);
469 487 },
470 488 [this, event]() {
471 489 bool removed = false;
472 490 sqpApp->catalogueController().discardEvent(event, removed);
473 491 if (removed) {
474 492 impl->m_Model->removeEvent(event);
475 493 }
476 494 else {
477 495 setEventChanges(event, false);
478 496 impl->m_Model->refreshEvent(event, true);
479 497 }
480 498 emitSelection();
481 499 });
482 500 ui->treeView->setIndexWidget(validationIndex, widget);
483 501 ui->treeView->header()->resizeSection((int)CatalogueEventsModel::Column::Validation,
484 502 QHeaderView::ResizeToContents);
485 503 }
486 504 }
487 505 else {
488 506 // Note: the widget is destroyed
489 507 ui->treeView->setIndexWidget(validationIndex, nullptr);
490 508 }
491 509 }
492 510 else {
493 511 qCWarning(LOG_CatalogueEventsWidget())
494 512 << "setEventChanges: the event is not displayed in the model.";
495 513 }
496 514 }
497 515
498 516 QVector<std::shared_ptr<DBCatalogue> > CatalogueEventsWidget::displayedCatalogues() const
499 517 {
500 518 return impl->m_DisplayedCatalogues;
501 519 }
502 520
503 521 bool CatalogueEventsWidget::isAllEventsDisplayed() const
504 522 {
505 523 return impl->m_AllEventDisplayed;
506 524 }
507 525
508 526 bool CatalogueEventsWidget::isEventDisplayed(const std::shared_ptr<DBEvent> &event) const
509 527 {
510 528 return impl->m_Model->indexOf(event).isValid();
511 529 }
512 530
513 531 void CatalogueEventsWidget::refreshEvent(const std::shared_ptr<DBEvent> &event)
514 532 {
515 533 impl->m_Model->refreshEvent(event, true);
516 534 }
517 535
518 536 void CatalogueEventsWidget::populateWithCatalogues(
519 537 const QVector<std::shared_ptr<DBCatalogue> > &catalogues)
520 538 {
521 539 impl->m_DisplayedCatalogues = catalogues;
522 540 impl->m_AllEventDisplayed = false;
523 541
524 542 QSet<QUuid> eventIds;
525 543 QVector<std::shared_ptr<DBEvent> > events;
526 544
527 545 for (auto catalogue : catalogues) {
528 546 auto catalogueEvents = sqpApp->catalogueController().retrieveEventsFromCatalogue(catalogue);
529 547 for (auto event : catalogueEvents) {
530 548 if (!eventIds.contains(event->getUniqId())) {
531 549 events << event;
532 550 eventIds.insert(event->getUniqId());
533 551 }
534 552 }
535 553 }
536 554
537 555 impl->setEvents(events, this);
538 556 }
539 557
540 558 void CatalogueEventsWidget::populateWithAllEvents()
541 559 {
542 560 impl->m_DisplayedCatalogues.clear();
543 561 impl->m_AllEventDisplayed = true;
544 562
545 563 auto allEvents = sqpApp->catalogueController().retrieveAllEvents();
546 564
547 565 QVector<std::shared_ptr<DBEvent> > events;
548 566 for (auto event : allEvents) {
549 567 events << event;
550 568 }
551 569
552 570 impl->setEvents(events, this);
553 571 }
554 572
555 573 void CatalogueEventsWidget::clear()
556 574 {
557 575 impl->m_DisplayedCatalogues.clear();
558 576 impl->m_AllEventDisplayed = false;
559 577 impl->setEvents({}, this);
560 578 }
561 579
562 580 void CatalogueEventsWidget::refresh()
563 581 {
564 582 if (isAllEventsDisplayed()) {
565 583 populateWithAllEvents();
566 584 }
567 585 else if (!impl->m_DisplayedCatalogues.isEmpty()) {
568 586 populateWithCatalogues(impl->m_DisplayedCatalogues);
569 587 }
570 588 }
571 589
572 590 void CatalogueEventsWidget::emitSelection()
573 591 {
574 592 QVector<std::shared_ptr<DBEvent> > events;
575 593 QVector<QPair<std::shared_ptr<DBEvent>, std::shared_ptr<DBEventProduct> > > eventProducts;
576 594 impl->getSelectedItems(ui->treeView, events, eventProducts);
577 595
578 596 if (!events.isEmpty() && eventProducts.isEmpty()) {
579 597 emit eventsSelected(events);
580 598 }
581 599 else if (events.isEmpty() && !eventProducts.isEmpty()) {
582 600 emit eventProductsSelected(eventProducts);
583 601 }
584 602 else {
585 603 emit selectionCleared();
586 604 }
587 605 }
588 606
589 607
590 608 void CatalogueEventsWidget::keyPressEvent(QKeyEvent *event)
591 609 {
592 610 switch (event->key()) {
593 611 case Qt::Key_Delete: {
594 612 ui->btnRemove->click();
595 613 }
596 614 default:
597 615 break;
598 616 }
599 617 }
General Comments 0
You need to be logged in to leave comments. Login now