| @@ -513,7 +513,8 @@ public: | |||
| db = new DrawableButton ("Button 4", DrawableButton::ImageOnButtonBackground); | |||
| db->setImages (&normal, &over, &down); | |||
| db->setClickingTogglesState (true); | |||
| db->setBackgroundColours (Colours::white, Colours::yellow); | |||
| db->setColour (TextButton::buttonColourId, Colours::white); | |||
| db->setColour (TextButton::buttonOnColourId, Colours::yellow); | |||
| db->setBounds (200, 70, 50, 50); | |||
| db->setTooltip ("this is a DrawableButton on a standard button background"); | |||
| db->addListener (buttonListener); | |||
| @@ -29,7 +29,6 @@ | |||
| #include "../components/juce_Component.h" | |||
| #include "../keyboard/juce_KeyListener.h" | |||
| #include "../commands/juce_ApplicationCommandManager.h" | |||
| #include "../windows/juce_TooltipWindow.h" | |||
| //============================================================================== | |||
| @@ -52,9 +51,9 @@ protected: | |||
| //============================================================================== | |||
| /** Creates a button. | |||
| @param buttonName the text to put in the button (the component's name is also | |||
| initially set to this string, but these can be changed later | |||
| using the setName() and setButtonText() methods) | |||
| @param buttonName the text to put in the button (the component's name is also | |||
| initially set to this string, but these can be changed later | |||
| using the setName() and setButtonText() methods) | |||
| */ | |||
| explicit Button (const String& buttonName); | |||
| @@ -64,28 +63,23 @@ public: | |||
| //============================================================================== | |||
| /** Changes the button's text. | |||
| @see getButtonText | |||
| */ | |||
| void setButtonText (const String& newText); | |||
| /** Returns the text displayed in the button. | |||
| @see setButtonText | |||
| */ | |||
| const String& getButtonText() const { return text; } | |||
| //============================================================================== | |||
| /** Returns true if the button is currently being held down by the mouse. | |||
| @see isOver | |||
| */ | |||
| bool isDown() const noexcept; | |||
| /** Returns true if the mouse is currently over the button. | |||
| This will be also be true if the mouse is being held down. | |||
| @see isDown | |||
| */ | |||
| bool isOver() const noexcept; | |||
| @@ -125,7 +119,7 @@ public: | |||
| your own Value object. | |||
| @see getToggleState, Value | |||
| */ | |||
| Value& getToggleStateValue() { return isOn; } | |||
| Value& getToggleStateValue() noexcept { return isOn; } | |||
| /** This tells the button to automatically flip the toggle state when | |||
| the button is clicked. | |||
| @@ -136,7 +130,6 @@ public: | |||
| void setClickingTogglesState (bool shouldToggle) noexcept; | |||
| /** Returns true if this button is set to be an automatic toggle-button. | |||
| This returns the last value that was passed to setClickingTogglesState(). | |||
| */ | |||
| bool getClickingTogglesState() const noexcept; | |||
| @@ -162,7 +155,6 @@ public: | |||
| void setRadioGroupId (int newGroupId); | |||
| /** Returns the ID of the group to which this button belongs. | |||
| (See setRadioGroupId() for an explanation of this). | |||
| */ | |||
| int getRadioGroupId() const noexcept { return radioGroupId; } | |||
| @@ -177,13 +169,13 @@ public: | |||
| { | |||
| public: | |||
| /** Destructor. */ | |||
| virtual ~Listener() {} | |||
| virtual ~Listener() {} | |||
| /** Called when the button is clicked. */ | |||
| virtual void buttonClicked (Button* button) = 0; | |||
| /** Called when the button's state changes. */ | |||
| virtual void buttonStateChanged (Button*) {} | |||
| virtual void buttonStateChanged (Button*) {} | |||
| }; | |||
| /** Registers a listener to receive events when this button's state changes. | |||
| @@ -226,8 +218,7 @@ public: | |||
| int commandID, | |||
| bool generateTooltip); | |||
| /** Returns the command ID that was set by setCommandToTrigger(). | |||
| */ | |||
| /** Returns the command ID that was set by setCommandToTrigger(). */ | |||
| int getCommandID() const noexcept { return commandID; } | |||
| //============================================================================== | |||
| @@ -243,13 +234,11 @@ public: | |||
| void addShortcut (const KeyPress& key); | |||
| /** Removes all key shortcuts that had been set for this button. | |||
| @see addShortcut | |||
| */ | |||
| void clearShortcuts(); | |||
| /** Returns true if the given keypress is a shortcut for this button. | |||
| @see addShortcut | |||
| */ | |||
| bool isRegisteredForShortcut (const KeyPress& key) const; | |||
| @@ -300,8 +289,7 @@ public: | |||
| //============================================================================== | |||
| /** A combination of these flags are used by setConnectedEdges(). | |||
| */ | |||
| /** A combination of these flags are used by setConnectedEdges(). */ | |||
| enum ConnectedEdgeFlags | |||
| { | |||
| ConnectedOnLeft = 1, | |||
| @@ -324,27 +312,27 @@ public: | |||
| void setConnectedEdges (int connectedEdgeFlags); | |||
| /** Returns the set of flags passed into setConnectedEdges(). */ | |||
| int getConnectedEdgeFlags() const noexcept { return connectedEdgeFlags; } | |||
| int getConnectedEdgeFlags() const noexcept { return connectedEdgeFlags; } | |||
| /** Indicates whether the button adjoins another one on its left edge. | |||
| @see setConnectedEdges | |||
| */ | |||
| bool isConnectedOnLeft() const noexcept { return (connectedEdgeFlags & ConnectedOnLeft) != 0; } | |||
| bool isConnectedOnLeft() const noexcept { return (connectedEdgeFlags & ConnectedOnLeft) != 0; } | |||
| /** Indicates whether the button adjoins another one on its right edge. | |||
| @see setConnectedEdges | |||
| */ | |||
| bool isConnectedOnRight() const noexcept { return (connectedEdgeFlags & ConnectedOnRight) != 0; } | |||
| bool isConnectedOnRight() const noexcept { return (connectedEdgeFlags & ConnectedOnRight) != 0; } | |||
| /** Indicates whether the button adjoins another one on its top edge. | |||
| @see setConnectedEdges | |||
| */ | |||
| bool isConnectedOnTop() const noexcept { return (connectedEdgeFlags & ConnectedOnTop) != 0; } | |||
| bool isConnectedOnTop() const noexcept { return (connectedEdgeFlags & ConnectedOnTop) != 0; } | |||
| /** Indicates whether the button adjoins another one on its bottom edge. | |||
| @see setConnectedEdges | |||
| */ | |||
| bool isConnectedOnBottom() const noexcept { return (connectedEdgeFlags & ConnectedOnBottom) != 0; } | |||
| bool isConnectedOnBottom() const noexcept { return (connectedEdgeFlags & ConnectedOnBottom) != 0; } | |||
| //============================================================================== | |||
| @@ -367,11 +355,6 @@ public: | |||
| void setState (const ButtonState newState); | |||
| //============================================================================== | |||
| // These are deprecated - please use addListener() and removeListener() instead! | |||
| JUCE_DEPRECATED (void addButtonListener (Listener*)); | |||
| JUCE_DEPRECATED (void removeButtonListener (Listener*)); | |||
| protected: | |||
| //============================================================================== | |||
| /** This method is called when the button has been clicked. | |||
| @@ -420,7 +403,7 @@ protected: | |||
| //============================================================================== | |||
| /** @internal */ | |||
| virtual void internalClickCallback (const ModifierKeys& modifiers); | |||
| virtual void internalClickCallback (const ModifierKeys&); | |||
| /** @internal */ | |||
| void handleCommandMessage (int commandId); | |||
| /** @internal */ | |||
| @@ -495,9 +478,13 @@ private: | |||
| void turnOffOtherButtonsInGroup (bool sendChangeNotification); | |||
| void flashButtonState(); | |||
| void sendClickMessage (const ModifierKeys& modifiers); | |||
| void sendClickMessage (const ModifierKeys&); | |||
| void sendStateMessage(); | |||
| // These are deprecated - please use addListener() and removeListener() instead! | |||
| JUCE_DEPRECATED (void addButtonListener (Listener*)); | |||
| JUCE_DEPRECATED (void removeButtonListener (Listener*)); | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Button); | |||
| }; | |||
| @@ -30,16 +30,6 @@ DrawableButton::DrawableButton (const String& name, | |||
| currentImage (nullptr), | |||
| edgeIndent (3) | |||
| { | |||
| if (buttonStyle == ImageOnButtonBackground) | |||
| { | |||
| backgroundOff = Colour (0xffbbbbff); | |||
| backgroundOn = Colour (0xff3333ff); | |||
| } | |||
| else | |||
| { | |||
| backgroundOff = Colours::transparentBlack; | |||
| backgroundOn = Colour (0xaabbbbff); | |||
| } | |||
| } | |||
| DrawableButton::~DrawableButton() | |||
| @@ -80,25 +70,6 @@ void DrawableButton::setButtonStyle (const DrawableButton::ButtonStyle newStyle) | |||
| } | |||
| } | |||
| void DrawableButton::setBackgroundColours (const Colour& toggledOffColour, | |||
| const Colour& toggledOnColour) | |||
| { | |||
| if (backgroundOff != toggledOffColour | |||
| || backgroundOn != toggledOnColour) | |||
| { | |||
| backgroundOff = toggledOffColour; | |||
| backgroundOn = toggledOnColour; | |||
| repaint(); | |||
| } | |||
| } | |||
| const Colour& DrawableButton::getBackgroundColour() const noexcept | |||
| { | |||
| return getToggleState() ? backgroundOn | |||
| : backgroundOff; | |||
| } | |||
| void DrawableButton::setEdgeIndent (const int numPixelsIndent) | |||
| { | |||
| edgeIndent = numPixelsIndent; | |||
| @@ -120,19 +91,20 @@ void DrawableButton::resized() | |||
| { | |||
| Rectangle<int> imageSpace; | |||
| const int indentX = jmin (edgeIndent, proportionOfWidth (0.3f)); | |||
| const int indentY = jmin (edgeIndent, proportionOfHeight (0.3f)); | |||
| if (style == ImageOnButtonBackground) | |||
| { | |||
| imageSpace = getLocalBounds().reduced (getWidth() / 4, getHeight() / 4); | |||
| imageSpace = getLocalBounds().reduced (jmax (getWidth() / 4, indentX), | |||
| jmax (getHeight() / 4, indentY)); | |||
| } | |||
| else | |||
| { | |||
| const int textH = (style == ImageAboveTextLabel) ? jmin (16, proportionOfHeight (0.25f)) : 0; | |||
| const int indentX = jmin (edgeIndent, proportionOfWidth (0.3f)); | |||
| const int indentY = jmin (edgeIndent, proportionOfHeight (0.3f)); | |||
| imageSpace.setBounds (indentX, indentY, | |||
| getWidth() - indentX * 2, | |||
| getWidth() - indentX * 2, | |||
| getHeight() - indentY * 2 - textH); | |||
| } | |||
| @@ -187,20 +159,27 @@ void DrawableButton::enablementChanged() | |||
| buttonStateChanged(); | |||
| } | |||
| void DrawableButton::colourChanged() | |||
| { | |||
| repaint(); | |||
| } | |||
| void DrawableButton::paintButton (Graphics& g, | |||
| bool isMouseOverButton, | |||
| bool isButtonDown) | |||
| const bool isMouseOverButton, | |||
| const bool isButtonDown) | |||
| { | |||
| if (style == ImageOnButtonBackground) | |||
| { | |||
| getLookAndFeel().drawButtonBackground (g, *this, | |||
| getBackgroundColour(), | |||
| findColour (getToggleState() ? TextButton::buttonOnColourId | |||
| : TextButton::buttonColourId), | |||
| isMouseOverButton, | |||
| isButtonDown); | |||
| } | |||
| else | |||
| { | |||
| g.fillAll (getBackgroundColour()); | |||
| g.fillAll (findColour (getToggleState() ? backgroundOnColourId | |||
| : backgroundColourId)); | |||
| const int textH = (style == ImageAboveTextLabel) | |||
| ? jmin (16, proportionOfHeight (0.25f)) | |||
| @@ -224,11 +203,8 @@ void DrawableButton::paintButton (Graphics& g, | |||
| //============================================================================== | |||
| Drawable* DrawableButton::getCurrentImage() const noexcept | |||
| { | |||
| if (isDown()) | |||
| return getDownImage(); | |||
| if (isOver()) | |||
| return getOverImage(); | |||
| if (isDown()) return getDownImage(); | |||
| if (isOver()) return getOverImage(); | |||
| return getNormalImage(); | |||
| } | |||
| @@ -241,50 +217,18 @@ Drawable* DrawableButton::getNormalImage() const noexcept | |||
| Drawable* DrawableButton::getOverImage() const noexcept | |||
| { | |||
| Drawable* d = normalImage; | |||
| if (getToggleState()) | |||
| { | |||
| if (overImageOn != nullptr) | |||
| d = overImageOn; | |||
| else if (normalImageOn != nullptr) | |||
| d = normalImageOn; | |||
| else if (overImage != nullptr) | |||
| d = overImage; | |||
| } | |||
| else | |||
| { | |||
| if (overImage != nullptr) | |||
| d = overImage; | |||
| if (overImageOn != nullptr) return overImageOn; | |||
| if (normalImageOn != nullptr) return normalImageOn; | |||
| } | |||
| return d; | |||
| return overImage != nullptr ? overImage : normalImage; | |||
| } | |||
| Drawable* DrawableButton::getDownImage() const noexcept | |||
| { | |||
| Drawable* d = normalImage; | |||
| if (getToggleState()) | |||
| { | |||
| if (downImageOn != nullptr) | |||
| d = downImageOn; | |||
| else if (overImageOn != nullptr) | |||
| d = overImageOn; | |||
| else if (normalImageOn != nullptr) | |||
| d = normalImageOn; | |||
| else if (downImage != nullptr) | |||
| d = downImage; | |||
| else | |||
| d = getOverImage(); | |||
| } | |||
| else | |||
| { | |||
| if (downImage != nullptr) | |||
| d = downImage; | |||
| else | |||
| d = getOverImage(); | |||
| } | |||
| Drawable* const d = getToggleState() ? downImageOn : downImage; | |||
| return d; | |||
| return d != nullptr ? d : getOverImage(); | |||
| } | |||
| @@ -49,7 +49,9 @@ public: | |||
| ImageRaw, /**< The button will just display the images in their normal size and position. | |||
| This leaves it up to the caller to make sure the images are the correct size and position for the button. */ | |||
| ImageAboveTextLabel, /**< Draws the button as a text label across the bottom with the image resized and scaled to fit above it. */ | |||
| ImageOnButtonBackground /**< Draws the button as a standard rounded-rectangle button with the image on top. */ | |||
| ImageOnButtonBackground /**< Draws the button as a standard rounded-rectangle button with the image on top. | |||
| Note that if you use this style, the colour IDs that control the button colour are | |||
| TextButton::buttonColourId and TextButton::buttonOnColourId. */ | |||
| }; | |||
| //============================================================================== | |||
| @@ -88,60 +90,33 @@ public: | |||
| An internal copy will be made of the object passed-in if it is | |||
| non-zero. | |||
| @param normalImageOn same as the normalImage, but this is used when the button's toggle | |||
| state is 'on'. If this is 0, the normal image is used instead | |||
| state is 'on'. If this is nullptr, the normal image is used instead | |||
| @param overImageOn same as the overImage, but this is used when the button's toggle | |||
| state is 'on'. If this is 0, the normalImageOn is drawn instead | |||
| state is 'on'. If this is nullptr, the normalImageOn is drawn instead | |||
| @param downImageOn same as the downImage, but this is used when the button's toggle | |||
| state is 'on'. If this is 0, the overImageOn is drawn instead | |||
| state is 'on'. If this is nullptr, the overImageOn is drawn instead | |||
| @param disabledImageOn same as the disabledImage, but this is used when the button's toggle | |||
| state is 'on'. If this is 0, the normal image will be drawn instead | |||
| state is 'on'. If this is nullptr, the normal image will be drawn instead | |||
| with a reduced opacity | |||
| */ | |||
| void setImages (const Drawable* normalImage, | |||
| const Drawable* overImage = nullptr, | |||
| const Drawable* downImage = nullptr, | |||
| const Drawable* disabledImage = nullptr, | |||
| const Drawable* normalImageOn = nullptr, | |||
| const Drawable* overImageOn = nullptr, | |||
| const Drawable* downImageOn = nullptr, | |||
| const Drawable* overImage = nullptr, | |||
| const Drawable* downImage = nullptr, | |||
| const Drawable* disabledImage = nullptr, | |||
| const Drawable* normalImageOn = nullptr, | |||
| const Drawable* overImageOn = nullptr, | |||
| const Drawable* downImageOn = nullptr, | |||
| const Drawable* disabledImageOn = nullptr); | |||
| //============================================================================== | |||
| /** Changes the button's style. | |||
| @see ButtonStyle | |||
| */ | |||
| void setButtonStyle (ButtonStyle newStyle); | |||
| //============================================================================== | |||
| /** Changes the button's background colours. | |||
| The toggledOffColour is the colour to use when the button's toggle state | |||
| is off, and toggledOnColour when it's on. | |||
| For an ImageOnly or ImageAboveTextLabel style, the background colour is | |||
| used to fill the background of the component. | |||
| For an ImageOnButtonBackground style, the colour is used to draw the | |||
| button's lozenge shape and exactly how the colour's used will depend | |||
| on the LookAndFeel. | |||
| */ | |||
| void setBackgroundColours (const Colour& toggledOffColour, | |||
| const Colour& toggledOnColour); | |||
| /** Returns the current background colour being used. | |||
| @see setBackgroundColour | |||
| */ | |||
| const Colour& getBackgroundColour() const noexcept; | |||
| /** Gives the button an optional amount of space around the edge of the drawable. | |||
| This will only apply to ImageFitted or ImageRaw styles, it won't affect the | |||
| ones on a button background. If the button is too small for the given gap, a | |||
| smaller gap will be used. | |||
| By default there's a gap of about 3 pixels. | |||
| */ | |||
| void setEdgeIndent (int numPixelsIndent); | |||
| @@ -149,8 +124,12 @@ public: | |||
| //============================================================================== | |||
| /** Returns the image that the button is currently displaying. */ | |||
| Drawable* getCurrentImage() const noexcept; | |||
| /** Returns the image that the button will use for its normal state. */ | |||
| Drawable* getNormalImage() const noexcept; | |||
| /** Returns the image that the button will use when the mouse is over it. */ | |||
| Drawable* getOverImage() const noexcept; | |||
| /** Returns the image that the button will use when the mouse is held down on it. */ | |||
| Drawable* getDownImage() const noexcept; | |||
| //============================================================================== | |||
| @@ -159,33 +138,43 @@ public: | |||
| These constants can be used either via the Component::setColour(), or LookAndFeel::setColour() | |||
| methods. | |||
| Note that when the ImageOnButtonBackground style is used, the colour IDs that control | |||
| the button colour are TextButton::buttonColourId and TextButton::buttonOnColourId. | |||
| @see Component::setColour, Component::findColour, LookAndFeel::setColour, LookAndFeel::findColour | |||
| */ | |||
| enum ColourIds | |||
| { | |||
| textColourId = 0x1004010, /**< The colour to use for the URL text. */ | |||
| textColourId = 0x1004010, /**< The colour to use for the button's text label. */ | |||
| backgroundColourId = 0x1004011, /**< The colour used to fill the button's background (when | |||
| the button is toggled 'off'). Note that if you use the | |||
| ImageOnButtonBackground style, you should use TextButton::buttonColourId | |||
| to change the button's colour. */ | |||
| backgroundOnColourId = 0x1004012, /**< The colour used to fill the button's background (when | |||
| the button is toggled 'on'). Note that if you use the | |||
| ImageOnButtonBackground style, you should use TextButton::buttonOnColourId | |||
| to change the button's colour. */ | |||
| }; | |||
| protected: | |||
| //============================================================================== | |||
| /** @internal */ | |||
| void paintButton (Graphics& g, | |||
| bool isMouseOverButton, | |||
| bool isButtonDown); | |||
| void paintButton (Graphics&, bool isMouseOverButton, bool isButtonDown); | |||
| /** @internal */ | |||
| void buttonStateChanged(); | |||
| /** @internal */ | |||
| void resized(); | |||
| /** @internal */ | |||
| void enablementChanged(); | |||
| /** @internal */ | |||
| void colourChanged(); | |||
| private: | |||
| //============================================================================== | |||
| ButtonStyle style; | |||
| ScopedPointer <Drawable> normalImage, overImage, downImage, disabledImage; | |||
| ScopedPointer <Drawable> normalImageOn, overImageOn, downImageOn, disabledImageOn; | |||
| ScopedPointer <Drawable> normalImage, overImage, downImage, disabledImage, | |||
| normalImageOn, overImageOn, downImageOn, disabledImageOn; | |||
| Drawable* currentImage; | |||
| Colour backgroundOff, backgroundOn; | |||
| int edgeIndent; | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DrawableButton); | |||
| @@ -219,6 +219,9 @@ LookAndFeel::LookAndFeel() | |||
| Toolbar::labelTextColourId, 0xff000000, | |||
| Toolbar::editingModeOutlineColourId, 0xffff0000, | |||
| DrawableButton::backgroundColourId, 0x00000000, | |||
| DrawableButton::backgroundOnColourId, 0xaabbbbff, | |||
| HyperlinkButton::textColourId, 0xcc1111ee, | |||
| GroupComponent::outlineColourId, 0x66000000, | |||