From 151aaf68cfe184321ad132c7a509372ba819785c Mon Sep 17 00:00:00 2001 From: James Ball Date: Wed, 20 Dec 2023 20:58:08 +0000 Subject: [PATCH] Use native window with native menu bar --- Source/PluginEditor.cpp | 23 +++++++++++++-- Source/PluginEditor.h | 3 ++ Source/PluginProcessor.cpp | 6 ++++ Source/components/MainMenuBarModel.cpp | 40 ++++++++++++++++++-------- Source/lua/LuaParser.cpp | 1 - 5 files changed, 57 insertions(+), 16 deletions(-) diff --git a/Source/PluginEditor.cpp b/Source/PluginEditor.cpp index 9797485..95c36ab 100644 --- a/Source/PluginEditor.cpp +++ b/Source/PluginEditor.cpp @@ -1,5 +1,6 @@ #include "PluginProcessor.h" #include "PluginEditor.h" +#include OscirenderAudioProcessorEditor::OscirenderAudioProcessorEditor(OscirenderAudioProcessor& p) : AudioProcessorEditor(&p), audioProcessor(p), collapseButton("Collapse", juce::Colours::white, juce::Colours::white, juce::Colours::white) @@ -8,8 +9,16 @@ OscirenderAudioProcessorEditor::OscirenderAudioProcessorEditor(OscirenderAudioPr setLookAndFeel(&lookAndFeel); addAndMakeVisible(volume); - menuBar.setModel(&menuBarModel); - addAndMakeVisible(menuBar); +#if JUCE_MAC + if (audioProcessor.wrapperType == juce::AudioProcessor::WrapperType::wrapperType_Standalone) { + usingNativeMenuBar = true; + } +#endif + + if (!usingNativeMenuBar) { + menuBar.setModel(&menuBarModel); + addAndMakeVisible(menuBar); + } addAndMakeVisible(collapseButton); collapseButton.onClick = [this] { @@ -92,7 +101,10 @@ void OscirenderAudioProcessorEditor::paint(juce::Graphics& g) { void OscirenderAudioProcessorEditor::resized() { auto area = getLocalBounds(); - menuBar.setBounds(area.removeFromTop(25)); + if (!usingNativeMenuBar) { + menuBar.setBounds(area.removeFromTop(25)); + } + area.removeFromTop(2); area.removeFromLeft(3); auto volumeArea = area.removeFromLeft(30); @@ -384,3 +396,8 @@ void OscirenderAudioProcessorEditor::updateTitle() { } getTopLevelComponent()->setName(title); } + +void OscirenderAudioProcessorEditor::openAudioSettings() { + juce::StandalonePluginHolder* standalone = juce::StandalonePluginHolder::getInstance(); + standalone->showAudioSettingsDialog(); +} diff --git a/Source/PluginEditor.h b/Source/PluginEditor.h index 8b7853f..ef9d32f 100644 --- a/Source/PluginEditor.h +++ b/Source/PluginEditor.h @@ -32,6 +32,7 @@ public: void saveProject(); void saveProjectAs(); void updateTitle(); + void openAudioSettings(); std::atomic editingPerspective = false; @@ -61,6 +62,8 @@ private: std::atomic updatingDocumentsWithParserLock = false; + bool usingNativeMenuBar = false; + void codeDocumentTextInserted(const juce::String& newText, int insertIndex) override; void codeDocumentTextDeleted(int startIndex, int endIndex) override; void updateCodeDocument(); diff --git a/Source/PluginProcessor.cpp b/Source/PluginProcessor.cpp index a0e0fb8..26c3008 100644 --- a/Source/PluginProcessor.cpp +++ b/Source/PluginProcessor.cpp @@ -608,6 +608,12 @@ bool OscirenderAudioProcessor::hasEditor() const { juce::AudioProcessorEditor* OscirenderAudioProcessor::createEditor() { auto editor = new OscirenderAudioProcessorEditor(*this); + if (wrapperType == wrapperType_Standalone) { + if (juce::TopLevelWindow::getNumTopLevelWindows() == 1) { + juce::TopLevelWindow* w = juce::TopLevelWindow::getTopLevelWindow(0); + w->setUsingNativeTitleBar(true); + } + } return editor; } diff --git a/Source/components/MainMenuBarModel.cpp b/Source/components/MainMenuBarModel.cpp index a985834..e34e0cd 100644 --- a/Source/components/MainMenuBarModel.cpp +++ b/Source/components/MainMenuBarModel.cpp @@ -2,31 +2,47 @@ #include "../PluginEditor.h" juce::StringArray MainMenuBarModel::getMenuBarNames() { - return juce::StringArray("File"); + return juce::StringArray("File", "Options"); } juce::PopupMenu MainMenuBarModel::getMenuForIndex(int topLevelMenuIndex, const juce::String& menuName) { juce::PopupMenu menu; - menu.addItem(1, "Open"); - menu.addItem(2, "Save"); - menu.addItem(3, "Save As"); + + if (topLevelMenuIndex == 0) { + menu.addItem(1, "Open"); + menu.addItem(2, "Save"); + menu.addItem(3, "Save As"); + } else if (topLevelMenuIndex == 1) { + menu.addItem(1, "Audio Settings"); + } + return menu; } void MainMenuBarModel::menuItemSelected(int menuItemID, int topLevelMenuIndex) { - switch (menuItemID) { + switch (topLevelMenuIndex) { + case 0: + switch (menuItemID) { + case 1: + editor.openProject(); + break; + case 2: + editor.saveProject(); + break; + case 3: + editor.saveProjectAs(); + break; + default: + break; + } + break; case 1: - editor.openProject(); - break; - case 2: - editor.saveProject(); - break; - case 3: - editor.saveProjectAs(); + editor.openAudioSettings(); break; default: break; } + } void MainMenuBarModel::menuBarActivated(bool isActive) {} diff --git a/Source/lua/LuaParser.cpp b/Source/lua/LuaParser.cpp index d7ca642..e1be58d 100644 --- a/Source/lua/LuaParser.cpp +++ b/Source/lua/LuaParser.cpp @@ -1,7 +1,6 @@ #include "LuaParser.h" #include "luaimport.h" - LuaParser::LuaParser(juce::String fileName, juce::String script, std::function errorCallback, juce::String fallbackScript) : fallbackScript(fallbackScript), errorCallback(errorCallback), fileName(fileName) { reset(script); }