Audio plugin host https://kx.studio/carla
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

590 lines
21KB

  1. /*
  2. * Carla plugin host
  3. * Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License as
  7. * published by the Free Software Foundation; either version 2 of
  8. * the License, or any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * For a full copy of the GNU General Public License see the doc/GPL.txt file.
  16. */
  17. #include "pluginlistrefreshdialog.hpp"
  18. #ifdef __clang__
  19. # pragma clang diagnostic push
  20. # pragma clang diagnostic ignored "-Wdeprecated-copy-with-user-provided-copy"
  21. # pragma clang diagnostic ignored "-Wdeprecated-register"
  22. #elif defined(__GNUC__) && __GNUC__ >= 8
  23. # pragma GCC diagnostic push
  24. # pragma GCC diagnostic ignored "-Wclass-memaccess"
  25. # pragma GCC diagnostic ignored "-Wdeprecated-copy"
  26. #endif
  27. #include "pluginlistrefreshdialog_ui.hpp"
  28. #include <QtCore/QFileInfo>
  29. #include <QtWidgets/QPushButton>
  30. #ifdef __clang__
  31. # pragma clang diagnostic pop
  32. #elif defined(__GNUC__) && __GNUC__ >= 8
  33. # pragma GCC diagnostic pop
  34. #endif
  35. #include "qsafesettings.hpp"
  36. #include "CarlaUtils.h"
  37. #include <cstring>
  38. static bool hasFeature(const char* const* const features, const char* const feature)
  39. {
  40. if (features == nullptr)
  41. return false;
  42. for (int i=0; features[i] != nullptr; ++i)
  43. {
  44. if (std::strcmp(features[i], feature) == 0)
  45. return true;
  46. }
  47. return false;
  48. }
  49. // --------------------------------------------------------------------------------------------------------------------
  50. // Jack Application Dialog
  51. struct PluginListRefreshDialog::Self {
  52. Ui_PluginRefreshW ui;
  53. QPixmap fIconYes;
  54. QPixmap fIconNo;
  55. Self() {}
  56. static Self& create()
  57. {
  58. Self* const self = new Self();
  59. return *self;
  60. }
  61. };
  62. PluginListRefreshDialog::PluginListRefreshDialog(QWidget* const parent, const bool useSystemIcons)
  63. : QDialog(parent),
  64. self(Self::create())
  65. {
  66. self.ui.setupUi(this);
  67. // ----------------------------------------------------------------------------------------------------------------
  68. // Internal stuff
  69. #ifdef CARLA_OS_WIN
  70. #define APP_EXT ".exe"
  71. #else
  72. #define APP_EXT ".exe"
  73. #endif
  74. QString hostPathBinaries;
  75. const bool hasNative = QFileInfo::exists(QCarlaString(hostPathBinaries) + CARLA_OS_SEP_STR "carla-discovery-native" APP_EXT);
  76. const bool hasPosix32 = QFileInfo::exists(QCarlaString(hostPathBinaries) + CARLA_OS_SEP_STR "carla-discovery-posix32");
  77. const bool hasPosix64 = QFileInfo::exists(QCarlaString(hostPathBinaries) + CARLA_OS_SEP_STR "carla-discovery-posix64");
  78. const bool hasWin32 = QFileInfo::exists(QCarlaString(hostPathBinaries) + CARLA_OS_SEP_STR "carla-discovery-win32.exe");
  79. const bool hasWin64 = QFileInfo::exists(QCarlaString(hostPathBinaries) + CARLA_OS_SEP_STR "carla-discovery-win64.exe");
  80. // self.fThread = SearchPluginsThread(self, host.pathBinaries)
  81. // ----------------------------------------------------------------------------------------------------------------
  82. // Set-up Icons
  83. if (useSystemIcons)
  84. {
  85. // self.ui.b_start->setIcon(getIcon("arrow-right", 16, "svgz"));
  86. // self.ui.b_close->setIcon(getIcon("window-close", 16, "svgz"));
  87. // if QT_VERSION >= 0x50600:
  88. // size = int(16 * self.devicePixelRatioF())
  89. // else:
  90. // size = 16
  91. // self.fIconYes = QPixmap(getIcon('dialog-ok-apply', 16, 'svgz').pixmap(size))
  92. // self.fIconNo = QPixmap(getIcon('dialog-error', 16, 'svgz').pixmap(size))
  93. }
  94. else
  95. {
  96. self.fIconYes = QPixmap(":/16x16/dialog-ok-apply.svgz");
  97. self.fIconNo = QPixmap(":/16x16/dialog-error.svgz");
  98. }
  99. // ----------------------------------------------------------------------------------------------------------------
  100. // UI setup
  101. // FIXME remove LRDF
  102. self.ui.ico_rdflib->setPixmap(self.fIconNo);
  103. self.ui.b_skip->hide();
  104. #if defined(CARLA_OS_HAIKU)
  105. self.ui.ch_posix32->setText("Haiku 32bit");
  106. self.ui.ch_posix64->setText("Haiku 64bit");
  107. #elif defined(CARLA_OS_LINUX)
  108. self.ui.ch_posix32->setText("Linux 32bit");
  109. self.ui.ch_posix64->setText("Linux 64bit");
  110. #elif defined(CARLA_OS_MAC)
  111. self.ui.ch_posix32->setText("MacOS 32bit");
  112. self.ui.ch_posix64->setText("MacOS 64bit");
  113. #endif
  114. #ifndef CARLA_OS_WIN
  115. if (hasPosix32)
  116. {
  117. self.ui.ico_posix32->setPixmap(self.fIconYes);
  118. }
  119. else
  120. #endif
  121. {
  122. self.ui.ico_posix32->setPixmap(self.fIconNo);
  123. self.ui.ch_posix32->setEnabled(false);
  124. }
  125. #ifndef CARLA_OS_WIN
  126. if (hasPosix64)
  127. {
  128. self.ui.ico_posix64->setPixmap(self.fIconYes);
  129. }
  130. else
  131. #endif
  132. {
  133. self.ui.ico_posix64->setPixmap(self.fIconNo);
  134. self.ui.ch_posix64->setEnabled(false);
  135. }
  136. if (hasWin32)
  137. {
  138. self.ui.ico_win32->setPixmap(self.fIconYes);
  139. }
  140. else
  141. {
  142. self.ui.ico_win32->setPixmap(self.fIconNo);
  143. self.ui.ch_win32->setEnabled(false);
  144. }
  145. if (hasWin64)
  146. {
  147. self.ui.ico_win64->setPixmap(self.fIconYes);
  148. }
  149. else
  150. {
  151. self.ui.ico_win64->setPixmap(self.fIconNo);
  152. self.ui.ch_win64->setEnabled(false);
  153. }
  154. bool hasNonNative;
  155. #if defined(CARLA_OS_WIN)
  156. #ifdef CARLA_OS_64BIT
  157. hasNonNative = hasWin32;
  158. self.ui.ch_win64->setEnabled(false);
  159. self.ui.ch_win64->setVisible(false);
  160. self.ui.ico_win64->setVisible(false);
  161. self.ui.label_win64->setVisible(false);
  162. #else
  163. hasNonNative = hasWin64;
  164. self.ui.ch_win32->setEnabled(false);
  165. self.ui.ch_win32->setVisible(false);
  166. self.ui.ico_win32->setVisible(false);
  167. self.ui.label_win32->setVisible(false);
  168. #endif
  169. self.ui.ch_posix32->setEnabled(false);
  170. self.ui.ch_posix32->setVisible(false);
  171. self.ui.ch_posix64->setEnabled(false);
  172. self.ui.ch_posix64->setVisible(false);
  173. self.ui.ico_posix32->hide();
  174. self.ui.ico_posix64->hide();
  175. self.ui.label_posix32->hide();
  176. self.ui.label_posix64->hide();
  177. self.ui.ico_rdflib->hide();
  178. self.ui.label_rdflib->hide();
  179. #elif defined(CARLA_OS_64BIT)
  180. hasNonNative = hasPosix32 || hasWin32 || hasWin64;
  181. self.ui.ch_posix64->setEnabled(false);
  182. self.ui.ch_posix64->setVisible(false);
  183. self.ui.ico_posix64->setVisible(false);
  184. self.ui.label_posix64->setVisible(false);
  185. #else
  186. hasNonNative = hasPosix64 || hasWin32 || hasWin64;
  187. self.ui.ch_posix32->setEnabled(false);
  188. self.ui.ch_posix32->setVisible(false);
  189. self.ui.ico_posix32->setVisible(false);
  190. self.ui.label_posix32->setVisible(false);
  191. #endif
  192. #ifdef CARLA_OS_MAC
  193. setWindowModality(Qt::WindowModal);
  194. #else
  195. self.ui.ch_au->setEnabled(false);
  196. self.ui.ch_au->setVisible(false);
  197. #endif
  198. if (hasNative)
  199. {
  200. self.ui.ico_native->setPixmap(self.fIconYes);
  201. }
  202. else
  203. {
  204. self.ui.ico_native->setPixmap(self.fIconNo);
  205. self.ui.ch_native->setEnabled(false);
  206. self.ui.ch_sf2->setEnabled(false);
  207. if (! hasNonNative)
  208. {
  209. self.ui.ch_ladspa->setEnabled(false);
  210. self.ui.ch_dssi->setEnabled(false);
  211. self.ui.ch_vst->setEnabled(false);
  212. self.ui.ch_vst3->setEnabled(false);
  213. self.ui.ch_clap->setEnabled(false);
  214. }
  215. }
  216. // TODO
  217. // if (! hasLoadedLv2Plugins)
  218. self.ui.lv2_restart_notice->hide();
  219. setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
  220. // ----------------------------------------------------------------------------------------------------------------
  221. // Load settings
  222. loadSettings();
  223. // ----------------------------------------------------------------------------------------------------------------
  224. // Hide bridges if disabled
  225. // TODO
  226. bool showPluginBridges = true;
  227. bool showWineBridges = true;
  228. #ifdef CARLA_OS_WIN
  229. #ifndef CARLA_OS_64BIT
  230. // NOTE: We Assume win32 carla build will not run win64 plugins
  231. showPluginBridges = false;
  232. #endif
  233. showWineBridges = false;
  234. #endif
  235. if (! showPluginBridges)
  236. {
  237. self.ui.ch_native->setChecked(true);
  238. self.ui.ch_native->setEnabled(false);
  239. self.ui.ch_native->setVisible(false);
  240. self.ui.ch_posix32->setChecked(false);
  241. self.ui.ch_posix32->setEnabled(false);
  242. self.ui.ch_posix32->setVisible(false);
  243. self.ui.ch_posix64->setChecked(false);
  244. self.ui.ch_posix64->setEnabled(false);
  245. self.ui.ch_posix64->setVisible(false);
  246. self.ui.ch_win32->setChecked(false);
  247. self.ui.ch_win32->setEnabled(false);
  248. self.ui.ch_win32->setVisible(false);
  249. self.ui.ch_win64->setChecked(false);
  250. self.ui.ch_win64->setEnabled(false);
  251. self.ui.ch_win64->setVisible(false);
  252. self.ui.ico_posix32->hide();
  253. self.ui.ico_posix64->hide();
  254. self.ui.ico_win32->hide();
  255. self.ui.ico_win64->hide();
  256. self.ui.label_posix32->hide();
  257. self.ui.label_posix64->hide();
  258. self.ui.label_win32->hide();
  259. self.ui.label_win64->hide();
  260. self.ui.sep_format->hide();
  261. }
  262. else if (! showWineBridges)
  263. {
  264. self.ui.ch_win32->setChecked(false);
  265. self.ui.ch_win32->setEnabled(false);
  266. self.ui.ch_win32->setVisible(false);
  267. self.ui.ch_win64->setChecked(false);
  268. self.ui.ch_win64->setEnabled(false);
  269. self.ui.ch_win64->setVisible(false);
  270. self.ui.ico_win32->hide();
  271. self.ui.ico_win64->hide();
  272. self.ui.label_win32->hide();
  273. self.ui.label_win64->hide();
  274. }
  275. // Disable non-supported features
  276. const char* const* const features = carla_get_supported_features();
  277. if (! hasFeature(features, "sf2"))
  278. {
  279. self.ui.ch_sf2->setChecked(false);
  280. self.ui.ch_sf2->setEnabled(false);
  281. }
  282. #ifdef CARLA_OS_MAC
  283. if (! hasFeature(features, "juce"))
  284. {
  285. self.ui.ch_au->setChecked(false);
  286. self.ui.ch_au->setEnabled(false);
  287. }
  288. #endif
  289. // ----------------------------------------------------------------------------------------------------------------
  290. // Resize to minimum size, as it's very likely UI stuff was hidden
  291. resize(minimumSize());
  292. // ----------------------------------------------------------------------------------------------------------------
  293. // Set-up connections
  294. connect(this, &QDialog::finished,
  295. this, &PluginListRefreshDialog::slot_saveSettings);
  296. // self.ui.b_start.clicked.connect(self.slot_start)
  297. // self.ui.b_skip.clicked.connect(self.slot_skip)
  298. // self.ui.ch_native.clicked.connect(self.slot_checkTools)
  299. // self.ui.ch_posix32.clicked.connect(self.slot_checkTools)
  300. // self.ui.ch_posix64.clicked.connect(self.slot_checkTools)
  301. // self.ui.ch_win32.clicked.connect(self.slot_checkTools)
  302. // self.ui.ch_win64.clicked.connect(self.slot_checkTools)
  303. // self.ui.ch_ladspa.clicked.connect(self.slot_checkTools)
  304. // self.ui.ch_dssi.clicked.connect(self.slot_checkTools)
  305. // self.ui.ch_lv2.clicked.connect(self.slot_checkTools)
  306. // self.ui.ch_vst.clicked.connect(self.slot_checkTools)
  307. // self.ui.ch_vst3.clicked.connect(self.slot_checkTools)
  308. // self.ui.ch_clap.clicked.connect(self.slot_checkTools)
  309. // self.ui.ch_au.clicked.connect(self.slot_checkTools)
  310. // self.ui.ch_sf2.clicked.connect(self.slot_checkTools)
  311. // self.ui.ch_sfz.clicked.connect(self.slot_checkTools)
  312. // self.ui.ch_jsfx.clicked.connect(self.slot_checkTools)
  313. // self.fThread.pluginLook.connect(self.slot_handlePluginLook)
  314. // self.fThread.finished.connect(self.slot_handlePluginThreadFinished)
  315. // connect(this, &QDialog::finished,
  316. // this, &JackAppDialog::slot_saveSettings);
  317. // connect(self.ui.cb_session_mgr, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
  318. // this, &JackAppDialog::slot_sessionManagerChanged);
  319. // connect(self.ui.le_command, &QLineEdit::textChanged,
  320. // this, &JackAppDialog::slot_commandChanged);
  321. // ----------------------------------------------------------------------------------------------------------------
  322. // Post-connect setup
  323. slot_checkTools();
  324. }
  325. PluginListRefreshDialog::~PluginListRefreshDialog()
  326. {
  327. delete &self;
  328. }
  329. // -----------------------------------------------------------------------------------------------------------------
  330. // public methods
  331. // -----------------------------------------------------------------------------------------------------------------
  332. // protected methods
  333. void PluginListRefreshDialog::closeEvent(QCloseEvent* const event)
  334. {
  335. /*
  336. if (self.fThread.isRunning())
  337. {
  338. self.fThread.stop();
  339. killDiscovery();
  340. #self.fThread.terminate();
  341. self.fThread.wait();
  342. }
  343. if (self.fThread.hasSomethingChanged())
  344. accept();
  345. else
  346. */
  347. reject();
  348. QDialog::closeEvent(event);
  349. }
  350. // -----------------------------------------------------------------------------------------------------------------
  351. // private methods
  352. void PluginListRefreshDialog::loadSettings()
  353. {
  354. const QSafeSettings settings("falkTX", "CarlaRefresh2");
  355. bool check;
  356. check = settings.valueBool("PluginDatabase/SearchLADSPA", true) and self.ui.ch_ladspa->isEnabled();
  357. self.ui.ch_ladspa->setChecked(check);
  358. check = settings.valueBool("PluginDatabase/SearchDSSI", true) and self.ui.ch_dssi->isEnabled();
  359. self.ui.ch_dssi->setChecked(check);
  360. check = settings.valueBool("PluginDatabase/SearchLV2", true) and self.ui.ch_lv2->isEnabled();
  361. self.ui.ch_lv2->setChecked(check);
  362. check = settings.valueBool("PluginDatabase/SearchVST2", true) and self.ui.ch_vst->isEnabled();
  363. self.ui.ch_vst->setChecked(check);
  364. check = settings.valueBool("PluginDatabase/SearchVST3", true) and self.ui.ch_vst3->isEnabled();
  365. self.ui.ch_vst3->setChecked(check);
  366. check = settings.valueBool("PluginDatabase/SearchCLAP", true) and self.ui.ch_clap->isEnabled();
  367. self.ui.ch_clap->setChecked(check);
  368. #ifdef CARLA_OS_MAC
  369. check = settings.valueBool("PluginDatabase/SearchAU", true) and self.ui.ch_au->isEnabled();
  370. #else
  371. check = false;
  372. #endif
  373. self.ui.ch_au->setChecked(check);
  374. check = settings.valueBool("PluginDatabase/SearchSF2", false) and self.ui.ch_sf2->isEnabled();
  375. self.ui.ch_sf2->setChecked(check);
  376. check = settings.valueBool("PluginDatabase/SearchSFZ", false) and self.ui.ch_sfz->isEnabled();
  377. self.ui.ch_sfz->setChecked(check);
  378. check = settings.valueBool("PluginDatabase/SearchJSFX", true) and self.ui.ch_jsfx->isEnabled();
  379. self.ui.ch_jsfx->setChecked(check);
  380. check = settings.valueBool("PluginDatabase/SearchNative", true) and self.ui.ch_native->isEnabled();
  381. self.ui.ch_native->setChecked(check);
  382. check = settings.valueBool("PluginDatabase/SearchPOSIX32", false) and self.ui.ch_posix32->isEnabled();
  383. self.ui.ch_posix32->setChecked(check);
  384. check = settings.valueBool("PluginDatabase/SearchPOSIX64", false) and self.ui.ch_posix64->isEnabled();
  385. self.ui.ch_posix64->setChecked(check);
  386. check = settings.valueBool("PluginDatabase/SearchWin32", false) and self.ui.ch_win32->isEnabled();
  387. self.ui.ch_win32->setChecked(check);
  388. check = settings.valueBool("PluginDatabase/SearchWin64", false) and self.ui.ch_win64->isEnabled();
  389. self.ui.ch_win64->setChecked(check);
  390. self.ui.ch_do_checks->setChecked(settings.valueBool("PluginDatabase/DoChecks", false));
  391. }
  392. // -----------------------------------------------------------------------------------------------------------------
  393. // private slots
  394. void PluginListRefreshDialog::slot_saveSettings()
  395. {
  396. QSafeSettings settings("falkTX", "CarlaRefresh2");
  397. settings.setValue("PluginDatabase/SearchLADSPA", self.ui.ch_ladspa->isChecked());
  398. settings.setValue("PluginDatabase/SearchDSSI", self.ui.ch_dssi->isChecked());
  399. settings.setValue("PluginDatabase/SearchLV2", self.ui.ch_lv2->isChecked());
  400. settings.setValue("PluginDatabase/SearchVST2", self.ui.ch_vst->isChecked());
  401. settings.setValue("PluginDatabase/SearchVST3", self.ui.ch_vst3->isChecked());
  402. settings.setValue("PluginDatabase/SearchCLAP", self.ui.ch_clap->isChecked());
  403. settings.setValue("PluginDatabase/SearchAU", self.ui.ch_au->isChecked());
  404. settings.setValue("PluginDatabase/SearchSF2", self.ui.ch_sf2->isChecked());
  405. settings.setValue("PluginDatabase/SearchSFZ", self.ui.ch_sfz->isChecked());
  406. settings.setValue("PluginDatabase/SearchJSFX", self.ui.ch_jsfx->isChecked());
  407. settings.setValue("PluginDatabase/SearchNative", self.ui.ch_native->isChecked());
  408. settings.setValue("PluginDatabase/SearchPOSIX32", self.ui.ch_posix32->isChecked());
  409. settings.setValue("PluginDatabase/SearchPOSIX64", self.ui.ch_posix64->isChecked());
  410. settings.setValue("PluginDatabase/SearchWin32", self.ui.ch_win32->isChecked());
  411. settings.setValue("PluginDatabase/SearchWin64", self.ui.ch_win64->isChecked());
  412. settings.setValue("PluginDatabase/DoChecks", self.ui.ch_do_checks->isChecked());
  413. }
  414. void PluginListRefreshDialog::slot_start()
  415. {
  416. self.ui.progressBar->setMinimum(0);
  417. self.ui.progressBar->setMaximum(100);
  418. self.ui.progressBar->setValue(0);
  419. self.ui.b_start->setEnabled(false);
  420. self.ui.b_skip->setVisible(true);
  421. self.ui.b_close->setVisible(false);
  422. self.ui.group_types->setEnabled(false);
  423. self.ui.group_options->setEnabled(false);
  424. // if gCarla.utils:
  425. // if self.ui.ch_do_checks.isChecked():
  426. // gCarla.utils.unsetenv("CARLA_DISCOVERY_NO_PROCESSING_CHECKS")
  427. // else:
  428. // gCarla.utils.setenv("CARLA_DISCOVERY_NO_PROCESSING_CHECKS", "true")
  429. //
  430. // native, posix32, posix64, win32, win64 = (self.ui.ch_native.isChecked(),
  431. // self.ui.ch_posix32.isChecked(), self.ui.ch_posix64.isChecked(),
  432. // self.ui.ch_win32.isChecked(), self.ui.ch_win64.isChecked())
  433. //
  434. // ladspa, dssi, lv2, vst, vst3, clap, au, sf2, sfz, jsfx = (self.ui.ch_ladspa.isChecked(), self.ui.ch_dssi.isChecked(),
  435. // self.ui.ch_lv2.isChecked(), self.ui.ch_vst.isChecked(),
  436. // self.ui.ch_vst3.isChecked(), self.ui.ch_clap.isChecked(),
  437. // self.ui.ch_au.isChecked(), self.ui.ch_sf2.isChecked(),
  438. // self.ui.ch_sfz.isChecked(), self.ui.ch_jsfx.isChecked())
  439. //
  440. // self.fThread.setSearchBinaryTypes(native, posix32, posix64, win32, win64)
  441. // self.fThread.setSearchPluginTypes(ladspa, dssi, lv2, vst, vst3, clap, au, sf2, sfz, jsfx)
  442. // self.fThread.start()
  443. }
  444. void PluginListRefreshDialog::slot_skip()
  445. {
  446. // killDiscovery();
  447. }
  448. void PluginListRefreshDialog::slot_checkTools()
  449. {
  450. const bool enabled1 = self.ui.ch_native->isChecked()
  451. || self.ui.ch_posix32->isChecked()
  452. || self.ui.ch_posix64->isChecked()
  453. || self.ui.ch_win32->isChecked()
  454. || self.ui.ch_win64->isChecked();
  455. const bool enabled2 = self.ui.ch_ladspa->isChecked()
  456. || self.ui.ch_dssi->isChecked()
  457. || self.ui.ch_lv2->isChecked()
  458. || self.ui.ch_vst->isChecked()
  459. || self.ui.ch_vst3->isChecked()
  460. || self.ui.ch_clap->isChecked()
  461. || self.ui.ch_au->isChecked()
  462. || self.ui.ch_sf2->isChecked()
  463. || self.ui.ch_sfz->isChecked()
  464. || self.ui.ch_jsfx->isChecked();
  465. self.ui.b_start->setEnabled(enabled1 and enabled2);
  466. }
  467. void PluginListRefreshDialog::slot_handlePluginLook(const int percent, const QString plugin)
  468. {
  469. self.ui.progressBar->setFormat(plugin);
  470. self.ui.progressBar->setValue(percent);
  471. }
  472. void PluginListRefreshDialog::slot_handlePluginThreadFinished()
  473. {
  474. self.ui.progressBar->setMinimum(0);
  475. self.ui.progressBar->setMaximum(1);
  476. self.ui.progressBar->setValue(1);
  477. self.ui.progressBar->setFormat(tr("Done"));
  478. self.ui.b_start->setEnabled(true);
  479. self.ui.b_skip->setVisible(false);
  480. self.ui.b_close->setVisible(true);
  481. self.ui.group_types->setEnabled(true);
  482. self.ui.group_options->setEnabled(true);
  483. }
  484. // --------------------------------------------------------------------------------------------------------------------
  485. PluginListRefreshDialogResults* carla_frontend_createAndExecPluginListRefreshDialog(void* const parent,
  486. const bool useSystemIcons)
  487. {
  488. PluginListRefreshDialog gui(reinterpret_cast<QWidget*>(parent), useSystemIcons);
  489. if (gui.exec())
  490. {
  491. static PluginListRefreshDialogResults ret = {};
  492. return &ret;
  493. }
  494. return nullptr;
  495. }
  496. // --------------------------------------------------------------------------------------------------------------------