mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
New type of mouse cursor: ParentCursor, which means "show the same cursor as the parent component".
This commit is contained in:
parent
5d52b0e071
commit
b7089dfa45
14 changed files with 87 additions and 57 deletions
|
|
@ -35,15 +35,15 @@ bool File::copyInternal (const File& dest) const
|
|||
NSFileManager* fm = [NSFileManager defaultManager];
|
||||
|
||||
return [fm fileExistsAtPath: juceStringToNS (fullPath)]
|
||||
#if defined (MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
|
||||
#if defined (MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
|
||||
&& [fm copyItemAtPath: juceStringToNS (fullPath)
|
||||
toPath: juceStringToNS (dest.getFullPathName())
|
||||
error: nil];
|
||||
#else
|
||||
#else
|
||||
&& [fm copyPath: juceStringToNS (fullPath)
|
||||
toPath: juceStringToNS (dest.getFullPathName())
|
||||
handler: nil];
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
void File::findFileSystemRoots (Array<File>& destArray)
|
||||
|
|
@ -73,7 +73,7 @@ namespace FileHelpers
|
|||
|
||||
static bool isHiddenFile (const String& path)
|
||||
{
|
||||
#if defined (MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6
|
||||
#if defined (MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6
|
||||
JUCE_AUTORELEASEPOOL
|
||||
NSNumber* hidden = nil;
|
||||
NSError* err = nil;
|
||||
|
|
@ -81,25 +81,25 @@ namespace FileHelpers
|
|||
return [[NSURL fileURLWithPath: juceStringToNS (path)]
|
||||
getResourceValue: &hidden forKey: NSURLIsHiddenKey error: &err]
|
||||
&& [hidden boolValue];
|
||||
#elif JUCE_IOS
|
||||
#elif JUCE_IOS
|
||||
return File (path).getFileName().startsWithChar ('.');
|
||||
#else
|
||||
#else
|
||||
FSRef ref;
|
||||
LSItemInfoRecord info;
|
||||
|
||||
return FSPathMakeRefWithOptions ((const UInt8*) path.toUTF8().getAddress(), kFSPathMakeRefDoNotFollowLeafSymlink, &ref, 0) == noErr
|
||||
&& LSCopyItemInfoForRef (&ref, kLSRequestBasicFlagsOnly, &info) == noErr
|
||||
&& (info.flags & kLSItemInfoIsInvisible) != 0;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
#if JUCE_IOS
|
||||
#if JUCE_IOS
|
||||
String getIOSSystemLocation (NSSearchPathDirectory type)
|
||||
{
|
||||
return nsStringToJuce ([NSSearchPathForDirectoriesInDomains (type, NSUserDomainMask, YES)
|
||||
objectAtIndex: 0]);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static bool launchExecutable (const String& pathAndArguments)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -348,21 +348,18 @@ bool XmlElement::writeToFile (const File& file,
|
|||
const String& encodingType,
|
||||
const int lineWrapLength) const
|
||||
{
|
||||
if (file.hasWriteAccess())
|
||||
TemporaryFile tempFile (file);
|
||||
|
||||
{
|
||||
TemporaryFile tempFile (file);
|
||||
ScopedPointer <FileOutputStream> out (tempFile.getFile().createOutputStream());
|
||||
FileOutputStream out (tempFile.getFile());
|
||||
|
||||
if (out != nullptr)
|
||||
{
|
||||
writeToStream (*out, dtdToUse, false, true, encodingType, lineWrapLength);
|
||||
out = nullptr;
|
||||
if (! out.openedOk())
|
||||
return false;
|
||||
|
||||
return tempFile.overwriteTargetFileWithTemporary();
|
||||
}
|
||||
writeToStream (out, dtdToUse, false, true, encodingType, lineWrapLength);
|
||||
}
|
||||
|
||||
return false;
|
||||
return tempFile.overwriteTargetFileWithTemporary();
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
|
|
|||
|
|
@ -232,7 +232,7 @@ public:
|
|||
component->setBounds (getLocalBounds().withTop (getHeaderSize()));
|
||||
}
|
||||
|
||||
void mouseDown (const MouseEvent& e)
|
||||
void mouseDown (const MouseEvent&)
|
||||
{
|
||||
mouseDownY = getY();
|
||||
dragStartSizes = getPanel().getFittedSizes();
|
||||
|
|
@ -246,7 +246,7 @@ public:
|
|||
panel.getHeight()), false);
|
||||
}
|
||||
|
||||
void mouseDoubleClick (const MouseEvent& e)
|
||||
void mouseDoubleClick (const MouseEvent&)
|
||||
{
|
||||
getPanel().panelHeaderDoubleClicked (component);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,8 +31,8 @@ ResizableEdgeComponent::ResizableEdgeComponent (Component* const componentToResi
|
|||
edge (edge_)
|
||||
{
|
||||
setRepaintsOnMouseActivity (true);
|
||||
setMouseCursor (MouseCursor (isVertical() ? MouseCursor::LeftRightResizeCursor
|
||||
: MouseCursor::UpDownResizeCursor));
|
||||
setMouseCursor (isVertical() ? MouseCursor::LeftRightResizeCursor
|
||||
: MouseCursor::UpDownResizeCursor);
|
||||
}
|
||||
|
||||
ResizableEdgeComponent::~ResizableEdgeComponent()
|
||||
|
|
|
|||
|
|
@ -24,15 +24,15 @@
|
|||
*/
|
||||
|
||||
StretchableLayoutResizerBar::StretchableLayoutResizerBar (StretchableLayoutManager* layout_,
|
||||
const int itemIndex_,
|
||||
const bool isVertical_)
|
||||
const int index,
|
||||
const bool vertical)
|
||||
: layout (layout_),
|
||||
itemIndex (itemIndex_),
|
||||
isVertical (isVertical_)
|
||||
itemIndex (index),
|
||||
isVertical (vertical)
|
||||
{
|
||||
setRepaintsOnMouseActivity (true);
|
||||
setMouseCursor (MouseCursor (isVertical_ ? MouseCursor::LeftRightResizeCursor
|
||||
: MouseCursor::UpDownResizeCursor));
|
||||
setMouseCursor (vertical ? MouseCursor::LeftRightResizeCursor
|
||||
: MouseCursor::UpDownResizeCursor);
|
||||
}
|
||||
|
||||
StretchableLayoutResizerBar::~StretchableLayoutResizerBar()
|
||||
|
|
|
|||
|
|
@ -340,7 +340,16 @@ void LookAndFeel::setDefaultSansSerifTypefaceName (const String& newName)
|
|||
//==============================================================================
|
||||
MouseCursor LookAndFeel::getMouseCursorFor (Component& component)
|
||||
{
|
||||
return component.getMouseCursor();
|
||||
MouseCursor m (component.getMouseCursor());
|
||||
|
||||
Component* parent = component.getParentComponent();
|
||||
while (parent != nullptr && m == MouseCursor::ParentCursor)
|
||||
{
|
||||
m = parent->getMouseCursor();
|
||||
parent = parent->getParentComponent();
|
||||
}
|
||||
|
||||
return m;
|
||||
}
|
||||
|
||||
LowLevelGraphicsContext* LookAndFeel::createGraphicsContext (const Image& imageToRenderOn, const Point<int>& origin, const RectangleList& initialClip)
|
||||
|
|
@ -1687,8 +1696,8 @@ void LookAndFeel::layoutFilenameComponent (FilenameComponent& filenameComp,
|
|||
|
||||
//==============================================================================
|
||||
void LookAndFeel::drawConcertinaPanelHeader (Graphics& g, const Rectangle<int>& area,
|
||||
bool isMouseOver, bool isMouseDown,
|
||||
ConcertinaPanel& concertina, Component& panel)
|
||||
bool isMouseOver, bool /*isMouseDown*/,
|
||||
ConcertinaPanel&, Component& panel)
|
||||
{
|
||||
g.fillAll (Colours::grey.withAlpha (isMouseOver ? 0.9f : 0.7f));
|
||||
g.setColour (Colours::black.withAlpha (0.5f));
|
||||
|
|
|
|||
|
|
@ -49,19 +49,23 @@ public:
|
|||
|
||||
static SharedCursorHandle* createStandard (const MouseCursor::StandardCursorType type)
|
||||
{
|
||||
jassert (isPositiveAndBelow (type, MouseCursor::NumStandardCursorTypes));
|
||||
|
||||
const SpinLock::ScopedLockType sl (lock);
|
||||
|
||||
for (int i = 0; i < getCursors().size(); ++i)
|
||||
{
|
||||
SharedCursorHandle* const sc = getCursors().getUnchecked(i);
|
||||
SharedCursorHandle*& c = getSharedCursor (type);
|
||||
|
||||
if (sc->standardType == type)
|
||||
return sc->retain();
|
||||
}
|
||||
if (c == nullptr)
|
||||
c = new SharedCursorHandle (type);
|
||||
else
|
||||
c->retain();
|
||||
|
||||
SharedCursorHandle* const sc = new SharedCursorHandle (type);
|
||||
getCursors().add (sc);
|
||||
return sc;
|
||||
return c;
|
||||
}
|
||||
|
||||
bool isStandardType (MouseCursor::StandardCursorType type) const noexcept
|
||||
{
|
||||
return type == standardType && isStandard;
|
||||
}
|
||||
|
||||
SharedCursorHandle* retain() noexcept
|
||||
|
|
@ -77,7 +81,7 @@ public:
|
|||
if (isStandard)
|
||||
{
|
||||
const SpinLock::ScopedLockType sl (lock);
|
||||
getCursors().removeFirstMatchingValue (this);
|
||||
getSharedCursor (standardType) = nullptr;
|
||||
}
|
||||
|
||||
delete this;
|
||||
|
|
@ -86,19 +90,17 @@ public:
|
|||
|
||||
void* getHandle() const noexcept { return handle; }
|
||||
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
void* const handle;
|
||||
Atomic <int> refCount;
|
||||
const MouseCursor::StandardCursorType standardType;
|
||||
const bool isStandard;
|
||||
static SpinLock lock;
|
||||
|
||||
static Array <SharedCursorHandle*>& getCursors()
|
||||
static SharedCursorHandle*& getSharedCursor (const MouseCursor::StandardCursorType type)
|
||||
{
|
||||
static Array <SharedCursorHandle*> cursors;
|
||||
return cursors;
|
||||
static SharedCursorHandle* cursors [MouseCursor::NumStandardCursorTypes] = {};
|
||||
return cursors [type];
|
||||
}
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SharedCursorHandle);
|
||||
|
|
@ -113,7 +115,7 @@ MouseCursor::MouseCursor()
|
|||
}
|
||||
|
||||
MouseCursor::MouseCursor (const StandardCursorType type)
|
||||
: cursorHandle (type != MouseCursor::NormalCursor ? SharedCursorHandle::createStandard (type) : 0)
|
||||
: cursorHandle (type != MouseCursor::NormalCursor ? SharedCursorHandle::createStandard (type) : nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -164,11 +166,15 @@ bool MouseCursor::operator== (const MouseCursor& other) const noexcept
|
|||
return getHandle() == other.getHandle();
|
||||
}
|
||||
|
||||
bool MouseCursor::operator!= (const MouseCursor& other) const noexcept
|
||||
bool MouseCursor::operator== (StandardCursorType type) const noexcept
|
||||
{
|
||||
return getHandle() != other.getHandle();
|
||||
return cursorHandle != nullptr ? cursorHandle->isStandardType (type)
|
||||
: (type == NormalCursor);
|
||||
}
|
||||
|
||||
bool MouseCursor::operator!= (const MouseCursor& other) const noexcept { return ! operator== (other); }
|
||||
bool MouseCursor::operator!= (StandardCursorType type) const noexcept { return ! operator== (type); }
|
||||
|
||||
void* MouseCursor::getHandle() const noexcept
|
||||
{
|
||||
return cursorHandle != nullptr ? cursorHandle->getHandle() : nullptr;
|
||||
|
|
|
|||
|
|
@ -45,7 +45,9 @@ public:
|
|||
/** The set of available standard mouse cursors. */
|
||||
enum StandardCursorType
|
||||
{
|
||||
NoCursor = 0, /**< An invisible cursor. */
|
||||
ParentCursor = 0, /**< Indicates that the component's parent's cursor should be used. */
|
||||
|
||||
NoCursor, /**< An invisible cursor. */
|
||||
NormalCursor, /**< The stardard arrow cursor. */
|
||||
|
||||
WaitCursor, /**< The normal hourglass or spinning-beachball 'busy' cursor. */
|
||||
|
|
@ -68,7 +70,9 @@ public:
|
|||
TopLeftCornerResizeCursor, /**< A platform-specific cursor for resizing the top-left-corner of a window. */
|
||||
TopRightCornerResizeCursor, /**< A platform-specific cursor for resizing the top-right-corner of a window. */
|
||||
BottomLeftCornerResizeCursor, /**< A platform-specific cursor for resizing the bottom-left-corner of a window. */
|
||||
BottomRightCornerResizeCursor /**< A platform-specific cursor for resizing the bottom-right-corner of a window. */
|
||||
BottomRightCornerResizeCursor, /**< A platform-specific cursor for resizing the bottom-right-corner of a window. */
|
||||
|
||||
NumStandardCursorTypes
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
|
|
@ -120,6 +124,12 @@ public:
|
|||
*/
|
||||
bool operator!= (const MouseCursor& other) const noexcept;
|
||||
|
||||
/** Checks whether this cursor is of the standard type mentioned. */
|
||||
bool operator== (StandardCursorType type) const noexcept;
|
||||
|
||||
/** Checks whether this cursor is of the standard type mentioned. */
|
||||
bool operator!= (StandardCursorType type) const noexcept;
|
||||
|
||||
//==============================================================================
|
||||
/** Makes the system show its default 'busy' cursor.
|
||||
|
||||
|
|
|
|||
|
|
@ -2966,7 +2966,8 @@ void* MouseCursor::createStandardMouseCursor (MouseCursor::StandardCursorType ty
|
|||
|
||||
switch (type)
|
||||
{
|
||||
case NormalCursor: return None; // Use parent cursor
|
||||
case NormalCursor:
|
||||
case ParentCursor: return None; // Use parent cursor
|
||||
case NoCursor: return createMouseCursorFromImage (Image (Image::ARGB, 16, 16, true), 0, 0);
|
||||
|
||||
case WaitCursor: shape = XC_watch; break;
|
||||
|
|
|
|||
|
|
@ -86,7 +86,8 @@ void* MouseCursor::createStandardMouseCursor (MouseCursor::StandardCursorType ty
|
|||
|
||||
switch (type)
|
||||
{
|
||||
case NormalCursor: c = [NSCursor arrowCursor]; break;
|
||||
case NormalCursor:
|
||||
case ParentCursor: c = [NSCursor arrowCursor]; break;
|
||||
case NoCursor: return createMouseCursorFromImage (Image (Image::ARGB, 8, 8, true), 0, 0);
|
||||
case DraggingHandCursor: c = [NSCursor openHandCursor]; break;
|
||||
case WaitCursor: c = [NSCursor arrowCursor]; break; // avoid this on the mac, let the OS provide the beachball
|
||||
|
|
|
|||
|
|
@ -3193,7 +3193,8 @@ void* MouseCursor::createStandardMouseCursor (const MouseCursor::StandardCursorT
|
|||
|
||||
switch (type)
|
||||
{
|
||||
case NormalCursor: break;
|
||||
case NormalCursor:
|
||||
case ParentCursor: break;
|
||||
case NoCursor: return (void*) hiddenMouseCursorHandle;
|
||||
case WaitCursor: cursorName = IDC_WAIT; break;
|
||||
case IBeamCursor: cursorName = IDC_IBEAM; break;
|
||||
|
|
|
|||
|
|
@ -576,9 +576,14 @@ public:
|
|||
valueBox->addListener (this);
|
||||
|
||||
if (style == LinearBar)
|
||||
{
|
||||
valueBox->addMouseListener (&owner, false);
|
||||
valueBox->setMouseCursor (MouseCursor::ParentCursor);
|
||||
}
|
||||
else
|
||||
{
|
||||
valueBox->setTooltip (owner.getTooltip());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -865,7 +865,7 @@ public:
|
|||
{
|
||||
setWantsKeyboardFocus (false);
|
||||
setInterceptsMouseClicks (false, true);
|
||||
setMouseCursor (MouseCursor::IBeamCursor);
|
||||
setMouseCursor (MouseCursor::ParentCursor);
|
||||
|
||||
owner.getTextValue().addListener (this);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -333,7 +333,7 @@ CodeEditorComponent::CodeEditorComponent (CodeDocument& doc, CodeTokeniser* cons
|
|||
selectionEnd.setPositionMaintained (true);
|
||||
|
||||
setOpaque (true);
|
||||
setMouseCursor (MouseCursor (MouseCursor::IBeamCursor));
|
||||
setMouseCursor (MouseCursor::IBeamCursor);
|
||||
setWantsKeyboardFocus (true);
|
||||
|
||||
addAndMakeVisible (&verticalScrollBar);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue