|
- /*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2017 - ROLI Ltd.
-
- JUCE is an open source library subject to commercial or open-source
- licensing.
-
- By using JUCE, you agree to the terms of both the JUCE 5 End-User License
- Agreement and JUCE 5 Privacy Policy (both updated and effective as of the
- 27th April 2017).
-
- End User License Agreement: www.juce.com/juce-5-licence
- Privacy Policy: www.juce.com/juce-5-privacy-policy
-
- Or: You may also use this code under the terms of the GPL v3 (see
- www.gnu.org/licenses).
-
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
- DISCLAIMED.
-
- ==============================================================================
- */
-
- #include "../JuceDemoHeader.h"
-
- //==============================================================================
- class DemoBackgroundThread : public ThreadWithProgressWindow
- {
- public:
- DemoBackgroundThread()
- : ThreadWithProgressWindow ("busy doing some important things...", true, true)
- {
- setStatusMessage ("Getting ready...");
- }
-
- void run() override
- {
- setProgress (-1.0); // setting a value beyond the range 0 -> 1 will show a spinning bar..
- setStatusMessage ("Preparing to do some stuff...");
- wait (2000);
-
- const int thingsToDo = 10;
-
- for (int i = 0; i < thingsToDo; ++i)
- {
- // must check this as often as possible, because this is
- // how we know if the user's pressed 'cancel'
- if (threadShouldExit())
- return;
-
- // this will update the progress bar on the dialog box
- setProgress (i / (double) thingsToDo);
-
- setStatusMessage (String (thingsToDo - i) + " things left to do...");
-
- wait (500);
- }
-
- setProgress (-1.0); // setting a value beyond the range 0 -> 1 will show a spinning bar..
- setStatusMessage ("Finishing off the last few bits and pieces!");
- wait (2000);
- }
-
- // This method gets called on the message thread once our thread has finished..
- void threadComplete (bool userPressedCancel) override
- {
- if (userPressedCancel)
- {
- AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon,
- "Progress window",
- "You pressed cancel!");
- }
- else
- {
- // thread finished normally..
- AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon,
- "Progress window",
- "Thread finished ok!");
- }
-
- // ..and clean up by deleting our thread object..
- delete this;
- }
- };
-
-
- //==============================================================================
- class DialogsDemo : public Component,
- private Button::Listener
- {
- public:
- enum DialogType
- {
- plainAlertWindow,
- warningAlertWindow,
- infoAlertWindow,
- questionAlertWindow,
- okCancelAlertWindow,
- extraComponentsAlertWindow,
- calloutBoxWindow,
- progressWindow,
- loadChooser,
- loadWithPreviewChooser,
- directoryChooser,
- saveChooser,
- numDialogs
- };
-
- DialogsDemo()
- {
- setOpaque (true);
-
- addAndMakeVisible (nativeButton);
- nativeButton.setButtonText ("Use Native Windows");
- nativeButton.addListener (this);
-
- static const char* windowNames[] =
- {
- "Plain Alert Window",
- "Alert Window With Warning Icon",
- "Alert Window With Info Icon",
- "Alert Window With Question Icon",
- "OK Cancel Alert Window",
- "Alert Window With Extra Components",
- "CalloutBox",
- "Thread With Progress Window",
- "'Load' File Browser",
- "'Load' File Browser With Image Preview",
- "'Choose Directory' File Browser",
- "'Save' File Browser"
- };
-
- // warn in case we add any windows
- jassert (numElementsInArray (windowNames) == numDialogs);
-
- for (int i = 0; i < numDialogs; ++i)
- {
- TextButton* newButton = new TextButton();
- windowButtons.add (newButton);
- addAndMakeVisible (newButton);
- newButton->setButtonText (windowNames[i]);
- newButton->addListener (this);
- }
- }
-
- ~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
- {
- g.fillAll (getUIColourIfAvailable (LookAndFeel_V4::ColourScheme::UIColour::windowBackground));
- }
-
- void resized() override
- {
- Rectangle<int> area (getLocalBounds().reduced (5, 15));
- Rectangle<int> topRow;
-
- for (int i = 0; i < windowButtons.size(); ++i)
- {
- if (topRow.getWidth() < 10 || i == loadChooser)
- topRow = area.removeFromTop (26);
-
- if (i == progressWindow)
- area.removeFromTop (20);
-
- windowButtons.getUnchecked (i)
- ->setBounds (topRow.removeFromLeft (area.getWidth() / 2).reduced (4, 2));
- }
-
- area.removeFromTop (15);
- nativeButton.setBounds (area.removeFromTop (24));
- }
-
- private:
- OwnedArray<TextButton> windowButtons;
- ToggleButton nativeButton;
-
- static void alertBoxResultChosen (int result, DialogsDemo*)
- {
- AlertWindow::showMessageBoxAsync (AlertWindow::InfoIcon,
- "Alert Box",
- "Result code: " + String (result));
- }
-
- void showWindow (Component& button, DialogType type)
- {
- if (type >= plainAlertWindow && type <= questionAlertWindow)
- {
- AlertWindow::AlertIconType icon = AlertWindow::NoIcon;
-
- switch (type)
- {
- case warningAlertWindow: icon = AlertWindow::WarningIcon; break;
- case infoAlertWindow: icon = AlertWindow::InfoIcon; break;
- case questionAlertWindow: icon = AlertWindow::QuestionIcon; break;
- default: break;
- }
-
- AlertWindow::showMessageBoxAsync (icon,
- "This is an AlertWindow",
- "And this is the AlertWindow's message. Blah blah blah blah blah blah blah blah blah blah blah blah blah.",
- "OK");
- }
- else if (type == okCancelAlertWindow)
- {
- AlertWindow::showOkCancelBox (AlertWindow::QuestionIcon,
- "This is an ok/cancel AlertWindow",
- "And this is the AlertWindow's message. Blah blah blah blah blah blah blah blah blah blah blah blah blah.",
- String(),
- String(),
- 0,
- ModalCallbackFunction::forComponent (alertBoxResultChosen, this));
- }
- else if (type == calloutBoxWindow)
- {
- ColourSelector* colourSelector = new ColourSelector();
- colourSelector->setName ("background");
- colourSelector->setCurrentColour (findColour (TextButton::buttonColourId));
- colourSelector->setColour (ColourSelector::backgroundColourId, Colours::transparentBlack);
- colourSelector->setSize (300, 400);
-
- CallOutBox::launchAsynchronously (colourSelector, button.getScreenBounds(), nullptr);
- }
- else if (type == extraComponentsAlertWindow)
- {
- #if JUCE_MODAL_LOOPS_PERMITTED
- AlertWindow w ("AlertWindow demo..",
- "This AlertWindow has a couple of extra components added to show how to add drop-down lists and text entry boxes.",
- AlertWindow::QuestionIcon);
-
- w.addTextEditor ("text", "enter some text here", "text field:");
-
- const char* options[] = { "option 1", "option 2", "option 3", "option 4", nullptr };
- w.addComboBox ("option", StringArray (options), "some options");
-
- w.addButton ("OK", 1, KeyPress (KeyPress::returnKey, 0, 0));
- w.addButton ("Cancel", 0, KeyPress (KeyPress::escapeKey, 0, 0));
-
- if (w.runModalLoop() != 0) // is they picked 'ok'
- {
- // this is the item they chose in the drop-down list..
- const int optionIndexChosen = w.getComboBoxComponent ("option")->getSelectedItemIndex();
- ignoreUnused (optionIndexChosen);
-
- // this is the text they entered..
- String text = w.getTextEditorContents ("text");
- }
- #endif
- }
- else if (type == progressWindow)
- {
- // This will launch our ThreadWithProgressWindow in a modal state. (Our subclass
- // will take care of deleting the object when the task has finished)
- (new DemoBackgroundThread())->launchThread();
- }
- else if (type >= loadChooser && type <= saveChooser)
- {
- #if JUCE_MODAL_LOOPS_PERMITTED
- const bool useNativeVersion = nativeButton.getToggleState();
-
- if (type == loadChooser)
- {
- FileChooser fc ("Choose a file to open...",
- File::getCurrentWorkingDirectory(),
- "*",
- useNativeVersion);
-
- if (fc.browseForMultipleFilesToOpen())
- {
- String chosen;
- for (int i = 0; i < fc.getResults().size(); ++i)
- chosen << fc.getResults().getReference(i).getFullPathName() << "\n";
-
- AlertWindow::showMessageBoxAsync (AlertWindow::InfoIcon,
- "File Chooser...",
- "You picked: " + chosen);
- }
- }
- else if (type == loadWithPreviewChooser)
- {
- ImagePreviewComponent imagePreview;
- imagePreview.setSize (200, 200);
-
- FileChooser fc ("Choose an image to open...",
- File::getSpecialLocation (File::userPicturesDirectory),
- "*.jpg;*.jpeg;*.png;*.gif",
- useNativeVersion);
-
- if (fc.browseForMultipleFilesToOpen (&imagePreview))
- {
- String chosen;
- for (int i = 0; i < fc.getResults().size(); ++i)
- chosen << fc.getResults().getReference (i).getFullPathName() << "\n";
-
- AlertWindow::showMessageBoxAsync (AlertWindow::InfoIcon,
- "File Chooser...",
- "You picked: " + chosen);
- }
- }
- else if (type == saveChooser)
- {
- FileChooser fc ("Choose a file to save...",
- File::getCurrentWorkingDirectory(),
- "*",
- useNativeVersion);
-
- if (fc.browseForFileToSave (true))
- {
- File chosenFile = fc.getResult();
-
- AlertWindow::showMessageBoxAsync (AlertWindow::InfoIcon,
- "File Chooser...",
- "You picked: " + chosenFile.getFullPathName());
- }
- }
- else if (type == directoryChooser)
- {
- FileChooser fc ("Choose a directory...",
- File::getCurrentWorkingDirectory(),
- "*",
- useNativeVersion);
-
- if (fc.browseForDirectory())
- {
- File chosenDirectory = fc.getResult();
-
- AlertWindow::showMessageBoxAsync (AlertWindow::InfoIcon,
- "File Chooser...",
- "You picked: " + chosenDirectory.getFullPathName());
- }
- }
- #endif
- }
- }
-
- 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<DialogType> (i));
- }
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DialogsDemo)
- };
-
-
- // This static object will register this demo type in a global list of demos..
- static JuceDemoType<DialogsDemo> demo ("10 Components: Dialog Boxes");
|