@@ -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 |