#include "adduniversedialog.h" #include "lineeditdialog.h" #include "multiversewindow.h" #include "multiversemodel.h" #include "ui_multiversewindow.h" #include "universewindow.h" #include /** * @brief MultiverseWindow::MultiverseWindow * @param parent */ MultiverseWindow::MultiverseWindow(QWidget *parent, QSacnNode *node) : QMainWindow(parent) , ui(new Ui::MultiverseWindow) , 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->actionIPv4->setChecked(node->isEnabledIPv4()); ui->actionIPv6->setChecked(node->isEnabledIPv6()); ui->actionDiscovery->setChecked(node->discoveryEnabled()); ui->menubar->setNativeMenuBar(false); sortProxy->setSourceModel(model); 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); auto mergeMode = new QActionGroup(this); mergeMode->addAction(ui->actionMergeModeHTP); mergeMode->addAction(ui->actionMergeModeLTP); connect(ui->multiverseView->selectionModel(), &QItemSelectionModel::currentChanged, this, &MultiverseWindow::selectionChanged); connect(ui->multiverseView, &QTreeView::customContextMenuRequested, this, &MultiverseWindow::createContextMenu); connect(ui->multiverseView, &QTreeView::doubleClicked, this, &MultiverseWindow::createEditor); connect(ui->actionUACN, &QAction::triggered, this, &MultiverseWindow::showUacnEditor); connect(ui->actionIPv4, &QAction::toggled, node, &QSacnNode::setIPv4); connect(ui->actionIPv6, &QAction::toggled, node, &QSacnNode::setIPv6); 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); connect(dialog, &AddUniverseDialog::additionRequested, node, &QSacnNode::create); dialog->setWindowTitle(tr("Create")); dialog->setAttribute(Qt::WA_DeleteOnClose); dialog->open(); }); 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 val = QVariant(1); auto index = ui->multiverseView->currentIndex(); if (index.isValid()) { auto actual = sortProxy->mapToSource(index); auto item = static_cast(actual.internalPointer()); val = item->data(MultiverseModel::Column::Universe, Qt::DisplayRole); } auto dialog = new AddUniverseDialog(this, val.toInt()); connect(dialog, &AddUniverseDialog::additionRequested, node, &QSacnNode::subscribe); dialog->setWindowTitle(tr("Subscribe")); dialog->setAttribute(Qt::WA_DeleteOnClose); dialog->open(); }); 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) { checked ? node->discoveryStart() : node->discoveryStop(); }); } /** * @brief MultiverseWindow::~MultiverseWindow */ MultiverseWindow::~MultiverseWindow() { delete ui; } /** * @brief MultiverseWindow::selectionChanged * @param selected * @param deselected */ void MultiverseWindow::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 MultiverseWindow::multiverseContextMenu * @param pos */ void MultiverseWindow::createContextMenu(const QPoint &pos) { auto menu = new QMenu(ui->multiverseView); menu->setAttribute(Qt::WA_DeleteOnClose, true); 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->popup(globalpos); return; } // Discovery universes: if (data.metaType().id() == qMetaTypeId()) { menu->addAction(ui->actionSubscribe); menu->popup(globalpos); return; } } /** * @brief MultiverseWindow::createEditor * @param index */ void MultiverseWindow::createEditor(const QModelIndex &index) { auto data = index.data(Qt::EditRole); // Data universes: if (data.metaType().id() == qMetaTypeId()) { auto univ = data.value(); foreach (const auto & inspector, mInspectors) if (inspector->universe() == univ) return inspector->show(); auto view = new UniverseWindow(this, univ); mInspectors.insert(view); connect(view, &QObject::destroyed, this, [this, view](){mInspectors.remove(view);}); connect(univ, &QObject::destroyed, view, &QMainWindow::close); view->setAttribute(Qt::WA_DeleteOnClose, true); view->show(); return; } // Discovery universes: if (data.metaType().id() == qMetaTypeId()) { auto disc = data.value(); auto dialog = new AddUniverseDialog(this, disc->universe); connect(dialog, &AddUniverseDialog::additionRequested, node, &QSacnNode::subscribe); dialog->setWindowTitle(tr("Create")); dialog->setAttribute(Qt::WA_DeleteOnClose); dialog->open(); return; } } /** * @brief MultiverseWindow::showUacnEditor */ void MultiverseWindow::showUacnEditor() { auto editor = new LineEditDialog(this, "Name", 63, node->userName().c_str(), node->fixedName().c_str()); connect(editor, &LineEditDialog::submit, this, [&](QString name) {node->assignUserName(name.toStdString());}); editor->setWindowTitle("User Assigned Component Name"); editor->setAttribute(Qt::WA_DeleteOnClose); editor->open(); }