| @@ -938,10 +938,17 @@ void Path::applyTransform (const AffineTransform& transform) noexcept | |||||
| //============================================================================== | //============================================================================== | ||||
| AffineTransform Path::getTransformToScaleToFit (const Rectangle<float>& area, | |||||
| bool preserveProportions, Justification justification) const | |||||
| { | |||||
| return getTransformToScaleToFit (area.getX(), area.getY(), area.getWidth(), area.getHeight(), | |||||
| preserveProportions, justification); | |||||
| } | |||||
| AffineTransform Path::getTransformToScaleToFit (const float x, const float y, | AffineTransform Path::getTransformToScaleToFit (const float x, const float y, | ||||
| const float w, const float h, | const float w, const float h, | ||||
| const bool preserveProportions, | const bool preserveProportions, | ||||
| const Justification& justification) const | |||||
| Justification justification) const | |||||
| { | { | ||||
| Rectangle<float> boundsRect (getBounds()); | Rectangle<float> boundsRect (getBounds()); | ||||
| @@ -612,7 +612,25 @@ public: | |||||
| */ | */ | ||||
| AffineTransform getTransformToScaleToFit (float x, float y, float width, float height, | AffineTransform getTransformToScaleToFit (float x, float y, float width, float height, | ||||
| bool preserveProportions, | bool preserveProportions, | ||||
| const Justification& justificationType = Justification::centred) const; | |||||
| Justification justificationType = Justification::centred) const; | |||||
| /** Returns a transform that can be used to rescale the path to fit into a given space. | |||||
| @param area the rectangle to fit the path inside | |||||
| @param preserveProportions if true, it will fit the path into the space without altering its | |||||
| horizontal/vertical scale ratio; if false, it will distort the | |||||
| path to fill the specified ratio both horizontally and vertically | |||||
| @param justificationType if the proportions are preseved, the resultant path may be smaller | |||||
| than the available rectangle, so this describes how it should be | |||||
| positioned within the space. | |||||
| @returns an appropriate transformation | |||||
| @see applyTransform, scaleToFit | |||||
| */ | |||||
| AffineTransform getTransformToScaleToFit (const Rectangle<float>& area, | |||||
| bool preserveProportions, | |||||
| Justification justificationType = Justification::centred) const; | |||||
| /** Creates a version of this path where all sharp corners have been replaced by curves. | /** Creates a version of this path where all sharp corners have been replaced by curves. | ||||
| @@ -68,9 +68,10 @@ void ShapeButton::setShape (const Path& newShape, | |||||
| Rectangle<float> newBounds (shape.getBounds()); | Rectangle<float> newBounds (shape.getBounds()); | ||||
| if (hasShadow) | if (hasShadow) | ||||
| newBounds.expand (4.0f, 4.0f); | |||||
| newBounds = newBounds.expanded (4.0f); | |||||
| shape.applyTransform (AffineTransform::translation (-newBounds.getX(), -newBounds.getY())); | |||||
| shape.applyTransform (AffineTransform::translation (-newBounds.getX(), | |||||
| -newBounds.getY())); | |||||
| setSize (1 + (int) (newBounds.getWidth() + outlineWidth), | setSize (1 + (int) (newBounds.getWidth() + outlineWidth), | ||||
| 1 + (int) (newBounds.getHeight() + outlineWidth)); | 1 + (int) (newBounds.getHeight() + outlineWidth)); | ||||
| @@ -85,25 +86,24 @@ void ShapeButton::paintButton (Graphics& g, bool isMouseOverButton, bool isButto | |||||
| isButtonDown = false; | isButtonDown = false; | ||||
| } | } | ||||
| g.setColour (isButtonDown ? downColour | |||||
| : isMouseOverButton ? overColour | |||||
| : normalColour); | |||||
| int w = getWidth(); | |||||
| int h = getHeight(); | |||||
| Rectangle<float> r (getLocalBounds().toFloat().reduced (outlineWidth * 0.5f)); | |||||
| if (getComponentEffect() != nullptr) | if (getComponentEffect() != nullptr) | ||||
| r = r.reduced (2.0f); | |||||
| if (isButtonDown) | |||||
| { | { | ||||
| w -= 4; | |||||
| h -= 4; | |||||
| const float sizeReductionWhenPressed = 0.04f; | |||||
| r = r.reduced (sizeReductionWhenPressed * r.getWidth(), | |||||
| sizeReductionWhenPressed * r.getHeight()); | |||||
| } | } | ||||
| const float offset = (outlineWidth * 0.5f) + (isButtonDown ? 1.5f : 0.0f); | |||||
| const AffineTransform trans (shape.getTransformToScaleToFit (r, maintainShapeProportions)); | |||||
| const AffineTransform trans (shape.getTransformToScaleToFit (offset, offset, | |||||
| w - offset - outlineWidth, | |||||
| h - offset - outlineWidth, | |||||
| maintainShapeProportions)); | |||||
| g.setColour (isButtonDown ? downColour | |||||
| : isMouseOverButton ? overColour | |||||
| : normalColour); | |||||
| g.fillPath (shape, trans); | g.fillPath (shape, trans); | ||||
| if (outlineWidth > 0.0f) | if (outlineWidth > 0.0f) | ||||