Loading...
Searching...
No Matches
DeviceExplorerModel.hpp
1#pragma once
2#include <State/Message.hpp>
3#include <State/Value.hpp>
4
5#include <Device/ItemModels/NodeBasedItemModel.hpp>
6#include <Device/Node/DeviceNode.hpp>
7
8#include <Explorer/Explorer/Column.hpp>
9
10#include <score/document/DocumentContext.hpp>
11
12#include <QAbstractItemModel>
13#include <QString>
14#include <QStringList>
15#include <QVariant>
16#include <qnamespace.h>
17
18#include <score_plugin_deviceexplorer_export.h>
19
20#include <verdigris>
21class QMimeData;
22class QObject;
23namespace score
24{
25class CommandStackFacade;
26}
27namespace Device
28{
29struct DeviceSettings;
30struct AddressSettings;
31}
32
33namespace Explorer
34{
35class ListeningManager;
36class DeviceDocumentPlugin;
37class DeviceEditDialog;
38class DeviceExplorerView;
39class DeviceExplorerWidget;
40
52struct SCORE_PLUGIN_DEVICEEXPLORER_EXPORT SelectedNodes
53{
57 std::vector<Device::Node*> parents;
58
62 std::vector<Device::Node*> messages;
63};
64
65class SCORE_PLUGIN_DEVICEEXPLORER_EXPORT DeviceExplorerModel final
67{
68 W_OBJECT(DeviceExplorerModel)
69
70public:
71 using QAbstractItemModel::beginResetModel;
72 using QAbstractItemModel::endResetModel;
73
74 explicit DeviceExplorerModel(DeviceDocumentPlugin&, QObject* parent);
75
77
78 Device::Node& rootNode() override { return m_rootNode; }
79
80 const Device::Node& rootNode() const override { return m_rootNode; }
81
82 void setView(DeviceExplorerView* v) { m_view = v; }
83
84 // The class that does the link with the low-level implementation of the
85 // devices. This is here so that commands don't need to save
86 // at the same time a path to the device explorer, and the device doc plugin.
87 DeviceDocumentPlugin& deviceModel() const;
88 QModelIndexList selectedIndexes() const;
89
90 const score::CommandStackFacade& commandStack() const { return m_cmdQ; }
91
92 // Returns the row (useful for undo)
93 int addDevice(Device::Node&& deviceNode);
94 int addDevice(const Device::Node& deviceNode);
95 void updateDevice(const QString& name, const Device::DeviceSettings& dev);
96
97 Device::Node* addAddress(
98 Device::Node* parentNode, const Device::AddressSettings& addressSettings, int row);
99 void updateAddress(Device::Node* node, const Device::AddressSettings& addressSettings);
100
101 void addNode(Device::Node* parentNode, Device::Node&& child, int row);
102
103 void updateValue(
104 Device::Node* n, const State::AddressAccessor& addr, const ossia::value& v);
105
106 // Checks if the settings can be added; if not,
107 // trigger a dialog to edit them as wanted.
108 // Returns true if the device is to be added, false if
109 // it should not be added.
110 bool checkDeviceInstantiatable(const Device::DeviceSettings& n) const;
111 bool checkDeviceEditable(
112 const QString& originalName, const Device::DeviceSettings& n) const;
113
114 bool
115 checkAddressInstantiatable(Device::Node& parent, const Device::AddressSettings& addr);
116
117 bool checkAddressEditable(
118 Device::Node& parent, const Device::AddressSettings& before,
119 const Device::AddressSettings& after);
120
121 int columnCount() const;
122 QStringList getColumns() const;
123 bool isEmpty() const;
124 bool isDevice(QModelIndex index) const;
125 bool hasCut() const;
126
127 void debug_printIndexes(const QModelIndexList& indexes);
128
129 int columnCount(const QModelIndex& parent) const override;
130
131 QVariant data(const QModelIndex& index, int role) const override;
132 QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
133
134 Qt::ItemFlags flags(const QModelIndex& index) const override;
135
136 bool setData(const QModelIndex& index, const QVariant& value, int role) override;
137 bool setHeaderData(int, Qt::Orientation, const QVariant&, int = Qt::EditRole) override;
138
139 void editData(
140 const Device::NodePath& path, Column column, const ossia::value& value, int role);
141 void editData(Device::Node& n, Column column, const ossia::value& value, int role);
142
143 Qt::DropActions supportedDropActions() const override;
144 Qt::DropActions supportedDragActions() const override;
145 QStringList mimeTypes() const override;
146 QMimeData* mimeData(const QModelIndexList& indexes) const override;
147 bool canDropMimeData(
148 const QMimeData* data, Qt::DropAction action, int row, int column,
149 const QModelIndex& parent) const override;
150 bool dropMimeData(
151 const QMimeData* mimeData, Qt::DropAction action, int row, int column,
152 const QModelIndex& parent) override;
153
154 SelectedNodes uniqueSelectedNodes(const QModelIndexList& indexes)
155 const; // Note : filters so that only parents are given.
156 void checkAndLoadDevice(Device::Node n);
157 void checkAndLoadDevice(Device::DeviceSettings n);
158
159public:
160 void nodeChanged(Device::Node* n)
161 E_SIGNAL(SCORE_PLUGIN_DEVICEEXPLORER_EXPORT, nodeChanged, n)
162
163protected:
164 void debug_printPath(const Device::NodePath& path);
165
166private:
167 DeviceDocumentPlugin& m_devicePlugin;
168
169 QModelIndex bottomIndex(const QModelIndex& index) const;
170
171 Device::Node& m_rootNode;
172
173 const score::CommandStackFacade& m_cmdQ;
174
175 DeviceExplorerView* m_view{};
176};
177
178// Will update the tree and return the messages corresponding to the selected
179// nodes.
180SCORE_PLUGIN_DEVICEEXPLORER_EXPORT State::MessageList
181getSelectionSnapshot(DeviceExplorerModel& model);
182
183SCORE_PLUGIN_DEVICEEXPLORER_EXPORT DeviceExplorerModel&
184deviceExplorerFromObject(const QObject&);
185SCORE_PLUGIN_DEVICEEXPLORER_EXPORT DeviceExplorerModel*
186try_deviceExplorerFromObject(const QObject&);
187SCORE_PLUGIN_DEVICEEXPLORER_EXPORT DeviceExplorerModel*
188try_deviceExplorerFromContext(const score::DocumentContext& ctx);
189SCORE_PLUGIN_DEVICEEXPLORER_EXPORT DeviceExplorerModel&
190deviceExplorerFromContext(const score::DocumentContext& ctx);
191
192// Will try to find a node and fill the structure with it.
193SCORE_PLUGIN_DEVICEEXPLORER_EXPORT Device::FullAddressAccessorSettings
194makeFullAddressAccessorSettings(
195 const State::AddressAccessor& mess, const score::DocumentContext& ctx,
196 ossia::value min, ossia::value max, ossia::value cur);
197}
Definition NodeBasedItemModel.hpp:18
Definition DeviceExplorerModel.hpp:67
Definition DeviceExplorerView.hpp:18
Path in a tree of QAbstractItemModel objects.
Definition TreePath.hpp:34
A small abstraction layer over the score::CommandStack.
Definition CommandStackFacade.hpp:20
Manipulation of Devices from Qt.
Definition AddressSettings.cpp:14
Base toolkit upon which the software is built.
Definition Application.cpp:90
Definition AddressSettings.hpp:49
Definition DeviceSettings.hpp:20
Definition AddressSettings.hpp:131
The SelectedNodes struct.
Definition DeviceExplorerModel.hpp:53
std::vector< Device::Node * > parents
parents The topmost parents of the selected parameters
Definition DeviceExplorerModel.hpp:57
std::vector< Device::Node * > messages
messages The selected messages
Definition DeviceExplorerModel.hpp:62
Definition Address.hpp:108
Definition DocumentContext.hpp:18