diff --git a/Resources/images/sosci_logo.png b/Resources/images/sosci_logo.png new file mode 100644 index 00000000..9ca734cd Binary files /dev/null and b/Resources/images/sosci_logo.png differ diff --git a/Resources/sosci/default.sosci b/Resources/sosci/default.sosci new file mode 100644 index 00000000..f1e9e1e0 Binary files /dev/null and b/Resources/sosci/default.sosci differ diff --git a/Source/components/MainMenuBarModel.cpp b/Source/components/MainMenuBarModel.cpp index 80a8dcb5..240a2b8b 100644 --- a/Source/components/MainMenuBarModel.cpp +++ b/Source/components/MainMenuBarModel.cpp @@ -21,6 +21,10 @@ juce::StringArray MainMenuBarModel::getMenuBarNames() { juce::PopupMenu MainMenuBarModel::getMenuForIndex(int topLevelMenuIndex, const juce::String& menuName) { juce::PopupMenu menu; + + if (customMenuLogic) { + customMenuLogic(menu, topLevelMenuIndex); + } for (int i = 0; i < menuItems[topLevelMenuIndex].size(); i++) { menu.addItem(i + 1, menuItems[topLevelMenuIndex][i].first); @@ -30,6 +34,9 @@ juce::PopupMenu MainMenuBarModel::getMenuForIndex(int topLevelMenuIndex, const j } void MainMenuBarModel::menuItemSelected(int menuItemID, int topLevelMenuIndex) { + if (customMenuSelectedLogic && customMenuSelectedLogic(menuItemID, topLevelMenuIndex)) { + return; + } menuItems[topLevelMenuIndex][menuItemID - 1].second(); } diff --git a/Source/components/MainMenuBarModel.h b/Source/components/MainMenuBarModel.h index c1664ab8..790dfe71 100644 --- a/Source/components/MainMenuBarModel.h +++ b/Source/components/MainMenuBarModel.h @@ -8,6 +8,9 @@ public: void addTopLevelMenu(const juce::String& name); void addMenuItem(int topLevelMenuIndex, const juce::String& name, std::function action); + + std::function customMenuLogic; + std::function customMenuSelectedLogic; private: juce::StringArray getMenuBarNames() override; diff --git a/Source/components/SosciMainMenuBarModel.cpp b/Source/components/SosciMainMenuBarModel.cpp index 30fd5252..18f7871c 100644 --- a/Source/components/SosciMainMenuBarModel.cpp +++ b/Source/components/SosciMainMenuBarModel.cpp @@ -2,11 +2,39 @@ #include "../SosciPluginEditor.h" #include "../SosciPluginProcessor.h" -SosciMainMenuBarModel::SosciMainMenuBarModel(SosciPluginEditor& e, SosciAudioProcessor& processor) : editor(e), processor(processor) { +SosciMainMenuBarModel::SosciMainMenuBarModel(SosciPluginEditor& e, SosciAudioProcessor& p) : editor(e), processor(p) { addTopLevelMenu("File"); addTopLevelMenu("About"); addTopLevelMenu("Recording"); addTopLevelMenu("Audio"); + + std::vector> examples = { + {"default.sosci", BinaryData::default_sosci, BinaryData::default_sosciSize}, + }; + + // This is a hack - ideally I would improve the MainMenuBarModel class to allow for submenus + customMenuLogic = [this, examples](juce::PopupMenu& menu, int topLevelMenuIndex) { + if (topLevelMenuIndex == 0) { + juce::PopupMenu submenu; + + for (int i = 0; i < examples.size(); i++) { + submenu.addItem(SUBMENU_ID + i, std::get<0>(examples[i])); + } + + menu.addSubMenu("Examples", submenu); + } + }; + + customMenuSelectedLogic = [this, examples](int menuItemID, int topLevelMenuIndex) { + if (topLevelMenuIndex == 0) { + if (menuItemID >= SUBMENU_ID) { + int index = menuItemID - SUBMENU_ID; + processor.setStateInformation(std::get<1>(examples[index]), std::get<2>(examples[index])); + return true; + } + } + return false; + }; addMenuItem(0, "Open", [&]() { editor.openProject(); }); addMenuItem(0, "Save", [&]() { editor.saveProject(); }); @@ -17,7 +45,7 @@ SosciMainMenuBarModel::SosciMainMenuBarModel(SosciPluginEditor& e, SosciAudioPro addMenuItem(1, "About sosci", [&]() { juce::DialogWindow::LaunchOptions options; - AboutComponent* about = new AboutComponent(BinaryData::logo_png, BinaryData::logo_pngSize, + AboutComponent* about = new AboutComponent(BinaryData::sosci_logo_png, BinaryData::sosci_logo_pngSize, juce::String(ProjectInfo::projectName) + " by " + ProjectInfo::companyName + "\n" #if SOSCI_FEATURES "Thank you for purchasing sosci!\n" @@ -34,7 +62,7 @@ SosciMainMenuBarModel::SosciMainMenuBarModel(SosciPluginEditor& e, SosciAudioPro options.content.setOwned(about); options.content->setSize(500, 270); options.dialogTitle = "About"; - options.dialogBackgroundColour = Colours::dark; + options.dialogBackgroundColour = Colours::veryDark; options.escapeKeyTriggersCloseButton = true; #if JUCE_WINDOWS // if not standalone, use native title bar for compatibility with DAWs diff --git a/Source/components/SosciMainMenuBarModel.h b/Source/components/SosciMainMenuBarModel.h index 74dca65e..c9a0b3b4 100644 --- a/Source/components/SosciMainMenuBarModel.h +++ b/Source/components/SosciMainMenuBarModel.h @@ -12,4 +12,6 @@ public: SosciPluginEditor& editor; SosciAudioProcessor& processor; + + const int SUBMENU_ID = 100; }; diff --git a/sosci.jucer b/sosci.jucer index b09ed4ad..042692e6 100644 --- a/sosci.jucer +++ b/sosci.jucer @@ -18,7 +18,7 @@ file="Resources/fonts/FiraSans-Regular.ttf"/> - + @@ -36,6 +36,9 @@ + + +