|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590 |
- /*
- * Carla plugin host
- * Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * For a full copy of the GNU General Public License see the doc/GPL.txt file.
- */
-
- #include "pluginlistrefreshdialog.hpp"
-
- #ifdef __clang__
- # pragma clang diagnostic push
- # pragma clang diagnostic ignored "-Wdeprecated-copy-with-user-provided-copy"
- # pragma clang diagnostic ignored "-Wdeprecated-register"
- #elif defined(__GNUC__) && __GNUC__ >= 8
- # pragma GCC diagnostic push
- # pragma GCC diagnostic ignored "-Wclass-memaccess"
- # pragma GCC diagnostic ignored "-Wdeprecated-copy"
- #endif
-
- #include "ui_pluginlistrefreshdialog.h"
- #include <QtCore/QFileInfo>
- #include <QtWidgets/QPushButton>
-
- #ifdef __clang__
- # pragma clang diagnostic pop
- #elif defined(__GNUC__) && __GNUC__ >= 8
- # pragma GCC diagnostic pop
- #endif
-
- #include "qsafesettings.hpp"
-
- #include "CarlaFrontend.h"
- #include "CarlaUtils.h"
-
- #include <cstring>
-
- static bool hasFeature(const char* const* const features, const char* const feature)
- {
- if (features == nullptr)
- return false;
-
- for (int i=0; features[i] != nullptr; ++i)
- {
- if (std::strcmp(features[i], feature) == 0)
- return true;
- }
-
- return false;
- }
-
- // --------------------------------------------------------------------------------------------------------------------
- // Jack Application Dialog
-
- struct PluginListRefreshDialog::Self {
- Ui_PluginRefreshW ui;
- QPixmap fIconYes;
- QPixmap fIconNo;
-
- Self() {}
-
- static Self& create()
- {
- Self* const self = new Self();
- return *self;
- }
- };
-
- PluginListRefreshDialog::PluginListRefreshDialog(QWidget* const parent, const bool useSystemIcons)
- : QDialog(parent),
- self(Self::create())
- {
- self.ui.setupUi(this);
-
- // ----------------------------------------------------------------------------------------------------------------
- // Internal stuff
-
- #ifdef CARLA_OS_WIN
- #define APP_EXT ".exe"
- #else
- #define APP_EXT ""
- #endif
-
- QString hostPathBinaries;
- const bool hasNative = QFileInfo::exists(QCarlaString(hostPathBinaries) + CARLA_OS_SEP_STR "carla-discovery-native" APP_EXT);
- const bool hasPosix32 = QFileInfo::exists(QCarlaString(hostPathBinaries) + CARLA_OS_SEP_STR "carla-discovery-posix32");
- const bool hasPosix64 = QFileInfo::exists(QCarlaString(hostPathBinaries) + CARLA_OS_SEP_STR "carla-discovery-posix64");
- const bool hasWin32 = QFileInfo::exists(QCarlaString(hostPathBinaries) + CARLA_OS_SEP_STR "carla-discovery-win32.exe");
- const bool hasWin64 = QFileInfo::exists(QCarlaString(hostPathBinaries) + CARLA_OS_SEP_STR "carla-discovery-win64.exe");
-
- // self.fThread = SearchPluginsThread(self, host.pathBinaries)
-
- // ----------------------------------------------------------------------------------------------------------------
- // Set-up Icons
-
- if (useSystemIcons)
- {
- // self.ui.b_start->setIcon(getIcon("arrow-right", 16, "svgz"));
- // self.ui.b_close->setIcon(getIcon("window-close", 16, "svgz"));
- // if QT_VERSION >= 0x50600:
- // size = int(16 * self.devicePixelRatioF())
- // else:
- // size = 16
- // self.fIconYes = QPixmap(getIcon('dialog-ok-apply', 16, 'svgz').pixmap(size))
- // self.fIconNo = QPixmap(getIcon('dialog-error', 16, 'svgz').pixmap(size))
- }
- else
- {
- self.fIconYes = QPixmap(":/16x16/dialog-ok-apply.svgz");
- self.fIconNo = QPixmap(":/16x16/dialog-error.svgz");
- }
-
- // ----------------------------------------------------------------------------------------------------------------
- // UI setup
-
- // FIXME remove LRDF
- self.ui.ico_rdflib->setPixmap(self.fIconNo);
-
- self.ui.b_skip->hide();
-
- #if defined(CARLA_OS_HAIKU)
- self.ui.ch_posix32->setText("Haiku 32bit");
- self.ui.ch_posix64->setText("Haiku 64bit");
- #elif defined(CARLA_OS_LINUX)
- self.ui.ch_posix32->setText("Linux 32bit");
- self.ui.ch_posix64->setText("Linux 64bit");
- #elif defined(CARLA_OS_MAC)
- self.ui.ch_posix32->setText("MacOS 32bit");
- self.ui.ch_posix64->setText("MacOS 64bit");
- #endif
-
- #ifndef CARLA_OS_WIN
- if (hasPosix32)
- {
- self.ui.ico_posix32->setPixmap(self.fIconYes);
- }
- else
- #endif
- {
- self.ui.ico_posix32->setPixmap(self.fIconNo);
- self.ui.ch_posix32->setEnabled(false);
- }
-
- #ifndef CARLA_OS_WIN
- if (hasPosix64)
- {
- self.ui.ico_posix64->setPixmap(self.fIconYes);
- }
- else
- #endif
- {
- self.ui.ico_posix64->setPixmap(self.fIconNo);
- self.ui.ch_posix64->setEnabled(false);
- }
-
- if (hasWin32)
- {
- self.ui.ico_win32->setPixmap(self.fIconYes);
- }
- else
- {
- self.ui.ico_win32->setPixmap(self.fIconNo);
- self.ui.ch_win32->setEnabled(false);
- }
-
- if (hasWin64)
- {
- self.ui.ico_win64->setPixmap(self.fIconYes);
- }
- else
- {
- self.ui.ico_win64->setPixmap(self.fIconNo);
- self.ui.ch_win64->setEnabled(false);
- }
-
- bool hasNonNative;
-
- #if defined(CARLA_OS_WIN)
- #ifdef CARLA_OS_64BIT
- hasNonNative = hasWin32;
- self.ui.ch_win64->setEnabled(false);
- self.ui.ch_win64->setVisible(false);
- self.ui.ico_win64->setVisible(false);
- self.ui.label_win64->setVisible(false);
- #else
- hasNonNative = hasWin64;
- self.ui.ch_win32->setEnabled(false);
- self.ui.ch_win32->setVisible(false);
- self.ui.ico_win32->setVisible(false);
- self.ui.label_win32->setVisible(false);
- #endif
-
- self.ui.ch_posix32->setEnabled(false);
- self.ui.ch_posix32->setVisible(false);
- self.ui.ch_posix64->setEnabled(false);
- self.ui.ch_posix64->setVisible(false);
- self.ui.ico_posix32->hide();
- self.ui.ico_posix64->hide();
- self.ui.label_posix32->hide();
- self.ui.label_posix64->hide();
- self.ui.ico_rdflib->hide();
- self.ui.label_rdflib->hide();
- #elif defined(CARLA_OS_64BIT)
- hasNonNative = hasPosix32 || hasWin32 || hasWin64;
- self.ui.ch_posix64->setEnabled(false);
- self.ui.ch_posix64->setVisible(false);
- self.ui.ico_posix64->setVisible(false);
- self.ui.label_posix64->setVisible(false);
- #else
- hasNonNative = hasPosix64 || hasWin32 || hasWin64;
- self.ui.ch_posix32->setEnabled(false);
- self.ui.ch_posix32->setVisible(false);
- self.ui.ico_posix32->setVisible(false);
- self.ui.label_posix32->setVisible(false);
- #endif
-
- #ifdef CARLA_OS_MAC
- setWindowModality(Qt::WindowModal);
- #else
- self.ui.ch_au->setEnabled(false);
- self.ui.ch_au->setVisible(false);
- #endif
-
- if (hasNative)
- {
- self.ui.ico_native->setPixmap(self.fIconYes);
- }
- else
- {
- self.ui.ico_native->setPixmap(self.fIconNo);
- self.ui.ch_native->setEnabled(false);
- self.ui.ch_sf2->setEnabled(false);
- if (! hasNonNative)
- {
- self.ui.ch_ladspa->setEnabled(false);
- self.ui.ch_dssi->setEnabled(false);
- self.ui.ch_vst->setEnabled(false);
- self.ui.ch_vst3->setEnabled(false);
- self.ui.ch_clap->setEnabled(false);
- }
- }
-
- // TODO
- // if (! hasLoadedLv2Plugins)
- self.ui.lv2_restart_notice->hide();
-
- setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
-
- // ----------------------------------------------------------------------------------------------------------------
- // Load settings
-
- loadSettings();
-
- // ----------------------------------------------------------------------------------------------------------------
- // Hide bridges if disabled
-
- // TODO
- bool showPluginBridges = true;
- bool showWineBridges = true;
-
- #ifdef CARLA_OS_WIN
- #ifndef CARLA_OS_64BIT
- // NOTE: We Assume win32 carla build will not run win64 plugins
- showPluginBridges = false;
- #endif
- showWineBridges = false;
- #endif
-
- if (! showPluginBridges)
- {
- self.ui.ch_native->setChecked(true);
- self.ui.ch_native->setEnabled(false);
- self.ui.ch_native->setVisible(false);
- self.ui.ch_posix32->setChecked(false);
- self.ui.ch_posix32->setEnabled(false);
- self.ui.ch_posix32->setVisible(false);
- self.ui.ch_posix64->setChecked(false);
- self.ui.ch_posix64->setEnabled(false);
- self.ui.ch_posix64->setVisible(false);
- self.ui.ch_win32->setChecked(false);
- self.ui.ch_win32->setEnabled(false);
- self.ui.ch_win32->setVisible(false);
- self.ui.ch_win64->setChecked(false);
- self.ui.ch_win64->setEnabled(false);
- self.ui.ch_win64->setVisible(false);
- self.ui.ico_posix32->hide();
- self.ui.ico_posix64->hide();
- self.ui.ico_win32->hide();
- self.ui.ico_win64->hide();
- self.ui.label_posix32->hide();
- self.ui.label_posix64->hide();
- self.ui.label_win32->hide();
- self.ui.label_win64->hide();
- self.ui.sep_format->hide();
- }
- else if (! showWineBridges)
- {
- self.ui.ch_win32->setChecked(false);
- self.ui.ch_win32->setEnabled(false);
- self.ui.ch_win32->setVisible(false);
- self.ui.ch_win64->setChecked(false);
- self.ui.ch_win64->setEnabled(false);
- self.ui.ch_win64->setVisible(false);
- self.ui.ico_win32->hide();
- self.ui.ico_win64->hide();
- self.ui.label_win32->hide();
- self.ui.label_win64->hide();
- }
-
- // Disable non-supported features
- const char* const* const features = carla_get_supported_features();
-
- if (! hasFeature(features, "sf2"))
- {
- self.ui.ch_sf2->setChecked(false);
- self.ui.ch_sf2->setEnabled(false);
- }
-
- #ifdef CARLA_OS_MAC
- if (! hasFeature(features, "juce"))
- {
- self.ui.ch_au->setChecked(false);
- self.ui.ch_au->setEnabled(false);
- }
- #endif
-
- // ----------------------------------------------------------------------------------------------------------------
- // Resize to minimum size, as it's very likely UI stuff was hidden
-
- resize(minimumSize());
-
- // ----------------------------------------------------------------------------------------------------------------
- // Set-up connections
-
- connect(this, &QDialog::finished,
- this, &PluginListRefreshDialog::slot_saveSettings);
- // self.ui.b_start.clicked.connect(self.slot_start)
- // self.ui.b_skip.clicked.connect(self.slot_skip)
- // self.ui.ch_native.clicked.connect(self.slot_checkTools)
- // self.ui.ch_posix32.clicked.connect(self.slot_checkTools)
- // self.ui.ch_posix64.clicked.connect(self.slot_checkTools)
- // self.ui.ch_win32.clicked.connect(self.slot_checkTools)
- // self.ui.ch_win64.clicked.connect(self.slot_checkTools)
- // self.ui.ch_ladspa.clicked.connect(self.slot_checkTools)
- // self.ui.ch_dssi.clicked.connect(self.slot_checkTools)
- // self.ui.ch_lv2.clicked.connect(self.slot_checkTools)
- // self.ui.ch_vst.clicked.connect(self.slot_checkTools)
- // self.ui.ch_vst3.clicked.connect(self.slot_checkTools)
- // self.ui.ch_clap.clicked.connect(self.slot_checkTools)
- // self.ui.ch_au.clicked.connect(self.slot_checkTools)
- // self.ui.ch_sf2.clicked.connect(self.slot_checkTools)
- // self.ui.ch_sfz.clicked.connect(self.slot_checkTools)
- // self.ui.ch_jsfx.clicked.connect(self.slot_checkTools)
- // self.fThread.pluginLook.connect(self.slot_handlePluginLook)
- // self.fThread.finished.connect(self.slot_handlePluginThreadFinished)
-
- // connect(this, &QDialog::finished,
- // this, &JackAppDialog::slot_saveSettings);
- // connect(self.ui.cb_session_mgr, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
- // this, &JackAppDialog::slot_sessionManagerChanged);
- // connect(self.ui.le_command, &QLineEdit::textChanged,
- // this, &JackAppDialog::slot_commandChanged);
-
- // ----------------------------------------------------------------------------------------------------------------
- // Post-connect setup
-
- slot_checkTools();
- }
-
- PluginListRefreshDialog::~PluginListRefreshDialog()
- {
- delete &self;
- }
-
- // -----------------------------------------------------------------------------------------------------------------
- // public methods
-
- // -----------------------------------------------------------------------------------------------------------------
- // protected methods
-
- void PluginListRefreshDialog::closeEvent(QCloseEvent* const event)
- {
- /*
- if (self.fThread.isRunning())
- {
- self.fThread.stop();
- killDiscovery();
- #self.fThread.terminate();
- self.fThread.wait();
- }
-
- if (self.fThread.hasSomethingChanged())
- accept();
- else
- */
- reject();
-
- QDialog::closeEvent(event);
- }
-
- // -----------------------------------------------------------------------------------------------------------------
- // private methods
-
- void PluginListRefreshDialog::loadSettings()
- {
- const QSafeSettings settings("falkTX", "CarlaRefresh2");
-
- bool check;
-
- check = settings.valueBool("PluginDatabase/SearchLADSPA", true) and self.ui.ch_ladspa->isEnabled();
- self.ui.ch_ladspa->setChecked(check);
-
- check = settings.valueBool("PluginDatabase/SearchDSSI", true) and self.ui.ch_dssi->isEnabled();
- self.ui.ch_dssi->setChecked(check);
-
- check = settings.valueBool("PluginDatabase/SearchLV2", true) and self.ui.ch_lv2->isEnabled();
- self.ui.ch_lv2->setChecked(check);
-
- check = settings.valueBool("PluginDatabase/SearchVST2", true) and self.ui.ch_vst->isEnabled();
- self.ui.ch_vst->setChecked(check);
-
- check = settings.valueBool("PluginDatabase/SearchVST3", true) and self.ui.ch_vst3->isEnabled();
- self.ui.ch_vst3->setChecked(check);
-
- check = settings.valueBool("PluginDatabase/SearchCLAP", true) and self.ui.ch_clap->isEnabled();
- self.ui.ch_clap->setChecked(check);
-
- #ifdef CARLA_OS_MAC
- check = settings.valueBool("PluginDatabase/SearchAU", true) and self.ui.ch_au->isEnabled();
- #else
- check = false;
- #endif
- self.ui.ch_au->setChecked(check);
-
- check = settings.valueBool("PluginDatabase/SearchSF2", false) and self.ui.ch_sf2->isEnabled();
- self.ui.ch_sf2->setChecked(check);
-
- check = settings.valueBool("PluginDatabase/SearchSFZ", false) and self.ui.ch_sfz->isEnabled();
- self.ui.ch_sfz->setChecked(check);
-
- check = settings.valueBool("PluginDatabase/SearchJSFX", true) and self.ui.ch_jsfx->isEnabled();
- self.ui.ch_jsfx->setChecked(check);
-
- check = settings.valueBool("PluginDatabase/SearchNative", true) and self.ui.ch_native->isEnabled();
- self.ui.ch_native->setChecked(check);
-
- check = settings.valueBool("PluginDatabase/SearchPOSIX32", false) and self.ui.ch_posix32->isEnabled();
- self.ui.ch_posix32->setChecked(check);
-
- check = settings.valueBool("PluginDatabase/SearchPOSIX64", false) and self.ui.ch_posix64->isEnabled();
- self.ui.ch_posix64->setChecked(check);
-
- check = settings.valueBool("PluginDatabase/SearchWin32", false) and self.ui.ch_win32->isEnabled();
- self.ui.ch_win32->setChecked(check);
-
- check = settings.valueBool("PluginDatabase/SearchWin64", false) and self.ui.ch_win64->isEnabled();
- self.ui.ch_win64->setChecked(check);
-
- self.ui.ch_do_checks->setChecked(settings.valueBool("PluginDatabase/DoChecks", false));
- }
-
- // -----------------------------------------------------------------------------------------------------------------
- // private slots
-
- void PluginListRefreshDialog::slot_saveSettings()
- {
- QSafeSettings settings("falkTX", "CarlaRefresh2");
- settings.setValue("PluginDatabase/SearchLADSPA", self.ui.ch_ladspa->isChecked());
- settings.setValue("PluginDatabase/SearchDSSI", self.ui.ch_dssi->isChecked());
- settings.setValue("PluginDatabase/SearchLV2", self.ui.ch_lv2->isChecked());
- settings.setValue("PluginDatabase/SearchVST2", self.ui.ch_vst->isChecked());
- settings.setValue("PluginDatabase/SearchVST3", self.ui.ch_vst3->isChecked());
- settings.setValue("PluginDatabase/SearchCLAP", self.ui.ch_clap->isChecked());
- settings.setValue("PluginDatabase/SearchAU", self.ui.ch_au->isChecked());
- settings.setValue("PluginDatabase/SearchSF2", self.ui.ch_sf2->isChecked());
- settings.setValue("PluginDatabase/SearchSFZ", self.ui.ch_sfz->isChecked());
- settings.setValue("PluginDatabase/SearchJSFX", self.ui.ch_jsfx->isChecked());
- settings.setValue("PluginDatabase/SearchNative", self.ui.ch_native->isChecked());
- settings.setValue("PluginDatabase/SearchPOSIX32", self.ui.ch_posix32->isChecked());
- settings.setValue("PluginDatabase/SearchPOSIX64", self.ui.ch_posix64->isChecked());
- settings.setValue("PluginDatabase/SearchWin32", self.ui.ch_win32->isChecked());
- settings.setValue("PluginDatabase/SearchWin64", self.ui.ch_win64->isChecked());
- settings.setValue("PluginDatabase/DoChecks", self.ui.ch_do_checks->isChecked());
- }
-
- void PluginListRefreshDialog::slot_start()
- {
- self.ui.progressBar->setMinimum(0);
- self.ui.progressBar->setMaximum(100);
- self.ui.progressBar->setValue(0);
- self.ui.b_start->setEnabled(false);
- self.ui.b_skip->setVisible(true);
- self.ui.b_close->setVisible(false);
- self.ui.group_types->setEnabled(false);
- self.ui.group_options->setEnabled(false);
-
- // if gCarla.utils:
- // if self.ui.ch_do_checks.isChecked():
- // gCarla.utils.unsetenv("CARLA_DISCOVERY_NO_PROCESSING_CHECKS")
- // else:
- // gCarla.utils.setenv("CARLA_DISCOVERY_NO_PROCESSING_CHECKS", "true")
- //
- // native, posix32, posix64, win32, win64 = (self.ui.ch_native.isChecked(),
- // self.ui.ch_posix32.isChecked(), self.ui.ch_posix64.isChecked(),
- // self.ui.ch_win32.isChecked(), self.ui.ch_win64.isChecked())
- //
- // ladspa, dssi, lv2, vst, vst3, clap, au, sf2, sfz, jsfx = (self.ui.ch_ladspa.isChecked(), self.ui.ch_dssi.isChecked(),
- // self.ui.ch_lv2.isChecked(), self.ui.ch_vst.isChecked(),
- // self.ui.ch_vst3.isChecked(), self.ui.ch_clap.isChecked(),
- // self.ui.ch_au.isChecked(), self.ui.ch_sf2.isChecked(),
- // self.ui.ch_sfz.isChecked(), self.ui.ch_jsfx.isChecked())
- //
- // self.fThread.setSearchBinaryTypes(native, posix32, posix64, win32, win64)
- // self.fThread.setSearchPluginTypes(ladspa, dssi, lv2, vst, vst3, clap, au, sf2, sfz, jsfx)
- // self.fThread.start()
- }
-
- void PluginListRefreshDialog::slot_skip()
- {
- // killDiscovery();
- }
-
- void PluginListRefreshDialog::slot_checkTools()
- {
- const bool enabled1 = self.ui.ch_native->isChecked()
- || self.ui.ch_posix32->isChecked()
- || self.ui.ch_posix64->isChecked()
- || self.ui.ch_win32->isChecked()
- || self.ui.ch_win64->isChecked();
-
- const bool enabled2 = self.ui.ch_ladspa->isChecked()
- || self.ui.ch_dssi->isChecked()
- || self.ui.ch_lv2->isChecked()
- || self.ui.ch_vst->isChecked()
- || self.ui.ch_vst3->isChecked()
- || self.ui.ch_clap->isChecked()
- || self.ui.ch_au->isChecked()
- || self.ui.ch_sf2->isChecked()
- || self.ui.ch_sfz->isChecked()
- || self.ui.ch_jsfx->isChecked();
-
- self.ui.b_start->setEnabled(enabled1 and enabled2);
- }
-
- void PluginListRefreshDialog::slot_handlePluginLook(const int percent, const QString plugin)
- {
- self.ui.progressBar->setFormat(plugin);
- self.ui.progressBar->setValue(percent);
- }
-
- void PluginListRefreshDialog::slot_handlePluginThreadFinished()
- {
- self.ui.progressBar->setMinimum(0);
- self.ui.progressBar->setMaximum(1);
- self.ui.progressBar->setValue(1);
- self.ui.progressBar->setFormat(tr("Done"));
- self.ui.b_start->setEnabled(true);
- self.ui.b_skip->setVisible(false);
- self.ui.b_close->setVisible(true);
- self.ui.group_types->setEnabled(true);
- self.ui.group_options->setEnabled(true);
- }
-
- // --------------------------------------------------------------------------------------------------------------------
-
- const PluginListRefreshDialogResults*
- carla_frontend_createAndExecPluginListRefreshDialog(void* const parent, const bool useSystemIcons)
- {
- PluginListRefreshDialog gui(reinterpret_cast<QWidget*>(parent), useSystemIcons);
-
- if (gui.exec())
- {
- static PluginListRefreshDialogResults ret = {};
-
- return &ret;
- }
-
- return nullptr;
- }
-
- // --------------------------------------------------------------------------------------------------------------------
|