From cdd177863090a9a75669a7d61c6a9611228cee49 Mon Sep 17 00:00:00 2001 From: Julian Storer Date: Fri, 19 Aug 2011 16:33:55 +0100 Subject: [PATCH] Modal component deletion fix. Minor addition to ComponentAnimator. --- .../Project Saving/jucer_ProjectSaver.h | 14 +++++++---- .../components/juce_Component.cpp | 23 +------------------ .../components/juce_ModalComponentManager.cpp | 17 ++++++++++---- .../components/juce_ModalComponentManager.h | 2 +- .../layout/juce_ComponentAnimator.cpp | 9 ++++++-- .../layout/juce_ComponentAnimator.h | 7 ++++-- 6 files changed, 36 insertions(+), 36 deletions(-) diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectSaver.h b/extras/Introjucer/Source/Project Saving/jucer_ProjectSaver.h index 3597bb4392..33ddfa09a6 100644 --- a/extras/Introjucer/Source/Project Saving/jucer_ProjectSaver.h +++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectSaver.h @@ -158,7 +158,7 @@ private: File appConfigFile, binaryDataCpp; - // Recursively clears out a folder's contents, but leaves behind any folders + // Recursively clears out a folder's contents, but leaves behind any folders // containing hidden files used by version-control systems. static bool deleteNonHiddenFilesIn (const File& parent) { @@ -193,12 +193,18 @@ private: return folderIsNowEmpty; } - + static bool shouldFileBeKept (const String& filename) { - return filename == ".svn" || filename == ".cvs"; + const char* filesToKeep = { ".svn", ".cvs", "CMakeLists.txt" }; + + for (int i = 0; i < numElementsInArray (filesToKeep); ++i) + if (filename == filesToKeep[i]) + return true; + + return false; } - + void writeMainProjectFile() { ScopedPointer xml (project.getProjectRoot().createXml()); diff --git a/modules/juce_gui_basics/components/juce_Component.cpp b/modules/juce_gui_basics/components/juce_Component.cpp index 845f747854..e639f463f6 100644 --- a/modules/juce_gui_basics/components/juce_Component.cpp +++ b/modules/juce_gui_basics/components/juce_Component.cpp @@ -1538,24 +1538,6 @@ int Component::runModalLoop() #endif //============================================================================== -class ModalAutoDeleteCallback : public ModalComponentManager::Callback -{ -public: - ModalAutoDeleteCallback (Component* const comp_) - : comp (comp_) - {} - - void modalStateFinished (int) - { - delete comp.get(); - } - -private: - WeakReference comp; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ModalAutoDeleteCallback); -}; - void Component::enterModalState (const bool shouldTakeKeyboardFocus, ModalComponentManager::Callback* callback, const bool deleteWhenDismissed) @@ -1571,12 +1553,9 @@ void Component::enterModalState (const bool shouldTakeKeyboardFocus, if (! isCurrentlyModal()) { ModalComponentManager* const mcm = ModalComponentManager::getInstance(); - mcm->startModal (this); + mcm->startModal (this, deleteWhenDismissed); mcm->attachCallback (this, callback); - if (deleteWhenDismissed) - mcm->attachCallback (this, new ModalAutoDeleteCallback (this)); - flags.currentlyModalFlag = true; setVisible (true); diff --git a/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp b/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp index fddbcb690c..3cf37af612 100644 --- a/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp +++ b/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp @@ -29,9 +29,10 @@ BEGIN_JUCE_NAMESPACE class ModalComponentManager::ModalItem : public ComponentMovementWatcher { public: - ModalItem (Component* const comp) + ModalItem (Component* const comp, const bool autoDelete_) : ComponentMovementWatcher (comp), - component (comp), returnValue (0), isActive (true) + component (comp), returnValue (0), + isActive (true), autoDelete (autoDelete_) { jassert (comp != nullptr); } @@ -55,7 +56,10 @@ public: ComponentMovementWatcher::componentBeingDeleted (comp); if (component == &comp || comp.isParentOf (component)) + { + autoDelete = false; cancel(); + } } void cancel() @@ -70,7 +74,7 @@ public: Component* component; OwnedArray callbacks; int returnValue; - bool isActive; + bool isActive, autoDelete; private: JUCE_DECLARE_NON_COPYABLE (ModalItem); @@ -90,10 +94,10 @@ juce_ImplementSingleton_SingleThreaded (ModalComponentManager); //============================================================================== -void ModalComponentManager::startModal (Component* component) +void ModalComponentManager::startModal (Component* component, bool autoDelete) { if (component != nullptr) - stack.add (new ModalItem (component)); + stack.add (new ModalItem (component, autoDelete)); } void ModalComponentManager::attachCallback (Component* component, Callback* callback) @@ -191,9 +195,12 @@ void ModalComponentManager::handleAsyncUpdate() if (! item->isActive) { ScopedPointer deleter (stack.removeAndReturn (i)); + Component::SafePointer compToDelete (item->autoDelete ? item->component : nullptr); for (int j = item->callbacks.size(); --j >= 0;) item->callbacks.getUnchecked(j)->modalStateFinished (item->returnValue); + + compToDelete.deleteAndZero(); } } } diff --git a/modules/juce_gui_basics/components/juce_ModalComponentManager.h b/modules/juce_gui_basics/components/juce_ModalComponentManager.h index c76019f4cf..d9430a0b7b 100644 --- a/modules/juce_gui_basics/components/juce_ModalComponentManager.h +++ b/modules/juce_gui_basics/components/juce_ModalComponentManager.h @@ -139,7 +139,7 @@ private: friend class OwnedArray ; OwnedArray stack; - void startModal (Component*); + void startModal (Component*, bool autoDelete); void endModal (Component*, int returnValue); void endModal (Component*); diff --git a/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp b/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp index e96ff7e7c0..9c76043c82 100644 --- a/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp +++ b/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp @@ -206,7 +206,7 @@ ComponentAnimator::~ComponentAnimator() } //============================================================================== -ComponentAnimator::AnimationTask* ComponentAnimator::findTaskFor (Component* const component) const +ComponentAnimator::AnimationTask* ComponentAnimator::findTaskFor (Component* const component) const noexcept { for (int i = tasks.size(); --i >= 0;) if (component == tasks.getUnchecked(i)->component.get()) @@ -308,11 +308,16 @@ const Rectangle ComponentAnimator::getComponentDestination (Component* cons return component->getBounds(); } -bool ComponentAnimator::isAnimating (Component* component) const +bool ComponentAnimator::isAnimating (Component* component) const noexcept { return findTaskFor (component) != nullptr; } +bool ComponentAnimator::isAnimating() const noexcept +{ + return tasks.size() != 0; +} + void ComponentAnimator::timerCallback() { const uint32 timeNow = Time::getMillisecondCounter(); diff --git a/modules/juce_gui_basics/layout/juce_ComponentAnimator.h b/modules/juce_gui_basics/layout/juce_ComponentAnimator.h index ae8154bf30..27e0c5df32 100644 --- a/modules/juce_gui_basics/layout/juce_ComponentAnimator.h +++ b/modules/juce_gui_basics/layout/juce_ComponentAnimator.h @@ -143,7 +143,10 @@ public: const Rectangle getComponentDestination (Component* component); /** Returns true if the specified component is currently being animated. */ - bool isAnimating (Component* component) const; + bool isAnimating (Component* component) const noexcept; + + /** Returns true if any components are currently being animated. */ + bool isAnimating() const noexcept; private: //============================================================================== @@ -151,7 +154,7 @@ private: OwnedArray tasks; uint32 lastTime; - AnimationTask* findTaskFor (Component* component) const; + AnimationTask* findTaskFor (Component* component) const noexcept; void timerCallback(); JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ComponentAnimator);