From d8c145256f8633e8f31409ad80b7c204383aa0ba Mon Sep 17 00:00:00 2001 From: Josh Siegle Date: Wed, 4 Sep 2024 14:57:32 -0700 Subject: [PATCH] Update control panel buttons --- Source/UI/ControlPanel.cpp | 91 +++++++++++++++++++++++++++----------- Source/UI/ControlPanel.h | 23 +++++++++- 2 files changed, 88 insertions(+), 26 deletions(-) diff --git a/Source/UI/ControlPanel.cpp b/Source/UI/ControlPanel.cpp index b2f775711..5b5b86fc9 100755 --- a/Source/UI/ControlPanel.cpp +++ b/Source/UI/ControlPanel.cpp @@ -33,22 +33,61 @@ along with this program. If not, see . #include "LookAndFeel/CustomLookAndFeel.h" const int SIZE_AUDIO_EDITOR_MAX_WIDTH = 500; -//const int SIZE_AUDIO_EDITOR_MIN_WIDTH = 250; -ForceNewDirectoryButton::ForceNewDirectoryButton () : Button ("ForceNewDirectory") +NewDirectoryButton::NewDirectoryButton() : Button ("NewDirectory") { + //XmlDocument xmlDoc (R"( + // + // + //)"); + XmlDocument xmlDoc (R"( - - - - - - )"); + )"); - forceNewDirectoryIcon = Drawable::createFromSVG (*xmlDoc.getDocumentElement().get()); + //XmlDocument xmlDoc (R"( + // )"); + + newDirectoryIcon = Drawable::createFromSVG (*xmlDoc.getDocumentElement().get()); + + newDirectoryIcon->replaceColour (Colours::black, Colours::black); setClickingTogglesState (true); +} + +void NewDirectoryButton::paintButton (Graphics& g, bool isMouseOver, bool isButtonDown) +{ + Colour buttonColour; + if (getToggleState()) + buttonColour = findColour (ThemeColours::highlightedFill); + else + buttonColour = findColour (ThemeColours::controlPanelBackground); + + if (isMouseOver) + buttonColour = buttonColour.brighter (0.2f); + + g.setColour (Colours::black); + g.fillRoundedRectangle (0, 0, getWidth(), getHeight(), 5); + g.setColour (buttonColour); + g.fillRoundedRectangle (1, 1, getWidth() - 2, getHeight() - 2, 3); + + g.setColour (Colours::black); + newDirectoryIcon->drawWithin (g, juce::Rectangle(2,2.5,18,18), RectanglePlacement::centred, 1.0f); + g.setColour (buttonColour); + g.drawRect (10, 9, 2, 6); + g.drawRect (8, 11, 6, 2); +} + +ForceNewDirectoryButton::ForceNewDirectoryButton() : Button ("ForceNewDirectory") +{ + XmlDocument xmlDoc (R"( + )"); + + forceNewDirectoryIcon = Drawable::createFromSVG (*xmlDoc.getDocumentElement().get()); + + setClickingTogglesState (true); } void ForceNewDirectoryButton::paintButton (Graphics& g, bool isMouseOver, bool isButtonDown) @@ -58,7 +97,7 @@ void ForceNewDirectoryButton::paintButton (Graphics& g, bool isMouseOver, bool i if (getToggleState()) buttonColour = findColour (ThemeColours::highlightedFill); else - buttonColour = findColour (ThemeColours::defaultText); + buttonColour = findColour (ThemeColours::controlPanelText); if (isMouseOver) buttonColour = buttonColour.brighter (0.2f); @@ -152,7 +191,8 @@ void RecordButton::updateImages (bool recordingIsActive) setImages (&normal, &over, &down); } -CPUMeter::CPUMeter() : Label ("CPU Meter", "0.0"), cpu (0.0f) +CPUMeter::CPUMeter() : Label ("CPU Meter", "0.0"), + cpu (0.0f) { font = FontOptions ("Silkscreen", "Regular", 14); @@ -375,8 +415,8 @@ void Clock::mouseDown (const MouseEvent& e) } ControlPanel::ControlPanel (ProcessorGraph* graph_, AudioComponent* audio_, bool isConsoleApp_) - : graph (graph_), - audio (audio_), + : graph (graph_), + audio (audio_), isConsoleApp (isConsoleApp_) { AccessClass::setControlPanel (this); @@ -420,8 +460,7 @@ ControlPanel::ControlPanel (ProcessorGraph* graph_, AudioComponent* audio_, bool recordOptionsButton->setTooltip ("Configure options for selected record engine"); addChildComponent (recordOptionsButton.get()); - newDirectoryButton = std::make_unique ("+"); - newDirectoryButton->setFont (FontOptions ("Silkscreen", "Regular", 15)); + newDirectoryButton = std::make_unique(); newDirectoryButton->setEnabled (false); newDirectoryButton->addListener (this); newDirectoryButton->setTooltip ("Start a new data directory for next recording"); @@ -429,7 +468,7 @@ ControlPanel::ControlPanel (ProcessorGraph* graph_, AudioComponent* audio_, bool newDirectoryButton->setClickingTogglesState (true); addChildComponent (newDirectoryButton.get()); - forceNewDirectoryButton = std::make_unique (); + forceNewDirectoryButton = std::make_unique(); forceNewDirectoryButton->setEnabled (true); forceNewDirectoryButton->addListener (this); forceNewDirectoryButton->setTooltip ("Force a new data directory for each recording"); @@ -542,7 +581,6 @@ void ControlPanel::startAcquisition (bool recordingShouldAlsoStart) graph->startAcquisition(); // inform processors that acquisition will start - if (recordingShouldAlsoStart) { startRecording(); @@ -563,9 +601,8 @@ void ControlPanel::startAcquisition (bool recordingShouldAlsoStart) recordSelector->setEnabled (false); // why is this outside the "if" statement? recordOptionsButton->setEnabled (false); } - + audio->beginCallbacks(); // starts acquisition callbacks - } } @@ -950,7 +987,7 @@ void ControlPanel::componentBeingDeleted (Component& component) filenameText->setButtonText (generateFilenameFromFields (true)); //TODO: Assumes any change in filename settings should start a new directory next recording - if (!newDirectoryButton->getToggleState()) + if (! newDirectoryButton->getToggleState()) newDirectoryButton->setToggleState (true, dontSendNotification); CoreServices::saveRecoveryConfig(); @@ -991,18 +1028,21 @@ void ControlPanel::buttonClicked (Button* button) if (button == newDirectoryButton.get()) { //Setting the button state only takes effect on the next recording + return; } if (button == forceNewDirectoryButton.get()) { - if (button->getToggleState()) { + if (button->getToggleState()) + { newDirectoryButton->setToggleState (true, dontSendNotification); newDirectoryButton->setEnabled (false); } else { - newDirectoryButton->setEnabled (true); + if (hasRecorded) + newDirectoryButton->setEnabled (true); } return; } @@ -1262,7 +1302,8 @@ String ControlPanel::getRecordingDirectoryName() void ControlPanel::createNewRecordingDirectory() { //TODO: Remove depdendency on button states/callbacks - MessageManager::callAsync ([this] { buttonClicked (newDirectoryButton.get()); }); + MessageManager::callAsync ([this] + { buttonClicked (newDirectoryButton.get()); }); } String ControlPanel::getRecordingDirectoryPrependText() @@ -1395,7 +1436,6 @@ void ControlPanel::setRecordingDirectoryBaseText (String text) String ControlPanel::generateFilenameFromFields (bool usePlaceholderText) { - String filename = ""; for (auto& field : filenameFields) //loops in order through prepend, main, append @@ -1403,7 +1443,8 @@ String ControlPanel::generateFilenameFromFields (bool usePlaceholderText) filename += field->getNextValue (usePlaceholderText); } - MessageManager::callAsync ([this, filename] { filenameText->setButtonText (filename); }); + MessageManager::callAsync ([this, filename] + { filenameText->setButtonText (filename); }); return filename; } diff --git a/Source/UI/ControlPanel.h b/Source/UI/ControlPanel.h index 1beaabd41..fd0db7e0d 100755 --- a/Source/UI/ControlPanel.h +++ b/Source/UI/ControlPanel.h @@ -38,6 +38,27 @@ #include "LookAndFeel/CustomLookAndFeel.h" #include +/** + + Triggers a new directory to be created at the start of each recording + +*/ +class NewDirectoryButton : public Button +{ +public: + /** Constructor */ + NewDirectoryButton(); + + /** Destructor */ + ~NewDirectoryButton() {} + + void paintButton (Graphics& g, bool isMouseOver, bool isButtonDown) override; + +private: + std::unique_ptr newDirectoryIcon; +}; + + /** Locks the new directory button to force new directories for each recording. @@ -481,7 +502,7 @@ class TESTABLE ControlPanel : public Component, std::unique_ptr cpuMeter; std::unique_ptr diskMeter; std::unique_ptr filenameComponent; - std::unique_ptr newDirectoryButton; + std::unique_ptr newDirectoryButton; std::unique_ptr forceNewDirectoryButton; std::unique_ptr showHideRecordingOptionsButton; std::unique_ptr recordButton;