commit 7852fb4d0356fbb85aeb817a1799168d154469cc
parent 43969b12f8b3d21b6e29c9dad3fe51adb5da84e3
Author: Alexandre BIQUE <bique.alexandre@gmail.com>
Date: Mon, 30 Aug 2021 22:36:52 +0200
Add utility to recreate the plugin window
Diffstat:
4 files changed, 67 insertions(+), 1 deletion(-)
diff --git a/examples/host/main-window.cc b/examples/host/main-window.cc
@@ -77,6 +77,19 @@ void MainWindow::createMenu() {
&QAction::triggered,
this,
&MainWindow::showPluginQuickControlsWindow);
+ menuBar->addSeparator();
+ connect(windowsMenu->addAction(tr("Toggle Plugin Window Visibility")),
+ &QAction::triggered,
+ this,
+ &MainWindow::togglePluginWindowVisibility);
+ connect(windowsMenu->addAction(tr("Recreate Plugin Window")),
+ &QAction::triggered,
+ this,
+ &MainWindow::recreatePluginWindow);
+ connect(windowsMenu->addAction(tr("Scale Plugin Window")),
+ &QAction::triggered,
+ this,
+ &MainWindow::scalePluginWindow);
QMenu *helpMenu = menuBar->addMenu(tr("Help"));
helpMenu->addAction(tr("Manual"));
@@ -108,4 +121,21 @@ void MainWindow::loadNativePluginPreset()
return;
application_.engine()->pluginHost().loadNativePluginPreset(file.toStdString());
+}
+
+void MainWindow::togglePluginWindowVisibility()
+{
+ bool isVisible = !pluginViewWidget_->isVisible();
+ pluginViewWidget_->setVisible(isVisible);
+ application_.engine()->pluginHost().setPluginWindowVisibility(isVisible);
+}
+
+void MainWindow::recreatePluginWindow()
+{
+ application_.engine()->pluginHost().setParentWindow(pluginViewWindow_->winId());
+}
+
+void MainWindow::scalePluginWindow()
+{
+ // TODO
}
\ No newline at end of file
diff --git a/examples/host/main-window.hh b/examples/host/main-window.hh
@@ -26,6 +26,10 @@ public:
private:
void createMenu();
+ void togglePluginWindowVisibility();
+ void recreatePluginWindow();
+ void scalePluginWindow();
+
Application & application_;
SettingsDialog *settingsDialog_ = nullptr;
QWindow * pluginViewWindow_ = nullptr;
diff --git a/examples/host/plugin-host.cc b/examples/host/plugin-host.cc
@@ -248,9 +248,19 @@ void PluginHost::setPorts(int numInputs, float **inputs, int numOutputs, float *
void PluginHost::setParentWindow(WId parentWindow) {
checkForMainThread();
+ if (isGuiCreated_)
+ {
+ pluginGui_->destroy(plugin_);
+ isGuiCreated_ = false;
+ isGuiVisible_ = false;
+ }
+
if (!pluginGui_->create(plugin_))
return;
+ isGuiCreated_ = true;
+ assert(isGuiVisible_ == false);
+
uint32_t width = 0;
uint32_t height = 0;
@@ -272,7 +282,23 @@ void PluginHost::setParentWindow(WId parentWindow) {
Application::instance().mainWindow()->resizePluginView(width, height);
- pluginGui_->show(plugin_);
+ setPluginWindowVisibility(true);
+}
+
+void PluginHost::setPluginWindowVisibility(bool isVisible) {
+ assert(clapIsMainThread(&host_));
+
+ if (!isGuiCreated_)
+ return;
+
+ if (isVisible && !isGuiVisible_) {
+ pluginGui_->show(plugin_);
+ isGuiVisible_ = true;
+ } else if (!isVisible && isGuiVisible_)
+ {
+ pluginGui_->hide(plugin_);
+ isGuiVisible_ = false;
+ }
}
void PluginHost::clapLog(const clap_host *host, clap_log_severity severity, const char *msg) {
diff --git a/examples/host/plugin-host.hh b/examples/host/plugin-host.hh
@@ -34,6 +34,9 @@ public:
void activate(int32_t sample_rate);
void deactivate();
+ void recreatePluginWindow();
+ void setPluginWindowVisibility(bool isVisible);
+
void setPorts(int numInputs, float **inputs, int numOutputs, float **outputs);
void setParentWindow(WId parentWindow);
@@ -226,4 +229,7 @@ private:
bool stateIsDirty_ = false;
bool scheduleRestart_ = false;
+
+ bool isGuiCreated_ = false;
+ bool isGuiVisible_ = false;
};