From 8377a6406b4528015bc7403a894acb7d9433d0c8 Mon Sep 17 00:00:00 2001 From: hogliux Date: Tue, 29 May 2018 11:43:30 +0100 Subject: [PATCH] Scaling: Ensured that the Slider's PopupDisplayComponent will have the same transform applied as the Slider itself --- .../misc/juce_BubbleComponent.cpp | 3 ++- .../juce_gui_basics/widgets/juce_Slider.cpp | 23 +++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/modules/juce_gui_basics/misc/juce_BubbleComponent.cpp b/modules/juce_gui_basics/misc/juce_BubbleComponent.cpp index 13ce260eb6..bad49aea03 100644 --- a/modules/juce_gui_basics/misc/juce_BubbleComponent.cpp +++ b/modules/juce_gui_basics/misc/juce_BubbleComponent.cpp @@ -145,7 +145,8 @@ void BubbleComponent::setPosition (Rectangle rectangleToPointTo, } } - setBounds (targetX - arrowTip.x, targetY - arrowTip.y, totalW, totalH); + auto origin = Point (targetX - arrowTip.x, targetY - arrowTip.y).transformedBy (getTransform().inverted()); + setBounds (origin.getX(), origin.getY(), totalW, totalH); } } // namespace juce diff --git a/modules/juce_gui_basics/widgets/juce_Slider.cpp b/modules/juce_gui_basics/widgets/juce_Slider.cpp index 504b0db615..e60bd9e371 100644 --- a/modules/juce_gui_basics/widgets/juce_Slider.cpp +++ b/modules/juce_gui_basics/widgets/juce_Slider.cpp @@ -990,7 +990,7 @@ public: if (popupDisplay == nullptr) { - popupDisplay.reset (new PopupDisplayComponent (owner)); + popupDisplay.reset (new PopupDisplayComponent (owner, parentForPopupDisplay == nullptr)); if (parentForPopupDisplay != nullptr) parentForPopupDisplay->addChildComponent (popupDisplay.get()); @@ -1275,10 +1275,13 @@ public: struct PopupDisplayComponent : public BubbleComponent, public Timer { - PopupDisplayComponent (Slider& s) + PopupDisplayComponent (Slider& s, bool isOnDesktop) : owner (s), font (s.getLookAndFeel().getSliderPopupFont (s)) { + if (isOnDesktop) + setTransform (AffineTransform::scale (getApproximateScaleFactor (&s))); + setAlwaysOnTop (true); setAllowedPlacement (owner.getLookAndFeel().getSliderPopupPlacement (s)); setLookAndFeel (&s.getLookAndFeel()); @@ -1316,6 +1319,22 @@ public: } private: + static float getApproximateScaleFactor (Component* targetComponent) + { + AffineTransform transform; + + for (Component* target = targetComponent; target != nullptr; target = target->getParentComponent()) + { + transform = transform.followedBy (target->getTransform()); + + if (target->isOnDesktop()) + transform = transform.scaled (target->getDesktopScaleFactor()); + } + + return (transform.getScaleFactor() / Desktop::getInstance().getGlobalScaleFactor()); + } + + //============================================================================== Slider& owner; Font font; String text;