Browse Source

Minor fixes for LeakedObjectDetector, Slider, NamedValueSet.

tags/2021-05-28
Julian Storer 14 years ago
parent
commit
f1a0c50aeb
7 changed files with 122 additions and 135 deletions
  1. +50
    -66
      juce_amalgamated.cpp
  2. +36
    -32
      juce_amalgamated.h
  3. +1
    -1
      src/containers/juce_NamedValueSet.cpp
  4. +1
    -1
      src/core/juce_StandardHeader.h
  5. +21
    -31
      src/gui/components/controls/juce_Slider.cpp
  6. +5
    -1
      src/gui/components/controls/juce_Slider.h
  7. +8
    -3
      src/memory/juce_LeakedObjectDetector.h

+ 50
- 66
juce_amalgamated.cpp View File

@@ -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;


+ 36
- 32
juce_amalgamated.h View File

@@ -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);
}; };


+ 1
- 1
src/containers/juce_NamedValueSet.cpp View File

@@ -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;


+ 1
- 1
src/core/juce_StandardHeader.h View File

@@ -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.


+ 21
- 31
src/gui/components/controls/juce_Slider.cpp View File

@@ -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()


+ 5
- 1
src/gui/components/controls/juce_Slider.h View File

@@ -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);


+ 8
- 3
src/memory/juce_LeakedObjectDetector.h View File

@@ -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;


Loading…
Cancel
Save