From ce8b2d865a260e11f8c8178e7de418d8bc22c863 Mon Sep 17 00:00:00 2001 From: jules Date: Wed, 3 Jan 2018 10:45:13 +0000 Subject: [PATCH] Used Button::onClick to simplify a bunch of library classes and demo code --- examples/Demo/Source/Demos/AnimationDemo.cpp | 7 +- .../Demo/Source/Demos/AudioLatencyDemo.cpp | 12 +- .../Demo/Source/Demos/AudioPlaybackDemo.cpp | 44 ++-- .../Demo/Source/Demos/AudioRecordingDemo.cpp | 28 +- .../Source/Demos/AudioSynthesiserDemo.cpp | 16 +- examples/Demo/Source/Demos/CameraDemo.cpp | 56 ++-- .../Demo/Source/Demos/ChildProcessDemo.cpp | 14 +- .../Demo/Source/Demos/CryptographyDemo.cpp | 13 +- examples/Demo/Source/Demos/DialogsDemo.cpp | 32 +-- examples/Demo/Source/Demos/FlexBoxDemo.cpp | 130 +++------ examples/Demo/Source/Demos/FontsDemo.cpp | 11 +- .../Demo/Source/Demos/LiveConstantDemo.cpp | 17 +- .../Demo/Source/Demos/LookAndFeelDemo.cpp | 11 +- examples/Demo/Source/Demos/MDIDemo.cpp | 27 +- .../Demo/Source/Demos/MultithreadingDemo.cpp | 16 +- examples/Demo/Source/Demos/NetworkingDemo.cpp | 13 +- examples/Demo/Source/Demos/OpenGLDemo.cpp | 40 ++- .../Demo/Source/Demos/TimersAndEventsDemo.cpp | 59 ++--- examples/Demo/Source/Demos/UnitTestsDemo.cpp | 13 +- examples/Demo/Source/Demos/ValueTreesDemo.cpp | 13 +- examples/Demo/Source/Demos/VideoDemo.cpp | 15 +- examples/Demo/Source/Demos/WebBrowserDemo.cpp | 19 +- examples/Demo/Source/Demos/WidgetsDemo.cpp | 111 +++----- examples/Demo/Source/Demos/WindowsDemo.cpp | 18 +- .../Source/Application/jucer_Application.cpp | 29 -- .../scanning/juce_PluginListComponent.cpp | 35 ++- .../scanning/juce_PluginListComponent.h | 5 +- .../gui/juce_AudioDeviceSelectorComponent.cpp | 247 ++++++++---------- .../gui/juce_AudioDeviceSelectorComponent.h | 5 +- .../broadcasters/juce_EventHandler.h | 21 +- .../juce_gui_basics/buttons/juce_Button.cpp | 4 +- modules/juce_gui_basics/buttons/juce_Button.h | 1 + .../filebrowser/juce_FileBrowserComponent.cpp | 7 +- .../filebrowser/juce_FileBrowserComponent.h | 3 - .../filebrowser/juce_FileChooserDialogBox.cpp | 14 +- .../filebrowser/juce_FileChooserDialogBox.h | 2 - .../juce_FileSearchPathListComponent.cpp | 120 ++++----- .../juce_FileSearchPathListComponent.h | 8 +- .../filebrowser/juce_FilenameComponent.cpp | 13 +- .../filebrowser/juce_FilenameComponent.h | 7 +- .../juce_gui_basics/layout/juce_SidePanel.cpp | 7 +- .../juce_gui_basics/layout/juce_SidePanel.h | 4 +- .../layout/juce_TabbedButtonBar.cpp | 11 +- .../juce_BooleanPropertyComponent.cpp | 7 +- .../juce_BooleanPropertyComponent.h | 5 +- .../juce_ButtonPropertyComponent.cpp | 10 +- .../properties/juce_ButtonPropertyComponent.h | 5 +- .../juce_gui_basics/widgets/juce_Slider.cpp | 8 +- .../juce_gui_basics/widgets/juce_Toolbar.cpp | 139 +++++----- .../juce_gui_basics/widgets/juce_Toolbar.h | 9 +- .../misc/juce_KeyMappingEditorComponent.cpp | 34 ++- .../misc/juce_PreferencesPanel.cpp | 16 +- 52 files changed, 557 insertions(+), 954 deletions(-) diff --git a/examples/Demo/Source/Demos/AnimationDemo.cpp b/examples/Demo/Source/Demos/AnimationDemo.cpp index b0d05dbd85..f7a5b33b0f 100644 --- a/examples/Demo/Source/Demos/AnimationDemo.cpp +++ b/examples/Demo/Source/Demos/AnimationDemo.cpp @@ -121,7 +121,6 @@ struct BallComponent : public Component //============================================================================== class AnimationDemo : public Component, - private Button::Listener, private Timer { public: @@ -132,10 +131,10 @@ public: for (int i = 11; --i >= 0;) { - Button* b = createButton(); + auto* b = createButton(); componentsToAnimate.add (b); addAndMakeVisible (b); - b->addListener (this); + b->onClick = [this] { triggerAnimation(); }; } addAndMakeVisible (ballGenerator); @@ -253,7 +252,7 @@ private: return b; } - void buttonClicked (Button*) override + void triggerAnimation() { for (int i = 0; i < componentsToAnimate.size(); ++i) { diff --git a/examples/Demo/Source/Demos/AudioLatencyDemo.cpp b/examples/Demo/Source/Demos/AudioLatencyDemo.cpp index 6695e91ec5..a436c7f983 100644 --- a/examples/Demo/Source/Demos/AudioLatencyDemo.cpp +++ b/examples/Demo/Source/Demos/AudioLatencyDemo.cpp @@ -290,8 +290,7 @@ private: }; //============================================================================== -class AudioLatencyDemo : public Component, - private Button::Listener +class AudioLatencyDemo : public Component { public: AudioLatencyDemo() @@ -318,8 +317,8 @@ public: "microphone somewhere near your speakers..."); addAndMakeVisible (startTestButton); - startTestButton.addListener (this); startTestButton.setButtonText ("Test Latency"); + startTestButton.onClick = [this]() { startTest(); }; MainAppWindow::getSharedAudioDeviceManager().addAudioCallback (liveAudioScroller); } @@ -327,7 +326,6 @@ public: ~AudioLatencyDemo() { MainAppWindow::getSharedAudioDeviceManager().removeAudioCallback (liveAudioScroller); - startTestButton.removeListener (this); latencyTester.reset(); liveAudioScroller.reset(); } @@ -359,12 +357,6 @@ private: TextButton startTestButton; TextEditor resultsBox; - void buttonClicked (Button* buttonThatWasClicked) override - { - if (buttonThatWasClicked == &startTestButton) - startTest(); - } - void lookAndFeelChanged() override { resultsBox.setColour (TextEditor::backgroundColourId, diff --git a/examples/Demo/Source/Demos/AudioPlaybackDemo.cpp b/examples/Demo/Source/Demos/AudioPlaybackDemo.cpp index 9d2e4c652a..04b5d4813f 100644 --- a/examples/Demo/Source/Demos/AudioPlaybackDemo.cpp +++ b/examples/Demo/Source/Demos/AudioPlaybackDemo.cpp @@ -233,7 +233,6 @@ private: //============================================================================== class AudioPlaybackDemo : public Component, private FileBrowserListener, - private Button::Listener, private Slider::Listener, private ChangeListener { @@ -254,7 +253,7 @@ public: addAndMakeVisible (followTransportButton); followTransportButton.setButtonText ("Follow Transport"); - followTransportButton.addListener (this); + followTransportButton.onClick = [this]() { updateFollowTransportState(); }; addAndMakeVisible (explanation); explanation.setText ("Select an audio file in the treeview above, and this page will display its waveform, and let you play it..", dontSendNotification); @@ -276,9 +275,9 @@ public: addAndMakeVisible (startStopButton); startStopButton.setButtonText ("Play/Stop"); - startStopButton.addListener (this); startStopButton.setColour (TextButton::buttonColourId, Colour (0xff79ed7f)); startStopButton.setColour (TextButton::textColourOffId, Colours::black); + startStopButton.onClick = [this]() { startOrStop(); }; addAndMakeVisible (fileTreeComp); @@ -305,7 +304,6 @@ public: deviceManager.removeAudioCallback (&audioSourcePlayer); fileTreeComp.removeListener (this); thumbnail->removeChangeListener (this); - followTransportButton.removeListener (this); zoomSlider.removeListener (this); } @@ -378,6 +376,24 @@ private: } } + void startOrStop() + { + if (transportSource.isPlaying()) + { + transportSource.stop(); + } + else + { + transportSource.setPosition (0); + transportSource.start(); + } + } + + void updateFollowTransportState() + { + thumbnail->setFollowsTransport (followTransportButton.getToggleState()); + } + void selectionChanged() override { showFile (fileTreeComp.getSelectedFile()); @@ -393,26 +409,6 @@ private: thumbnail->setZoomFactor (zoomSlider.getValue()); } - void buttonClicked (Button* buttonThatWasClicked) override - { - if (buttonThatWasClicked == &startStopButton) - { - if (transportSource.isPlaying()) - { - transportSource.stop(); - } - else - { - transportSource.setPosition (0); - transportSource.start(); - } - } - else if (buttonThatWasClicked == &followTransportButton) - { - thumbnail->setFollowsTransport (followTransportButton.getToggleState()); - } - } - void changeListenerCallback (ChangeBroadcaster* source) override { if (source == thumbnail) diff --git a/examples/Demo/Source/Demos/AudioRecordingDemo.cpp b/examples/Demo/Source/Demos/AudioRecordingDemo.cpp index 77d4600aea..d9d08bcd62 100644 --- a/examples/Demo/Source/Demos/AudioRecordingDemo.cpp +++ b/examples/Demo/Source/Demos/AudioRecordingDemo.cpp @@ -210,8 +210,7 @@ private: }; //============================================================================== -class AudioRecordingDemo : public Component, - private Button::Listener +class AudioRecordingDemo : public Component { public: AudioRecordingDemo() @@ -231,10 +230,17 @@ public: addAndMakeVisible (recordButton); recordButton.setButtonText ("Record"); - recordButton.addListener (this); recordButton.setColour (TextButton::buttonColourId, Colour (0xffff5c5c)); recordButton.setColour (TextButton::textColourOnId, Colours::black); + recordButton.onClick = [this]() + { + if (recorder.isRecording()) + stopRecording(); + else + startRecording(); + }; + addAndMakeVisible (recordingThumbnail); deviceManager.addAudioCallback (&liveAudioScroller); @@ -271,8 +277,9 @@ private: void startRecording() { - const File file (File::getSpecialLocation (File::userDocumentsDirectory) - .getNonexistentChildFile ("JUCE Demo Audio Recording", ".wav")); + auto file = File::getSpecialLocation (File::userDocumentsDirectory) + .getNonexistentChildFile ("JUCE Demo Audio Recording", ".wav"); + recorder.startRecording (file); recordButton.setButtonText ("Stop"); @@ -286,17 +293,6 @@ private: recordingThumbnail.setDisplayFullThumbnail (true); } - void buttonClicked (Button* button) override - { - if (button == &recordButton) - { - if (recorder.isRecording()) - stopRecording(); - else - startRecording(); - } - } - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioRecordingDemo) }; diff --git a/examples/Demo/Source/Demos/AudioSynthesiserDemo.cpp b/examples/Demo/Source/Demos/AudioSynthesiserDemo.cpp index c78bdce0c8..928755a86e 100644 --- a/examples/Demo/Source/Demos/AudioSynthesiserDemo.cpp +++ b/examples/Demo/Source/Demos/AudioSynthesiserDemo.cpp @@ -231,8 +231,7 @@ struct SynthAudioSource : public AudioSource }; //============================================================================== -class AudioSynthesiserDemo : public Component, - private Button::Listener +class AudioSynthesiserDemo : public Component { public: AudioSynthesiserDemo() @@ -245,13 +244,13 @@ public: addAndMakeVisible (sineButton); sineButton.setButtonText ("Use sine wave"); sineButton.setRadioGroupId (321); - sineButton.addListener (this); sineButton.setToggleState (true, dontSendNotification); + sineButton.onClick = [this]() { synthAudioSource.setUsingSineWaveSound(); }; addAndMakeVisible (sampledButton); sampledButton.setButtonText ("Use sampled sound"); sampledButton.setRadioGroupId (321); - sampledButton.addListener (this); + sampledButton.onClick = [this]() { synthAudioSource.setUsingSampledSound(); }; addAndMakeVisible (liveAudioDisplayComp); @@ -298,15 +297,6 @@ private: ToggleButton sampledButton; LiveScrollingAudioDisplay liveAudioDisplayComp; - //============================================================================== - void buttonClicked (Button* buttonThatWasClicked) override - { - if (buttonThatWasClicked == &sineButton) - synthAudioSource.setUsingSineWaveSound(); - else if (buttonThatWasClicked == &sampledButton) - synthAudioSource.setUsingSampledSound(); - } - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioSynthesiserDemo) }; diff --git a/examples/Demo/Source/Demos/CameraDemo.cpp b/examples/Demo/Source/Demos/CameraDemo.cpp index af00c7d4cd..08f1387577 100644 --- a/examples/Demo/Source/Demos/CameraDemo.cpp +++ b/examples/Demo/Source/Demos/CameraDemo.cpp @@ -31,7 +31,6 @@ //============================================================================== class CameraDemo : public Component, private ComboBox::Listener, - private Button::Listener, private CameraDevice::Listener, private AsyncUpdater { @@ -50,11 +49,11 @@ public: cameraSelectorComboBox.addListener (this); addAndMakeVisible (snapshotButton); - snapshotButton.addListener (this); + snapshotButton.onClick = [this]() { takeSnapshot(); }; snapshotButton.setEnabled (false); addAndMakeVisible (recordMovieButton); - recordMovieButton.addListener (this); + recordMovieButton.onClick = [this]() { startRecording(); }; recordMovieButton.setEnabled (false); addAndMakeVisible (lastSnapshot); @@ -70,9 +69,9 @@ public: void resized() override { - Rectangle r (getLocalBounds().reduced (5)); + auto r = getLocalBounds().reduced (5); - Rectangle top (r.removeFromTop (25)); + auto top = r.removeFromTop (25); cameraSelectorComboBox.setBounds (top.removeFromLeft (250)); r.removeFromTop (4); @@ -85,7 +84,7 @@ public: recordMovieButton.setBounds (top.removeFromLeft (recordMovieButton.getWidth())); r.removeFromTop (4); - Rectangle previewArea (r.removeFromTop (r.getHeight() / 2)); + auto previewArea = r.removeFromTop (r.getHeight() / 2); if (cameraPreviewComp != nullptr) cameraPreviewComp->setBounds (previewArea); @@ -112,7 +111,7 @@ private: cameraSelectorComboBox.addItem ("No camera", 1); cameraSelectorComboBox.addSeparator(); - StringArray cameras = CameraDevice::getAvailableDevices(); + auto cameras = CameraDevice::getAvailableDevices(); for (int i = 0; i < cameras.size(); ++i) cameraSelectorComboBox.addItem (cameras[i], i + 2); @@ -140,42 +139,39 @@ private: resized(); } - void buttonClicked (Button* b) override + void startRecording() { if (cameraDevice != nullptr) { - if (b == &recordMovieButton) + // The user has clicked the record movie button.. + if (! recordingMovie) { - // The user has clicked the record movie button.. - if (! recordingMovie) - { - // Start recording to a file on the user's desktop.. - recordingMovie = true; + // Start recording to a file on the user's desktop.. + recordingMovie = true; - File file (File::getSpecialLocation (File::userDesktopDirectory) - .getNonexistentChildFile ("JuceCameraDemo", - CameraDevice::getFileExtension())); + auto file = File::getSpecialLocation (File::userDesktopDirectory) + .getNonexistentChildFile ("JuceCameraDemo", CameraDevice::getFileExtension()); - cameraDevice->startRecordingToFile (file); - recordMovieButton.setButtonText ("Stop Recording"); - } - else - { - // Already recording, so stop... - recordingMovie = false; - cameraDevice->stopRecording(); - recordMovieButton.setButtonText ("Start recording (to a file on your desktop)"); - } + cameraDevice->startRecordingToFile (file); + recordMovieButton.setButtonText ("Stop Recording"); } else { - // When the user clicks the snapshot button, we'll attach ourselves to - // the camera as a listener, and wait for an image to arrive... - cameraDevice->addListener (this); + // Already recording, so stop... + recordingMovie = false; + cameraDevice->stopRecording(); + recordMovieButton.setButtonText ("Start recording (to a file on your desktop)"); } } } + void takeSnapshot() + { + // When the user clicks the snapshot button, we'll attach ourselves to + // the camera as a listener, and wait for an image to arrive... + cameraDevice->addListener (this); + } + // This is called by the camera device when a new image arrives void imageReceived (const Image& image) override { diff --git a/examples/Demo/Source/Demos/ChildProcessDemo.cpp b/examples/Demo/Source/Demos/ChildProcessDemo.cpp index a5dc4156c1..2140ce8bb7 100644 --- a/examples/Demo/Source/Demos/ChildProcessDemo.cpp +++ b/examples/Demo/Source/Demos/ChildProcessDemo.cpp @@ -54,7 +54,6 @@ static String valueTreeToString (const ValueTree& v) //============================================================================== class ChildProcessDemo : public Component, - private Button::Listener, private MessageListener { public: @@ -64,15 +63,15 @@ public: addAndMakeVisible (launchButton); launchButton.setButtonText ("Launch Child Process"); - launchButton.addListener (this); + launchButton.onClick = [this]() { launchChildProcess(); }; addAndMakeVisible (pingButton); pingButton.setButtonText ("Send Ping"); - pingButton.addListener (this); + pingButton.onClick = [this]() { pingChildProcess(); }; addAndMakeVisible (killButton); killButton.setButtonText ("Kill Child Process"); - killButton.addListener (this); + killButton.onClick = [this]() { killChildProcess(); }; addAndMakeVisible (testResultsBox); testResultsBox.setMultiLine (true); @@ -184,13 +183,6 @@ private: TextButton launchButton, pingButton, killButton; TextEditor testResultsBox; - void buttonClicked (Button* button) override - { - if (button == &launchButton) launchChildProcess(); - if (button == &pingButton) pingChildProcess(); - if (button == &killButton) killChildProcess(); - } - struct LogMessage : public Message { LogMessage (const String& m) : message (m) {} diff --git a/examples/Demo/Source/Demos/CryptographyDemo.cpp b/examples/Demo/Source/Demos/CryptographyDemo.cpp index 41eaff84ba..254435020b 100644 --- a/examples/Demo/Source/Demos/CryptographyDemo.cpp +++ b/examples/Demo/Source/Demos/CryptographyDemo.cpp @@ -27,8 +27,7 @@ #include "../JuceDemoHeader.h" -class RSAComponent : public Component, - private Button::Listener +class RSAComponent : public Component { public: RSAComponent() @@ -44,7 +43,7 @@ public: addAndMakeVisible (generateRSAButton); generateRSAButton.setButtonText ("Generate RSA"); - generateRSAButton.addListener (this); + generateRSAButton.onClick = [this]() { createRSAKey(); }; addAndMakeVisible (rsaResultBox); rsaResultBox.setReadOnly (true); @@ -53,7 +52,7 @@ public: void resized() override { - Rectangle area (getLocalBounds()); + auto area = getLocalBounds(); rsaGroup.setBounds (area); area.removeFromTop (10); area.reduce (5, 5); @@ -104,12 +103,6 @@ private: Label bitSizeLabel; TextEditor bitSize, rsaResultBox; - void buttonClicked (Button* buttonThatWasClicked) override - { - if (buttonThatWasClicked == &generateRSAButton) - createRSAKey(); - } - void lookAndFeelChanged() override { rsaGroup.setColour (GroupComponent::outlineColourId, diff --git a/examples/Demo/Source/Demos/DialogsDemo.cpp b/examples/Demo/Source/Demos/DialogsDemo.cpp index 3eb94946c7..517b1c1d3e 100644 --- a/examples/Demo/Source/Demos/DialogsDemo.cpp +++ b/examples/Demo/Source/Demos/DialogsDemo.cpp @@ -88,8 +88,7 @@ public: //============================================================================== -class DialogsDemo : public Component, - private Button::Listener +class DialogsDemo : public Component { public: enum DialogType @@ -118,7 +117,7 @@ public: addAndMakeVisible (nativeButton); nativeButton.setButtonText ("Use Native Windows"); - nativeButton.addListener (this); + nativeButton.onClick = [this]() { getLookAndFeel().setUsingNativeAlertWindows (nativeButton.getToggleState()); }; static const char* windowNames[] = { @@ -144,23 +143,14 @@ public: for (int i = 0; i < numDialogs; ++i) { - TextButton* newButton = new TextButton(); + auto* newButton = new TextButton(); windowButtons.add (newButton); addAndMakeVisible (newButton); newButton->setButtonText (windowNames[i]); - newButton->addListener (this); + newButton->onClick = [this, i, newButton]() { showWindow (*newButton, static_cast (i)); }; } } - ~DialogsDemo() - { - nativeButton.removeListener (this); - - for (int i = windowButtons.size(); --i >= 0;) - if (TextButton* button = windowButtons.getUnchecked (i)) - button->removeListener (this); - } - //============================================================================== void paint (Graphics& g) override { @@ -451,20 +441,6 @@ private: } } - void buttonClicked (Button* button) override - { - if (button == &nativeButton) - { - getLookAndFeel().setUsingNativeAlertWindows (nativeButton.getToggleState()); - - return; - } - - for (int i = windowButtons.size(); --i >= 0;) - if (button == windowButtons.getUnchecked (i)) - return showWindow (*button, static_cast (i)); - } - ImagePreviewComponent imagePreview; ScopedPointer fc; diff --git a/examples/Demo/Source/Demos/FlexBoxDemo.cpp b/examples/Demo/Source/Demos/FlexBoxDemo.cpp index 0afd5a3aba..b93be90a9a 100644 --- a/examples/Demo/Source/Demos/FlexBoxDemo.cpp +++ b/examples/Demo/Source/Demos/FlexBoxDemo.cpp @@ -145,8 +145,7 @@ struct DemoFlexPanel : public juce::Component, }; //============================================================================== -struct FlexBoxDemo : public juce::Component, - private juce::Button::Listener +struct FlexBoxDemo : public juce::Component { FlexBoxDemo() { @@ -184,11 +183,10 @@ struct FlexBoxDemo : public juce::Component, int leftMargin = 15; int topMargin = 45; - setupToggleButton (flexDirectionRowButton, "row", groupID, leftMargin, topMargin + i++ * 22); - setupToggleButton (flexDirectionRowReverseButton, "row-reverse", groupID, leftMargin, topMargin + i++ * 22); - setupToggleButton (flexDirectionColumnButton, "column", groupID, leftMargin, topMargin + i++ * 22); - setupToggleButton (flexDirectionColumnReverseButton, "column-reverse", groupID, leftMargin, topMargin + i++ * 22); - flexDirectionRowButton.setToggleState (true, dontSendNotification); + createToggleButton ("row", groupID, leftMargin, topMargin + i++ * 22, true, [this]() { flexBox.flexDirection = FlexBox::Direction::row; }).setToggleState (true, dontSendNotification); + createToggleButton ("row-reverse", groupID, leftMargin, topMargin + i++ * 22, false, [this]() { flexBox.flexDirection = FlexBox::Direction::rowReverse; }); + createToggleButton ("column", groupID, leftMargin, topMargin + i++ * 22, false, [this]() { flexBox.flexDirection = FlexBox::Direction::column; }); + createToggleButton ("column-reverse", groupID, leftMargin, topMargin + i++ * 22, false, [this]() { flexBox.flexDirection = FlexBox::Direction::columnReverse; }); auto wrapGroup = addControl (new GroupComponent ("wrap", "flex-wrap")); wrapGroup->setBounds (160, 30, 140, 110); @@ -197,10 +195,9 @@ struct FlexBoxDemo : public juce::Component, ++groupID; leftMargin = 165; - setupToggleButton (flexNoWrapButton, "nowrap", groupID, leftMargin, topMargin + i++ * 22); - setupToggleButton (flexWrapButton, "wrap", groupID, leftMargin, topMargin + i++ * 22); - setupToggleButton (flexWrapReverseButton, "wrap-reverse", groupID, leftMargin, topMargin + i++ * 22); - flexWrapButton.setToggleState (true, sendNotification); + createToggleButton ("nowrap", groupID, leftMargin, topMargin + i++ * 22, false, [this]() { flexBox.flexWrap = FlexBox::Wrap::noWrap; }); + createToggleButton ("wrap", groupID, leftMargin, topMargin + i++ * 22, true, [this]() { flexBox.flexWrap = FlexBox::Wrap::wrap; }); + createToggleButton ("wrap-reverse", groupID, leftMargin, topMargin + i++ * 22, false, [this]() { flexBox.flexWrap = FlexBox::Wrap::wrapReverse; }); auto justifyGroup = addControl (new GroupComponent ("justify", "justify-content")); justifyGroup->setBounds (10, 150, 140, 140); @@ -210,12 +207,11 @@ struct FlexBoxDemo : public juce::Component, leftMargin = 15; topMargin = 165; - setupToggleButton (justifyFlexStartButton, "flex-start", groupID, leftMargin, topMargin + i++ * 22); - setupToggleButton (justifyFlexEndButton, "flex-end", groupID, leftMargin, topMargin + i++ * 22); - setupToggleButton (justifyCenterButton, "center", groupID, leftMargin, topMargin + i++ * 22); - setupToggleButton (justifySpaceBetweenButton, "space-between", groupID, leftMargin, topMargin + i++ * 22); - setupToggleButton (justifySpaceAroundButton, "space-around", groupID, leftMargin, topMargin + i++ * 22); - justifyFlexStartButton.setToggleState (true, sendNotification); + createToggleButton ("flex-start", groupID, leftMargin, topMargin + i++ * 22, true, [this]() { flexBox.justifyContent = FlexBox::JustifyContent::flexStart; }); + createToggleButton ("flex-end", groupID, leftMargin, topMargin + i++ * 22, false, [this]() { flexBox.justifyContent = FlexBox::JustifyContent::flexEnd; }); + createToggleButton ("center", groupID, leftMargin, topMargin + i++ * 22, false, [this]() { flexBox.justifyContent = FlexBox::JustifyContent::center; }); + createToggleButton ("space-between", groupID, leftMargin, topMargin + i++ * 22, false, [this]() { flexBox.justifyContent = FlexBox::JustifyContent::spaceBetween; }); + createToggleButton ("space-around", groupID, leftMargin, topMargin + i++ * 22, false, [this]() { flexBox.justifyContent = FlexBox::JustifyContent::spaceAround; }); auto alignGroup = addControl (new GroupComponent ("align", "align-items")); alignGroup->setBounds (160, 150, 140, 140); @@ -225,11 +221,10 @@ struct FlexBoxDemo : public juce::Component, leftMargin = 165; topMargin = 165; - setupToggleButton (alignStretchButton, "stretch", groupID, leftMargin, topMargin + i++ * 22); - setupToggleButton (alignFlexStartButton, "flex-start", groupID, leftMargin, topMargin + i++ * 22); - setupToggleButton (alignFlexEndButton, "flex-end", groupID, leftMargin, topMargin + i++ * 22); - setupToggleButton (alignCenterButton, "center", groupID, leftMargin, topMargin + i++ * 22); - alignStretchButton.setToggleState (true, sendNotification); + createToggleButton ("stretch", groupID, leftMargin, topMargin + i++ * 22, true, [this]() { flexBox.alignItems = FlexBox::AlignItems::stretch; }); + createToggleButton ("flex-start", groupID, leftMargin, topMargin + i++ * 22, false, [this]() { flexBox.alignItems = FlexBox::AlignItems::flexStart; }); + createToggleButton ("flex-end", groupID, leftMargin, topMargin + i++ * 22, false, [this]() { flexBox.alignItems = FlexBox::AlignItems::flexEnd; }); + createToggleButton ("center", groupID, leftMargin, topMargin + i++ * 22, false, [this]() { flexBox.alignItems = FlexBox::AlignItems::center; }); auto alignContentGroup = addControl (new GroupComponent ("content", "align-content")); alignContentGroup->setBounds (10, 300, 140, 160); @@ -239,13 +234,12 @@ struct FlexBoxDemo : public juce::Component, leftMargin = 15; topMargin = 315; - setupToggleButton (alignContentStretchButton, "stretch", groupID, leftMargin, topMargin + i++ * 22); - setupToggleButton (alignContentFlexStartButton, "flex-start", groupID, leftMargin, topMargin + i++ * 22); - setupToggleButton (alignContentFlexEndButton, "flex-end", groupID, leftMargin, topMargin + i++ * 22); - setupToggleButton (alignContentCenterButton, "center", groupID, leftMargin, topMargin + i++ * 22); - setupToggleButton (alignContentSpaceBetweenButton, "space-between", groupID, leftMargin, topMargin + i++ * 22); - setupToggleButton (alignContentSpaceAroundButton, "space-around", groupID, leftMargin, topMargin + i++ * 22); - alignContentStretchButton.setToggleState (true, sendNotification); + createToggleButton ("stretch", groupID, leftMargin, topMargin + i++ * 22, true, [this]() { flexBox.alignContent = FlexBox::AlignContent::stretch; }); + createToggleButton ("flex-start", groupID, leftMargin, topMargin + i++ * 22, false, [this]() { flexBox.alignContent = FlexBox::AlignContent::flexStart; }); + createToggleButton ("flex-end", groupID, leftMargin, topMargin + i++ * 22, false, [this]() { flexBox.alignContent = FlexBox::AlignContent::flexEnd; }); + createToggleButton ("center", groupID, leftMargin, topMargin + i++ * 22, false, [this]() { flexBox.alignContent = FlexBox::AlignContent::center; }); + createToggleButton ("space-between", groupID, leftMargin, topMargin + i++ * 22, false, [this]() { flexBox.alignContent = FlexBox::AlignContent::spaceBetween; }); + createToggleButton ("space-around", groupID, leftMargin, topMargin + i++ * 22, false, [this]() { flexBox.alignContent = FlexBox::AlignContent::spaceAround; }); } void setupFlexBoxItems() @@ -265,21 +259,21 @@ struct FlexBoxDemo : public juce::Component, auto& flexItem = flexBox.items.getReference (flexBox.items.size() - 1); - auto panel = new DemoFlexPanel (colour, flexItem); - panels.add (panel); + auto panel = panels.add (new DemoFlexPanel (colour, flexItem)); flexItem.associatedComponent = panel; addAndMakeVisible (panel); } - void setupToggleButton (ToggleButton& tb, StringRef text, int groupID, int x, int y) + ToggleButton& createToggleButton (StringRef text, int groupID, int x, int y, bool toggleOn, std::function fn) { - tb.setButtonText (text); - tb.setRadioGroupId (groupID); - tb.setToggleState (false, dontSendNotification); - tb.addListener (this); - tb.setBounds (x, y, 130, 22); - + auto* tb = buttons.add (new ToggleButton()); + tb->setButtonText (text); + tb->setRadioGroupId (groupID); + tb->setToggleState (toggleOn, dontSendNotification); + tb->onClick = fn; + tb->setBounds (x, y, 130, 22); addAndMakeVisible (tb); + return *tb; } template @@ -290,69 +284,11 @@ struct FlexBoxDemo : public juce::Component, return newControlComp; } - void buttonClicked (Button* b) override - { - if (b->getToggleState()) - { - if (b == &flexDirectionRowButton) flexBox.flexDirection = FlexBox::Direction::row; - else if (b == &flexDirectionRowReverseButton) flexBox.flexDirection = FlexBox::Direction::rowReverse; - else if (b == &flexDirectionColumnButton) flexBox.flexDirection = FlexBox::Direction::column; - else if (b == &flexDirectionColumnReverseButton) flexBox.flexDirection = FlexBox::Direction::columnReverse; - else if (b == &flexNoWrapButton) flexBox.flexWrap = FlexBox::Wrap::noWrap; - else if (b == &flexWrapButton) flexBox.flexWrap = FlexBox::Wrap::wrap; - else if (b == &flexWrapReverseButton) flexBox.flexWrap = FlexBox::Wrap::wrapReverse; - else if (b == &justifyFlexStartButton) flexBox.justifyContent = FlexBox::JustifyContent::flexStart; - else if (b == &justifyFlexEndButton) flexBox.justifyContent = FlexBox::JustifyContent::flexEnd; - else if (b == &justifyCenterButton) flexBox.justifyContent = FlexBox::JustifyContent::center; - else if (b == &justifySpaceBetweenButton) flexBox.justifyContent = FlexBox::JustifyContent::spaceBetween; - else if (b == &justifySpaceAroundButton) flexBox.justifyContent = FlexBox::JustifyContent::spaceAround; - else if (b == &alignStretchButton) flexBox.alignItems = FlexBox::AlignItems::stretch; - else if (b == &alignFlexStartButton) flexBox.alignItems = FlexBox::AlignItems::flexStart; - else if (b == &alignFlexEndButton) flexBox.alignItems = FlexBox::AlignItems::flexEnd; - else if (b == &alignCenterButton) flexBox.alignItems = FlexBox::AlignItems::center; - else if (b == &alignContentStretchButton) flexBox.alignContent = FlexBox::AlignContent::stretch; - else if (b == &alignContentFlexStartButton) flexBox.alignContent = FlexBox::AlignContent::flexStart; - else if (b == &alignContentFlexEndButton) flexBox.alignContent = FlexBox::AlignContent::flexEnd; - else if (b == &alignContentCenterButton) flexBox.alignContent = FlexBox::AlignContent::center; - else if (b == &alignContentSpaceBetweenButton) flexBox.alignContent = FlexBox::AlignContent::spaceBetween; - else if (b == &alignContentSpaceAroundButton) flexBox.alignContent = FlexBox::AlignContent::spaceAround; - else return; - - resized(); - } - } - FlexBox flexBox; OwnedArray panels; OwnedArray controls; - - ToggleButton flexDirectionRowButton, - flexDirectionRowReverseButton, - flexDirectionColumnButton, - flexDirectionColumnReverseButton, - - flexNoWrapButton, - flexWrapButton, - flexWrapReverseButton, - - justifyFlexStartButton, - justifyFlexEndButton, - justifyCenterButton, - justifySpaceBetweenButton, - justifySpaceAroundButton, - - alignStretchButton, - alignFlexStartButton, - alignFlexEndButton, - alignCenterButton, - - alignContentStretchButton, - alignContentFlexStartButton, - alignContentFlexEndButton, - alignContentCenterButton, - alignContentSpaceBetweenButton, - alignContentSpaceAroundButton; + OwnedArray buttons; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FlexBoxDemo) }; diff --git a/examples/Demo/Source/Demos/FontsDemo.cpp b/examples/Demo/Source/Demos/FontsDemo.cpp index d4c34b1e29..63ff650dd8 100644 --- a/examples/Demo/Source/Demos/FontsDemo.cpp +++ b/examples/Demo/Source/Demos/FontsDemo.cpp @@ -31,7 +31,6 @@ class FontsDemo : public Component, private ListBoxModel, private Slider::Listener, - private Button::Listener, private ComboBox::Listener { public: @@ -59,8 +58,8 @@ public: heightSlider.addListener (this); kerningSlider.addListener (this); scaleSlider.addListener (this); - boldToggle.addListener (this); - italicToggle.addListener (this); + boldToggle.onClick = [this]() { refreshPreviewBoxFont(); }; + italicToggle.onClick = [this]() { refreshPreviewBoxFont(); }; styleBox.addListener (this); Font::findFonts (fonts); // Generate the list of fonts @@ -157,12 +156,6 @@ public: else if (sliderThatWasMoved == &scaleSlider) refreshPreviewBoxFont(); } - void buttonClicked (Button* buttonThatWasClicked) override - { - if (buttonThatWasClicked == &boldToggle) refreshPreviewBoxFont(); - else if (buttonThatWasClicked == &italicToggle) refreshPreviewBoxFont(); - } - // The following methods implement the ListBoxModel virtual methods: int getNumRows() override { diff --git a/examples/Demo/Source/Demos/LiveConstantDemo.cpp b/examples/Demo/Source/Demos/LiveConstantDemo.cpp index eed3709bec..ef5310d698 100644 --- a/examples/Demo/Source/Demos/LiveConstantDemo.cpp +++ b/examples/Demo/Source/Demos/LiveConstantDemo.cpp @@ -57,8 +57,7 @@ struct LiveConstantDemoComponent : public Component }; //============================================================================== -class LiveConstantEditorDemo : public Component, - private Button::Listener +class LiveConstantEditorDemo : public Component { public: LiveConstantEditorDemo() @@ -75,7 +74,7 @@ public: addAndMakeVisible (descriptionLabel); addAndMakeVisible (startButton); addChildComponent (demoComp); - startButton.addListener (this); + startButton.onClick = [this]() { start(); }; } void paint (Graphics& g) override @@ -95,12 +94,7 @@ public: demoComp.setBounds (r.withTrimmedTop (10)); } -private: - Label descriptionLabel; - TextButton startButton; - LiveConstantDemoComponent demoComp; - - void buttonClicked (Button*) override + void start() { startButton.setVisible (false); demoComp.setVisible (true); @@ -110,6 +104,11 @@ private: dontSendNotification); } +private: + Label descriptionLabel; + TextButton startButton; + LiveConstantDemoComponent demoComp; + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LiveConstantEditorDemo) }; diff --git a/examples/Demo/Source/Demos/LookAndFeelDemo.cpp b/examples/Demo/Source/Demos/LookAndFeelDemo.cpp index 57e50401dd..4648a92f97 100644 --- a/examples/Demo/Source/Demos/LookAndFeelDemo.cpp +++ b/examples/Demo/Source/Demos/LookAndFeelDemo.cpp @@ -505,8 +505,7 @@ struct LookAndFeelDemoComponent : public Component //============================================================================== class LookAndFeelDemo : public Component, - private ComboBox::Listener, - private Button::Listener + private ComboBox::Listener { public: LookAndFeelDemo() @@ -542,7 +541,7 @@ public: addAndMakeVisible (randomButton); randomButton.setButtonText ("Assign Randomly"); - randomButton.addListener (this); + randomButton.onClick = [this]() { lafBox.setSelectedItemIndex (Random().nextInt (lafBox.getNumItems())); }; } void paint (Graphics& g) override @@ -619,12 +618,6 @@ private: setAllLookAndFeels (lookAndFeels[lafBox.getSelectedItemIndex()]); } - void buttonClicked (Button* b) override - { - if (b == &randomButton) - lafBox.setSelectedItemIndex (Random::getSystemRandom().nextInt (lafBox.getNumItems())); - } - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LookAndFeelDemo) }; diff --git a/examples/Demo/Source/Demos/MDIDemo.cpp b/examples/Demo/Source/Demos/MDIDemo.cpp index 68f6144d73..56f171452c 100644 --- a/examples/Demo/Source/Demos/MDIDemo.cpp +++ b/examples/Demo/Source/Demos/MDIDemo.cpp @@ -163,8 +163,7 @@ private: By default this will look for notes saved to the desktop and load them up. */ class MDIDemo : public Component, - public FileDragAndDropTarget, - private Button::Listener + public FileDragAndDropTarget { public: MDIDemo() @@ -173,11 +172,11 @@ public: showInTabsButton.setButtonText ("Show with tabs"); showInTabsButton.setToggleState (false, dontSendNotification); - showInTabsButton.addListener (this); + showInTabsButton.onClick = [this]() { updateLayoutMode(); }; addAndMakeVisible (showInTabsButton); addNoteButton.setButtonText ("Create a new note"); - addNoteButton.addListener (this); + addNoteButton.onClick = [this]() { addNote (String ("Note ") + String (multiDocumentPanel.getNumDocuments() + 1), "Hello World!"); }; addAndMakeVisible (addNoteButton); addAndMakeVisible (multiDocumentPanel); @@ -188,12 +187,6 @@ public: addExistingNotes(); } - ~MDIDemo() - { - addNoteButton.removeListener (this); - showInTabsButton.removeListener (this); - } - void paint (Graphics& g) override { g.fillAll (getUIColourIfAvailable (LookAndFeel_V4::ColourScheme::UIColour::windowBackground)); @@ -226,11 +219,9 @@ public: void createNotesForFiles (const Array& files) { - for (int i = 0; i < files.size(); ++i) + for (auto& file : files) { - const File file (files[i]); - - String content = file.loadFileAsString(); + auto content = file.loadFileAsString(); if (content.length() > 20000) content = "Too long!"; @@ -265,14 +256,6 @@ private: createNotesForFiles (files); } - void buttonClicked (Button* b) override - { - if (b == &showInTabsButton) - updateLayoutMode(); - else if (b == &addNoteButton) - addNote (String ("Note ") + String (multiDocumentPanel.getNumDocuments() + 1), "Hello World!"); - } - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MDIDemo) }; diff --git a/examples/Demo/Source/Demos/MultithreadingDemo.cpp b/examples/Demo/Source/Demos/MultithreadingDemo.cpp index 71284b4ec9..76b74326c4 100644 --- a/examples/Demo/Source/Demos/MultithreadingDemo.cpp +++ b/examples/Demo/Source/Demos/MultithreadingDemo.cpp @@ -205,14 +205,10 @@ private: //============================================================================== class MultithreadingDemo : public Component, - private Timer, - private Button::Listener + private Timer { public: MultithreadingDemo() - : pool (3), - controlButton ("Thread type"), - isUsingPool (false) { setOpaque (true); @@ -221,7 +217,7 @@ public: controlButton.setTopLeftPosition (20, 20); controlButton.setTriggeredOnMouseDown (true); controlButton.setAlwaysOnTop (true); - controlButton.addListener (this); + controlButton.onClick = [this]() { showMenu(); }; } ~MultithreadingDemo() @@ -251,9 +247,9 @@ public: } private: - ThreadPool pool; - TextButton controlButton; - bool isUsingPool; + ThreadPool pool { 3 }; + TextButton controlButton { "Thread type" }; + bool isUsingPool = false; OwnedArray balls; @@ -319,7 +315,7 @@ private: } } - void buttonClicked (Button*) override + void showMenu() { PopupMenu m; m.addItem (1, "Use one thread per ball", true, ! isUsingPool); diff --git a/examples/Demo/Source/Demos/NetworkingDemo.cpp b/examples/Demo/Source/Demos/NetworkingDemo.cpp index 0e8cefc215..3b276f6a4d 100644 --- a/examples/Demo/Source/Demos/NetworkingDemo.cpp +++ b/examples/Demo/Source/Demos/NetworkingDemo.cpp @@ -29,7 +29,6 @@ //============================================================================== class NetworkingDemo : public Component, - private Button::Listener, private TextEditor::Listener, private Thread { @@ -46,7 +45,7 @@ public: addAndMakeVisible (fetchButton); fetchButton.setButtonText ("Download URL Contents"); - fetchButton.addListener (this); + fetchButton.onClick = [this]() { startThread(); }; addAndMakeVisible (resultsBox); } @@ -58,10 +57,10 @@ public: void resized() override { - Rectangle area (getLocalBounds()); + auto area = getLocalBounds(); { - Rectangle topArea (area.removeFromTop (40)); + auto topArea = area.removeFromTop (40); fetchButton.setBounds (topArea.removeFromRight (180).reduced (8)); urlBox.setBounds (topArea.reduced (8)); } @@ -107,12 +106,6 @@ private: CodeDocument resultsDocument; CodeEditorComponent resultsBox; - void buttonClicked (Button* button) override - { - if (button == &fetchButton) - startThread(); - } - void textEditorReturnKeyPressed (TextEditor&) override { fetchButton.triggerClick(); diff --git a/examples/Demo/Source/Demos/OpenGLDemo.cpp b/examples/Demo/Source/Demos/OpenGLDemo.cpp index 96945736f3..570cf960c9 100644 --- a/examples/Demo/Source/Demos/OpenGLDemo.cpp +++ b/examples/Demo/Source/Demos/OpenGLDemo.cpp @@ -88,9 +88,9 @@ struct OpenGLDemoClasses void disable (OpenGLContext& openGLContext) { - if (position != nullptr) openGLContext.extensions.glDisableVertexAttribArray (position->attributeID); - if (normal != nullptr) openGLContext.extensions.glDisableVertexAttribArray (normal->attributeID); - if (sourceColour != nullptr) openGLContext.extensions.glDisableVertexAttribArray (sourceColour->attributeID); + if (position != nullptr) openGLContext.extensions.glDisableVertexAttribArray (position->attributeID); + if (normal != nullptr) openGLContext.extensions.glDisableVertexAttribArray (normal->attributeID); + if (sourceColour != nullptr) openGLContext.extensions.glDisableVertexAttribArray (sourceColour->attributeID); if (textureCoordIn != nullptr) openGLContext.extensions.glDisableVertexAttribArray (textureCoordIn->attributeID); } @@ -144,20 +144,18 @@ struct OpenGLDemoClasses Shape (OpenGLContext& openGLContext) { if (shapeFile.load (BinaryData::teapot_obj).wasOk()) - for (int i = 0; i < shapeFile.shapes.size(); ++i) - vertexBuffers.add (new VertexBuffer (openGLContext, *shapeFile.shapes.getUnchecked(i))); - + for (auto* s : shapeFile.shapes) + vertexBuffers.add (new VertexBuffer (openGLContext, *s)); } void draw (OpenGLContext& openGLContext, Attributes& attributes) { - for (int i = 0; i < vertexBuffers.size(); ++i) + for (auto* vertexBuffer : vertexBuffers) { - VertexBuffer& vertexBuffer = *vertexBuffers.getUnchecked (i); - vertexBuffer.bind(); + vertexBuffer->bind(); attributes.enable (openGLContext); - glDrawElements (GL_TRIANGLES, vertexBuffer.numIndices, GL_UNSIGNED_INT, 0); + glDrawElements (GL_TRIANGLES, vertexBuffer->numIndices, GL_UNSIGNED_INT, 0); attributes.disable (openGLContext); } } @@ -333,7 +331,6 @@ struct OpenGLDemoClasses private CodeDocument::Listener, private ComboBox::Listener, private Slider::Listener, - private Button::Listener, private Timer { public: @@ -364,7 +361,7 @@ struct OpenGLDemoClasses speedLabel.attachToComponent (&speedSlider, true); addAndMakeVisible (showBackgroundToggle); - showBackgroundToggle.addListener (this); + showBackgroundToggle.onClick = [this]() { demo.doBackgroundDrawing = showBackgroundToggle.getToggleState(); }; addAndMakeVisible (tabbedComp); tabbedComp.setTabBarDepth (25); @@ -387,7 +384,7 @@ struct OpenGLDemoClasses addAndMakeVisible (presetBox); presetBox.addListener (this); - Array presets (getPresets()); + auto presets = getPresets(); StringArray presetNames; for (int i = 0; i < presets.size(); ++i) @@ -415,11 +412,11 @@ struct OpenGLDemoClasses void resized() override { - Rectangle area (getLocalBounds().reduced (4)); + auto area = getLocalBounds().reduced (4); - Rectangle top (area.removeFromTop (75)); + auto top = area.removeFromTop (75); - Rectangle sliders (top.removeFromRight (area.getWidth() / 2)); + auto sliders = top.removeFromRight (area.getWidth() / 2); showBackgroundToggle.setBounds (sliders.removeFromBottom (25)); speedSlider.setBounds (sliders.removeFromBottom (25)); sizeSlider.setBounds (sliders.removeFromBottom (25)); @@ -427,9 +424,9 @@ struct OpenGLDemoClasses top.removeFromRight (70); statusLabel.setBounds (top); - Rectangle shaderArea (area.removeFromBottom (area.getHeight() / 2)); + auto shaderArea = area.removeFromBottom (area.getHeight() / 2); - Rectangle presets (shaderArea.removeFromTop (25)); + auto presets = shaderArea.removeFromTop (25); presets.removeFromLeft (100); presetBox.setBounds (presets.removeFromLeft (150)); presets.removeFromLeft (100); @@ -523,11 +520,6 @@ struct OpenGLDemoClasses demo.rotationSpeed = (float) speedSlider.getValue(); } - void buttonClicked (Button*) override - { - demo.doBackgroundDrawing = showBackgroundToggle.getToggleState(); - } - enum { shaderLinkDelay = 500 }; void codeDocumentTextInserted (const String& /*newText*/, int /*insertIndex*/) override @@ -597,7 +589,7 @@ struct OpenGLDemoClasses public: OpenGLDemo() { - if (MainAppWindow* mw = MainAppWindow::getMainAppWindow()) + if (auto* mw = MainAppWindow::getMainAppWindow()) mw->setRenderingEngine (0); setOpaque (true); diff --git a/examples/Demo/Source/Demos/TimersAndEventsDemo.cpp b/examples/Demo/Source/Demos/TimersAndEventsDemo.cpp index 3e48c72615..b194475954 100644 --- a/examples/Demo/Source/Demos/TimersAndEventsDemo.cpp +++ b/examples/Demo/Source/Demos/TimersAndEventsDemo.cpp @@ -37,13 +37,12 @@ struct ColourMessage : public Message /** Returns the colour of a ColourMessage of white if the message is not a ColourMessage. */ static Colour getColour (const Message& message) { - if (const ColourMessage* cm = dynamic_cast (&message)) + if (auto* cm = dynamic_cast (&message)) return cm->colour; return Colours::white; } -private: Colour colour; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ColourMessage) @@ -61,8 +60,6 @@ class FlashingComponent : public Component, { public: FlashingComponent() - : flashAlpha (0.0f), - colour (Colours::red) { } @@ -107,8 +104,8 @@ public: } private: - float flashAlpha; - Colour colour; + float flashAlpha = 0; + Colour colour { Colours::red }; void timerCallback() override { @@ -130,8 +127,7 @@ private: //============================================================================== class TimersAndEventsDemo : public Component, - private ChangeListener, - private Button::Listener + private ChangeListener { public: TimersAndEventsDemo() @@ -141,7 +137,7 @@ public: // Create and add our FlashingComponents with some random colours and sizes for (int i = 0; i < numFlashingComponents; ++i) { - FlashingComponent* newFlasher = new FlashingComponent(); + auto* newFlasher = new FlashingComponent(); flashingComponents.add (newFlasher); newFlasher->setFlashColour (getRandomBrightColour()); @@ -154,20 +150,19 @@ public: } addAndMakeVisible (stopButton); - stopButton.addListener (this); stopButton.setButtonText ("Stop"); + stopButton.onClick = [this]() { stopButtonClicked(); }; addAndMakeVisible (randomColourButton); - randomColourButton.addListener (this); randomColourButton.setButtonText ("Set Random Colour"); + randomColourButton.onClick = [this]() { randomColourButtonClicked(); }; // lay out our components in a psudo random grid Rectangle area (0, 100, 150, 150); - for (int i = 0; i < flashingComponents.size(); ++i) + for (auto* comp : flashingComponents) { - FlashingComponent* comp = flashingComponents.getUnchecked (i); - Rectangle buttonArea (area.withSize (comp->getWidth(), comp->getHeight())); + auto buttonArea = area.withSize (comp->getWidth(), comp->getHeight()); buttonArea.translate (random.nextInt (area.getWidth() - comp->getWidth()), random.nextInt (area.getHeight() - comp->getHeight())); comp->setBounds (buttonArea); @@ -185,11 +180,8 @@ public: ~TimersAndEventsDemo() { - stopButton.removeListener (this); - randomColourButton.removeListener (this); - - for (int i = flashingComponents.size(); --i >= 0;) - flashingComponents.getUnchecked (i)->removeChangeListener (this); + for (auto* fc : flashingComponents) + fc->removeChangeListener (this); } void paint (Graphics& g) override @@ -200,7 +192,7 @@ public: void paintOverChildren (Graphics& g) override { - const Rectangle explanationArea (getLocalBounds().removeFromTop (100)); + auto explanationArea = getLocalBounds().removeFromTop (100); AttributedString s; s.append ("Click on a circle to make it flash. When it has finished flashing it will send a message which causes the next circle to flash"); @@ -208,14 +200,13 @@ public: s.append ("Click the \"Set Random Colour\" button to change the colour of one of the circles."); s.append (newLine); s.setFont (Font (16.0f)); - s.setColour (getUIColourIfAvailable(LookAndFeel_V4::ColourScheme::UIColour::defaultText, - Colours::lightgrey)); + s.setColour (getUIColourIfAvailable (LookAndFeel_V4::ColourScheme::UIColour::defaultText, Colours::lightgrey)); s.draw (g, explanationArea.reduced (10).toFloat()); } void resized() override { - Rectangle area (getLocalBounds().removeFromBottom (40)); + auto area = getLocalBounds().removeFromBottom (40); randomColourButton.setBounds (area.removeFromLeft (166).reduced (8)); stopButton.setBounds (area.removeFromRight (166).reduced (8)); } @@ -234,19 +225,17 @@ private: flashingComponents.getUnchecked ((i + 1) % flashingComponents.size())->startFlashing(); } - void buttonClicked (Button* button) override + void randomColourButtonClicked() { - if (button == &randomColourButton) - { - // Here we post a new ColourMessage with a random colour to a random flashing component. - // This will send a message to the component asynchronously and trigger its handleMessage callback - flashingComponents.getUnchecked (random.nextInt (flashingComponents.size()))->postMessage (new ColourMessage (getRandomBrightColour())); - } - else if (button == &stopButton) - { - for (int i = 0; i < flashingComponents.size(); ++i) - flashingComponents.getUnchecked (i)->stopFlashing(); - } + // Here we post a new ColourMessage with a random colour to a random flashing component. + // This will send a message to the component asynchronously and trigger its handleMessage callback + flashingComponents.getUnchecked (random.nextInt (flashingComponents.size()))->postMessage (new ColourMessage (getRandomBrightColour())); + } + + void stopButtonClicked() + { + for (auto* fc : flashingComponents) + fc->stopFlashing(); } JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TimersAndEventsDemo) diff --git a/examples/Demo/Source/Demos/UnitTestsDemo.cpp b/examples/Demo/Source/Demos/UnitTestsDemo.cpp index 9d7b6991f8..54f1207ce4 100644 --- a/examples/Demo/Source/Demos/UnitTestsDemo.cpp +++ b/examples/Demo/Source/Demos/UnitTestsDemo.cpp @@ -106,17 +106,15 @@ struct UnitTestClasses //============================================================================== - class UnitTestsDemo : public Component, - public Button::Listener + class UnitTestsDemo : public Component { public: UnitTestsDemo() - : startTestButton ("Run Unit Tests...") { setOpaque (true); addAndMakeVisible (startTestButton); - startTestButton.addListener (this); + startTestButton.onClick = [this]() { start(); }; addAndMakeVisible (testResultsBox); testResultsBox.setMultiLine (true); @@ -160,10 +158,9 @@ struct UnitTestClasses testResultsBox.setBounds (bounds); } - void buttonClicked (Button* buttonThatWasClicked) override + void start() { - if (buttonThatWasClicked == &startTestButton) - startTest (categoriesBox.getText()); + startTest (categoriesBox.getText()); } void startTest (const String& category) @@ -201,7 +198,7 @@ struct UnitTestClasses private: ScopedPointer currentTestThread; - TextButton startTestButton; + TextButton startTestButton { "Run Unit Tests..." }; ComboBox categoriesBox; TextEditor testResultsBox; diff --git a/examples/Demo/Source/Demos/ValueTreesDemo.cpp b/examples/Demo/Source/Demos/ValueTreesDemo.cpp index 92ab62d688..1582ec8b3c 100644 --- a/examples/Demo/Source/Demos/ValueTreesDemo.cpp +++ b/examples/Demo/Source/Demos/ValueTreesDemo.cpp @@ -158,7 +158,6 @@ private: //============================================================================== class ValueTreesDemo : public Component, public DragAndDropContainer, - private Button::Listener, private Timer { public: @@ -174,8 +173,8 @@ public: addAndMakeVisible (undoButton); addAndMakeVisible (redoButton); - undoButton.addListener (this); - redoButton.addListener (this); + undoButton.onClick = [this]() { undoManager.undo(); }; + redoButton.onClick = [this]() { undoManager.redo(); }; startTimer (500); } @@ -271,14 +270,6 @@ public: return Component::keyPressed (key); } - void buttonClicked (Button* b) override - { - if (b == &undoButton) - undoManager.undo(); - else if (b == &redoButton) - undoManager.redo(); - } - private: TreeView tree; TextButton undoButton, redoButton; diff --git a/examples/Demo/Source/Demos/VideoDemo.cpp b/examples/Demo/Source/Demos/VideoDemo.cpp index 66b7a9da33..98c29f0b0e 100644 --- a/examples/Demo/Source/Demos/VideoDemo.cpp +++ b/examples/Demo/Source/Demos/VideoDemo.cpp @@ -119,7 +119,6 @@ private: //============================================================================== class VideoDemo : public Component, public DragAndDropContainer, - private Button::Listener, private FileBrowserListener { public: @@ -144,8 +143,8 @@ public: loadLeftButton.setButtonText ("Load Left"); loadRightButton.setButtonText ("Load Right"); - loadLeftButton.addListener (this); - loadRightButton.addListener (this); + loadLeftButton .onClick = [this]() { movieCompLeft .setFile (fileTree.getSelectedFile (0)); }; + loadRightButton.onClick = [this]() { movieCompRight.setFile (fileTree.getSelectedFile (0)); }; addAndMakeVisible (loadLeftButton); addAndMakeVisible (loadRightButton); @@ -168,8 +167,6 @@ public: ~VideoDemo() { - loadLeftButton.removeListener (this); - loadRightButton.removeListener (this); fileTree.removeListener (this); } @@ -214,14 +211,6 @@ private: TextButton loadLeftButton, loadRightButton; MovieComponentWithFileBrowser movieCompLeft, movieCompRight; - void buttonClicked (Button* button) override - { - if (button == &loadLeftButton) - movieCompLeft.setFile (fileTree.getSelectedFile (0)); - else if (button == &loadRightButton) - movieCompRight.setFile (fileTree.getSelectedFile (0)); - } - void selectionChanged() override { // we're just going to update the drag description of out tree so that rows can be dragged onto the file players diff --git a/examples/Demo/Source/Demos/WebBrowserDemo.cpp b/examples/Demo/Source/Demos/WebBrowserDemo.cpp index ff0aec2c9e..9df67fa887 100644 --- a/examples/Demo/Source/Demos/WebBrowserDemo.cpp +++ b/examples/Demo/Source/Demos/WebBrowserDemo.cpp @@ -69,8 +69,7 @@ private: //============================================================================== class WebBrowserDemo : public Component, - private TextEditor::Listener, - private Button::Listener + private TextEditor::Listener { public: WebBrowserDemo() @@ -90,11 +89,11 @@ public: // add some buttons.. addAndMakeVisible (goButton); - goButton.addListener (this); + goButton.onClick = [this]() { webView->goToURL (addressTextBox.getText()); }; addAndMakeVisible (backButton); - backButton.addListener (this); + backButton.onClick = [this]() { webView->goBack(); }; addAndMakeVisible (forwardButton); - forwardButton.addListener (this); + forwardButton.onClick = [this]() { webView->goForward(); }; // send the browser to a start page.. webView->goToURL ("https://www.juce.com"); @@ -130,16 +129,6 @@ private: webView->goToURL (addressTextBox.getText()); } - void buttonClicked (Button* b) override - { - if (b == &backButton) - webView->goBack(); - else if (b == &forwardButton) - webView->goForward(); - else if (b == &goButton) - webView->goToURL (addressTextBox.getText()); - } - void lookAndFeelChanged() override { addressTextBox.applyFontToAllText (addressTextBox.getFont()); diff --git a/examples/Demo/Source/Demos/WidgetsDemo.cpp b/examples/Demo/Source/Demos/WidgetsDemo.cpp index 4d8a69bbb8..944ad26e00 100644 --- a/examples/Demo/Source/Demos/WidgetsDemo.cpp +++ b/examples/Demo/Source/Demos/WidgetsDemo.cpp @@ -27,7 +27,7 @@ #include "../JuceDemoHeader.h" -static void showBubbleMessage (Component* targetComponent, const String& textToShow, +static void showBubbleMessage (Component& targetComponent, const String& textToShow, ScopedPointer& bmc) { bmc = new BubbleMessageComponent(); @@ -39,14 +39,14 @@ static void showBubbleMessage (Component* targetComponent, const String& textToS } else { - targetComponent->getTopLevelComponent()->addChildComponent (bmc); + targetComponent.getTopLevelComponent()->addChildComponent (bmc); } AttributedString text (textToShow); text.setJustification (Justification::centred); - text.setColour (targetComponent->findColour (TextButton::textColourOffId)); + text.setColour (targetComponent.findColour (TextButton::textColourOffId)); - bmc->showAt (targetComponent, text, 2000, true, false); + bmc->showAt (&targetComponent, text, 2000, true, false); } //============================================================================== @@ -247,8 +247,7 @@ private: }; //============================================================================== -struct ButtonsPage : public Component, - public Button::Listener +struct ButtonsPage : public Component { ButtonsPage() { @@ -352,58 +351,68 @@ struct ButtonsPage : public Component, down.setImage (ImageCache::getFromMemory (BinaryData::juce_icon_png, BinaryData::juce_icon_pngSize)); down.setOverlayColour (Colours::black.withAlpha (0.3f)); + auto popupMessageCallback = [this]() + { + if (auto* focused = Component::getCurrentlyFocusedComponent()) + showBubbleMessage (*focused, + "This is a demo of the BubbleMessageComponent, which lets you pop up a message pointing " + "at a component or somewhere on the screen.\n\n" + "The message bubbles will disappear after a timeout period, or when the mouse is clicked.", + this->bubbleMessage); + }; + { // create an image-above-text button from these drawables.. - DrawableButton* db = addToList (new DrawableButton ("Button 1", DrawableButton::ImageAboveTextLabel)); + auto db = addToList (new DrawableButton ("Button 1", DrawableButton::ImageAboveTextLabel)); db->setImages (&normal, &over, &down); db->setBounds (260, 60, 80, 80); db->setTooltip ("This is a DrawableButton with a label"); - db->addListener (this); + db->onClick = popupMessageCallback; } { // create an image-only button from these drawables.. - DrawableButton* db = addToList (new DrawableButton ("Button 2", DrawableButton::ImageFitted)); + auto db = addToList (new DrawableButton ("Button 2", DrawableButton::ImageFitted)); db->setImages (&normal, &over, &down); db->setClickingTogglesState (true); db->setBounds (370, 60, 80, 80); db->setTooltip ("This is an image-only DrawableButton"); - db->addListener (this); + db->onClick = popupMessageCallback; } { // create an image-on-button-shape button from the same drawables.. - DrawableButton* db = addToList (new DrawableButton ("Button 3", DrawableButton::ImageOnButtonBackground)); + auto db = addToList (new DrawableButton ("Button 3", DrawableButton::ImageOnButtonBackground)); db->setImages (&normal, 0, 0); db->setBounds (260, 160, 110, 25); db->setTooltip ("This is a DrawableButton on a standard button background"); - db->addListener (this); + db->onClick = popupMessageCallback; } { - DrawableButton* db = addToList (new DrawableButton ("Button 4", DrawableButton::ImageOnButtonBackground)); + auto db = addToList (new DrawableButton ("Button 4", DrawableButton::ImageOnButtonBackground)); db->setImages (&normal, &over, &down); db->setClickingTogglesState (true); db->setColour (DrawableButton::backgroundColourId, Colours::white); db->setColour (DrawableButton::backgroundOnColourId, Colours::yellow); db->setBounds (400, 150, 50, 50); db->setTooltip ("This is a DrawableButton on a standard button background"); - db->addListener (this); + db->onClick = popupMessageCallback; } { - ShapeButton* sb = addToList (new ShapeButton ("ShapeButton", - getRandomDarkColour(), - getRandomDarkColour(), - getRandomDarkColour())); + auto sb = addToList (new ShapeButton ("ShapeButton", + getRandomDarkColour(), + getRandomDarkColour(), + getRandomDarkColour())); sb->setShape (MainAppWindow::getJUCELogoPath(), false, true, false); sb->setBounds (260, 220, 200, 120); } { - ImageButton* ib = addToList (new ImageButton ("ImageButton")); + auto ib = addToList (new ImageButton ("ImageButton")); - Image juceImage = ImageCache::getFromMemory (BinaryData::juce_icon_png, BinaryData::juce_icon_pngSize); + auto juceImage = ImageCache::getFromMemory (BinaryData::juce_icon_png, BinaryData::juce_icon_pngSize); ib->setImages (true, true, true, juceImage, 0.7f, Colours::transparentBlack, @@ -430,15 +439,6 @@ private: return newComp; } - void buttonClicked (Button* button) override - { - showBubbleMessage (button, - "This is a demo of the BubbleMessageComponent, which lets you pop up a message pointing " - "at a component or somewhere on the screen.\n\n" - "The message bubbles will disappear after a timeout period, or when the mouse is clicked.", - bubbleMessage); - } - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ButtonsPage) }; @@ -481,16 +481,15 @@ struct MiscPage : public Component //============================================================================== class ToolbarDemoComp : public Component, - public Slider::Listener, - public Button::Listener + private Slider::Listener { public: ToolbarDemoComp() - : depthLabel (String(), "Toolbar depth:"), - infoLabel (String(), "As well as showing off toolbars, this demo illustrates how to store " - "a set of SVG files in a Zip file, embed that in your application, and read " - "them back in at runtime.\n\nThe icon images here are taken from the open-source " - "Tango icon project."), + : depthLabel ({}, "Toolbar depth:"), + infoLabel ({}, "As well as showing off toolbars, this demo illustrates how to store " + "a set of SVG files in a Zip file, embed that in your application, and read " + "them back in at runtime.\n\nThe icon images here are taken from the open-source " + "Tango icon project."), orientationButton ("Vertical/Horizontal"), customiseButton ("Customise...") { @@ -517,12 +516,12 @@ public: depthLabel.attachToComponent (&depthSlider, false); addAndMakeVisible (orientationButton); - orientationButton.addListener (this); + orientationButton.onClick = [this]() { toolbar.setVertical (! toolbar.isVertical()); resized(); }; orientationButton.changeWidthToFitText (22); orientationButton.setTopLeftPosition (depthSlider.getX(), depthSlider.getBottom() + 20); addAndMakeVisible (customiseButton); - customiseButton.addListener (this); + customiseButton.onClick = [this]() { toolbar.showCustomisationDialog (factory); }; customiseButton.changeWidthToFitText (22); customiseButton.setTopLeftPosition (orientationButton.getRight() + 20, orientationButton.getY()); } @@ -542,19 +541,6 @@ public: resized(); } - void buttonClicked (Button* button) override - { - if (button == &orientationButton) - { - toolbar.setVertical (! toolbar.isVertical()); - resized(); - } - else if (button == &customiseButton) - { - toolbar.showCustomisationDialog (factory); - } - } - private: Toolbar toolbar; Slider depthSlider; @@ -1276,8 +1262,7 @@ private: }; //============================================================================== -struct BurgerMenuHeader : public Component, - private Button::Listener +struct BurgerMenuHeader : public Component { BurgerMenuHeader() { @@ -1299,7 +1284,7 @@ struct BurgerMenuHeader : public Component, p.loadPathFromData (burgerMenuPathData, sizeof (burgerMenuPathData)); burgerButton.setShape (p, true, true, false); - burgerButton.addListener (this); + burgerButton.onClick = [this]() { showOrHide(); }; addAndMakeVisible (burgerButton); } @@ -1328,7 +1313,7 @@ private: titleLabel.setBounds (r); } - void buttonClicked (Button*) override + void showOrHide() { auto& panel = MainAppWindow::getSharedSidePanel(); @@ -1344,8 +1329,7 @@ private: //============================================================================== class MenusDemo : public Component, public MenuBarModel, - public ChangeBroadcaster, - private Button::Listener + public ChangeBroadcaster { public: //============================================================================== @@ -1363,7 +1347,7 @@ public: popupButton.setButtonText ("Show Popup Menu"); popupButton.setTriggeredOnMouseDown (true); - popupButton.addListener (this); + popupButton.onClick = [this]() { getDummyPopupMenu().showMenuAsync (PopupMenu::Options().withTargetComponent (&popupButton), nullptr); }; addAndMakeVisible (popupButton); addChildComponent (menuHeader); @@ -1378,8 +1362,6 @@ public: MenuBarModel::setMacMainMenu (nullptr); #endif PopupMenu::dismissAllActiveMenus(); - - popupButton.removeListener (this); } void resized() override @@ -1565,13 +1547,6 @@ private: return m; } - //============================================================================== - void buttonClicked (Button* button) override - { - if (button == &popupButton) - getDummyPopupMenu().showMenuAsync (PopupMenu::Options().withTargetComponent (&popupButton), nullptr); - } - //============================================================================== class CustomMenuComponent : public PopupMenu::CustomComponent, private Timer @@ -1677,7 +1652,7 @@ public: void mouseDown (const MouseEvent&) override { - showBubbleMessage (this, + showBubbleMessage (*this, "This is a custom tab component\n" "\n" "You can use these to implement things like close-buttons " diff --git a/examples/Demo/Source/Demos/WindowsDemo.cpp b/examples/Demo/Source/Demos/WindowsDemo.cpp index bb2fe9aa94..e32ba4df02 100644 --- a/examples/Demo/Source/Demos/WindowsDemo.cpp +++ b/examples/Demo/Source/Demos/WindowsDemo.cpp @@ -187,8 +187,7 @@ private: }; //============================================================================== -class WindowsDemo : public Component, - private Button::Listener +class WindowsDemo : public Component { public: enum Windows @@ -205,11 +204,11 @@ public: showWindowsButton.setButtonText ("Show Windows"); addAndMakeVisible (showWindowsButton); - showWindowsButton.addListener (this); + showWindowsButton.onClick = [this]() { showAllWindows(); }; closeWindowsButton.setButtonText ("Close Windows"); addAndMakeVisible (closeWindowsButton); - closeWindowsButton.addListener (this); + closeWindowsButton.onClick = [this]() { closeAllWindows(); }; } ~WindowsDemo() @@ -224,9 +223,6 @@ public: } closeAllWindows(); - - closeWindowsButton.removeListener (this); - showWindowsButton.removeListener (this); } void paint (Graphics& g) override @@ -341,14 +337,6 @@ private: balls->setVisible (true); } - void buttonClicked (Button* button) override - { - if (button == &showWindowsButton) - showAllWindows(); - else if (button == &closeWindowsButton) - closeAllWindows(); - } - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WindowsDemo) }; diff --git a/extras/Projucer/Source/Application/jucer_Application.cpp b/extras/Projucer/Source/Application/jucer_Application.cpp index 7d7b77b680..ec7869f89a 100644 --- a/extras/Projucer/Source/Application/jucer_Application.cpp +++ b/extras/Projucer/Source/Application/jucer_Application.cpp @@ -29,35 +29,6 @@ void handleGUIEditorMenuCommand (int); void registerGUIEditorCommands(); - void attachCallback (Button& button, std::function callback) - { - struct ButtonCallback : public Button::Listener, - private ComponentListener - { - ButtonCallback (Button& b, std::function f) : target (b), fn (f) - { - target.addListener (this); - target.addComponentListener (this); - } - - ~ButtonCallback() - { - target.removeListener (this); - } - - void componentBeingDeleted (Component&) override { delete this; } - void buttonClicked (Button*) override { fn(); } - - Button& target; - std::function fn; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ButtonCallback) - }; - - new ButtonCallback (button, callback); - } - - //============================================================================== struct ProjucerApplication::MainMenuModel : public MenuBarModel { diff --git a/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp b/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp index e5462dfb41..85ddf7977e 100644 --- a/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp +++ b/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp @@ -159,7 +159,7 @@ PluginListComponent::PluginListComponent (AudioPluginFormatManager& manager, Kno addAndMakeVisible (table); addAndMakeVisible (optionsButton); - optionsButton.addListener (this); + optionsButton.onClick = [this]() { showOptionsMenu(); }; optionsButton.setTriggeredOnMouseDown (true); setSize (400, 600); @@ -290,28 +290,25 @@ void PluginListComponent::optionsMenuCallback (int result) } } -void PluginListComponent::buttonClicked (Button* button) +void PluginListComponent::showOptionsMenu() { - if (button == &optionsButton) + PopupMenu menu; + menu.addItem (1, TRANS("Clear list")); + menu.addItem (2, TRANS("Remove selected plug-in from list"), table.getNumSelectedRows() > 0); + menu.addItem (3, TRANS("Show folder containing selected plug-in"), canShowSelectedFolder()); + menu.addItem (4, TRANS("Remove any plug-ins whose files no longer exist")); + menu.addSeparator(); + + for (int i = 0; i < formatManager.getNumFormats(); ++i) { - PopupMenu menu; - menu.addItem (1, TRANS("Clear list")); - menu.addItem (2, TRANS("Remove selected plug-in from list"), table.getNumSelectedRows() > 0); - menu.addItem (3, TRANS("Show folder containing selected plug-in"), canShowSelectedFolder()); - menu.addItem (4, TRANS("Remove any plug-ins whose files no longer exist")); - menu.addSeparator(); + auto* format = formatManager.getFormat (i); - for (int i = 0; i < formatManager.getNumFormats(); ++i) - { - AudioPluginFormat* const format = formatManager.getFormat (i); - - if (format->canScanForPlugins()) - menu.addItem (10 + i, "Scan for new or updated " + format->getName() + " plug-ins"); - } - - menu.showMenuAsync (PopupMenu::Options().withTargetComponent (&optionsButton), - ModalCallbackFunction::forComponent (optionsMenuStaticCallback, this)); + if (format->canScanForPlugins()) + menu.addItem (10 + i, "Scan for new or updated " + format->getName() + " plug-ins"); } + + menu.showMenuAsync (PopupMenu::Options().withTargetComponent (&optionsButton), + ModalCallbackFunction::forComponent (optionsMenuStaticCallback, this)); } bool PluginListComponent::isInterestedInFileDrag (const StringArray& /*files*/) diff --git a/modules/juce_audio_processors/scanning/juce_PluginListComponent.h b/modules/juce_audio_processors/scanning/juce_PluginListComponent.h index df3ec367c8..f7c72c605e 100644 --- a/modules/juce_audio_processors/scanning/juce_PluginListComponent.h +++ b/modules/juce_audio_processors/scanning/juce_PluginListComponent.h @@ -34,8 +34,7 @@ namespace juce */ class JUCE_API PluginListComponent : public Component, public FileDragAndDropTarget, - private ChangeListener, - private Button::Listener + private ChangeListener { public: //============================================================================== @@ -119,11 +118,11 @@ private: bool canShowSelectedFolder() const; void removeMissingPlugins(); void removePluginItem (int index); + void showOptionsMenu(); void resized() override; bool isInterestedInFileDrag (const StringArray&) override; void filesDropped (const StringArray&, int, int) override; - void buttonClicked (Button*) override; void changeListenerCallback (ChangeBroadcaster*) override; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PluginListComponent) diff --git a/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp b/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp index 79aaec8dca..5433da31e0 100644 --- a/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp +++ b/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp @@ -27,14 +27,12 @@ namespace juce { -class SimpleDeviceManagerInputLevelMeter : public Component, - public Timer +struct SimpleDeviceManagerInputLevelMeter : public Component, + public Timer { -public: - SimpleDeviceManagerInputLevelMeter (AudioDeviceManager& m) - : manager (m), level (0) + SimpleDeviceManagerInputLevelMeter (AudioDeviceManager& m) : manager (m) { - startTimer (50); + startTimerHz (20); manager.enableInputLevelMeasurement (true); } @@ -47,7 +45,7 @@ public: { if (isShowing()) { - const float newLevel = (float) manager.getCurrentInputLevel(); + auto newLevel = (float) manager.getCurrentInputLevel(); if (std::abs (level - newLevel) > 0.005f) { @@ -67,9 +65,8 @@ public: (float) exp (log (level) / 3.0)); // (add a bit of a skew to make the level more obvious) } -private: AudioDeviceManager& manager; - float level; + float level = 0; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SimpleDeviceManagerInputLevelMeter) }; @@ -81,7 +78,7 @@ class AudioDeviceSelectorComponent::MidiInputSelectorComponentListBox : public { public: MidiInputSelectorComponentListBox (AudioDeviceManager& dm, const String& noItems) - : ListBox (String(), nullptr), + : ListBox ({}, nullptr), deviceManager (dm), noItemsMessage (noItems) { @@ -108,11 +105,11 @@ public: g.fillAll (findColour (TextEditor::highlightColourId) .withMultipliedAlpha (0.3f)); - const String item (items [row]); + auto item = items[row]; bool enabled = deviceManager.isMidiInputEnabled (item); - const int x = getTickX(); - const float tickW = height * 0.75f; + auto x = getTickX(); + auto tickW = height * 0.75f; getLookAndFeel().drawTickBox (g, *this, x - tickW, (height - tickW) / 2, tickW, tickW, enabled, true, true, false); @@ -145,7 +142,7 @@ public: { ListBox::paint (g); - if (items.size() == 0) + if (items.isEmpty()) { g.setColour (Colours::grey); g.setFont (13.0f); @@ -155,9 +152,9 @@ public: } } - int getBestHeight (const int preferredHeight) + int getBestHeight (int preferredHeight) { - const int extra = getOutlineThickness() * 2; + auto extra = getOutlineThickness() * 2; return jmax (getRowHeight() * 2 + extra, jmin (getRowHeight() * getNumRows() + extra, @@ -174,7 +171,7 @@ private: { if (isPositiveAndBelow (row, items.size())) { - const String item (items [row]); + auto item = items[row]; deviceManager.setMidiInputEnabled (item, ! deviceManager.isMidiInputEnabled (item)); } } @@ -202,8 +199,7 @@ static String getNoDeviceString() { return "<< " + TRANS("none") + " >>"; } //============================================================================== class AudioDeviceSettingsPanel : public Component, private ChangeListener, - private ComboBox::Listener, - private Button::Listener + private ComboBox::Listener { public: AudioDeviceSettingsPanel (AudioIODeviceType& t, AudioDeviceSetupDetails& setupDetails, @@ -213,7 +209,7 @@ public: if (hideAdvancedOptionsWithButton) { addAndMakeVisible (showAdvancedSettingsButton = new TextButton (TRANS("Show advanced settings..."))); - showAdvancedSettingsButton->addListener (this); + showAdvancedSettingsButton->onClick = [this]() { showAdvanced(); }; } type.scanForDevices(); @@ -228,7 +224,7 @@ public: void resized() override { - if (AudioDeviceSelectorComponent* parent = findParentComponentOfClass()) + if (auto* parent = findParentComponentOfClass()) { Rectangle r (proportionOfWidth (0.35f), 0, proportionOfWidth (0.6f), 3000); @@ -238,7 +234,7 @@ public: if (outputDeviceDropDown != nullptr) { - Rectangle row (r.removeFromTop (h)); + auto row = r.removeFromTop (h); if (testButton != nullptr) { @@ -253,7 +249,7 @@ public: if (inputDeviceDropDown != nullptr) { - Rectangle row (r.removeFromTop (h)); + auto row = r.removeFromTop (h); inputLevelMeter->setBounds (row.removeFromRight (testButton != nullptr ? testButton->getWidth() : row.getWidth() / 6)); row.removeFromRight (space); @@ -304,7 +300,7 @@ public: if (showUIButton != nullptr || resetDeviceButton != nullptr) { - Rectangle buttons (r.removeFromTop (h)); + auto buttons = r.removeFromTop (h); if (showUIButton != nullptr) { @@ -393,7 +389,7 @@ public: bool showDeviceControlPanel() { - if (AudioIODevice* const device = setup.manager->getCurrentAudioDevice()) + if (auto* device = setup.manager->getCurrentAudioDevice()) { Component modalWindow; modalWindow.setOpaque (true); @@ -406,32 +402,27 @@ public: return false; } - void buttonClicked (Button* button) override + void showAdvanced() { - if (button == showAdvancedSettingsButton) + showAdvancedSettingsButton->setVisible (false); + resized(); + } + + void showDeviceUIPanel() + { + if (showDeviceControlPanel()) { - showAdvancedSettingsButton->setVisible (false); - resized(); - } - else if (button == showUIButton) - { - if (showDeviceControlPanel()) - { - setup.manager->closeAudioDevice(); - setup.manager->restartLastAudioDevice(); - getTopLevelComponent()->toFront (true); - } - } - else if (button == testButton && testButton != nullptr) - { - setup.manager->playTestSound(); - } - else if (button == resetDeviceButton) - { - resetDevice(); + setup.manager->closeAudioDevice(); + setup.manager->restartLastAudioDevice(); + getTopLevelComponent()->toFront (true); } } + void playTestSound() + { + setup.manager->playTestSound(); + } + void updateAllControls() { updateOutputsComboBox(); @@ -440,7 +431,7 @@ public: updateControlPanelButton(); updateResetButton(); - if (AudioIODevice* const currentDevice = setup.manager->getCurrentAudioDevice()) + if (auto* currentDevice = setup.manager->getCurrentAudioDevice()) { if (setup.maxNumOutputChannels > 0 && setup.minNumOutputChannels < setup.manager->getCurrentAudioDevice()->getOutputChannelNames().size()) @@ -450,7 +441,7 @@ public: addAndMakeVisible (outputChanList = new ChannelSelectorListBox (setup, ChannelSelectorListBox::audioOutputType, TRANS ("(no audio output channels found)"))); - outputChanLabel = new Label (String(), TRANS("Active output channels:")); + outputChanLabel = new Label ({}, TRANS("Active output channels:")); outputChanLabel->setJustificationType (Justification::centredRight); outputChanLabel->attachToComponent (outputChanList, true); } @@ -471,7 +462,7 @@ public: addAndMakeVisible (inputChanList = new ChannelSelectorListBox (setup, ChannelSelectorListBox::audioInputType, TRANS("(no audio input channels found)"))); - inputChanLabel = new Label (String(), TRANS("Active input channels:")); + inputChanLabel = new Label ({}, TRANS("Active input channels:")); inputChanLabel->setJustificationType (Justification::centredRight); inputChanLabel->attachToComponent (inputChanList, true); } @@ -534,13 +525,12 @@ private: ScopedPointer inputLevelMeter; ScopedPointer showUIButton, showAdvancedSettingsButton, resetDeviceButton; - void showCorrectDeviceName (ComboBox* const box, const bool isInput) + void showCorrectDeviceName (ComboBox* box, bool isInput) { if (box != nullptr) { - AudioIODevice* const currentDevice = setup.manager->getCurrentAudioDevice(); - - const int index = type.getIndexOfDevice (currentDevice, isInput); + auto* currentDevice = setup.manager->getCurrentAudioDevice(); + auto index = type.getIndexOfDevice (currentDevice, isInput); box->setSelectedId (index + 1, dontSendNotification); @@ -581,7 +571,7 @@ private: { addAndMakeVisible (showUIButton = new TextButton (TRANS ("Control Panel"), TRANS ("Opens the device's own control panel"))); - showUIButton->addListener (this); + showUIButton->onClick = [this]() { showDeviceUIPanel(); }; } resized(); @@ -589,7 +579,7 @@ private: void updateResetButton() { - if (AudioIODevice* const currentDevice = setup.manager->getCurrentAudioDevice()) + if (auto* currentDevice = setup.manager->getCurrentAudioDevice()) { if (currentDevice->hasControlPanel()) { @@ -598,7 +588,7 @@ private: addAndMakeVisible (resetDeviceButton = new TextButton (TRANS ("Reset Device"), TRANS ("Resets the audio interface - sometimes needed after changing a device's properties in its custom control panel"))); - resetDeviceButton->addListener (this); + resetDeviceButton->onClick = [this]() { resetDevice(); }; resized(); } @@ -615,20 +605,19 @@ private: { if (outputDeviceDropDown == nullptr) { - outputDeviceDropDown = new ComboBox (String()); + outputDeviceDropDown = new ComboBox(); outputDeviceDropDown->addListener (this); addAndMakeVisible (outputDeviceDropDown); - outputDeviceLabel = new Label (String(), - type.hasSeparateInputsAndOutputs() ? TRANS("Output:") - : TRANS("Device:")); + outputDeviceLabel = new Label ({}, type.hasSeparateInputsAndOutputs() ? TRANS("Output:") + : TRANS("Device:")); outputDeviceLabel->attachToComponent (outputDeviceDropDown, true); if (setup.maxNumOutputChannels > 0) { addAndMakeVisible (testButton = new TextButton (TRANS("Test"), TRANS("Plays a test tone"))); - testButton->addListener (this); + testButton->onClick = [this]() { playTestSound(); }; } } @@ -644,11 +633,11 @@ private: { if (inputDeviceDropDown == nullptr) { - inputDeviceDropDown = new ComboBox (String()); + inputDeviceDropDown = new ComboBox(); inputDeviceDropDown->addListener (this); addAndMakeVisible (inputDeviceDropDown); - inputDeviceLabel = new Label (String(), TRANS("Input:")); + inputDeviceLabel = new Label ({}, TRANS("Input:")); inputDeviceLabel->attachToComponent (inputDeviceDropDown, true); addAndMakeVisible (inputLevelMeter @@ -665,9 +654,9 @@ private: { if (sampleRateDropDown == nullptr) { - addAndMakeVisible (sampleRateDropDown = new ComboBox (String())); + addAndMakeVisible (sampleRateDropDown = new ComboBox()); - sampleRateLabel = new Label (String(), TRANS("Sample rate:")); + sampleRateLabel = new Label ({}, TRANS("Sample rate:")); sampleRateLabel->attachToComponent (sampleRateDropDown, true); } else @@ -676,12 +665,10 @@ private: sampleRateDropDown->removeListener (this); } - const Array rates (currentDevice->getAvailableSampleRates()); - - for (int i = 0; i < rates.size(); ++i) + for (auto rate : currentDevice->getAvailableSampleRates()) { - const int rate = roundToInt (rates[i]); - sampleRateDropDown->addItem (String (rate) + " Hz", rate); + auto intRate = roundToInt (rate); + sampleRateDropDown->addItem (String (intRate) + " Hz", intRate); } sampleRateDropDown->setSelectedId (roundToInt (currentDevice->getCurrentSampleRate()), dontSendNotification); @@ -692,9 +679,9 @@ private: { if (bufferSizeDropDown == nullptr) { - addAndMakeVisible (bufferSizeDropDown = new ComboBox (String())); + addAndMakeVisible (bufferSizeDropDown = new ComboBox()); - bufferSizeLabel = new Label (String(), TRANS("Audio buffer size:")); + bufferSizeLabel = new Label ({}, TRANS("Audio buffer size:")); bufferSizeLabel->attachToComponent (bufferSizeDropDown, true); } else @@ -703,17 +690,13 @@ private: bufferSizeDropDown->removeListener (this); } - const Array bufferSizes (currentDevice->getAvailableBufferSizes()); + auto currentRate = currentDevice->getCurrentSampleRate(); - double currentRate = currentDevice->getCurrentSampleRate(); if (currentRate == 0) currentRate = 48000.0; - for (int i = 0; i < bufferSizes.size(); ++i) - { - const int bs = bufferSizes[i]; + for (auto bs : currentDevice->getAvailableBufferSizes()) bufferSizeDropDown->addItem (String (bs) + " samples (" + String (bs * 1000.0 / currentRate, 1) + " ms)", bs); - } bufferSizeDropDown->setSelectedId (currentDevice->getCurrentBufferSizeSamples(), dontSendNotification); bufferSizeDropDown->addListener (this); @@ -732,10 +715,8 @@ public: }; //============================================================================== - ChannelSelectorListBox (const AudioDeviceSetupDetails& setupDetails, - const BoxType boxType, const String& noItemsText) - : ListBox (String(), nullptr), - setup (setupDetails), type (boxType), noItemsMessage (noItemsText) + ChannelSelectorListBox (const AudioDeviceSetupDetails& setupDetails, BoxType boxType, const String& noItemsText) + : ListBox ({}, nullptr), setup (setupDetails), type (boxType), noItemsMessage (noItemsText) { refresh(); setModel (this); @@ -746,7 +727,7 @@ public: { items.clear(); - if (AudioIODevice* const currentDevice = setup.manager->getCurrentAudioDevice()) + if (auto* currentDevice = setup.manager->getCurrentAudioDevice()) { if (type == audioInputType) items = currentDevice->getInputChannelNames(); @@ -759,7 +740,7 @@ public: for (int i = 0; i < items.size(); i += 2) { - const String& name = items[i]; + auto& name = items[i]; if (i + 1 >= items.size()) pairs.add (name.trim()); @@ -786,7 +767,7 @@ public: { g.fillAll (findColour (ListBox::backgroundColourId)); - const String item (items [row]); + auto item = items[row]; bool enabled = false; AudioDeviceManager::AudioDeviceSetup config; @@ -795,20 +776,20 @@ public: if (setup.useStereoPairs) { if (type == audioInputType) - enabled = config.inputChannels [row * 2] || config.inputChannels [row * 2 + 1]; + enabled = config.inputChannels[row * 2] || config.inputChannels[row * 2 + 1]; else if (type == audioOutputType) - enabled = config.outputChannels [row * 2] || config.outputChannels [row * 2 + 1]; + enabled = config.outputChannels[row * 2] || config.outputChannels[row * 2 + 1]; } else { if (type == audioInputType) - enabled = config.inputChannels [row]; + enabled = config.inputChannels[row]; else if (type == audioOutputType) - enabled = config.outputChannels [row]; + enabled = config.outputChannels[row]; } - const int x = getTickX(); - const float tickW = height * 0.75f; + auto x = getTickX(); + auto tickW = height * 0.75f; getLookAndFeel().drawTickBox (g, *this, x - tickW, (height - tickW) / 2, tickW, tickW, enabled, true, true, false); @@ -841,7 +822,7 @@ public: { ListBox::paint (g); - if (items.size() == 0) + if (items.isEmpty()) { g.setColour (Colours::grey); g.setFont (13.0f); @@ -881,7 +862,7 @@ public: return name1.trim() + " + " + name2.substring (commonBit.length()).trim(); } - void flipEnablement (const int row) + void flipEnablement (int row) { jassert (type == audioInputType || type == audioOutputType); @@ -893,11 +874,11 @@ public: if (setup.useStereoPairs) { BigInteger bits; - BigInteger& original = (type == audioInputType ? config.inputChannels - : config.outputChannels); + auto& original = (type == audioInputType ? config.inputChannels + : config.outputChannels); for (int i = 0; i < 256; i += 2) - bits.setBit (i / 2, original [i] || original [i + 1]); + bits.setBit (i / 2, original[i] || original[i + 1]); if (type == audioInputType) { @@ -911,7 +892,7 @@ public: } for (int i = 0; i < 256; ++i) - original.setBit (i, bits [i / 2]); + original.setBit (i, bits[i / 2]); } else { @@ -927,7 +908,7 @@ public: } } - String error (setup.manager->setAudioDeviceSetup (config, true)); + auto error = setup.manager->setAudioDeviceSetup (config, true); if (error.isNotEmpty()) { @@ -938,9 +919,9 @@ public: static void flipBit (BigInteger& chans, int index, int minNumber, int maxNumber) { - const int numActive = chans.countNumberOfSetBits(); + auto numActive = chans.countNumberOfSetBits(); - if (chans [index]) + if (chans[index]) { if (numActive > minNumber) chans.setBit (index, false); @@ -949,11 +930,8 @@ public: { if (numActive >= maxNumber) { - const int firstActiveChan = chans.findNextSetBit (0); - - chans.setBit (index > firstActiveChan - ? firstActiveChan : chans.getHighestBit(), - false); + auto firstActiveChan = chans.findNextSetBit (0); + chans.clearBit (index > firstActiveChan ? firstActiveChan : chans.getHighestBit()); } chans.setBit (index, true); @@ -977,22 +955,22 @@ private: //============================================================================== AudioDeviceSelectorComponent::AudioDeviceSelectorComponent (AudioDeviceManager& dm, - const int minInputChannels_, - const int maxInputChannels_, - const int minOutputChannels_, - const int maxOutputChannels_, - const bool showMidiInputOptions, - const bool showMidiOutputSelector, - const bool showChannelsAsStereoPairs_, - const bool hideAdvancedOptionsWithButton_) + int minInputChannelsToUse, + int maxInputChannelsToUse, + int minOutputChannelsToUse, + int maxOutputChannelsToUse, + bool showMidiInputOptions, + bool showMidiOutputSelector, + bool showChannelsAsStereoPairsToUse, + bool hideAdvancedOptionsWithButtonToUse) : deviceManager (dm), itemHeight (24), - minOutputChannels (minOutputChannels_), - maxOutputChannels (maxOutputChannels_), - minInputChannels (minInputChannels_), - maxInputChannels (maxInputChannels_), - showChannelsAsStereoPairs (showChannelsAsStereoPairs_), - hideAdvancedOptionsWithButton (hideAdvancedOptionsWithButton_) + minOutputChannels (minOutputChannelsToUse), + maxOutputChannels (maxOutputChannelsToUse), + minInputChannels (minInputChannelsToUse), + maxInputChannels (maxInputChannelsToUse), + showChannelsAsStereoPairs (showChannelsAsStereoPairsToUse), + hideAdvancedOptionsWithButton (hideAdvancedOptionsWithButtonToUse) { jassert (minOutputChannels >= 0 && minOutputChannels <= maxOutputChannels); jassert (minInputChannels >= 0 && minInputChannels <= maxInputChannels); @@ -1001,7 +979,7 @@ AudioDeviceSelectorComponent::AudioDeviceSelectorComponent (AudioDeviceManager& if (types.size() > 1) { - deviceTypeDropDown = new ComboBox (String()); + deviceTypeDropDown = new ComboBox(); for (int i = 0; i < types.size(); ++i) deviceTypeDropDown->addItem (types.getUnchecked(i)->getTypeName(), i + 1); @@ -1009,7 +987,7 @@ AudioDeviceSelectorComponent::AudioDeviceSelectorComponent (AudioDeviceManager& addAndMakeVisible (deviceTypeDropDown); deviceTypeDropDown->addListener (this); - deviceTypeDropDownLabel = new Label (String(), TRANS("Audio device type:")); + deviceTypeDropDownLabel = new Label ({}, TRANS("Audio device type:")); deviceTypeDropDownLabel->setJustificationType (Justification::centredRight); deviceTypeDropDownLabel->attachToComponent (deviceTypeDropDown, true); } @@ -1020,7 +998,7 @@ AudioDeviceSelectorComponent::AudioDeviceSelectorComponent (AudioDeviceManager& = new MidiInputSelectorComponentListBox (deviceManager, "(" + TRANS("No MIDI inputs available") + ")")); - midiInputsLabel = new Label (String(), TRANS ("Active MIDI inputs:")); + midiInputsLabel = new Label ({}, TRANS ("Active MIDI inputs:")); midiInputsLabel->setJustificationType (Justification::topRight); midiInputsLabel->attachToComponent (midiInputsList, true); @@ -1028,7 +1006,7 @@ AudioDeviceSelectorComponent::AudioDeviceSelectorComponent (AudioDeviceManager& { addAndMakeVisible (bluetoothButton = new TextButton (TRANS("Bluetooth MIDI"), TRANS("Scan for bluetooth MIDI devices"))); - bluetoothButton->addListener (this); + bluetoothButton->onClick = [this]() { handleBluetoothButton(); }; } } else @@ -1040,7 +1018,7 @@ AudioDeviceSelectorComponent::AudioDeviceSelectorComponent (AudioDeviceManager& if (showMidiOutputSelector) { - addAndMakeVisible (midiOutputSelector = new ComboBox (String())); + addAndMakeVisible (midiOutputSelector = new ComboBox()); midiOutputSelector->addListener (this); midiOutputLabel = new Label ("lm", TRANS("MIDI Output:")); @@ -1071,7 +1049,7 @@ void AudioDeviceSelectorComponent::setItemHeight (int newItemHeight) void AudioDeviceSelectorComponent::resized() { Rectangle r (proportionOfWidth (0.35f), 15, proportionOfWidth (0.6f), 3000); - const int space = itemHeight / 4; + auto space = itemHeight / 4; if (deviceTypeDropDown != nullptr) { @@ -1121,7 +1099,7 @@ void AudioDeviceSelectorComponent::comboBoxChanged (ComboBox* comboBoxThatHasCha { if (comboBoxThatHasChanged == deviceTypeDropDown) { - if (AudioIODeviceType* const type = deviceManager.getAvailableDeviceTypes() [deviceTypeDropDown->getSelectedId() - 1]) + if (auto* type = deviceManager.getAvailableDeviceTypes() [deviceTypeDropDown->getSelectedId() - 1]) { audioDeviceSettingsComp.reset(); deviceManager.setCurrentAudioDeviceType (type->getTypeName(), true); @@ -1130,10 +1108,10 @@ void AudioDeviceSelectorComponent::comboBoxChanged (ComboBox* comboBoxThatHasCha } else if (comboBoxThatHasChanged == midiOutputSelector) { - String midiDeviceName (midiOutputSelector->getText()); + auto midiDeviceName = midiOutputSelector->getText(); if (midiDeviceName == getNoDeviceString()) - midiDeviceName = String(); + midiDeviceName = {}; deviceManager.setDefaultMidiOutput (midiDeviceName); } @@ -1203,16 +1181,13 @@ void AudioDeviceSelectorComponent::updateAllControls() resized(); } -void AudioDeviceSelectorComponent::buttonClicked (Button* btn) +void AudioDeviceSelectorComponent::handleBluetoothButton() { - if (bluetoothButton == btn) - { - if (! RuntimePermissions::isGranted (RuntimePermissions::bluetoothMidi)) - RuntimePermissions::request (RuntimePermissions::bluetoothMidi, nullptr); + if (! RuntimePermissions::isGranted (RuntimePermissions::bluetoothMidi)) + RuntimePermissions::request (RuntimePermissions::bluetoothMidi, nullptr); - if (RuntimePermissions::isGranted (RuntimePermissions::bluetoothMidi)) - BluetoothMidiDevicePairingDialogue::open(); - } + if (RuntimePermissions::isGranted (RuntimePermissions::bluetoothMidi)) + BluetoothMidiDevicePairingDialogue::open(); } ListBox* AudioDeviceSelectorComponent::getMidiInputSelectorListBox() const noexcept diff --git a/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h b/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h index ca2d8df76c..9498e5d153 100644 --- a/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h +++ b/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h @@ -39,7 +39,6 @@ namespace juce class JUCE_API AudioDeviceSelectorComponent : public Component, private ChangeListener, private ComboBox::Listener, - private Button::Listener, private Timer { public: @@ -94,9 +93,6 @@ public: void timerCallback() override; private: - //============================================================================== - void buttonClicked (Button*) override; - //============================================================================== ScopedPointer deviceTypeDropDown; ScopedPointer