| @@ -1089,57 +1089,17 @@ private: | |||||
| accordingly. The end result is that the peer is resized twice in a row to different sizes, | accordingly. The end result is that the peer is resized twice in a row to different sizes, | ||||
| which can appear glitchy/flickery to the user. | which can appear glitchy/flickery to the user. | ||||
| */ | */ | ||||
| struct DecoratorConstrainer : public ComponentBoundsConstrainer | |||||
| class DecoratorConstrainer : public BorderedComponentBoundsConstrainer | |||||
| { | { | ||||
| void checkBounds (Rectangle<int>& bounds, | |||||
| const Rectangle<int>& previousBounds, | |||||
| const Rectangle<int>& limits, | |||||
| bool isStretchingTop, | |||||
| bool isStretchingLeft, | |||||
| bool isStretchingBottom, | |||||
| bool isStretchingRight) override | |||||
| public: | |||||
| ComponentBoundsConstrainer* getWrappedConstrainer() const override | |||||
| { | { | ||||
| auto* decorated = contentComponent != nullptr ? contentComponent->getEditorConstrainer() | |||||
| : nullptr; | |||||
| return contentComponent != nullptr ? contentComponent->getEditorConstrainer() : nullptr; | |||||
| } | |||||
| if (decorated != nullptr) | |||||
| { | |||||
| const auto border = contentComponent->computeBorder(); | |||||
| const auto requestedBounds = bounds; | |||||
| border.subtractFrom (bounds); | |||||
| decorated->checkBounds (bounds, | |||||
| border.subtractedFrom (previousBounds), | |||||
| limits, | |||||
| isStretchingTop, | |||||
| isStretchingLeft, | |||||
| isStretchingBottom, | |||||
| isStretchingRight); | |||||
| border.addTo (bounds); | |||||
| bounds = bounds.withPosition (requestedBounds.getPosition()); | |||||
| if (isStretchingTop && ! isStretchingBottom) | |||||
| bounds = bounds.withBottomY (previousBounds.getBottom()); | |||||
| if (! isStretchingTop && isStretchingBottom) | |||||
| bounds = bounds.withY (previousBounds.getY()); | |||||
| if (isStretchingLeft && ! isStretchingRight) | |||||
| bounds = bounds.withRightX (previousBounds.getRight()); | |||||
| if (! isStretchingLeft && isStretchingRight) | |||||
| bounds = bounds.withX (previousBounds.getX()); | |||||
| } | |||||
| else | |||||
| { | |||||
| ComponentBoundsConstrainer::checkBounds (bounds, | |||||
| previousBounds, | |||||
| limits, | |||||
| isStretchingTop, | |||||
| isStretchingLeft, | |||||
| isStretchingBottom, | |||||
| isStretchingRight); | |||||
| } | |||||
| BorderSize<int> getAdditionalBorder() const override | |||||
| { | |||||
| return contentComponent != nullptr ? contentComponent->computeBorder() : BorderSize<int>{}; | |||||
| } | } | ||||
| void setMainContentComponent (MainContentComponent* in) { contentComponent = in; } | void setMainContentComponent (MainContentComponent* in) { contentComponent = in; } | ||||
| @@ -268,6 +268,7 @@ | |||||
| #include "keyboard/juce_ModifierKeys.cpp" | #include "keyboard/juce_ModifierKeys.cpp" | ||||
| #include "layout/juce_ComponentAnimator.cpp" | #include "layout/juce_ComponentAnimator.cpp" | ||||
| #include "layout/juce_ComponentBoundsConstrainer.cpp" | #include "layout/juce_ComponentBoundsConstrainer.cpp" | ||||
| #include "layout/juce_BorderedComponentBoundsConstrainer.cpp" | |||||
| #include "layout/juce_ComponentBuilder.cpp" | #include "layout/juce_ComponentBuilder.cpp" | ||||
| #include "layout/juce_ComponentMovementWatcher.cpp" | #include "layout/juce_ComponentMovementWatcher.cpp" | ||||
| #include "layout/juce_ConcertinaPanel.cpp" | #include "layout/juce_ConcertinaPanel.cpp" | ||||
| @@ -199,6 +199,7 @@ namespace juce | |||||
| #include "desktop/juce_Desktop.h" | #include "desktop/juce_Desktop.h" | ||||
| #include "desktop/juce_Displays.h" | #include "desktop/juce_Displays.h" | ||||
| #include "layout/juce_ComponentBoundsConstrainer.h" | #include "layout/juce_ComponentBoundsConstrainer.h" | ||||
| #include "layout/juce_BorderedComponentBoundsConstrainer.h" | |||||
| #include "mouse/juce_ComponentDragger.h" | #include "mouse/juce_ComponentDragger.h" | ||||
| #include "mouse/juce_DragAndDropTarget.h" | #include "mouse/juce_DragAndDropTarget.h" | ||||
| #include "mouse/juce_DragAndDropContainer.h" | #include "mouse/juce_DragAndDropContainer.h" | ||||
| @@ -0,0 +1,77 @@ | |||||
| /* | |||||
| ============================================================================== | |||||
| This file is part of the JUCE library. | |||||
| Copyright (c) 2022 - Raw Material Software Limited | |||||
| 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 7 End-User License | |||||
| Agreement and JUCE Privacy Policy. | |||||
| End User License Agreement: www.juce.com/juce-7-licence | |||||
| Privacy Policy: www.juce.com/juce-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. | |||||
| ============================================================================== | |||||
| */ | |||||
| namespace juce | |||||
| { | |||||
| void BorderedComponentBoundsConstrainer::checkBounds (Rectangle<int>& bounds, | |||||
| const Rectangle<int>& previousBounds, | |||||
| const Rectangle<int>& limits, | |||||
| bool isStretchingTop, | |||||
| bool isStretchingLeft, | |||||
| bool isStretchingBottom, | |||||
| bool isStretchingRight) | |||||
| { | |||||
| if (auto* decorated = getWrappedConstrainer()) | |||||
| { | |||||
| const auto border = getAdditionalBorder(); | |||||
| const auto requestedBounds = bounds; | |||||
| border.subtractFrom (bounds); | |||||
| decorated->checkBounds (bounds, | |||||
| border.subtractedFrom (previousBounds), | |||||
| limits, | |||||
| isStretchingTop, | |||||
| isStretchingLeft, | |||||
| isStretchingBottom, | |||||
| isStretchingRight); | |||||
| border.addTo (bounds); | |||||
| bounds = bounds.withPosition (requestedBounds.getPosition()); | |||||
| if (isStretchingTop && ! isStretchingBottom) | |||||
| bounds = bounds.withBottomY (previousBounds.getBottom()); | |||||
| if (! isStretchingTop && isStretchingBottom) | |||||
| bounds = bounds.withY (previousBounds.getY()); | |||||
| if (isStretchingLeft && ! isStretchingRight) | |||||
| bounds = bounds.withRightX (previousBounds.getRight()); | |||||
| if (! isStretchingLeft && isStretchingRight) | |||||
| bounds = bounds.withX (previousBounds.getX()); | |||||
| } | |||||
| else | |||||
| { | |||||
| ComponentBoundsConstrainer::checkBounds (bounds, | |||||
| previousBounds, | |||||
| limits, | |||||
| isStretchingTop, | |||||
| isStretchingLeft, | |||||
| isStretchingBottom, | |||||
| isStretchingRight); | |||||
| } | |||||
| } | |||||
| } // namespace juce | |||||
| @@ -0,0 +1,69 @@ | |||||
| /* | |||||
| ============================================================================== | |||||
| This file is part of the JUCE library. | |||||
| Copyright (c) 2022 - Raw Material Software Limited | |||||
| 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 7 End-User License | |||||
| Agreement and JUCE Privacy Policy. | |||||
| End User License Agreement: www.juce.com/juce-7-licence | |||||
| Privacy Policy: www.juce.com/juce-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. | |||||
| ============================================================================== | |||||
| */ | |||||
| namespace juce | |||||
| { | |||||
| //============================================================================== | |||||
| /** | |||||
| A ComponentBoundsConstrainer that can be used to add a constant border onto another | |||||
| ComponentBoundsConstrainer. | |||||
| This is useful when trying to constrain the size of a resizable window or | |||||
| other component that wraps a constrained component, such as a plugin | |||||
| editor. | |||||
| @see ResizableCornerComponent, ResizableBorderComponent, ResizableWindow, | |||||
| ComponentBoundsConstrainer | |||||
| @tags{GUI} | |||||
| */ | |||||
| class JUCE_API BorderedComponentBoundsConstrainer : public ComponentBoundsConstrainer | |||||
| { | |||||
| public: | |||||
| /** Default constructor. */ | |||||
| BorderedComponentBoundsConstrainer() = default; | |||||
| /** Returns a pointer to another constrainer that will be used as the | |||||
| base for any resizing operations. | |||||
| */ | |||||
| virtual ComponentBoundsConstrainer* getWrappedConstrainer() const = 0; | |||||
| /** Returns the border that should be applied to the constrained bounds. */ | |||||
| virtual BorderSize<int> getAdditionalBorder() const = 0; | |||||
| /** @internal */ | |||||
| void checkBounds (Rectangle<int>& bounds, | |||||
| const Rectangle<int>& previousBounds, | |||||
| const Rectangle<int>& limits, | |||||
| bool isStretchingTop, | |||||
| bool isStretchingLeft, | |||||
| bool isStretchingBottom, | |||||
| bool isStretchingRight) override; | |||||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BorderedComponentBoundsConstrainer) | |||||
| }; | |||||
| } // namespace juce | |||||