From d7358d0ef10681a3b3cb5c0403dfa7b9477bd6d8 Mon Sep 17 00:00:00 2001 From: ed Date: Mon, 30 Nov 2020 12:01:20 +0000 Subject: [PATCH] Update SidePanel visibility when shown/hidden and set always on top --- .../juce_gui_basics/layout/juce_SidePanel.cpp | 21 ++++++++++++-- .../juce_gui_basics/layout/juce_SidePanel.h | 28 +++++++++++-------- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/modules/juce_gui_basics/layout/juce_SidePanel.cpp b/modules/juce_gui_basics/layout/juce_SidePanel.cpp index c42fff1738..54a143a0db 100644 --- a/modules/juce_gui_basics/layout/juce_SidePanel.cpp +++ b/modules/juce_gui_basics/layout/juce_SidePanel.cpp @@ -39,17 +39,25 @@ SidePanel::SidePanel (StringRef title, int width, bool positionOnLeft, dismissButton.onClick = [this] { showOrHide (false); }; addAndMakeVisible (dismissButton); - Desktop::getInstance().addGlobalMouseListener (this); + auto& desktop = Desktop::getInstance(); + + desktop.addGlobalMouseListener (this); + desktop.getAnimator().addChangeListener (this); if (contentToDisplay != nullptr) setContent (contentToDisplay, deleteComponentWhenNoLongerNeeded); setOpaque (false); + setVisible (false); + setAlwaysOnTop (true); } SidePanel::~SidePanel() { - Desktop::getInstance().removeGlobalMouseListener (this); + auto& desktop = Desktop::getInstance(); + + desktop.removeGlobalMouseListener (this); + desktop.getAnimator().removeChangeListener (this); if (parent != nullptr) parent->removeComponentListener (this); @@ -98,6 +106,9 @@ void SidePanel::showOrHide (bool show) Desktop::getInstance().getAnimator().animateComponent (this, calculateBoundsInParent (*parent), 1.0f, 250, true, 1.0, 0.0); + if (isShowing && ! isVisible()) + setVisible (true); + if (onPanelShowHide != nullptr) onPanelShowHide (isShowing); } @@ -242,6 +253,12 @@ void SidePanel::componentMovedOrResized (Component& component, bool wasMoved, bo setBounds (calculateBoundsInParent (component)); } +void SidePanel::changeListenerCallback (ChangeBroadcaster*) +{ + if (isVisible() && ! isShowing && ! Desktop::getInstance().getAnimator().isAnimating (this)) + setVisible (false); +} + Rectangle SidePanel::calculateBoundsInParent (Component& parentComp) const { auto parentBounds = parentComp.getLocalBounds(); diff --git a/modules/juce_gui_basics/layout/juce_SidePanel.h b/modules/juce_gui_basics/layout/juce_SidePanel.h index b531be08bd..ba9703ea25 100644 --- a/modules/juce_gui_basics/layout/juce_SidePanel.h +++ b/modules/juce_gui_basics/layout/juce_SidePanel.h @@ -39,7 +39,8 @@ namespace juce @tags{GUI} */ class SidePanel : public Component, - private ComponentListener + private ComponentListener, + private ChangeListener { public: //============================================================================== @@ -144,16 +145,6 @@ public: /** Returns the text that is displayed in the title bar at the top of the SidePanel. */ String getTitleText() const noexcept { return titleLabel.getText(); } - //============================================================================== - void moved() override; - void resized() override; - void paint (Graphics& g) override; - - void parentHierarchyChanged() override; - - void mouseDrag (const MouseEvent&) override; - void mouseUp (const MouseEvent&) override; - //============================================================================== /** This abstract base class is implemented by LookAndFeel classes to provide SidePanel drawing functionality. @@ -191,6 +182,20 @@ public: /** You can assign a lambda to this callback object and it will be called when the panel is shown or hidden. */ std::function onPanelShowHide; + //============================================================================== + /** @internal */ + void moved() override; + /** @internal */ + void resized() override; + /** @internal */ + void paint (Graphics& g) override; + /** @internal */ + void parentHierarchyChanged() override; + /** @internal */ + void mouseDrag (const MouseEvent&) override; + /** @internal */ + void mouseUp (const MouseEvent&) override; + private: //============================================================================== Component* parent = nullptr; @@ -218,6 +223,7 @@ private: //============================================================================== void lookAndFeelChanged() override; void componentMovedOrResized (Component&, bool wasMoved, bool wasResized) override; + void changeListenerCallback (ChangeBroadcaster*) override; Rectangle calculateBoundsInParent (Component&) const; void calculateAndRemoveShadowBounds (Rectangle& bounds);