@@ -1089,57 +1089,17 @@ private: | |||
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. | |||
*/ | |||
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; } | |||
@@ -268,6 +268,7 @@ | |||
#include "keyboard/juce_ModifierKeys.cpp" | |||
#include "layout/juce_ComponentAnimator.cpp" | |||
#include "layout/juce_ComponentBoundsConstrainer.cpp" | |||
#include "layout/juce_BorderedComponentBoundsConstrainer.cpp" | |||
#include "layout/juce_ComponentBuilder.cpp" | |||
#include "layout/juce_ComponentMovementWatcher.cpp" | |||
#include "layout/juce_ConcertinaPanel.cpp" | |||
@@ -199,6 +199,7 @@ namespace juce | |||
#include "desktop/juce_Desktop.h" | |||
#include "desktop/juce_Displays.h" | |||
#include "layout/juce_ComponentBoundsConstrainer.h" | |||
#include "layout/juce_BorderedComponentBoundsConstrainer.h" | |||
#include "mouse/juce_ComponentDragger.h" | |||
#include "mouse/juce_DragAndDropTarget.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 |