##// END OF EJS Templates
Some refactoring on PB11 wrappers...
Some refactoring on PB11 wrappers Most sciqlop core wrappers are moved into a dedicated python module. We needs to get rid off sqpapp! All current sciqlop modules should either be stateless or act as real singletons they must not need any app to be used. This will ease testing, wrapping and usage. Signed-off-by: Alexis Jeandet <alexis.jeandet@member.fsf.org>

File last commit:

r1327:07b2554d7734
r1341:f18e017310bc
Show More
CatalogueExplorer.cpp
207 lines | 8.1 KiB | text/x-c | CppLexer
/ gui / src / Catalogue / CatalogueExplorer.cpp
#include "Catalogue/CatalogueExplorer.h"
#include "ui_CatalogueExplorer.h"
#include <Catalogue/CatalogueActionManager.h>
#include <Catalogue/CatalogueController.h>
#include <SqpApplication.h>
#include <Visualization/VisualizationGraphWidget.h>
#include <Visualization/VisualizationSelectionZoneItem.h>
#include <Visualization/VisualizationWidget.h>
#include <DBCatalogue.h>
#include <DBEvent.h>
#include <DBEventProduct.h>
#include <unordered_map>
struct CatalogueExplorer::CatalogueExplorerPrivate {
CatalogueActionManager m_ActionManager;
std::unordered_map<std::shared_ptr<DBEvent>, QVector<VisualizationSelectionZoneItem *> >
m_SelectionZonesPerEvents;
QMetaObject::Connection m_Conn;
CatalogueExplorerPrivate(CatalogueExplorer *catalogueExplorer)
: m_ActionManager(catalogueExplorer)
{
}
};
CatalogueExplorer::CatalogueExplorer(QWidget *parent)
: QDialog(parent, Qt::Dialog | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint),
ui(new Ui::CatalogueExplorer),
impl{spimpl::make_unique_impl<CatalogueExplorerPrivate>(this)}
{
ui->setupUi(this);
impl->m_ActionManager.installSelectionZoneActions();
// Updates events and inspector when something is selected in the catalogue widget
connect(ui->catalogues, &CatalogueSideBarWidget::catalogueSelected, [this](auto catalogues) {
if (catalogues.count() == 1) {
ui->inspector->setCatalogue(catalogues.first());
}
else {
ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty);
}
ui->events->populateWithCatalogues(catalogues);
});
connect(ui->catalogues, &CatalogueSideBarWidget::databaseSelected, [this](auto databases) {
ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty);
});
connect(ui->catalogues, &CatalogueSideBarWidget::trashSelected, [this]() {
ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty);
ui->events->clear();
});
connect(ui->catalogues, &CatalogueSideBarWidget::allEventsSelected, [this]() {
ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty);
ui->events->populateWithAllEvents();
});
connect(ui->catalogues, &CatalogueSideBarWidget::databaseSelected, [this](auto databaseList) {
QVector<std::shared_ptr<DBCatalogue> > catalogueList;
for (auto database : databaseList) {
catalogueList.append(ui->catalogues->getCatalogues(database));
}
ui->events->populateWithCatalogues(catalogueList);
ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty);
});
connect(ui->catalogues, &CatalogueSideBarWidget::selectionCleared, [this]() {
ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty);
ui->events->clear();
});
connect(ui->catalogues, &CatalogueSideBarWidget::catalogueSaved, ui->events,
&CatalogueEventsWidget::refresh);
connect(ui->catalogues, &CatalogueSideBarWidget::catalogueListChanged,
[this]() { impl->m_ActionManager.refreshCreateInCatalogueAction(); });
// Updates the inspectot when something is selected in the events
connect(ui->events, &CatalogueEventsWidget::eventsSelected, [this](auto events) {
if (events.count() == 1) {
ui->inspector->setEvent(events.first());
}
else {
ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty);
}
});
connect(ui->events, &CatalogueEventsWidget::eventProductsSelected, [this](auto eventProducts) {
if (eventProducts.count() == 1) {
ui->inspector->setEventProduct(eventProducts.first().first,
eventProducts.first().second);
}
else {
ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty);
}
});
connect(ui->events, &CatalogueEventsWidget::selectionCleared,
[this]() { ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty); });
// Manage Selection Zones associated to events
connect(ui->events, &CatalogueEventsWidget::selectionZoneAdded,
[this](auto event, auto productId, auto zone) {
this->addSelectionZoneItem(event, productId, zone);
});
connect(ui->events, &CatalogueEventsWidget::eventsRemoved, [this](auto events) {
for (auto event : events) {
auto associatedSelectionZonesIt = impl->m_SelectionZonesPerEvents.find(event);
if (associatedSelectionZonesIt != impl->m_SelectionZonesPerEvents.cend()) {
for (auto selectionZone : associatedSelectionZonesIt->second) {
auto parentGraph = selectionZone->parentGraphWidget();
parentGraph->removeSelectionZone(selectionZone);
}
impl->m_SelectionZonesPerEvents.erase(event);
}
}
});
// Updates changes from the inspector
connect(ui->inspector, &CatalogueInspectorWidget::catalogueUpdated, [this](auto catalogue) {
sqpApp->catalogueController().updateCatalogue(catalogue);
ui->catalogues->setCatalogueChanges(catalogue, true);
impl->m_ActionManager.refreshCreateInCatalogueAction();
});
connect(ui->inspector, &CatalogueInspectorWidget::eventUpdated, [this](auto event) {
sqpApp->catalogueController().updateEvent(event);
ui->events->setEventChanges(event, true);
});
connect(ui->inspector, &CatalogueInspectorWidget::eventProductUpdated,
[this](auto event, auto eventProduct) {
sqpApp->catalogueController().updateEventProduct(eventProduct);
ui->events->setEventChanges(event, true);
});
connect(ui->events, &CatalogueEventsWidget::eventCataloguesModified,
[this](const QVector<std::shared_ptr<DBCatalogue> > &catalogues) {
for (auto catalogue : catalogues) {
ui->catalogues->setCatalogueChanges(catalogue, true);
}
});
}
CatalogueExplorer::~CatalogueExplorer()
{
disconnect(impl->m_Conn);
delete ui;
}
void CatalogueExplorer::setVisualizationWidget(VisualizationWidget *visualization)
{
ui->events->setVisualizationWidget(visualization);
}
CatalogueEventsWidget &CatalogueExplorer::eventsWidget() const
{
return *ui->events;
}
CatalogueSideBarWidget &CatalogueExplorer::sideBarWidget() const
{
return *ui->catalogues;
}
void CatalogueExplorer::clearSelectionZones()
{
impl->m_SelectionZonesPerEvents.clear();
}
void CatalogueExplorer::addSelectionZoneItem(const std::shared_ptr<DBEvent> &event,
const QString &productId,
VisualizationSelectionZoneItem *selectionZone)
{
impl->m_SelectionZonesPerEvents[event] << selectionZone;
connect(selectionZone, &VisualizationSelectionZoneItem::rangeEdited,
[event, productId, this](auto range) {
auto productList = event->getEventProducts();
for (auto &product : productList) {
if (product.getProductId() == productId) {
product.setTStart(range.m_TStart);
product.setTEnd(range.m_TEnd);
}
}
event->setEventProducts(productList);
sqpApp->catalogueController().updateEvent(event);
ui->events->refreshEvent(event);
ui->events->setEventChanges(event, true);
ui->inspector->refresh();
});
impl->m_Conn = connect(selectionZone, &VisualizationSelectionZoneItem::destroyed,
[event, selectionZone, this]() {
if (!impl->m_SelectionZonesPerEvents.empty()) {
impl->m_SelectionZonesPerEvents[event].removeAll(selectionZone);
}
});
}