#include "adduniversedialog.h" #include "lineeditdialog.h" #include "multiverseview.h" #include "multiversemodel.h" #include "ui_multiverseview.h" #include "universeview.h" #include /** * @brief MultiverseView::MultiverseView * @param parent */ MultiverseView::MultiverseView(QWidget *parent, QSacnNode *node) : QMainWindow(parent) , ui(new Ui::MultiverseView) , node(node) , model(new MultiverseModel(this, node)) , sortProxy(new QSortFilterProxyModel(this)) { ui->setupUi(this); ui->actionTerminate->setEnabled(false); ui->actionUnsubscribe->setEnabled(false); ui->actionInspect->setEnabled(false); ui->actionDiscovery->setChecked(node->discoveryEnabled()); ui->menubar->setNativeMenuBar(false); sortProxy->setSourceModel(model); auto mergeMode = new QActionGroup(this); mergeMode->addAction(ui->actionMergeModeHTP); mergeMode->addAction(ui->actionMergeModeLTP); ui->multiverseView->setModel(sortProxy); ui->multiverseView->setSortingEnabled(true); ui->multiverseView->sortByColumn(MultiverseModel::Column::Universe, Qt::SortOrder::AscendingOrder); ui->multiverseView->setContextMenuPolicy(Qt::CustomContextMenu); ui->multiverseView->expandAll(); for (int i = 0; i < ui->multiverseView->model()->rowCount(); i++) ui->multiverseView->setFirstColumnSpanned(i, QModelIndex(), true); connect(ui->multiverseView, &QTreeView::customContextMenuRequested, this, &MultiverseView::createContextMenu); connect(ui->multiverseView, &QTreeView::doubleClicked, this, &MultiverseView::createEditor); connect(ui->actionUACN, &QAction::triggered, this, &MultiverseView::showUacnEditor); connect(ui->actionInspect, &QAction::triggered, this, [this]() { auto selected = ui->multiverseView->currentIndex(); createEditor(selected); }); connect(ui->actionCreate, &QAction::triggered, this, [this, node]() { auto dialog = new AddUniverseDialog(this, 1, tr("Create Universe")); connect(dialog, &AddUniverseDialog::additionRequested, node, &QSacnNode::create); dialog->exec(); }); connect(ui->actionTerminate, &QAction::triggered, this, [&, node]() { auto index = ui->multiverseView->currentIndex(); auto data = index.data(Qt::EditRole); if (data.metaType().id() == qMetaTypeId()) { auto univ = data.value(); if (univ->isEditable()) node->terminate(univ->number()); } }); connect(ui->actionSubscribe, &QAction::triggered, this, [this, node]() { auto index = ui->multiverseView->currentIndex(); auto actual = sortProxy->mapToSource(index); auto item = static_cast(actual.internalPointer()); auto val = item->data(MultiverseModel::Column::Universe, Qt::DisplayRole); auto dialog = new AddUniverseDialog(this, val.toInt(), tr("Subscribe to Universe")); connect(dialog, &AddUniverseDialog::additionRequested, node, &QSacnNode::subscribe); dialog->exec(); }); connect(ui->actionUnsubscribe, &QAction::triggered, this, [&, node]() { auto index = ui->multiverseView->currentIndex(); auto data = index.data(Qt::EditRole); if (data.metaType().id() == qMetaTypeId()) { auto univ = data.value(); if (!univ->isEditable()) node->unsubscribe(univ->number()); } }); connect(ui->actionDiscovery, &QAction::toggled, node, [&, node](bool checked) { if (checked) node->discoveryStart(); else node->discoveryStop(); }); connect(ui->multiverseView->selectionModel(), &QItemSelectionModel::currentChanged, this, &MultiverseView::selectionChanged); } /** * @brief MultiverseView::~MultiverseView */ MultiverseView::~MultiverseView() { delete ui; } /** * @brief MultiverseView::selectionChanged * @param selected * @param deselected */ void MultiverseView::selectionChanged(const QModelIndex ¤t, const QModelIndex &previous) { Q_UNUSED(previous) ui->actionTerminate->setEnabled(false); ui->actionUnsubscribe->setEnabled(false); ui->actionInspect->setEnabled(false); auto data = current.data(Qt::EditRole); // Data universes: if (data.metaType().id() == qMetaTypeId()) { ui->actionInspect->setEnabled(true); auto univ = data.value(); if (univ->isEditable()) ui->actionTerminate->setEnabled(true); else ui->actionUnsubscribe->setEnabled(true); return; } } /** * @brief MultiverseView::multiverseContextMenu * @param pos */ void MultiverseView::createContextMenu(const QPoint &pos) { QMenu menu(ui->multiverseView); auto globalpos = ui->multiverseView->mapToGlobal(pos); auto index = ui->multiverseView->indexAt(pos); auto data = index.data(Qt::EditRole); // Data universes: if (data.metaType().id() == qMetaTypeId()) { menu.addAction(ui->actionInspect); menu.addSeparator(); auto univ = data.value(); if (univ->isEditable()) menu.addAction(ui->actionTerminate); else menu.addAction(ui->actionUnsubscribe); menu.exec(globalpos); return; } // Discovery universes: if (data.metaType().id() == qMetaTypeId()) { menu.addAction(ui->actionSubscribe); menu.exec(globalpos); return; } } /** * @brief MultiverseView::createEditor * @param index */ void MultiverseView::createEditor(const QModelIndex &index) { auto data = index.data(Qt::EditRole); // Data universes: if (data.metaType().id() == qMetaTypeId()) { auto univ = data.value(); auto universeView = new UniverseView(this, univ); universeView->show(); } // Discovery universes: if (data.metaType().id() == qMetaTypeId()) { auto disc = data.value(); auto subscribe = new AddUniverseDialog(this, disc->universe, tr("Subscribe to Universe")); connect(subscribe, &AddUniverseDialog::additionRequested, node, &QSacnNode::subscribe); subscribe->exec(); } } /** * @brief MultiverseView::showUacnEditor */ void MultiverseView::showUacnEditor() { auto editor = new LineEditDialog(this, "Name", 63, node->userName().c_str(), node->fixedName().c_str()); editor->setWindowTitle("User Assigned Component Name"); connect(editor, &LineEditDialog::submit, this, [&](QString name) {node->assignUserName(name.toStdString());}); editor->exec(); }