diff --git a/src/tuxclocker-qt/data/DeviceModelDelegate.cpp b/src/tuxclocker-qt/data/DeviceModelDelegate.cpp index 79968b1..e593e4d 100644 --- a/src/tuxclocker-qt/data/DeviceModelDelegate.cpp +++ b/src/tuxclocker-qt/data/DeviceModelDelegate.cpp @@ -3,9 +3,13 @@ #include "DeviceModel.hpp" #include #include +#include #include #include #include +#include +#include +#include #include using namespace TuxClocker::Device; @@ -13,7 +17,11 @@ using namespace mpark::patterns; Q_DECLARE_METATYPE(AssignableItemData) -DeviceModelDelegate::DeviceModelDelegate(QObject *parent) : QStyledItemDelegate(parent) {} +DeviceModelDelegate::DeviceModelDelegate(QObject *parent) : QStyledItemDelegate(parent) { + m_parametrize = new QAction{"Parametrize...", this}; + + m_menu.addAction(m_parametrize); +} void DeviceModelDelegate::commitAndClose() { // It's also retarded to get the editor this way when we could just use it in the lambda @@ -84,6 +92,54 @@ void DeviceModelDelegate::updateEditorGeometry( editor->setGeometry(option.rect); } +bool DeviceModelDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, + const QStyleOptionViewItem &item, const QModelIndex &index) { + // Context menu handling + if (event->type() == QEvent::MouseButtonRelease) { + auto mouse = dynamic_cast(event); + + auto data = index.data(DeviceModel::AssignableRole); + auto assInfo = data.value(); + auto proxyV = index.data(DeviceModel::AssignableProxyRole); + auto proxy = proxyV.value(); + // TODO: need a different check for future 'Reset assignable' action + if (mouse->button() == Qt::RightButton && data.canConvert() && + proxyV.canConvert() && + std::holds_alternative(assInfo.assignableInfo())) { + // FIXME: this obviously will keep creating and showing new windows :D + // change FunctionEditor to allow mutating params to stop malloc spam? + auto editor = new FunctionEditor(*static_cast(model), + std::get(assInfo.assignableInfo()), *proxy, + index.data(DeviceModel::NodeNameRole).toString()); + auto conn = connect( + m_parametrize, &QAction::triggered, [=](auto) { editor->show(); }); + m_menu.exec(mouse->globalPos()); + + // TODO: not handled in AssignableProxy + connect(editor, &FunctionEditor::connectionDataChanged, [=](auto data) { + setAssignableData(model, index, "(Parametrized)", data); + }); + } + } + + return QStyledItemDelegate::editorEvent(event, model, item, index); +} + +template +void DeviceModelDelegate::setAssignableData( + QAbstractItemModel *model, const QModelIndex &index, QString text, T data) { + auto assData = index.data(DeviceModel::AssignableRole).value(); + QVariant assV; + assV.setValue(data); + assData.setValue(assV); + + QVariant v; + v.setValue(assData); + + model->setData(index, text, Qt::DisplayRole); + model->setData(index, v, DeviceModel::AssignableRole); +} + QColor alphaBlend(QColor top, QColor background) { auto alpha = top.alphaF(); auto factor = 1 - alpha; diff --git a/src/tuxclocker-qt/data/DeviceModelDelegate.hpp b/src/tuxclocker-qt/data/DeviceModelDelegate.hpp index 6675702..1f17768 100644 --- a/src/tuxclocker-qt/data/DeviceModelDelegate.hpp +++ b/src/tuxclocker-qt/data/DeviceModelDelegate.hpp @@ -1,7 +1,10 @@ #pragma once +#include #include +class AssignableItemData; + // TODO: align checkbox to the right class DeviceModelDelegate : public QStyledItemDelegate { public: @@ -13,9 +16,16 @@ public: void setEditorData(QWidget *editor, const QModelIndex &index) const; void setModelData( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; + bool editorEvent(QEvent *, QAbstractItemModel *, const QStyleOptionViewItem &, + const QModelIndex &) override; protected: void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; private: void commitAndClose(); + template + void setAssignableData(QAbstractItemModel *, const QModelIndex &, QString text, T data); + + QAction *m_parametrize; + QMenu m_menu; }; diff --git a/src/tuxclocker-qt/widgets/DeviceBrowser.cpp b/src/tuxclocker-qt/widgets/DeviceBrowser.cpp index c7f356b..f3c2302 100644 --- a/src/tuxclocker-qt/widgets/DeviceBrowser.cpp +++ b/src/tuxclocker-qt/widgets/DeviceBrowser.cpp @@ -51,8 +51,9 @@ DeviceBrowser::DeviceBrowser(DeviceModel &model, QWidget *parent) [=](auto ri) { auto f_editor = new FunctionEditor{m_deviceModel, ri, *proxy, name}; f_editor->show(); - f_editor->assignableConnectionChanged.connect( - [=](auto conn) { proxy->startConnection(conn); }); + + // f_editor->assignableConnectionChanged.connect( + //[=](auto conn) { proxy->startConnection(conn); }); }, pattern(_) = [] {}); diff --git a/src/tuxclocker-qt/widgets/DeviceTreeView.cpp b/src/tuxclocker-qt/widgets/DeviceTreeView.cpp index a5b9f5b..dafd976 100644 --- a/src/tuxclocker-qt/widgets/DeviceTreeView.cpp +++ b/src/tuxclocker-qt/widgets/DeviceTreeView.cpp @@ -17,9 +17,9 @@ DeviceTreeView::DeviceTreeView(QWidget *parent) : QTreeView(parent) { header()->setSectionResizeMode(QHeaderView::ResizeToContents); setSortingEnabled(true); setEditTriggers(SelectedClicked | EditKeyPressed); - setContextMenuPolicy(Qt::CustomContextMenu); + setContextMenuPolicy(Qt::DefaultContextMenu); connect(this, &QTreeView::customContextMenuRequested, [this](QPoint point) { - auto index = indexAt(point); + /*auto index = indexAt(point); auto data = index.data(DeviceModel::AssignableRole); auto proxyData = index.data(DeviceModel::AssignableProxyRole); QMenu menu; @@ -30,21 +30,7 @@ DeviceTreeView::DeviceTreeView(QWidget *parent) : QTreeView(parent) { menu.addActions({&editConn, enableConn}); if (data.canConvert() && proxyData.canConvert()) { - functionEditorRequested(index); - /*auto a_data = data.value(); - auto proxy = proxyData.value(); - match(a_data.assignableInfo()) ( - pattern(as(arg)) = [this, &menu, proxy, &editConn](auto - ri) { - //functionEditorRequested(*proxy, ri); - connect(&editConn, &QAction::triggered, [this, proxy, ri] { - functionEditorRequested(*proxy, ri); - }); - menu.exec(QCursor::pos()); - }, - pattern(_) = []{} - );*/ - } + }*/ }); m_delegate = new DeviceModelDelegate(this); diff --git a/src/tuxclocker-qt/widgets/FunctionEditor.hpp b/src/tuxclocker-qt/widgets/FunctionEditor.hpp index b225b43..6001da7 100644 --- a/src/tuxclocker-qt/widgets/FunctionEditor.hpp +++ b/src/tuxclocker-qt/widgets/FunctionEditor.hpp @@ -32,6 +32,7 @@ // Delet this namespace p = mpark::patterns; +Q_DECLARE_METATYPE(DynamicReadableConnectionData) Q_DECLARE_METATYPE(DynamicReadableProxy *) // TODO: make constructor of the type data Editor a = Maybe (Range a)