#include "FilePlayerGui.h" /** why does fileplayer get initialised with nullptr here? */ FilePlayerGui::FilePlayerGui() : buttonIndex (0), filePlayer (nullptr) { AudioFormatManager formatManager; formatManager.registerBasicFormats(); fileChooser = new FilenameComponent ("audiofile", File::nonexistent, true, false, false, formatManager.getWildcardForAllFormats(), String::empty, "(choose a WAV or AIFF file)"); fileChooser->addListener(this); addAndMakeVisible(fileChooser); /** set up row of buttons for play position */ for (int i = 0; i < 16; i++) { //buttonRow[i].addListener(this); buttonRow[i].addMouseListener(this, true); buttonRow[i].setTriggeredOnMouseDown(true); addAndMakeVisible(&buttonRow[i]); } addAndMakeVisible(&options); options.addItem("Position", POSITION); options.addItem("Pitch up", PITCHUP); options.addItem("Pitch down", PITCHDOWN); options.setSelectedId(1); } FilePlayerGui::~FilePlayerGui() { } void FilePlayerGui::mouseDown (const MouseEvent& event) { // Find the button that called mouseDown() for (int i = 0; i < 16; i++) { if (event.eventComponent == &(buttonRow[i])) { // i == the index of the button that called mouseDown() // DBG("Mouse down On Button: " << i); // If shift is held if (event.mods.isShiftDown()) { // Maing a loop // If we already have a loop, clear it if (buttonHeld.size() == 2) { DBG("We already have a loop"); for (int j = 0; j < 2; j++) { DBG("Clearing " << buttonHeld[j]); buttonRow[buttonHeld[j]].setColour (TextButton::ColourIds::buttonColourId, getLookAndFeel().findColour (TextButton::ColourIds::buttonColourId)); } buttonHeld.clear(); } // Add the clicked button to our buttonHeld array buttonHeld.add (i); DBG("Adding to " << i); buttonRow[i].setColour (TextButton::ColourIds::buttonColourId, Colours::orange); // If this was the second button clicked, making the loop, make the loop if (buttonHeld.size() == 2) { filePlayer->loopPoints (buttonHeld[0], buttonHeld[1]); } repaint(); return; } // If a loop has only been half made and the user goes to do something else, // remove the first loop point if (buttonHeld.size() == 1) { buttonRow[buttonHeld[0]].setColour (TextButton::ColourIds::buttonColourId, getLookAndFeel().findColour (TextButton::ColourIds::buttonColourId)); buttonHeld.clear(); repaint(); } // Am I in a loop? if (buttonHeld.size() == 2) { // If buttonHeld[0] is greater than buttonHeld[1], swap them int lower = buttonHeld[0]; int upper = buttonHeld[1]; if (lower > upper) { // E.G. lower == 1 && upper == 2 lower = lower + upper; // lower == 3 upper = lower - upper; // upper == 1 lower = lower - upper; // lower == 2 } // If I am outside the loop... if (i < lower || i > upper) { filePlayer->setPositionOutsideLoop (i); } return; } // If the code reaches here, we are not making a loop AND we're not currently in a loop // so we'll check the drop down options switch (options.getSelectedId()) { case POSITION: //maybe set main gain 0 here filePlayer->setPosition(i); //back up to where it was break; case PITCHUP: filePlayer->setPitch(i, true); break; case PITCHDOWN: filePlayer->setPitch(i, false); break; default: break; } return; } } } void FilePlayerGui::mouseUp (const MouseEvent& event) { for (int i = 0; i < 16; i++) { if (event.eventComponent == &(buttonRow[i])) { DBG("Mouse Up On Button: " << i); filePlayer->jumpBackToLoop(); } } } void FilePlayerGui::setFilePlayer (FilePlayer* fp) { filePlayer = fp; } //Component void FilePlayerGui::resized() { const int height = 20; fileChooser->setBounds (0, 0, 70, height); options.setBounds(70, 0, 150, height); /** set up row of buttons for play position */ for (int i = 0; i < 16; i++) { buttonRow[i].setBounds (((getWidth() / 2) / 16) * i , height, height , height + 10); } } /** Check to see button clicked */ void FilePlayerGui::buttonClicked (Button* button) { } //Slider Listener, callback here... void FilePlayerGui::sliderValueChanged(Slider* slider) { } //FilenameComponentListener void FilePlayerGui::filenameComponentChanged (FilenameComponent* fileComponentThatHasChanged) { if (fileComponentThatHasChanged == fileChooser) { File audioFile (fileChooser->getCurrentFile().getFullPathName()); if(audioFile.existsAsFile()) { filePlayer->loadFile(audioFile); } else { AlertWindow::showMessageBox (AlertWindow::WarningIcon, "sdaTransport", "Couldn't open file!\n\n"); } } } void FilePlayerGui::handleMessage (const Message& message) { const ButtonMessage* buttonMessage = dynamic_cast(&message); if(buttonMessage != nullptr) { buttonIndex = buttonMessage->buttonIndex; for (int i = 0; i < 16; i++) { if (buttonHeld.contains (i)) { // Colour as a loop buttonRow[i].setColour (TextButton::ColourIds::buttonColourId, Colours::orange); } else { // Colour as blank buttonRow[i].setColour (TextButton::ColourIds::buttonColourId, getLookAndFeel().findColour (TextButton::ColourIds::buttonColourId)); } if (i == buttonIndex) { // Colour as position highlight buttonRow[i].setColour (TextButton::ColourIds::buttonColourId, Colours::yellow); } } } }