Loading...
Searching...
No Matches
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>
14namespace Pd
15{
16/*
17struct 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*/
69struct 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 for(auto path :
96 {QStringLiteral("/usr/lib64/puredata"), QStringLiteral("/usr/lib64/pd"),
97 QStringLiteral("/usr/lib/puredata"), QStringLiteral("/usr/lib/pd")})
98 if(QFile::exists(path))
99 return path;
100#endif
101 return QFileInfo{locatePdBinary()}.absolutePath();
102 }
103
104 void closeEvent(QCloseEvent* event) override
105 {
106 QPointer<UiWrapper> p(this);
107
108 if(m_instance->ui_open)
109 {
110 m_instance->ui_open = false;
111 libpd_set_instance(m_instance->instance);
112 libpd_stop_gui();
113 }
114
115 if(m_model)
116 {
117 const_cast<QWidget*&>(m_model->externalUI) = nullptr;
118 m_model->externalUIVisible(false);
119 }
120
121 if(p)
122 {
123 QWidget::closeEvent(event);
124 }
125 }
126
127 ~UiWrapper()
128 {
129 if(m_instance->ui_open)
130 {
131 m_instance->ui_open = false;
132 libpd_set_instance(m_instance->instance);
133 libpd_stop_gui();
134 }
135
136 if(m_model)
137 {
138 const_cast<QWidget*&>(m_model->externalUI) = nullptr;
139 m_model->externalUIVisible(false);
140 }
141 }
142
143 void timerEvent(QTimerEvent* event) override
144 {
145 libpd_set_instance(m_instance->instance);
146 libpd_poll_gui();
147 }
148};
149
152}
void identified_object_destroying(IdentifiedObjectAbstract *o)
To be called by subclasses.
Definition PdProcess.hpp:40
Definition DefaultEffectItem.hpp:26
Definition EffectFactory.hpp:67
Definition PdLayer.hpp:70
Definition DocumentContext.hpp:18