| @@ -48,7 +48,7 @@ | |||||
| Macros that will be set here are: | Macros that will be set here are: | ||||
| - One of JUCE_WINDOWS, JUCE_MAC or JUCE_LINUX. | |||||
| - One of JUCE_WINDOWS, JUCE_MAC JUCE_LINUX, JUCE_IOS, JUCE_ANDROID, etc. | |||||
| - Either JUCE_32BIT or JUCE_64BIT, depending on the architecture. | - Either JUCE_32BIT or JUCE_64BIT, depending on the architecture. | ||||
| - Either JUCE_LITTLE_ENDIAN or JUCE_BIG_ENDIAN. | - Either JUCE_LITTLE_ENDIAN or JUCE_BIG_ENDIAN. | ||||
| - Either JUCE_INTEL or JUCE_PPC | - Either JUCE_INTEL or JUCE_PPC | ||||
| @@ -4760,7 +4760,7 @@ bool NamedValueSet::set (const Identifier& name, const var& newValue) | |||||
| if (v->name == name) | if (v->name == name) | ||||
| { | { | ||||
| if (v->value == newValue) | |||||
| if (v->value.equalsWithSameType (newValue)) | |||||
| return false; | return false; | ||||
| v->value = newValue; | v->value = newValue; | ||||
| @@ -27663,12 +27663,8 @@ void IIRFilter::copyCoefficientsFrom (const IIRFilter& other) throw() | |||||
| active = other.active; | active = other.active; | ||||
| } | } | ||||
| void IIRFilter::setCoefficients (double c1, | |||||
| double c2, | |||||
| double c3, | |||||
| double c4, | |||||
| double c5, | |||||
| double c6) throw() | |||||
| void IIRFilter::setCoefficients (double c1, double c2, double c3, | |||||
| double c4, double c5, double c6) throw() | |||||
| { | { | ||||
| const double a = 1.0 / c4; | const double a = 1.0 / c4; | ||||
| @@ -31784,7 +31780,8 @@ OSStatus AudioUnitPluginInstance::renderGetInput (AudioUnitRenderActionFlags* io | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| zeromem (ioData->mBuffers[i].mData, sizeof (float) * inNumberFrames); | |||||
| zeromem (ioData->mBuffers[i].mData, | |||||
| sizeof (float) * inNumberFrames); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -39359,7 +39356,7 @@ private: | |||||
| void addTimer (Timer* const t) throw() | void addTimer (Timer* const t) throw() | ||||
| { | { | ||||
| #if JUCE_DEBUG | |||||
| #if JUCE_DEBUG | |||||
| Timer* tt = firstTimer; | Timer* tt = firstTimer; | ||||
| while (tt != 0) | while (tt != 0) | ||||
| @@ -39372,7 +39369,7 @@ private: | |||||
| } | } | ||||
| jassert (t->previous == 0 && t->next == 0); | jassert (t->previous == 0 && t->next == 0); | ||||
| #endif | |||||
| #endif | |||||
| Timer* i = firstTimer; | Timer* i = firstTimer; | ||||
| @@ -39404,7 +39401,7 @@ private: | |||||
| void removeTimer (Timer* const t) throw() | void removeTimer (Timer* const t) throw() | ||||
| { | { | ||||
| #if JUCE_DEBUG | |||||
| #if JUCE_DEBUG | |||||
| Timer* tt = firstTimer; | Timer* tt = firstTimer; | ||||
| bool found = false; | bool found = false; | ||||
| @@ -39422,7 +39419,7 @@ private: | |||||
| // trying to remove a timer that's not here - shouldn't get to this point, | // trying to remove a timer that's not here - shouldn't get to this point, | ||||
| // so if you get this assertion, let me know! | // so if you get this assertion, let me know! | ||||
| jassert (found); | jassert (found); | ||||
| #endif | |||||
| #endif | |||||
| if (t->previous != 0) | if (t->previous != 0) | ||||
| { | { | ||||
| @@ -39478,9 +39475,9 @@ Timer::Timer() throw() | |||||
| previous (0), | previous (0), | ||||
| next (0) | next (0) | ||||
| { | { | ||||
| #if JUCE_DEBUG | |||||
| #if JUCE_DEBUG | |||||
| activeTimers.add (this); | activeTimers.add (this); | ||||
| #endif | |||||
| #endif | |||||
| } | } | ||||
| Timer::Timer (const Timer&) throw() | Timer::Timer (const Timer&) throw() | ||||
| @@ -39489,28 +39486,28 @@ Timer::Timer (const Timer&) throw() | |||||
| previous (0), | previous (0), | ||||
| next (0) | next (0) | ||||
| { | { | ||||
| #if JUCE_DEBUG | |||||
| #if JUCE_DEBUG | |||||
| activeTimers.add (this); | activeTimers.add (this); | ||||
| #endif | |||||
| #endif | |||||
| } | } | ||||
| Timer::~Timer() | Timer::~Timer() | ||||
| { | { | ||||
| stopTimer(); | stopTimer(); | ||||
| #if JUCE_DEBUG | |||||
| #if JUCE_DEBUG | |||||
| activeTimers.removeValue (this); | activeTimers.removeValue (this); | ||||
| #endif | |||||
| #endif | |||||
| } | } | ||||
| void Timer::startTimer (const int interval) throw() | void Timer::startTimer (const int interval) throw() | ||||
| { | { | ||||
| const ScopedLock sl (InternalTimerThread::lock); | const ScopedLock sl (InternalTimerThread::lock); | ||||
| #if JUCE_DEBUG | |||||
| #if JUCE_DEBUG | |||||
| // this isn't a valid object! Your timer might be a dangling pointer or something.. | // this isn't a valid object! Your timer might be a dangling pointer or something.. | ||||
| jassert (activeTimers.contains (this)); | jassert (activeTimers.contains (this)); | ||||
| #endif | |||||
| #endif | |||||
| if (periodMs == 0) | if (periodMs == 0) | ||||
| { | { | ||||
| @@ -39528,10 +39525,10 @@ void Timer::stopTimer() throw() | |||||
| { | { | ||||
| const ScopedLock sl (InternalTimerThread::lock); | const ScopedLock sl (InternalTimerThread::lock); | ||||
| #if JUCE_DEBUG | |||||
| #if JUCE_DEBUG | |||||
| // this isn't a valid object! Your timer might be a dangling pointer or something.. | // this isn't a valid object! Your timer might be a dangling pointer or something.. | ||||
| jassert (activeTimers.contains (this)); | jassert (activeTimers.contains (this)); | ||||
| #endif | |||||
| #endif | |||||
| if (periodMs > 0) | if (periodMs > 0) | ||||
| { | { | ||||
| @@ -49384,11 +49381,12 @@ END_JUCE_NAMESPACE | |||||
| /*** Start of inlined file: juce_Slider.cpp ***/ | /*** Start of inlined file: juce_Slider.cpp ***/ | ||||
| BEGIN_JUCE_NAMESPACE | BEGIN_JUCE_NAMESPACE | ||||
| class SliderPopupDisplayComponent : public BubbleComponent | |||||
| class Slider::PopupDisplayComponent : public BubbleComponent, | |||||
| public Timer | |||||
| { | { | ||||
| public: | public: | ||||
| SliderPopupDisplayComponent (Slider* const owner_) | |||||
| PopupDisplayComponent (Slider& owner_) | |||||
| : owner (owner_), | : owner (owner_), | ||||
| font (15.0f, Font::bold) | font (15.0f, Font::bold) | ||||
| { | { | ||||
| @@ -49417,15 +49415,21 @@ public: | |||||
| repaint(); | repaint(); | ||||
| } | } | ||||
| BubbleComponent::setPosition (owner); | |||||
| BubbleComponent::setPosition (&owner); | |||||
| repaint(); | |||||
| } | |||||
| void timerCallback() | |||||
| { | |||||
| owner.popupDisplay = 0; | |||||
| } | } | ||||
| private: | private: | ||||
| Slider* owner; | |||||
| Slider& owner; | |||||
| Font font; | Font font; | ||||
| String text; | String text; | ||||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SliderPopupDisplayComponent); | |||||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PopupDisplayComponent); | |||||
| }; | }; | ||||
| Slider::Slider (const String& name) | Slider::Slider (const String& name) | ||||
| @@ -49464,7 +49468,6 @@ Slider::Slider (const String& name) | |||||
| menuShown (false), | menuShown (false), | ||||
| scrollWheelEnabled (true), | scrollWheelEnabled (true), | ||||
| snapsToMousePos (true), | snapsToMousePos (true), | ||||
| popupDisplay (0), | |||||
| parentForPopupDisplay (0) | parentForPopupDisplay (0) | ||||
| { | { | ||||
| setWantsKeyboardFocus (false); | setWantsKeyboardFocus (false); | ||||
| @@ -49832,12 +49835,7 @@ void Slider::setValue (double newValue, | |||||
| repaint(); | repaint(); | ||||
| if (popupDisplay != 0) | if (popupDisplay != 0) | ||||
| { | |||||
| static_cast <SliderPopupDisplayComponent*> (static_cast <Component*> (popupDisplay)) | |||||
| ->updatePosition (getTextFromValue (newValue)); | |||||
| popupDisplay->repaint(); | |||||
| } | |||||
| popupDisplay->updatePosition (getTextFromValue (newValue)); | |||||
| if (sendUpdateMessage) | if (sendUpdateMessage) | ||||
| triggerChangeMessage (sendMessageSynchronously); | triggerChangeMessage (sendMessageSynchronously); | ||||
| @@ -49892,12 +49890,7 @@ void Slider::setMinValue (double newValue, const bool sendUpdateMessage, const b | |||||
| repaint(); | repaint(); | ||||
| if (popupDisplay != 0) | if (popupDisplay != 0) | ||||
| { | |||||
| static_cast <SliderPopupDisplayComponent*> (static_cast <Component*> (popupDisplay)) | |||||
| ->updatePosition (getTextFromValue (newValue)); | |||||
| popupDisplay->repaint(); | |||||
| } | |||||
| popupDisplay->updatePosition (getTextFromValue (newValue)); | |||||
| if (sendUpdateMessage) | if (sendUpdateMessage) | ||||
| triggerChangeMessage (sendMessageSynchronously); | triggerChangeMessage (sendMessageSynchronously); | ||||
| @@ -49934,12 +49927,7 @@ void Slider::setMaxValue (double newValue, const bool sendUpdateMessage, const b | |||||
| repaint(); | repaint(); | ||||
| if (popupDisplay != 0) | if (popupDisplay != 0) | ||||
| { | |||||
| static_cast <SliderPopupDisplayComponent*> (static_cast <Component*> (popupDisplay)) | |||||
| ->updatePosition (getTextFromValue (valueMax.getValue())); | |||||
| popupDisplay->repaint(); | |||||
| } | |||||
| popupDisplay->updatePosition (getTextFromValue (valueMax.getValue())); | |||||
| if (sendUpdateMessage) | if (sendUpdateMessage) | ||||
| triggerChangeMessage (sendMessageSynchronously); | triggerChangeMessage (sendMessageSynchronously); | ||||
| @@ -50447,17 +50435,13 @@ void Slider::mouseDown (const MouseEvent& e) | |||||
| if (popupDisplayEnabled) | if (popupDisplayEnabled) | ||||
| { | { | ||||
| SliderPopupDisplayComponent* const popup = new SliderPopupDisplayComponent (this); | |||||
| PopupDisplayComponent* const popup = new PopupDisplayComponent (*this); | |||||
| popupDisplay = popup; | popupDisplay = popup; | ||||
| if (parentForPopupDisplay != 0) | if (parentForPopupDisplay != 0) | ||||
| { | |||||
| parentForPopupDisplay->addChildComponent (popup); | parentForPopupDisplay->addChildComponent (popup); | ||||
| } | |||||
| else | else | ||||
| { | |||||
| popup->addToDesktop (0); | popup->addToDesktop (0); | ||||
| } | |||||
| popup->setVisible (true); | popup->setVisible (true); | ||||
| } | } | ||||
| @@ -50482,6 +50466,7 @@ void Slider::mouseUp (const MouseEvent&) | |||||
| triggerChangeMessage (false); | triggerChangeMessage (false); | ||||
| sendDragEnd(); | sendDragEnd(); | ||||
| popupDisplay = 0; | |||||
| if (style == IncDecButtons) | if (style == IncDecButtons) | ||||
| { | { | ||||
| @@ -50489,8 +50474,10 @@ void Slider::mouseUp (const MouseEvent&) | |||||
| decButton->setState (Button::buttonNormal); | decButton->setState (Button::buttonNormal); | ||||
| } | } | ||||
| } | } | ||||
| popupDisplay = 0; | |||||
| else if (popupDisplay != 0) | |||||
| { | |||||
| popupDisplay->startTimer (2000); | |||||
| } | |||||
| } | } | ||||
| void Slider::restoreMouseIfHidden() | void Slider::restoreMouseIfHidden() | ||||
| @@ -84034,8 +84021,10 @@ private: | |||||
| class LinearGradientPixelGenerator | class LinearGradientPixelGenerator | ||||
| { | { | ||||
| public: | public: | ||||
| LinearGradientPixelGenerator (const ColourGradient& gradient, const AffineTransform& transform, const PixelARGB* const lookupTable_, const int numEntries_) | |||||
| : lookupTable (lookupTable_), numEntries (numEntries_) | |||||
| LinearGradientPixelGenerator (const ColourGradient& gradient, const AffineTransform& transform, | |||||
| const PixelARGB* const lookupTable_, const int numEntries_) | |||||
| : lookupTable (lookupTable_), | |||||
| numEntries (numEntries_) | |||||
| { | { | ||||
| jassert (numEntries_ >= 0); | jassert (numEntries_ >= 0); | ||||
| Point<float> p1 (gradient.point1); | Point<float> p1 (gradient.point1); | ||||
| @@ -89540,16 +89529,11 @@ private: | |||||
| const juce_wchar n1 = s [len - 2]; | const juce_wchar n1 = s [len - 2]; | ||||
| const juce_wchar n2 = s [len - 1]; | const juce_wchar n2 = s [len - 1]; | ||||
| if (n1 == 'i' && n2 == 'n') | |||||
| n *= dpi; | |||||
| else if (n1 == 'm' && n2 == 'm') | |||||
| n *= dpi / 25.4f; | |||||
| else if (n1 == 'c' && n2 == 'm') | |||||
| n *= dpi / 2.54f; | |||||
| else if (n1 == 'p' && n2 == 'c') | |||||
| n *= 15.0f; | |||||
| else if (n2 == '%') | |||||
| n *= 0.01f * sizeForProportions; | |||||
| if (n1 == 'i' && n2 == 'n') n *= dpi; | |||||
| else if (n1 == 'm' && n2 == 'm') n *= dpi / 25.4f; | |||||
| else if (n1 == 'c' && n2 == 'm') n *= dpi / 2.54f; | |||||
| else if (n1 == 'p' && n2 == 'c') n *= 15.0f; | |||||
| else if (n2 == '%') n *= 0.01f * sizeForProportions; | |||||
| } | } | ||||
| return n; | return n; | ||||
| @@ -73,7 +73,7 @@ namespace JuceDummyNamespace {} | |||||
| */ | */ | ||||
| #define JUCE_MAJOR_VERSION 1 | #define JUCE_MAJOR_VERSION 1 | ||||
| #define JUCE_MINOR_VERSION 53 | #define JUCE_MINOR_VERSION 53 | ||||
| #define JUCE_BUILDNUMBER 40 | |||||
| #define JUCE_BUILDNUMBER 41 | |||||
| /** Current Juce version number. | /** Current Juce version number. | ||||
| @@ -95,7 +95,7 @@ namespace JuceDummyNamespace {} | |||||
| Macros that will be set here are: | Macros that will be set here are: | ||||
| - One of JUCE_WINDOWS, JUCE_MAC or JUCE_LINUX. | |||||
| - One of JUCE_WINDOWS, JUCE_MAC JUCE_LINUX, JUCE_IOS, JUCE_ANDROID, etc. | |||||
| - Either JUCE_32BIT or JUCE_64BIT, depending on the architecture. | - Either JUCE_32BIT or JUCE_64BIT, depending on the architecture. | ||||
| - Either JUCE_LITTLE_ENDIAN or JUCE_BIG_ENDIAN. | - Either JUCE_LITTLE_ENDIAN or JUCE_BIG_ENDIAN. | ||||
| - Either JUCE_INTEL or JUCE_PPC | - Either JUCE_INTEL or JUCE_PPC | ||||
| @@ -5565,7 +5565,7 @@ public: | |||||
| { | { | ||||
| if (--(getCounter().numObjects) < 0) | if (--(getCounter().numObjects) < 0) | ||||
| { | { | ||||
| DBG ("*** Dangling pointer deletion! Class: " << OwnerClass::getLeakedObjectClassName()); | |||||
| DBG ("*** Dangling pointer deletion! Class: " << getLeakedObjectClassName()); | |||||
| /** If you hit this, then you've managed to delete more instances of this class than you've | /** If you hit this, then you've managed to delete more instances of this class than you've | ||||
| created.. That indicates that you're deleting some dangling pointers. | created.. That indicates that you're deleting some dangling pointers. | ||||
| @@ -5587,13 +5587,13 @@ private: | |||||
| class LeakCounter | class LeakCounter | ||||
| { | { | ||||
| public: | public: | ||||
| LeakCounter() {} | |||||
| LeakCounter() throw() {} | |||||
| ~LeakCounter() | ~LeakCounter() | ||||
| { | { | ||||
| if (numObjects.value > 0) | if (numObjects.value > 0) | ||||
| { | { | ||||
| DBG ("*** Leaked objects detected: " << numObjects.value << " instance(s) of class " << OwnerClass::getLeakedObjectClassName()); | |||||
| DBG ("*** Leaked objects detected: " << numObjects.value << " instance(s) of class " << getLeakedObjectClassName()); | |||||
| /** If you hit this, then you've leaked one or more objects of the type specified by | /** If you hit this, then you've leaked one or more objects of the type specified by | ||||
| the 'OwnerClass' template parameter - the name should have been printed by the line above. | the 'OwnerClass' template parameter - the name should have been printed by the line above. | ||||
| @@ -5609,6 +5609,11 @@ private: | |||||
| Atomic<int> numObjects; | Atomic<int> numObjects; | ||||
| }; | }; | ||||
| static const char* getLeakedObjectClassName() | |||||
| { | |||||
| return OwnerClass::getLeakedObjectClassName(); | |||||
| } | |||||
| static LeakCounter& getCounter() throw() | static LeakCounter& getCounter() throw() | ||||
| { | { | ||||
| static LeakCounter counter; | static LeakCounter counter; | ||||
| @@ -20526,7 +20531,12 @@ private: | |||||
| #define __JUCE_RANDOM_JUCEHEADER__ | #define __JUCE_RANDOM_JUCEHEADER__ | ||||
| /** | /** | ||||
| A simple pseudo-random number generator. | |||||
| A random number generator. | |||||
| You can create a Random object and use it to generate a sequence of random numbers. | |||||
| As a handy shortcut to avoid having to create and seed one yourself, you can call | |||||
| Random::getSystemRandom() to return a global RNG that is seeded randomly when the | |||||
| app launches. | |||||
| */ | */ | ||||
| class JUCE_API Random | class JUCE_API Random | ||||
| { | { | ||||
| @@ -25231,55 +25241,46 @@ public: | |||||
| horizontallyJustified = 64, | horizontallyJustified = 64, | ||||
| /** Indicates that the item should be centred vertically and horizontally. | /** Indicates that the item should be centred vertically and horizontally. | ||||
| This is equivalent to (horizontallyCentred | verticallyCentred) | This is equivalent to (horizontallyCentred | verticallyCentred) | ||||
| */ | */ | ||||
| centred = 36, | centred = 36, | ||||
| /** Indicates that the item should be centred vertically but placed on the left hand side. | /** Indicates that the item should be centred vertically but placed on the left hand side. | ||||
| This is equivalent to (left | verticallyCentred) | This is equivalent to (left | verticallyCentred) | ||||
| */ | */ | ||||
| centredLeft = 33, | centredLeft = 33, | ||||
| /** Indicates that the item should be centred vertically but placed on the right hand side. | /** Indicates that the item should be centred vertically but placed on the right hand side. | ||||
| This is equivalent to (right | verticallyCentred) | This is equivalent to (right | verticallyCentred) | ||||
| */ | */ | ||||
| centredRight = 34, | centredRight = 34, | ||||
| /** Indicates that the item should be centred horizontally and placed at the top. | /** Indicates that the item should be centred horizontally and placed at the top. | ||||
| This is equivalent to (horizontallyCentred | top) | This is equivalent to (horizontallyCentred | top) | ||||
| */ | */ | ||||
| centredTop = 12, | centredTop = 12, | ||||
| /** Indicates that the item should be centred horizontally and placed at the bottom. | /** Indicates that the item should be centred horizontally and placed at the bottom. | ||||
| This is equivalent to (horizontallyCentred | bottom) | This is equivalent to (horizontallyCentred | bottom) | ||||
| */ | */ | ||||
| centredBottom = 20, | centredBottom = 20, | ||||
| /** Indicates that the item should be placed in the top-left corner. | /** Indicates that the item should be placed in the top-left corner. | ||||
| This is equivalent to (left | top) | This is equivalent to (left | top) | ||||
| */ | */ | ||||
| topLeft = 9, | topLeft = 9, | ||||
| /** Indicates that the item should be placed in the top-right corner. | /** Indicates that the item should be placed in the top-right corner. | ||||
| This is equivalent to (right | top) | This is equivalent to (right | top) | ||||
| */ | */ | ||||
| topRight = 10, | topRight = 10, | ||||
| /** Indicates that the item should be placed in the bottom-left corner. | /** Indicates that the item should be placed in the bottom-left corner. | ||||
| This is equivalent to (left | bottom) | This is equivalent to (left | bottom) | ||||
| */ | */ | ||||
| bottomLeft = 17, | bottomLeft = 17, | ||||
| /** Indicates that the item should be placed in the bottom-left corner. | /** Indicates that the item should be placed in the bottom-left corner. | ||||
| This is equivalent to (right | bottom) | This is equivalent to (right | bottom) | ||||
| */ | */ | ||||
| bottomRight = 18 | bottomRight = 18 | ||||
| @@ -29356,7 +29357,7 @@ public: | |||||
| void setBottom (ValueType newBottomGap) throw() { bottom = newBottomGap; } | void setBottom (ValueType newBottomGap) throw() { bottom = newBottomGap; } | ||||
| /** Changes the right gap. */ | /** Changes the right gap. */ | ||||
| void setRight (ValueType newRightGap) throw() { right = newRightGap; } | |||||
| void setRight (ValueType newRightGap) throw() { right = newRightGap; } | |||||
| /** Returns a rectangle with these borders removed from it. */ | /** Returns a rectangle with these borders removed from it. */ | ||||
| const Rectangle<ValueType> subtractedFrom (const Rectangle<ValueType>& original) const throw() | const Rectangle<ValueType> subtractedFrom (const Rectangle<ValueType>& original) const throw() | ||||
| @@ -52249,7 +52250,11 @@ private: | |||||
| bool scrollWheelEnabled : 1, snapsToMousePos : 1; | bool scrollWheelEnabled : 1, snapsToMousePos : 1; | ||||
| ScopedPointer<Label> valueBox; | ScopedPointer<Label> valueBox; | ||||
| ScopedPointer<Button> incButton, decButton; | ScopedPointer<Button> incButton, decButton; | ||||
| ScopedPointer <Component> popupDisplay; | |||||
| class PopupDisplayComponent; | |||||
| friend class PopupDisplayComponent; | |||||
| friend class ScopedPointer <PopupDisplayComponent>; | |||||
| ScopedPointer <PopupDisplayComponent> popupDisplay; | |||||
| Component* parentForPopupDisplay; | Component* parentForPopupDisplay; | ||||
| float getLinearSliderPos (double value); | float getLinearSliderPos (double value); | ||||
| @@ -63582,11 +63587,13 @@ private: | |||||
| class ComponentBoundsConstrainer; | class ComponentBoundsConstrainer; | ||||
| /** | /** | ||||
| The base class for window objects that wrap a component as a real operating | |||||
| system object. | |||||
| The Component class uses a ComponentPeer internally to create and manage a real | |||||
| operating-system window. | |||||
| This is an abstract base class - the platform specific code contains implementations of | |||||
| it for the various platforms. | |||||
| This is an abstract base class - the platform specific code contains default | |||||
| implementations of it that create and manage windows. | |||||
| User-code should very rarely need to have any involvement with this class. | |||||
| @see Component::createNewPeer | @see Component::createNewPeer | ||||
| */ | */ | ||||
| @@ -64384,16 +64391,13 @@ public: | |||||
| const Path& pathToAdd, | const Path& pathToAdd, | ||||
| const AffineTransform& transform); | const AffineTransform& transform); | ||||
| /** Creates an edge table containing a rectangle. | |||||
| */ | |||||
| /** Creates an edge table containing a rectangle. */ | |||||
| EdgeTable (const Rectangle<int>& rectangleToAdd); | EdgeTable (const Rectangle<int>& rectangleToAdd); | ||||
| /** Creates an edge table containing a rectangle list. | |||||
| */ | |||||
| /** Creates an edge table containing a rectangle list. */ | |||||
| EdgeTable (const RectangleList& rectanglesToAdd); | EdgeTable (const RectangleList& rectanglesToAdd); | ||||
| /** Creates an edge table containing a rectangle. | |||||
| */ | |||||
| /** Creates an edge table containing a rectangle. */ | |||||
| EdgeTable (const Rectangle<float>& rectangleToAdd); | EdgeTable (const Rectangle<float>& rectangleToAdd); | ||||
| /** Creates a copy of another edge table. */ | /** Creates a copy of another edge table. */ | ||||
| @@ -64557,6 +64561,7 @@ private: | |||||
| class JUCE_API FillType | class JUCE_API FillType | ||||
| { | { | ||||
| public: | public: | ||||
| /** Creates a default fill type, of solid black. */ | /** Creates a default fill type, of solid black. */ | ||||
| FillType() throw(); | FillType() throw(); | ||||
| @@ -64620,9 +64625,6 @@ public: | |||||
| /** Returns true if this fill type is completely transparent. */ | /** Returns true if this fill type is completely transparent. */ | ||||
| bool isInvisible() const throw(); | bool isInvisible() const throw(); | ||||
| bool operator== (const FillType& other) const; | |||||
| bool operator!= (const FillType& other) const; | |||||
| /** The solid colour being used. | /** The solid colour being used. | ||||
| If the fill type is not a solid colour, the alpha channel of this colour indicates | If the fill type is not a solid colour, the alpha channel of this colour indicates | ||||
| @@ -64643,10 +64645,12 @@ public: | |||||
| */ | */ | ||||
| Image image; | Image image; | ||||
| /** The transform that should be applied to the image or gradient that's being drawn. | |||||
| */ | |||||
| /** The transform that should be applied to the image or gradient that's being drawn. */ | |||||
| AffineTransform transform; | AffineTransform transform; | ||||
| bool operator== (const FillType& other) const; | |||||
| bool operator!= (const FillType& other) const; | |||||
| private: | private: | ||||
| JUCE_LEAK_DETECTOR (FillType); | JUCE_LEAK_DETECTOR (FillType); | ||||
| }; | }; | ||||
| @@ -146,7 +146,7 @@ bool NamedValueSet::set (const Identifier& name, const var& newValue) | |||||
| if (v->name == name) | if (v->name == name) | ||||
| { | { | ||||
| if (v->value == newValue) | |||||
| if (v->value.equalsWithSameType (newValue)) | |||||
| return false; | return false; | ||||
| v->value = newValue; | v->value = newValue; | ||||
| @@ -33,7 +33,7 @@ | |||||
| */ | */ | ||||
| #define JUCE_MAJOR_VERSION 1 | #define JUCE_MAJOR_VERSION 1 | ||||
| #define JUCE_MINOR_VERSION 53 | #define JUCE_MINOR_VERSION 53 | ||||
| #define JUCE_BUILDNUMBER 40 | |||||
| #define JUCE_BUILDNUMBER 41 | |||||
| /** Current Juce version number. | /** Current Juce version number. | ||||
| @@ -37,11 +37,12 @@ BEGIN_JUCE_NAMESPACE | |||||
| //============================================================================== | //============================================================================== | ||||
| class SliderPopupDisplayComponent : public BubbleComponent | |||||
| class Slider::PopupDisplayComponent : public BubbleComponent, | |||||
| public Timer | |||||
| { | { | ||||
| public: | public: | ||||
| //============================================================================== | //============================================================================== | ||||
| SliderPopupDisplayComponent (Slider* const owner_) | |||||
| PopupDisplayComponent (Slider& owner_) | |||||
| : owner (owner_), | : owner (owner_), | ||||
| font (15.0f, Font::bold) | font (15.0f, Font::bold) | ||||
| { | { | ||||
| @@ -70,15 +71,21 @@ public: | |||||
| repaint(); | repaint(); | ||||
| } | } | ||||
| BubbleComponent::setPosition (owner); | |||||
| BubbleComponent::setPosition (&owner); | |||||
| repaint(); | |||||
| } | |||||
| void timerCallback() | |||||
| { | |||||
| owner.popupDisplay = 0; | |||||
| } | } | ||||
| private: | private: | ||||
| Slider* owner; | |||||
| Slider& owner; | |||||
| Font font; | Font font; | ||||
| String text; | String text; | ||||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SliderPopupDisplayComponent); | |||||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PopupDisplayComponent); | |||||
| }; | }; | ||||
| //============================================================================== | //============================================================================== | ||||
| @@ -118,7 +125,6 @@ Slider::Slider (const String& name) | |||||
| menuShown (false), | menuShown (false), | ||||
| scrollWheelEnabled (true), | scrollWheelEnabled (true), | ||||
| snapsToMousePos (true), | snapsToMousePos (true), | ||||
| popupDisplay (0), | |||||
| parentForPopupDisplay (0) | parentForPopupDisplay (0) | ||||
| { | { | ||||
| setWantsKeyboardFocus (false); | setWantsKeyboardFocus (false); | ||||
| @@ -491,12 +497,7 @@ void Slider::setValue (double newValue, | |||||
| repaint(); | repaint(); | ||||
| if (popupDisplay != 0) | if (popupDisplay != 0) | ||||
| { | |||||
| static_cast <SliderPopupDisplayComponent*> (static_cast <Component*> (popupDisplay)) | |||||
| ->updatePosition (getTextFromValue (newValue)); | |||||
| popupDisplay->repaint(); | |||||
| } | |||||
| popupDisplay->updatePosition (getTextFromValue (newValue)); | |||||
| if (sendUpdateMessage) | if (sendUpdateMessage) | ||||
| triggerChangeMessage (sendMessageSynchronously); | triggerChangeMessage (sendMessageSynchronously); | ||||
| @@ -551,12 +552,7 @@ void Slider::setMinValue (double newValue, const bool sendUpdateMessage, const b | |||||
| repaint(); | repaint(); | ||||
| if (popupDisplay != 0) | if (popupDisplay != 0) | ||||
| { | |||||
| static_cast <SliderPopupDisplayComponent*> (static_cast <Component*> (popupDisplay)) | |||||
| ->updatePosition (getTextFromValue (newValue)); | |||||
| popupDisplay->repaint(); | |||||
| } | |||||
| popupDisplay->updatePosition (getTextFromValue (newValue)); | |||||
| if (sendUpdateMessage) | if (sendUpdateMessage) | ||||
| triggerChangeMessage (sendMessageSynchronously); | triggerChangeMessage (sendMessageSynchronously); | ||||
| @@ -593,12 +589,7 @@ void Slider::setMaxValue (double newValue, const bool sendUpdateMessage, const b | |||||
| repaint(); | repaint(); | ||||
| if (popupDisplay != 0) | if (popupDisplay != 0) | ||||
| { | |||||
| static_cast <SliderPopupDisplayComponent*> (static_cast <Component*> (popupDisplay)) | |||||
| ->updatePosition (getTextFromValue (valueMax.getValue())); | |||||
| popupDisplay->repaint(); | |||||
| } | |||||
| popupDisplay->updatePosition (getTextFromValue (valueMax.getValue())); | |||||
| if (sendUpdateMessage) | if (sendUpdateMessage) | ||||
| triggerChangeMessage (sendMessageSynchronously); | triggerChangeMessage (sendMessageSynchronously); | ||||
| @@ -1111,17 +1102,13 @@ void Slider::mouseDown (const MouseEvent& e) | |||||
| if (popupDisplayEnabled) | if (popupDisplayEnabled) | ||||
| { | { | ||||
| SliderPopupDisplayComponent* const popup = new SliderPopupDisplayComponent (this); | |||||
| PopupDisplayComponent* const popup = new PopupDisplayComponent (*this); | |||||
| popupDisplay = popup; | popupDisplay = popup; | ||||
| if (parentForPopupDisplay != 0) | if (parentForPopupDisplay != 0) | ||||
| { | |||||
| parentForPopupDisplay->addChildComponent (popup); | parentForPopupDisplay->addChildComponent (popup); | ||||
| } | |||||
| else | else | ||||
| { | |||||
| popup->addToDesktop (0); | popup->addToDesktop (0); | ||||
| } | |||||
| popup->setVisible (true); | popup->setVisible (true); | ||||
| } | } | ||||
| @@ -1146,6 +1133,7 @@ void Slider::mouseUp (const MouseEvent&) | |||||
| triggerChangeMessage (false); | triggerChangeMessage (false); | ||||
| sendDragEnd(); | sendDragEnd(); | ||||
| popupDisplay = 0; | |||||
| if (style == IncDecButtons) | if (style == IncDecButtons) | ||||
| { | { | ||||
| @@ -1153,8 +1141,10 @@ void Slider::mouseUp (const MouseEvent&) | |||||
| decButton->setState (Button::buttonNormal); | decButton->setState (Button::buttonNormal); | ||||
| } | } | ||||
| } | } | ||||
| popupDisplay = 0; | |||||
| else if (popupDisplay != 0) | |||||
| { | |||||
| popupDisplay->startTimer (2000); | |||||
| } | |||||
| } | } | ||||
| void Slider::restoreMouseIfHidden() | void Slider::restoreMouseIfHidden() | ||||
| @@ -845,7 +845,11 @@ private: | |||||
| bool scrollWheelEnabled : 1, snapsToMousePos : 1; | bool scrollWheelEnabled : 1, snapsToMousePos : 1; | ||||
| ScopedPointer<Label> valueBox; | ScopedPointer<Label> valueBox; | ||||
| ScopedPointer<Button> incButton, decButton; | ScopedPointer<Button> incButton, decButton; | ||||
| ScopedPointer <Component> popupDisplay; | |||||
| class PopupDisplayComponent; | |||||
| friend class PopupDisplayComponent; | |||||
| friend class ScopedPointer <PopupDisplayComponent>; | |||||
| ScopedPointer <PopupDisplayComponent> popupDisplay; | |||||
| Component* parentForPopupDisplay; | Component* parentForPopupDisplay; | ||||
| float getLinearSliderPos (double value); | float getLinearSliderPos (double value); | ||||
| @@ -55,7 +55,7 @@ public: | |||||
| { | { | ||||
| if (--(getCounter().numObjects) < 0) | if (--(getCounter().numObjects) < 0) | ||||
| { | { | ||||
| DBG ("*** Dangling pointer deletion! Class: " << OwnerClass::getLeakedObjectClassName()); | |||||
| DBG ("*** Dangling pointer deletion! Class: " << getLeakedObjectClassName()); | |||||
| /** If you hit this, then you've managed to delete more instances of this class than you've | /** If you hit this, then you've managed to delete more instances of this class than you've | ||||
| created.. That indicates that you're deleting some dangling pointers. | created.. That indicates that you're deleting some dangling pointers. | ||||
| @@ -77,13 +77,13 @@ private: | |||||
| class LeakCounter | class LeakCounter | ||||
| { | { | ||||
| public: | public: | ||||
| LeakCounter() {} | |||||
| LeakCounter() throw() {} | |||||
| ~LeakCounter() | ~LeakCounter() | ||||
| { | { | ||||
| if (numObjects.value > 0) | if (numObjects.value > 0) | ||||
| { | { | ||||
| DBG ("*** Leaked objects detected: " << numObjects.value << " instance(s) of class " << OwnerClass::getLeakedObjectClassName()); | |||||
| DBG ("*** Leaked objects detected: " << numObjects.value << " instance(s) of class " << getLeakedObjectClassName()); | |||||
| /** If you hit this, then you've leaked one or more objects of the type specified by | /** If you hit this, then you've leaked one or more objects of the type specified by | ||||
| the 'OwnerClass' template parameter - the name should have been printed by the line above. | the 'OwnerClass' template parameter - the name should have been printed by the line above. | ||||
| @@ -99,6 +99,11 @@ private: | |||||
| Atomic<int> numObjects; | Atomic<int> numObjects; | ||||
| }; | }; | ||||
| static const char* getLeakedObjectClassName() | |||||
| { | |||||
| return OwnerClass::getLeakedObjectClassName(); | |||||
| } | |||||
| static LeakCounter& getCounter() throw() | static LeakCounter& getCounter() throw() | ||||
| { | { | ||||
| static LeakCounter counter; | static LeakCounter counter; | ||||