score-lib-process/Process/Dataflow/PortItem.hpp
1 #pragma once
2 #include <QGraphicsItem>
3 #include <QObject>
4 
5 #include <functional>
6 #include <verdigris>
7 #if defined(_MSC_VER)
8 #include <Process/Dataflow/Port.hpp>
9 #endif
10 #include <Process/Dataflow/PortType.hpp>
11 
12 #include <ossia/detail/ptr_set.hpp>
13 
14 #include <score_lib_process_export.h>
15 namespace Process
16 {
17 class ProcessModel;
18 class Port;
19 class Inlet;
20 class Outlet;
21 class ControlInlet;
22 struct Context;
23 }
24 namespace score
25 {
26 struct Brush;
27 struct DocumentContext;
28 class Command;
29 class SimpleTextItem;
30 }
31 namespace Dataflow
32 {
33 class PortItem;
34 class CableItem;
35 struct DragMoveFilter;
36 class SCORE_LIB_PROCESS_EXPORT PortItem
37  : public QObject
38  , public QGraphicsItem
39 {
40  W_OBJECT(PortItem)
41  Q_INTERFACES(QGraphicsItem)
42 public:
43  PortItem(const Process::Port& p, const Process::Context& ctx, QGraphicsItem* parent);
44  ~PortItem() override;
45  const Process::Port& port() const { return m_port; }
46 
47  static PortItem* clickedPort;
48 
49  virtual void setupMenu(QMenu&, const score::DocumentContext& ctx);
50  void setPortVisible(bool b);
51  void resetPortVisible();
52 
53  void setHighlight(bool b);
54 
55  using QGraphicsItem::dropEvent;
56  static const constexpr int Type = QGraphicsItem::UserType + 700;
57  int type() const final override { return Type; }
58 
59  void createCable(PortItem* src, PortItem* snk)
60  E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, createCable, src, snk)
61  void contextMenuRequested(QPointF scenepos, QPoint pos)
62  E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, contextMenuRequested, scenepos, pos)
63 
64 protected:
65  QRectF boundingRect() const override;
66  void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
67  override;
68 
69  void mousePressEvent(QGraphicsSceneMouseEvent* event) override;
70  void mouseMoveEvent(QGraphicsSceneMouseEvent* event) override;
71  void mouseReleaseEvent(QGraphicsSceneMouseEvent* event) override;
72  void hoverEnterEvent(QGraphicsSceneHoverEvent* event) final override;
73  void hoverMoveEvent(QGraphicsSceneHoverEvent* event) final override;
74  void hoverLeaveEvent(QGraphicsSceneHoverEvent* event) final override;
75 
76  void dragEnterEvent(QGraphicsSceneDragDropEvent* event) final override;
77  void dragMoveEvent(QGraphicsSceneDragDropEvent* event) final override;
78  void dragLeaveEvent(QGraphicsSceneDragDropEvent* event) final override;
79 
80  void keyPressEvent(QKeyEvent* event) override;
81  void keyReleaseEvent(QKeyEvent* event) override;
82 
83  QVariant itemChange(GraphicsItemChange change, const QVariant& value) override;
84 
85  const Process::Context& m_context;
86  std::vector<QPointer<CableItem>> cables;
87  const Process::Port& m_port;
88 
89 public:
90  double m_diam = 8.;
91 
92  bool m_visible{true};
93  bool m_inlet{true};
94  bool m_highlight{true};
95 
96  friend class Dataflow::CableItem;
97 
98  static const QPixmap&
99  portImage(Process::PortType t, bool inlet, bool smol, bool light, bool addr) noexcept;
100 };
101 
102 SCORE_LIB_PROCESS_EXPORT
103 score::SimpleTextItem* makePortLabel(const Process::Port& port, QGraphicsItem* parent);
104 
105 ossia::small_vector<const Process::Port*, 16>
106 getProcessPorts(const Process::ProcessModel& proc);
107 }
108 
109 namespace score
110 {
111 namespace mime
112 {
113 inline const constexpr char* port()
114 {
115  return "application/x-score-port";
116 }
117 }
118 }
119 
120 W_REGISTER_ARGTYPE(Dataflow::PortItem*)
Definition: QmlObjects.hpp:114
Definition: CableItem.hpp:26
Definition: score-lib-process/Process/Dataflow/PortItem.hpp:39
Definition: QmlObjects.hpp:51
Definition: score-lib-process/Process/Dataflow/Port.hpp:102
The Process class.
Definition: score-lib-process/Process/Process.hpp:61
Definition: TextItem.hpp:28
Base classes and tools to implement processes and layers.
Definition: JSONVisitor.hpp:1324
Base toolkit upon which the software is built.
Definition: Application.cpp:90
Definition: ProcessContext.hpp:12
Definition: DocumentContext.hpp:18