|
- /*
- ==============================================================================
-
- This file is part of the JUCE library - "Jules' Utility Class Extensions"
- Copyright 2004-12 by Raw Material Software Ltd.
-
- ------------------------------------------------------------------------------
-
- JUCE can be redistributed and/or modified under the terms of the GNU General
- Public License (Version 2), as published by the Free Software Foundation.
- A copy of the license is included in the JUCE distribution, or can be found
- online at www.gnu.org/licenses.
-
- JUCE 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.
-
- ------------------------------------------------------------------------------
-
- To release a closed-source product which uses JUCE, commercial licenses are
- available: visit www.rawmaterialsoftware.com/juce for more information.
-
- ==============================================================================
- */
-
- #include "../JuceDemoHeader.h"
-
- //==============================================================================
- /** Just a simple window that deletes itself when closed. */
- class BasicWindow : public DocumentWindow
- {
- public:
- BasicWindow (const String& name, Colour backgroundColour, int buttonsNeeded)
- : DocumentWindow (name, backgroundColour, buttonsNeeded)
- {
- }
-
- void closeButtonPressed()
- {
- delete this;
- }
-
- private:
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BasicWindow)
- };
-
- //==============================================================================
- /** This window contains a ColourSelector which can be used to change the window's colour. */
- class ColourSelectorWindow : public DocumentWindow,
- private ChangeListener
- {
- public:
- ColourSelectorWindow (const String& name, Colour backgroundColour, int buttonsNeeded)
- : DocumentWindow (name, backgroundColour, buttonsNeeded),
- selector (ColourSelector::showColourAtTop | ColourSelector::showSliders | ColourSelector::showColourspace)
- {
- selector.setCurrentColour (backgroundColour);
- selector.setColour (ColourSelector::backgroundColourId, Colours::transparentWhite);
- selector.addChangeListener (this);
- setContentOwned (&selector, false);
- }
-
- ~ColourSelectorWindow()
- {
- selector.removeChangeListener (this);
- }
-
- void closeButtonPressed()
- {
- delete this;
- }
-
- private:
- ColourSelector selector;
-
- void changeListenerCallback (ChangeBroadcaster* source)
- {
- if (source == &selector)
- setBackgroundColour (selector.getCurrentColour());
- }
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ColourSelectorWindow)
- };
-
- //==============================================================================
- class BouncingBallComponent : public Component,
- public Timer
- {
- public:
- BouncingBallComponent()
- {
- setInterceptsMouseClicks (false, false);
-
- Random random;
-
- const float size = 10.0f + random.nextInt (30);
-
- ballBounds.setBounds (random.nextFloat() * 100.0f,
- random.nextFloat() * 100.0f,
- size, size);
-
- direction.x = random.nextFloat() * 8.0f - 4.0f;
- direction.y = random.nextFloat() * 8.0f - 4.0f;
-
- colour = Colour ((juce::uint32) random.nextInt())
- .withAlpha (0.5f)
- .withBrightness (0.7f);
-
- startTimer (60);
- }
-
- void paint (Graphics& g)
- {
- g.setColour (colour);
- g.fillEllipse (ballBounds - getPosition().toFloat());
- }
-
- void timerCallback()
- {
- ballBounds += direction;
-
- if (ballBounds.getX() < 0) direction.x = std::abs (direction.x);
- if (ballBounds.getY() < 0) direction.y = std::abs (direction.y);
- if (ballBounds.getRight() > getParentWidth()) direction.x = -std::abs (direction.x);
- if (ballBounds.getBottom() > getParentHeight()) direction.y = -std::abs (direction.y);
-
- setBounds (ballBounds.getSmallestIntegerContainer());
- }
-
- private:
- Colour colour;
- Rectangle<float> ballBounds;
- Point<float> direction;
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BouncingBallComponent)
- };
-
- //==============================================================================
- class BouncingBallsContainer : public Component
- {
- public:
- BouncingBallsContainer (int numBalls)
- {
- for (int i = 0; i < numBalls; ++i)
- {
- BouncingBallComponent* newBall = new BouncingBallComponent();
- balls.add (newBall);
- addAndMakeVisible (newBall);
- }
- }
-
- void mouseDown (const MouseEvent& e)
- {
- dragger.startDraggingComponent (this, e);
- }
-
- void mouseDrag (const MouseEvent& e)
- {
- // as there's no titlebar we have to manage the dragging ourselves
- dragger.dragComponent (this, e, 0);
- }
-
- void paint (Graphics& g)
- {
- if (isOpaque())
- g.fillAll (Colours::white);
- else
- g.fillAll (Colours::blue.withAlpha (0.2f));
-
- g.setFont (16.0f);
- g.setColour (Colours::black);
- g.drawFittedText ("This window has no titlebar and a transparent background.",
- getLocalBounds().reduced (8, 0),
- Justification::centred, 5);
-
- g.drawRect (getLocalBounds());
- }
-
- private:
- ComponentDragger dragger;
- OwnedArray<BouncingBallComponent> balls;
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BouncingBallsContainer)
- };
-
- //==============================================================================
- class WindowsDemo : public Component,
- private Button::Listener
- {
- public:
- enum Windows
- {
- dialog,
- document,
- alert,
- numWindows
- };
-
- WindowsDemo()
- {
- setOpaque (true);
-
- showWindowsButton.setButtonText ("Show Windows");
- addAndMakeVisible (showWindowsButton);
- showWindowsButton.addListener (this);
-
- closeWindowsButton.setButtonText ("Close Windows");
- addAndMakeVisible (closeWindowsButton);
- closeWindowsButton.addListener (this);
- }
-
- ~WindowsDemo()
- {
- closeAllWindows();
-
- closeWindowsButton.removeListener (this);
- showWindowsButton.removeListener (this);
- }
-
- void paint (Graphics& g) override
- {
- g.fillAll (Colours::grey);
- }
-
- void resized() override
- {
- const Rectangle<int> buttonSize (0, 0, 108, 28);
- Rectangle<int> area ((getWidth() / 2) - (buttonSize.getWidth() / 2),
- (getHeight() / 2) - buttonSize.getHeight(),
- buttonSize.getWidth(), buttonSize.getHeight());
- showWindowsButton.setBounds (area.reduced (2));
- closeWindowsButton.setBounds (area.translated (0, buttonSize.getHeight()).reduced (2));
- }
-
- private:
- // Because in this demo the windows delete themselves, we'll use the
- // Component::SafePointer class to point to them, which automatically becomes
- // null when the component that it points to is deleted.
- Array< Component::SafePointer<Component> > windows;
- TextButton showWindowsButton, closeWindowsButton;
-
- void showAllWindows()
- {
- closeAllWindows();
-
- showDocumentWindow (false);
- showDocumentWindow (true);
- showTransparentWindow();
- showDialogWindow();
- }
-
- void closeAllWindows()
- {
- for (int i = 0; i < windows.size(); ++i)
- windows.getReference(i).deleteAndZero();
-
- windows.clear();
- }
-
- void showDialogWindow()
- {
- String m;
-
- m << "Dialog Windows can be used to quickly show a component, usually blocking mouse input to other windows." << newLine
- << newLine
- << "They can also be quickly closed with the escape key, try it now.";
-
- DialogWindow::LaunchOptions options;
- Label* label = new Label();
- label->setText (m, dontSendNotification);
- label->setColour (Label::textColourId, Colours::whitesmoke);
- options.content.setOwned (label);
-
- Rectangle<int> area (0, 0, 300, 200);
- options.content->setSize (area.getWidth(), area.getHeight());
-
- options.dialogTitle = "Dialog Window";
- options.dialogBackgroundColour = Colour (0xff0e345a);
- options.escapeKeyTriggersCloseButton = true;
- options.useNativeTitleBar = false;
- options.resizable = true;
-
- const RectanglePlacement placement (RectanglePlacement::xRight + RectanglePlacement::yBottom + RectanglePlacement::doNotResize);
-
- DialogWindow* dw = options.launchAsync();
- dw->centreWithSize (300, 200);
- }
-
- void showDocumentWindow (bool native)
- {
- DocumentWindow* dw = new ColourSelectorWindow ("Document Window", getRandomBrightColour(), DocumentWindow::allButtons);
- windows.add (dw);
-
- Rectangle<int> area (0, 0, 300, 400);
- const RectanglePlacement placement ((native ? RectanglePlacement::xLeft : RectanglePlacement::xRight)
- + RectanglePlacement::yTop + RectanglePlacement::doNotResize);
- Rectangle<int> result (placement.appliedTo (area, Desktop::getInstance().getDisplays().getMainDisplay().userArea.reduced (20)));
- dw->setBounds (result);
-
- dw->setResizable (true, ! native);
- dw->setUsingNativeTitleBar (native);
- dw->setVisible (true);
- }
-
- void showTransparentWindow()
- {
- BouncingBallsContainer* balls = new BouncingBallsContainer (3);
- balls->addToDesktop (ComponentPeer::windowIsTemporary);
- windows.add (balls);
-
- Rectangle<int> area (0, 0, 200, 200);
- const RectanglePlacement placement (RectanglePlacement::xLeft + RectanglePlacement::yBottom + RectanglePlacement::doNotResize);
- Rectangle<int> result (placement.appliedTo (area, Desktop::getInstance().getDisplays().getMainDisplay().userArea.reduced (20)));
- balls->setBounds (result);
-
- balls->setVisible (true);
- }
-
- void buttonClicked (Button* button) override
- {
- if (button == &showWindowsButton)
- showAllWindows();
- else if (button == &closeWindowsButton)
- closeAllWindows();
- }
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WindowsDemo);
- };
-
- // This static object will register this demo type in a global list of demos..
- static JuceDemoType<WindowsDemo> demo ("10 Components: Windows");
|