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