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);
46 QModelIndex find(
47 const Process::ProcessModelFactory::ConcreteKey& k, const QString& customData);
48
54 void publish(ProcessEntry&& entry);
55
58 void publish(ProcessEntry&& entry, uint64_t generation);
59
61 uint64_t generation() const noexcept { return m_generation; }
62
69 void replaceChildren(
70 const Process::ProcessModelFactory::ConcreteKey& key,
71 std::vector<StagedNode> children);
72
75 void clearAnchorKey(const Process::ProcessModelFactory::ConcreteKey& key);
76
78 void flushPending();
79
80 ProcessNode& rootNode() override;
81 const ProcessNode& rootNode() const override;
82
83 // Data reading
84 int columnCount(const QModelIndex& parent) const override;
85 QVariant data(const QModelIndex& index, int role) const override;
86
87 QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
88 Qt::ItemFlags flags(const QModelIndex& index) const override;
89
90 // Drag, drop, etc.
91 QStringList mimeTypes() const override;
92 QMimeData* mimeData(const QModelIndexList& indexes) const override;
93 Qt::DropActions supportedDragActions() const override;
94
95 void on_newPlugin(const score::InterfaceBase& fact);
96
97private:
98 struct PendingEntry
99 {
100 ProcessEntry entry;
101 uint64_t generation{};
102 };
103
104 ProcessNode& addCategory(const QString& cat);
105 QModelIndex indexFromNode(ProcessNode& n);
106 void publishRun(PendingEntry* entries, std::size_t count);
107 void scheduleFlush();
108
109 const score::GUIApplicationContext& context;
110 ProcessNode m_root;
111
112 // The process nodes entries anchor to, by concrete key. Owned by the tree;
113 // rebuilt by rescan() and extended by on_newPlugin, so it never dangles.
114 ossia::hash_map<Process::ProcessModelFactory::ConcreteKey, ProcessNode*> m_anchors;
115
116 std::vector<PendingEntry> m_pending;
117 uint64_t m_generation{};
118 score::RecursiveWatch m_watch;
119 bool m_flushQueued{};
120 bool m_inReset{};
121};
122
123}
124
125inline QDataStream& operator<<(QDataStream& i, const Library::ProcessData& sel)
126{
127 return i;
128}
129inline QDataStream& operator>>(QDataStream& i, Library::ProcessData& sel)
130{
131 return i;
132}
133
134W_REGISTER_ARGTYPE(Library::ProcessData)
135Q_DECLARE_METATYPE(Library::ProcessData)
136W_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:61
Definition TreeNodeItemModel.hpp:38
Definition TreeNode.hpp:52
Base class for plug-in interfaces.
Definition Interface.hpp:52
Definition RecursiveWatch.hpp:20
Base toolkit upon which the software is built.
Definition Application.cpp:83
Definition ProcessEntry.hpp:25
Definition ProcessEntry.hpp:40
Specializes ApplicationContext with the QMainWindow.
Definition GUIApplicationContext.hpp:15