#pragma once #include #include #include #include #include #include #include class QPainter; class QStyleOptionGraphicsItem; namespace Xybrid::UI { class NodeObject; class PortObject; } namespace Xybrid::Config { class PluginInfo; } namespace Xybrid::Audio { class AudioEngine; } namespace Xybrid::Data { class Project; class Graph; class Node; class Port : public std::enable_shared_from_this { Q_GADGET public: enum Type : uint8_t { Input, Output }; Q_ENUM(Type) enum DataType : uint8_t { Audio, Command, MIDI, Parameter }; Q_ENUM(DataType) std::weak_ptr owner; std::vector> connections; std::weak_ptr passthroughTo; Type type; uint8_t index; size_t tickUpdatedOn = static_cast(-1); QPointer obj; std::string name; virtual ~Port(); virtual DataType dataType() const { return static_cast(-1); } virtual bool singleInput() const { return false; } virtual bool canConnectTo(DataType) const; /*virtual*/ bool connect(std::shared_ptr); /*virtual*/ void disconnect(std::shared_ptr); void cleanConnections(); virtual void pull() { } // make sure data for this tick is available static std::shared_ptr makePort(DataType); }; class Node : public std::enable_shared_from_this { friend class Audio::AudioEngine; size_t tick_last = 0; bool try_process(bool checkDependencies = true); public: Project* project; std::weak_ptr parent; int x{}, y{}; std::string name; std::map>> inputs, outputs; std::shared_ptr plugin; QPointer obj; virtual ~Node() = default; void parentTo(std::shared_ptr); std::shared_ptr port(Port::Type, Port::DataType, uint8_t, bool addIfNeeded = false); std::shared_ptr addPort(Port::Type, Port::DataType, uint8_t); void removePort(Port::Type, Port::DataType, uint8_t); std::unordered_set> dependencies() const; bool dependsOn(std::shared_ptr); virtual void init() { } virtual void reset() { } virtual void saveData(QCborMap&) { } virtual void loadData(QCborMap&) { } virtual void process() { } virtual std::string pluginName() const; virtual void onGadgetCreated() { } virtual void drawCustomChrome(QPainter*, const QStyleOptionGraphicsItem*) { } virtual void onRename() { } virtual void onUnparent(std::shared_ptr) { } virtual void onParent(std::shared_ptr) { } virtual void onDoubleClick() { } // something something customChrome? }; } Q_DECLARE_METATYPE(Xybrid::Data::Port)