Loading...
Searching...
No Matches
ConnectionsWidget.hpp
1#pragma once
2#include <Process/Dataflow/CableData.hpp>
3
4#include <Dataflow/MappingPanel/ConnectionsList.hpp>
5
6#include <ossia/detail/hash_map.hpp>
7#include <ossia/detail/small_vector.hpp>
8
9#include <QPointer>
10#include <QWidget>
11
12#include <score_plugin_dataflow_export.h>
13
14#include <nano_observer.hpp>
15
16#include <vector>
17
18class QComboBox;
19class QLineEdit;
20class QMenu;
21class QModelIndex;
22class QSortFilterProxyModel;
23class QStandardItem;
24class QStandardItemModel;
25class QTreeView;
26class Selection;
27namespace score
28{
29class Document;
30struct DocumentContext;
31}
32
33namespace Dataflow
34{
37class SCORE_PLUGIN_DATAFLOW_EXPORT ConnectionsWidget final
38 : public QWidget
39 , public Nano::Observer
40{
41public:
42 enum Column
43 {
50 FromColumn,
51 ToColumn,
52 LocationColumn,
53 ColumnCount
54 };
55 enum Grouping
56 {
57 NoGrouping,
58 ByKind,
59 ByFrom,
60 ByTo,
61 ByDevice
62 };
63 enum KindFilter
64 {
65 AllKinds,
66 CablesOnly,
67 AddressesOnly
68 };
70 static constexpr int RowRole = Qt::UserRole + 1;
72 static constexpr int GroupRole = Qt::UserRole + 2;
75 static constexpr int SearchRole = Qt::UserRole + 3;
77 static constexpr int PortTypeRole = Qt::UserRole + 4;
78
79 explicit ConnectionsWidget(QWidget* parent = nullptr);
80 ~ConnectionsWidget() override;
81
82 void setDocument(const score::DocumentContext* ctx);
84 void setSelection(const Selection& s);
85
86 const std::vector<ConnectionRow>& rows() const noexcept { return m_rows; }
88 void refresh();
89 bool refreshPending() const noexcept { return m_scheduled || m_dirty; }
90
91 QTreeView& view() const noexcept { return *m_view; }
92 QLineEdit& searchField() const noexcept { return *m_search; }
93 QComboBox& groupingBox() const noexcept { return *m_grouping; }
94 QComboBox& kindBox() const noexcept { return *m_kinds; }
95
97 int rowAt(const QModelIndex& viewIndex) const;
99 QModelIndex viewIndexOf(int row) const;
100
102 std::vector<int> selectedRows() const;
104 std::vector<ConnectionRow> rowsAt(const std::vector<int>& rows) const;
106 void selectInDocument(const std::vector<int>& rows);
108 void reveal(const ConnectionRow& row);
116 void goToEnd(int row, bool from);
118 void removeConnections(const std::vector<ConnectionRow>& rows);
120 void setCableType(const std::vector<ConnectionRow>& rows, Process::CableType t);
122 void fillContextMenu(QMenu& menu, int clickedRow);
123
124private:
125 void schedule();
126 void rebuild();
127 void populate();
129 void populate(const ossia::hash_set<const QObject*>& selected);
130 ossia::hash_set<const QObject*> selectedObjects() const;
132 void track();
133 void untrack();
134 void updateCounts();
135 void spanGroups();
136 void centerOn(const Process::Port& port);
137 void watchDocument();
138 void unwatchDocument();
139 void onViewSelectionChanged();
140 void contextMenu(const QPoint& pos);
141 void showEvent(QShowEvent* ev) override;
142 bool eventFilter(QObject* obj, QEvent* ev) override;
143
144 void on_cableAdded(const Process::Cable&);
145 void on_cableRemoved(const Process::Cable&);
146
148 bool alive() const noexcept { return m_ctx && !m_document.isNull(); }
149 const score::DocumentContext* m_ctx{};
150 QPointer<const score::Document> m_document;
151 std::vector<ConnectionRow> m_rows;
153 std::vector<QStandardItem*> m_items;
155 ossia::hash_map<const QObject*, ossia::small_vector<int, 1>> m_rowsOf;
157 std::vector<std::pair<QStandardItem*, QString>> m_groups;
159 ossia::hash_set<QString> m_collapsed;
160
161 QLineEdit* m_search{};
162 QComboBox* m_grouping{};
163 QComboBox* m_kinds{};
164 QTreeView* m_view{};
165 QStandardItemModel* m_model{};
166 QSortFilterProxyModel* m_proxy{};
167
169 QObject* m_tracking{};
171 ossia::hash_set<QObject*> m_tracked;
172 std::vector<QMetaObject::Connection> m_documentConnections;
173 QPointer<QObject> m_watchedScenario;
174
175 bool m_scheduled{};
176 bool m_dirty{true};
177 bool m_syncingSelection{};
179 bool m_selectionPending{};
180};
181}
Definition ConnectionsWidget.hpp:40
Column
Definition ConnectionsWidget.hpp:43
@ StatusColumn
Definition ConnectionsWidget.hpp:49
@ KindColumn
Definition ConnectionsWidget.hpp:46
Definition Cable.hpp:38
Definition Port.hpp:106
Definition Selection.hpp:12
Base toolkit upon which the software is built.
Definition Application.cpp:83
Definition DocumentContext.hpp:18