1
0
Fork 0
OpenLCP/example/sACN Explorer/multiverseview.cpp

256 lines
7.6 KiB
C++

#include "adduniversedialog.h"
#include "lineeditdialog.h"
#include "multiverseview.h"
#include "multiversemodel.h"
#include "ui_multiverseview.h"
#include "universeview.h"
#include <QActionGroup>
/**
* @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->actionIPv4->setChecked(node->isEnabledIPv4());
ui->actionIPv6->setChecked(node->isEnabledIPv6());
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->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, 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<QSacnUniverse*>())
{
auto univ = data.value<QSacnUniverse*>();
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<MultiverseItem*>(actual.internalPointer());
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<QSacnUniverse*>())
{
auto univ = data.value<QSacnUniverse*>();
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 &current,
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<QSacnUniverse*>())
{
ui->actionInspect->setEnabled(true);
auto univ = data.value<QSacnUniverse*>();
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<QSacnUniverse*>())
{
menu.addAction(ui->actionInspect);
menu.addSeparator();
auto univ = data.value<QSacnUniverse*>();
if (univ->isEditable())
menu.addAction(ui->actionTerminate);
else
menu.addAction(ui->actionUnsubscribe);
menu.exec(globalpos);
return;
}
// Discovery universes:
if (data.metaType().id() ==
qMetaTypeId<sACN::EXTENDED::DISCOVERY::discoveredUniverse*>())
{
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<QSacnUniverse*>())
{
auto univ = data.value<QSacnUniverse*>();
foreach (const auto & inspector, mInspectors)
if (inspector->universe() == univ)
return;
auto view = new UniverseView(this, univ);
mInspectors.insert(view);
connect(view, &QObject::destroyed, this, [this, view](){mInspectors.remove(view);});
view->setAttribute(Qt::WA_DeleteOnClose, true);
view->show();
return;
}
// Discovery universes:
if (data.metaType().id() ==
qMetaTypeId<sACN::EXTENDED::DISCOVERY::discoveredUniverse*>())
{
auto disc = data.value<sACN::EXTENDED::DISCOVERY::discoveredUniverse*>();
auto subscribe = new AddUniverseDialog(this, disc->universe,
tr("Subscribe to Universe"));
connect(subscribe, &AddUniverseDialog::additionRequested,
node, &QSacnNode::subscribe);
subscribe->exec();
return;
}
}
/**
* @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();
}