PdLayer.hpp
1 #pragma once
2 #include <Process/GenericProcessFactory.hpp>
3 #include <Process/WidgetLayer/WidgetProcessFactory.hpp>
4 
5 #include <Control/DefaultEffectItem.hpp>
6 #include <Effect/EffectFactory.hpp>
7 #include <Pd/Inspector/PdInspectorWidget.hpp>
8 #include <Pd/PdProcess.hpp>
9 
10 #include <QFileInfo>
11 #include <QProcess>
12 
13 #include <z_libpd.h>
14 namespace Pd
15 {
16 /*
17 struct UiWrapper : public QWidget
18 {
19  QPointer<const ProcessModel> m_model;
20  QProcess m_process;
21  UiWrapper(
22  const ProcessModel& proc,
23  const score::DocumentContext& ctx,
24  QWidget* parent)
25  : m_model{&proc}
26  {
27  setGeometry(0, 0, 0, 0);
28 
29  connect(
30  &m_process,
31  qOverload<int, QProcess::ExitStatus>(&QProcess::finished),
32  this,
33  &QWidget::deleteLater);
34  connect(
35  &proc,
36  &IdentifiedObjectAbstract::identified_object_destroying,
37  this,
38  &QWidget::deleteLater);
39  const auto& bin = locatePdBinary();
40  if (!bin.isEmpty())
41  {
42  m_process.start(bin, {proc.script()});
43  }
44  }
45 
46  void closeEvent(QCloseEvent* event) override
47  {
48  QPointer<UiWrapper> p(this);
49  if (m_model)
50  {
51  const_cast<QWidget*&>(m_model->externalUI) = nullptr;
52  m_model->externalUIVisible(false);
53  }
54  if (p)
55  QWidget::closeEvent(event);
56  }
57 
58  ~UiWrapper()
59  {
60  if (m_model)
61  {
62  const_cast<QWidget*&>(m_model->externalUI) = nullptr;
63  m_model->externalUIVisible(false);
64  }
65  m_process.terminate();
66  }
67 };
68 */
69 struct UiWrapper : public QWidget
70 {
71  QPointer<const ProcessModel> m_model;
72  std::shared_ptr<Pd::Instance> m_instance;
73  UiWrapper(const ProcessModel& proc, const score::DocumentContext& ctx, QWidget* parent)
74  : m_model{&proc}
75  , m_instance{proc.m_instance}
76  {
77  setGeometry(0, 0, 0, 0);
78 
79  connect(
81  &QWidget::deleteLater);
82  const auto& bin = locatePdBinary();
83  if(!bin.isEmpty())
84  {
85  libpd_set_instance(m_instance->instance);
86  libpd_start_gui(locatePdResourceFolder().toUtf8().constData());
87  m_instance->ui_open = true;
88  }
89  startTimer(8);
90  }
91 
92  QString locatePdResourceFolder() noexcept
93  {
94 #if defined(__linux__)
95  auto path = QStringLiteral("/usr/lib/pd");
96  if(QFile::exists(path))
97  return path;
98  else
99  return QStringLiteral("/usr/lib64/pd");
100 #else
101  return QFileInfo{locatePdBinary()}.absolutePath();
102 #endif
103  }
104 
105  void closeEvent(QCloseEvent* event) override
106  {
107  QPointer<UiWrapper> p(this);
108 
109  if(m_instance->ui_open)
110  {
111  m_instance->ui_open = false;
112  libpd_set_instance(m_instance->instance);
113  libpd_stop_gui();
114  }
115 
116  if(m_model)
117  {
118  const_cast<QWidget*&>(m_model->externalUI) = nullptr;
119  m_model->externalUIVisible(false);
120  }
121 
122  if(p)
123  {
124  QWidget::closeEvent(event);
125  }
126  }
127 
128  ~UiWrapper()
129  {
130  if(m_instance->ui_open)
131  {
132  m_instance->ui_open = false;
133  libpd_set_instance(m_instance->instance);
134  libpd_stop_gui();
135  }
136 
137  if(m_model)
138  {
139  const_cast<QWidget*&>(m_model->externalUI) = nullptr;
140  m_model->externalUIVisible(false);
141  }
142  }
143 
144  void timerEvent(QTimerEvent* event) override
145  {
146  libpd_set_instance(m_instance->instance);
147  libpd_poll_gui();
148  }
149 };
150 
153 }
void identified_object_destroying(IdentifiedObjectAbstract *o)
To be called by subclasses.
Definition: PdProcess.hpp:40
Definition: DefaultEffectItem.hpp:26
Definition: EffectFactory.hpp:66
Definition: PdLayer.hpp:70
Definition: DocumentContext.hpp:18