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.

211 lines
8.7KB

  1. #include "PluginScanStatusMessage.h"
  2. #include "PluginScanStatusBar.h"
  3. PluginScanStatusBar::PluginScanStatusBar(PluginScanClient& pluginScanClient,
  4. const SelectorComponentStyle& style) :
  5. _pluginScanClient(pluginScanClient) {
  6. statusLbl.reset(new juce::Label("Status Label", juce::String()));
  7. addAndMakeVisible(statusLbl.get());
  8. statusLbl->setFont(juce::Font (15.00f, juce::Font::plain).withTypefaceStyle ("Regular"));
  9. statusLbl->setJustificationType(juce::Justification::centredLeft);
  10. statusLbl->setEditable(false, false, false);
  11. statusLbl->setColour(juce::Label::textColourId, style.highlightColour);
  12. auto styleButton = [&style](std::unique_ptr<juce::TextButton>& button) {
  13. button->setLookAndFeel(style.scanButtonLookAndFeel.get());
  14. button->setColour(UIUtils::ToggleButtonLookAndFeel::backgroundColour, style.buttonBackgroundColour);
  15. button->setColour(UIUtils::ToggleButtonLookAndFeel::highlightColour, style.highlightColour);
  16. button->setColour(UIUtils::ToggleButtonLookAndFeel::disabledColour, style.disabledColour);
  17. };
  18. startScanBtn.reset(new juce::TextButton("Start Scan Button"));
  19. addAndMakeVisible(startScanBtn.get());
  20. startScanBtn->setButtonText(TRANS("Start Scan"));
  21. startScanBtn->addListener(this);
  22. styleButton(startScanBtn);
  23. stopScanBtn.reset(new juce::TextButton("Stop Scan Button"));
  24. addAndMakeVisible(stopScanBtn.get());
  25. stopScanBtn->setButtonText(TRANS("Stop Scan"));
  26. stopScanBtn->addListener(this);
  27. styleButton(stopScanBtn);
  28. rescanAllBtn.reset(new juce::TextButton("Rescan All Button"));
  29. addAndMakeVisible(rescanAllBtn.get());
  30. rescanAllBtn->setButtonText(TRANS("Rescan All Plugins"));
  31. rescanAllBtn->addListener(this);
  32. styleButton(rescanAllBtn);
  33. rescanCrashedBtn.reset(new juce::TextButton("Rescan Crashed Button"));
  34. addAndMakeVisible(rescanCrashedBtn.get());
  35. rescanCrashedBtn->setButtonText(TRANS("Rescan Crashed Plugins"));
  36. rescanCrashedBtn->addListener(this);
  37. styleButton(rescanCrashedBtn);
  38. viewCrashedBtn.reset(new juce::TextButton("View Crashed Button"));
  39. addAndMakeVisible(viewCrashedBtn.get());
  40. viewCrashedBtn->setButtonText(TRANS("View Crashed Plugins"));
  41. viewCrashedBtn->addListener(this);
  42. styleButton(viewCrashedBtn);
  43. configureBtn.reset(new juce::TextButton("Configure Button"));
  44. addAndMakeVisible(configureBtn.get());
  45. configureBtn->setButtonText(TRANS("Configure"));
  46. configureBtn->addListener(this);
  47. styleButton(configureBtn);
  48. _pluginScanClient.addListener(this);
  49. }
  50. PluginScanStatusBar::~PluginScanStatusBar() {
  51. _pluginScanClient.stopScan();
  52. _pluginScanClient.removeListener(this);
  53. statusLbl = nullptr;
  54. startScanBtn = nullptr;
  55. stopScanBtn = nullptr;
  56. rescanAllBtn = nullptr;
  57. rescanCrashedBtn = nullptr;
  58. viewCrashedBtn = nullptr;
  59. configureBtn = nullptr;
  60. crashedPluginsPopover = nullptr;
  61. }
  62. void PluginScanStatusBar::resized() {
  63. const int buttonsTotalWidth {
  64. getWidth() < MAX_BUTTONS_WIDTH + MIN_STATUS_WIDTH ? getWidth() - MIN_STATUS_WIDTH : MAX_BUTTONS_WIDTH
  65. };
  66. if (crashedPluginsPopover != nullptr) {
  67. crashedPluginsPopover->setBounds(getParentComponent()->getLocalBounds());
  68. }
  69. if (configurePopover != nullptr) {
  70. configurePopover->setBounds(getParentComponent()->getLocalBounds());
  71. }
  72. juce::Rectangle<int> availableArea = getLocalBounds();
  73. juce::FlexBox flexBox;
  74. flexBox.flexDirection = juce::FlexBox::Direction::row;
  75. flexBox.flexWrap = juce::FlexBox::Wrap::wrap;
  76. flexBox.justifyContent = juce::FlexBox::JustifyContent::spaceAround;
  77. flexBox.alignContent = juce::FlexBox::AlignContent::center;
  78. const juce::FlexItem::Margin margin(0, SPACER_WIDTH, 0, 0);
  79. flexBox.items.add(juce::FlexItem(*startScanBtn.get()).withMinWidth(NARROW_BUTTON_WIDTH).withMinHeight(ROW_HEIGHT).withMargin(margin));
  80. flexBox.items.add(juce::FlexItem(*stopScanBtn.get()).withMinWidth(NARROW_BUTTON_WIDTH).withMinHeight(ROW_HEIGHT).withMargin(margin));
  81. flexBox.items.add(juce::FlexItem(*rescanAllBtn.get()).withMinWidth(WIDE_BUTTON_WIDTH).withMinHeight(ROW_HEIGHT).withMargin(margin));
  82. flexBox.items.add(juce::FlexItem(*rescanCrashedBtn.get()).withMinWidth(WIDE_BUTTON_WIDTH).withMinHeight(ROW_HEIGHT).withMargin(margin));
  83. flexBox.items.add(juce::FlexItem(*viewCrashedBtn.get()).withMinWidth(WIDE_BUTTON_WIDTH).withMinHeight(ROW_HEIGHT).withMargin(margin));
  84. flexBox.items.add(juce::FlexItem(*configureBtn.get()).withMinWidth(NARROW_BUTTON_WIDTH).withMinHeight(ROW_HEIGHT));
  85. flexBox.performLayout(availableArea.removeFromRight(buttonsTotalWidth).toFloat());
  86. availableArea.removeFromRight(SPACER_WIDTH);
  87. statusLbl->setBounds(availableArea);
  88. }
  89. void PluginScanStatusBar::buttonClicked(juce::Button* buttonThatWasClicked) {
  90. if (buttonThatWasClicked == startScanBtn.get()) {
  91. _pluginScanClient.startScan();
  92. } else if (buttonThatWasClicked == stopScanBtn.get()) {
  93. _pluginScanClient.stopScan();
  94. } else if (buttonThatWasClicked == rescanAllBtn.get()) {
  95. _pluginScanClient.rescanAllPlugins();
  96. } else if (buttonThatWasClicked == rescanCrashedBtn.get()) {
  97. _pluginScanClient.rescanCrashedPlugins();
  98. } else if (buttonThatWasClicked == viewCrashedBtn.get()) {
  99. _createCrashedPluginsDialogue();
  100. } else if (buttonThatWasClicked == configureBtn.get()) {
  101. _createConfigureDialogue();
  102. }
  103. }
  104. void PluginScanStatusBar::handleMessage(const juce::Message& message) {
  105. const PluginScanStatusMessage* statusMessage {
  106. dynamic_cast<const PluginScanStatusMessage*>(&message)
  107. };
  108. if (statusMessage != nullptr) {
  109. // Set the status text
  110. juce::String statusString;
  111. const juce::String numPlugins(statusMessage->numPluginsScanned);
  112. if (statusMessage->errorText != "") {
  113. statusString = statusMessage->errorText;
  114. } else if (statusMessage->isScanRunning) {
  115. // Scan currently running
  116. statusString = "Found " + numPlugins + " plugins, scanning...";
  117. } else if (statusMessage->numPluginsScanned == 0) {
  118. // Couldn't restore any plugins, no scan currently running
  119. statusString = "No plugins available - click start scan to begin";
  120. } else {
  121. // Successfully restored plugins, no scan currently running
  122. statusString = "Found " + numPlugins + " plugins";
  123. }
  124. _updateButtonState(statusMessage->isScanRunning);
  125. statusLbl->setText(statusString, juce::dontSendNotification);
  126. }
  127. }
  128. void PluginScanStatusBar::_updateButtonState(bool isScanRunning) {
  129. if (isScanRunning) {
  130. startScanBtn->setEnabled(false);
  131. stopScanBtn->setEnabled(true);
  132. rescanAllBtn->setEnabled(false);
  133. rescanCrashedBtn->setEnabled(false);
  134. viewCrashedBtn->setEnabled(false);
  135. configureBtn->setEnabled(false);
  136. } else {
  137. startScanBtn->setEnabled(true);
  138. stopScanBtn->setEnabled(false);
  139. rescanAllBtn->setEnabled(true);
  140. rescanCrashedBtn->setEnabled(true);
  141. viewCrashedBtn->setEnabled(true);
  142. configureBtn->setEnabled(true);
  143. }
  144. }
  145. void PluginScanStatusBar::_createCrashedPluginsDialogue() {
  146. // Read the plugins from the crashed file
  147. juce::String bodyText;
  148. juce::File crashedPluginsFile = Utils::DataDirectory.getChildFile(Utils::CRASHED_PLUGINS_FILE_NAME);
  149. juce::String crashedPluginsStr;
  150. if (crashedPluginsFile.existsAsFile()) {
  151. crashedPluginsStr = crashedPluginsFile.loadFileAsString();
  152. }
  153. if (!crashedPluginsStr.isEmpty()) {
  154. bodyText += "The following plugins crashed during validation:\n\n";
  155. if (!crashedPluginsStr.isEmpty()) {
  156. bodyText += crashedPluginsStr;
  157. }
  158. } else {
  159. bodyText += "No plugins failed validation";
  160. }
  161. crashedPluginsPopover.reset(new UIUtils::PopoverComponent("Crashed plugins", bodyText, [&]() {crashedPluginsPopover.reset(); }));
  162. getParentComponent()->addAndMakeVisible(crashedPluginsPopover.get());
  163. crashedPluginsPopover->setBounds(getParentComponent()->getLocalBounds());
  164. }
  165. void PluginScanStatusBar::_createConfigureDialogue() {
  166. // Restore before opening the component
  167. _pluginScanClient.config.restoreFromXml();
  168. configurePopover.reset(new ConfigurePopover(_pluginScanClient.config, [&]() {
  169. _pluginScanClient.config.writeToXml();
  170. configurePopover.reset();
  171. }));
  172. getParentComponent()->addAndMakeVisible(configurePopover.get());
  173. configurePopover->setBounds(getParentComponent()->getLocalBounds());
  174. }