Browse Source

Minor fixes for Thread, ColourSelector, ToolbarButton.

tags/2021-05-28
jules 13 years ago
parent
commit
a64aa22af2
4 changed files with 86 additions and 53 deletions
  1. +56
    -36
      modules/juce_core/threads/juce_Thread.cpp
  2. +25
    -14
      modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp
  3. +4
    -2
      modules/juce_gui_basics/buttons/juce_ToolbarButton.h
  4. +1
    -1
      modules/juce_gui_extra/misc/juce_ColourSelector.cpp

+ 56
- 36
modules/juce_core/threads/juce_Thread.cpp View File

@@ -23,15 +23,61 @@
==============================================================================
*/
static ThreadLocalValue<Thread*>& getCurrentThreadHolder()
Thread::Thread (const String& threadName_)
: threadName (threadName_),
threadHandle (nullptr),
threadId (0),
threadPriority (5),
affinityMask (0),
shouldExit (false)
{
}
Thread::~Thread()
{
/* If your thread class's destructor has been called without first stopping the thread, that
means that this partially destructed object is still performing some work - and that's
probably a Bad Thing!
To avoid this type of nastiness, always make sure you call stopThread() before or during
your subclass's destructor.
*/
jassert (! isThreadRunning());
stopThread (100);
}
//==============================================================================
// Use a ref-counted object to hold this shared data, so that it can outlive its static
// shared pointer when threads are still running during static shutdown.
struct CurrentThreadHolder : public ReferenceCountedObject
{
static ThreadLocalValue<Thread*> tls;
return tls;
CurrentThreadHolder() noexcept {}
typedef ReferenceCountedObjectPtr <CurrentThreadHolder> Ptr;
ThreadLocalValue<Thread*> value;
JUCE_DECLARE_NON_COPYABLE (CurrentThreadHolder);
};
static char currentThreadHolderLock [sizeof (SpinLock)]; // (statically initialised to zeros).
static CurrentThreadHolder::Ptr getCurrentThreadHolder()
{
static CurrentThreadHolder::Ptr currentThreadHolder;
SpinLock::ScopedLockType lock (*reinterpret_cast <SpinLock*> (currentThreadHolderLock));
if (currentThreadHolder == nullptr)
currentThreadHolder = new CurrentThreadHolder();
return currentThreadHolder;
}
void Thread::threadEntryPoint()
{
getCurrentThreadHolder() = this;
const CurrentThreadHolder::Ptr currentThreadHolder (getCurrentThreadHolder());
currentThreadHolder->value = this;
JUCE_TRY
{
@@ -50,7 +96,7 @@ void Thread::threadEntryPoint()
}
JUCE_CATCH_ALL_ASSERT
getCurrentThreadHolder().releaseCurrentThreadStorage();
currentThreadHolder->value.releaseCurrentThreadStorage();
closeThreadHandle();
}
@@ -60,31 +106,6 @@ void JUCE_API juce_threadEntryPoint (void* userData)
static_cast <Thread*> (userData)->threadEntryPoint();
}
//==============================================================================
Thread::Thread (const String& threadName_)
: threadName (threadName_),
threadHandle (nullptr),
threadId (0),
threadPriority (5),
affinityMask (0),
shouldExit (false)
{
}
Thread::~Thread()
{
/* If your thread class's destructor has been called without first stopping the thread, that
means that this partially destructed object is still performing some work - and that's
probably a Bad Thing!
To avoid this type of nastiness, always make sure you call stopThread() before or during
your subclass's destructor.
*/
jassert (! isThreadRunning());
stopThread (100);
}
//==============================================================================
void Thread::startThread()
{
@@ -120,6 +141,11 @@ bool Thread::isThreadRunning() const
return threadHandle != nullptr;
}
Thread* Thread::getCurrentThread()
{
return getCurrentThreadHolder()->value.get();
}
//==============================================================================
void Thread::signalThreadShouldExit()
{
@@ -211,12 +237,6 @@ void Thread::notify() const
defaultEvent.signal();
}
//==============================================================================
Thread* Thread::getCurrentThread()
{
return *getCurrentThreadHolder();
}
//==============================================================================
void SpinLock::enter() const noexcept
{


+ 25
- 14
modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp View File

@@ -54,6 +54,22 @@ void ToolbarButton::contentAreaChanged (const Rectangle<int>&)
buttonStateChanged();
}
void ToolbarButton::setCurrentImage (Drawable* const newImage)
{
if (newImage != currentImage)
{
removeChildComponent (currentImage);
currentImage = newImage;
if (currentImage != nullptr)
{
enablementChanged();
addAndMakeVisible (currentImage);
updateDrawable();
}
}
}
void ToolbarButton::updateDrawable()
{
if (currentImage != nullptr)
@@ -75,23 +91,18 @@ void ToolbarButton::enablementChanged()
updateDrawable();
}
void ToolbarButton::buttonStateChanged()
Drawable* ToolbarButton::getImageToUse() const
{
Drawable* d = normalImage;
if (getStyle() == Toolbar::textOnly)
return nullptr;
if (getToggleState() && toggledOnImage != nullptr)
d = toggledOnImage;
return toggledOnImage;
if (d != currentImage)
{
removeChildComponent (currentImage);
currentImage = d;
return normalImage;
}
if (d != nullptr)
{
enablementChanged();
addAndMakeVisible (d);
updateDrawable();
}
}
void ToolbarButton::buttonStateChanged()
{
setCurrentImage (getImageToUse());
}

+ 4
- 2
modules/juce_gui_basics/buttons/juce_ToolbarButton.h View File

@@ -74,9 +74,9 @@ public:
bool getToolbarItemSizes (int toolbarDepth, bool isToolbarVertical, int& preferredSize,
int& minSize, int& maxSize);
/** @internal */
void paintButtonArea (Graphics& g, int width, int height, bool isMouseOver, bool isMouseDown);
void paintButtonArea (Graphics&, int width, int height, bool isMouseOver, bool isMouseDown);
/** @internal */
void contentAreaChanged (const Rectangle<int>& newBounds);
void contentAreaChanged (const Rectangle<int>&);
/** @internal */
void buttonStateChanged();
/** @internal */
@@ -90,6 +90,8 @@ private:
Drawable* currentImage;
void updateDrawable();
Drawable* getImageToUse() const;
void setCurrentImage (Drawable*);
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ToolbarButton);
};


+ 1
- 1
modules/juce_gui_extra/misc/juce_ColourSelector.cpp View File

@@ -443,7 +443,7 @@ void ColourSelector::paint (Graphics& g)
Colour (0xffffffff).overlaidWith (currentColour));
g.setColour (Colours::white.overlaidWith (currentColour).contrasting());
g.setFont (14.0f, true);
g.setFont (14.0f, Font::bold);
g.drawText (currentColour.toDisplayString ((flags & showAlphaChannel) != 0),
previewArea.getX(), previewArea.getY(), previewArea.getWidth(), previewArea.getHeight(),
Justification::centred, false);


Loading…
Cancel
Save