#pragma once /* ============================================================================== Copyright 2022 Nicolas Chambert This program is free software : you can redistribute itand /or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program.If not, see < http://www.gnu.org/licenses/>. ============================================================================== */ /* ============================================================================== Gestion des options figure rythmique et fichier son du tick. ============================================================================== */ #include #include "Metronome.h" #include "Config.h" class Config; class Metronome; // Surcharge les boutons pour afficher l'image de la figure rythmique struct FigureButton : public juce::PopupMenu::CustomComponent { FigureButton(juce::String image, int widthIn, int heightIn, juce::Colour backgroundIn) : juce::PopupMenu::CustomComponent(false), idealWidth(widthIn), idealHeight(heightIn), background(backgroundIn) { // initialisation de l'interface addAndMakeVisible(button); // récupère l'image de la figure auto doc = juce::XmlDocument::parse(image); auto note = juce::Drawable::createFromSVG(*doc); button.setImages(note.get()); button.setToggleState(false, juce::NotificationType::dontSendNotification); button.setColour(juce::TextButton::buttonColourId, juce::Colours::whitesmoke); button.setColour(juce::TextButton::textColourOffId, juce::Colours::black); button.onClick = [&, this] { // notifie la "Combo" this->triggerMenuItem(); }; } void getIdealSize(int& width, int& height) override { width = idealWidth; height = idealHeight; } void paint(juce::Graphics& g) override { g.fillAll(background); } void resized() override { button.setBounds(getBounds()); } // composants graphiques juce::Colour background; juce::DrawableButton button{ "Figures", juce::DrawableButton::ImageOnButtonBackground }; // taille du bouton int idealWidth = 0; int idealHeight = 0; }; // L&F pour la combo des sons, permet de setter le background du Popup struct ComboLookAndFeel : public juce::LookAndFeel_V4 { void drawPopupMenuBackground(juce::Graphics& g, int width, int height) override; void drawPopupMenuItem(juce::Graphics& g, const juce::Rectangle& area, const bool isSeparator, const bool isActive, const bool isHighlighted, const bool isTicked, const bool hasSubMenu, const juce::String& text, const juce::String& shortcutKeyText, const juce::Drawable* icon, const juce::Colour* const textColourToUse) override; }; // structure dédiée à la gestion des sons struct ClickSounds { ClickSounds() {}; // Charge la liste de sons void init(); // Accesseurs int getSoundCount() const { return (int)sounds.size(); }; std::string getSoundName(int i) const; std::string getSoundPathHigh(int i) const; std::string getSoundPathLow(int i) const; int getIndex(std::string soundName) const; // Liste des sons std::vector sounds; }; // Panneau d'affichage des options struct OptionsPanel : public juce::Component { explicit OptionsPanel(juce::Colour c, Config& configuration); ~OptionsPanel(); // Méthode de surcharge JUCE void paint(juce::Graphics& g) override; void resized() override; // méthodes internes void init(Metronome& metro); void selectSound(Metronome& metro); void setFigure(int figure); juce::String getSoundName(); // composants graphiques juce::DrawableButton figures{ "Figures", juce::DrawableButton::ImageOnButtonBackground }; juce::ComboBox sounds; juce::Colour backgroundColour; std::unique_ptr clef; // variables internes // liste des sons ClickSounds clicksounds; // pointeur sur la méthode qui permet de setter le metronome std::function< void(int)> setMetroFigure {nullptr}; // permet de stocker l'id du son selectionné dans la configuration entre le constructeur et le init() int curSoundID; };