Browse Source

Tidied up some macOS ObjC conversion methods

tags/2021-05-28
hogliux 7 years ago
parent
commit
7d056e2670
2 changed files with 19 additions and 40 deletions
  1. +17
    -38
      modules/juce_core/native/juce_osx_ObjCHelpers.h
  2. +2
    -2
      modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm

+ 17
- 38
modules/juce_core/native/juce_osx_ObjCHelpers.h View File

@@ -145,29 +145,14 @@ static NSArray* varArrayToNSArray (const var& varToParse)
return array; return array;
} }
static var nsArrayToVar (NSArray* array);
static var nsObjectToVar (NSObject* array);
static var nsDictionaryToVar (NSDictionary* dictionary) static var nsDictionaryToVar (NSDictionary* dictionary)
{ {
DynamicObject::Ptr dynamicObject = new DynamicObject(); DynamicObject::Ptr dynamicObject = new DynamicObject();
for (NSString* key in dictionary) for (NSString* key in dictionary)
{
const auto keyString = nsStringToJuce (key);
id value = dictionary[key];
if ([value isKindOfClass: [NSString class]])
dynamicObject->setProperty (keyString, nsStringToJuce ((NSString*) value));
else if ([value isKindOfClass: [NSNumber class]])
dynamicObject->setProperty (keyString, nsStringToJuce ([(NSNumber*) value stringValue]));
else if ([value isKindOfClass: [NSDictionary class]])
dynamicObject->setProperty (keyString, nsDictionaryToVar ((NSDictionary*) value));
else if ([value isKindOfClass: [NSArray class]])
dynamicObject->setProperty (keyString, nsArrayToVar ((NSArray*) value));
else
jassertfalse; // Unsupported yet, add here!
}
dynamicObject->setProperty (nsStringToJuce (key), nsObjectToVar (dictionary[key]));
return var (dynamicObject.get()); return var (dynamicObject.get());
} }
@@ -177,20 +162,24 @@ static var nsArrayToVar (NSArray* array)
Array<var> resultArray; Array<var> resultArray;
for (id value in array) for (id value in array)
resultArray.add (nsObjectToVar (value));
return var (resultArray);
}
static var nsObjectToVar (NSObject* obj)
{
if ([obj isKindOfClass: [NSString class]]) return nsStringToJuce ((NSString*) obj);
else if ([obj isKindOfClass: [NSNumber class]]) return nsStringToJuce ([(NSNumber*) obj stringValue]);
else if ([obj isKindOfClass: [NSDictionary class]]) return nsDictionaryToVar ((NSDictionary*) obj);
else if ([obj isKindOfClass: [NSArray class]]) return nsArrayToVar ((NSArray*) obj);
else
{ {
if ([value isKindOfClass: [NSString class]])
resultArray.add (var (nsStringToJuce ((NSString*) value)));
else if ([value isKindOfClass: [NSNumber class]])
resultArray.add (var (nsStringToJuce ([(NSNumber*) value stringValue])));
else if ([value isKindOfClass: [NSDictionary class]])
resultArray.add (nsDictionaryToVar ((NSDictionary*) value));
else if ([value isKindOfClass: [NSArray class]])
resultArray.add (nsArrayToVar ((NSArray*) value));
else
jassertfalse; // Unsupported yet, add here!
// Unsupported yet, add here!
jassertfalse;
} }
return var (resultArray);
return {};
} }
#if JUCE_MAC #if JUCE_MAC
@@ -226,16 +215,6 @@ static inline MsgSendFPRetFn getMsgSendFPRetFn() noexcept { return (MsgSendFPR
#endif #endif
#endif #endif
//==============================================================================
template <typename ObjectType>
struct NSObjectRetainer
{
inline NSObjectRetainer (ObjectType* o) : object (o) { [object retain]; }
inline ~NSObjectRetainer() { [object release]; }
ObjectType* object;
};
//============================================================================== //==============================================================================
struct NSObjectDeleter struct NSObjectDeleter
{ {


+ 2
- 2
modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm View File

@@ -780,7 +780,7 @@ public:
{ {
// (need to retain this in case a modal loop runs in handleKeyEvent and // (need to retain this in case a modal loop runs in handleKeyEvent and
// our event object gets lost) // our event object gets lost)
const NSObjectRetainer<NSEvent> r (ev);
const std::unique_ptr<NSEvent, NSObjectDeleter> r ([ev retain]);
updateKeysDown (ev, true); updateKeysDown (ev, true);
bool used = handleKeyEvent (ev, true); bool used = handleKeyEvent (ev, true);
@@ -810,7 +810,7 @@ public:
void redirectModKeyChange (NSEvent* ev) void redirectModKeyChange (NSEvent* ev)
{ {
// (need to retain this in case a modal loop runs and our event object gets lost) // (need to retain this in case a modal loop runs and our event object gets lost)
const NSObjectRetainer<NSEvent> r (ev);
const std::unique_ptr<NSEvent, NSObjectDeleter> r ([ev retain]);
keysCurrentlyDown.clear(); keysCurrentlyDown.clear();
handleKeyUpOrDown (true); handleKeyUpOrDown (true);


Loading…
Cancel
Save