Loading...
Searching...
No Matches
ProcessesItemModel.hpp
1#pragma once
2#include <Process/ProcessFactory.hpp>
3#include <Process/ProcessMimeSerialization.hpp>
4
5#include <Library/LibrarySettings.hpp>
6#include <Library/ProcessEntry.hpp>
7
8#include <score/application/ApplicationContext.hpp>
9#include <score/model/tree/TreeNode.hpp>
10#include <score/model/tree/TreeNodeItemModel.hpp>
11#include <score/tools/File.hpp>
12#include <score/tools/RecursiveWatch.hpp>
13#include <score/tools/std/Optional.hpp>
14#include <score/tools/std/StringHash.hpp>
15
16#include <ossia/detail/hash_map.hpp>
17
18#include <QDir>
19#include <QIcon>
20
21#include <nano_observer.hpp>
22#include <score_plugin_library_export.h>
23
24#include <verdigris>
25
26namespace score
27{
28struct GUIApplicationContext;
29}
30
31namespace Library
32{
33using ProcessNode = TreeNode<ProcessData>;
34
35class SCORE_PLUGIN_LIBRARY_EXPORT ProcessesItemModel
36 : public TreeNodeBasedItemModel<ProcessNode>
37 , public Nano::Observer
38{
39public:
40 ProcessesItemModel(const score::GUIApplicationContext& ctx, QObject* parent);
41
42 void rescan();
43 QModelIndex find(const Process::ProcessModelFactory::ConcreteKey& k);
44
50 void publish(ProcessEntry&& entry);
51
54 void publish(ProcessEntry&& entry, uint64_t generation);
55
57 uint64_t generation() const noexcept { return m_generation; }
58
65 void replaceChildren(
66 const Process::ProcessModelFactory::ConcreteKey& key,
67 std::vector<StagedNode> children);
68
71 void clearAnchorKey(const Process::ProcessModelFactory::ConcreteKey& key);
72
74 void flushPending();
75
76 ProcessNode& rootNode() override;
77 const ProcessNode& rootNode() const override;
78
79 // Data reading
80 int columnCount(const QModelIndex& parent) const override;
81 QVariant data(const QModelIndex& index, int role) const override;
82
83 QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
84 Qt::ItemFlags flags(const QModelIndex& index) const override;
85
86 // Drag, drop, etc.
87 QStringList mimeTypes() const override;
88 QMimeData* mimeData(const QModelIndexList& indexes) const override;
89 Qt::DropActions supportedDragActions() const override;
90
91 void on_newPlugin(const score::InterfaceBase& fact);
92
93private:
94 struct PendingEntry
95 {
96 ProcessEntry entry;
97 uint64_t generation{};
98 };
99
100 ProcessNode& addCategory(const QString& cat);
101 QModelIndex indexFromNode(ProcessNode& n);
102 void publishRun(PendingEntry* entries, std::size_t count);
103 void scheduleFlush();
104
105 const score::GUIApplicationContext& context;
106 ProcessNode m_root;
107
108 // The process nodes entries anchor to, by concrete key. Owned by the tree;
109 // rebuilt by rescan() and extended by on_newPlugin, so it never dangles.
110 ossia::hash_map<Process::ProcessModelFactory::ConcreteKey, ProcessNode*> m_anchors;
111
112 std::vector<PendingEntry> m_pending;
113 uint64_t m_generation{};
114 bool m_flushQueued{};
115 bool m_inReset{};
116};
117
118}
119
120inline QDataStream& operator<<(QDataStream& i, const Library::ProcessData& sel)
121{
122 return i;
123}
124inline QDataStream& operator>>(QDataStream& i, Library::ProcessData& sel)
125{
126 return i;
127}
128
129W_REGISTER_ARGTYPE(Library::ProcessData)
130Q_DECLARE_METATYPE(Library::ProcessData)
131W_REGISTER_ARGTYPE(std::optional<Library::ProcessData>)
Definition ProcessesItemModel.hpp:38
uint64_t generation() const noexcept
The scan generation the model is currently accepting. Bumped by rescan().
Definition ProcessesItemModel.hpp:57
Definition TreeNodeItemModel.hpp:38
Definition TreeNode.hpp:52
Base class for plug-in interfaces.
Definition Interface.hpp:52
Base toolkit upon which the software is built.
Definition Application.cpp:117
Definition ProcessEntry.hpp:25
Definition ProcessEntry.hpp:40
Specializes ApplicationContext with the QMainWindow.
Definition GUIApplicationContext.hpp:15