1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-25 02:04:23 +00:00
JUCE/modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm

137 lines
4.1 KiB
Text

/*
==============================================================================
This file is part of the JUCE library.
Copyright (c) 2015 - ROLI Ltd.
Permission is granted to use this software under the terms of either:
a) the GPL v2 (or any later version)
b) the Affero GPL v3
Details of these licenses can be found at: www.gnu.org/licenses
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
------------------------------------------------------------------------------
To release a closed-source product which uses JUCE, commercial licenses are
available: visit www.juce.com for more information.
==============================================================================
*/
// Note: for the Bluetooth Midi selector overlay, we need the class
// UIViewComponent from the juce_gui_extra module. If this module is not
// included in your app, BluetoothMidiDevicePairingDialogue::open() will fail
// and return false.
// It is also not available in the iPhone/iPad simulator.
#if JUCE_MODULE_AVAILABLE_juce_gui_extra && ! TARGET_IPHONE_SIMULATOR
} // (juce namespace)
#include <CoreAudioKit/CoreAudioKit.h>
//==============================================================================
@interface BluetoothSelectorView : NSObject
@property (nonatomic, retain) CABTMIDICentralViewController *central;
- (UIView*) getView;
@end
//==============================================================================
@implementation BluetoothSelectorView
- (instancetype) init
{
self = [super init];
self.central = [[CABTMIDICentralViewController alloc] init];
return self;
}
- (UIView*) getView
{
return self.central.view;
}
@end
namespace juce
{
//==============================================================================
class BluetoothMidiSelectorOverlay : public Component
{
public:
BluetoothMidiSelectorOverlay()
{
setAlwaysOnTop (true);
setVisible (true);
addToDesktop (ComponentPeer::windowHasDropShadow);
setBounds (0, 0, getParentWidth(), getParentHeight());
toFront (true);
nativeSelectorComponent.setView ([[[BluetoothSelectorView alloc] init] getView]);
addAndMakeVisible (nativeSelectorComponent);
enterModalState (true, nullptr, true);
}
void paint (Graphics& g) override
{
g.fillAll (Colours::black.withAlpha (0.5f));
}
void inputAttemptWhenModal() override { close(); }
void mouseDrag (const MouseEvent&) override {}
void mouseDown (const MouseEvent&) override { close(); }
void resized() override { update(); }
void parentSizeChanged() override { update(); }
private:
void update()
{
const int pw = getParentWidth();
const int ph = getParentHeight();
nativeSelectorComponent.setBounds (Rectangle<int> (pw, ph)
.withSizeKeepingCentre (jmin (400, pw - 14),
jmin (500, ph - 40)));
}
void close()
{
exitModalState (0);
setVisible (false);
}
UIViewComponent nativeSelectorComponent;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BluetoothMidiSelectorOverlay)
};
bool BluetoothMidiDevicePairingDialogue::open()
{
if (isAvailable())
{
new BluetoothMidiSelectorOverlay();
return true;
}
return false;
}
bool BluetoothMidiDevicePairingDialogue::isAvailable()
{
return NSClassFromString ([NSString stringWithUTF8String: "CABTMIDICentralViewController"]) != nil;
}
//==============================================================================
#else
bool BluetoothMidiDevicePairingDialogue::open() { return false; }
bool BluetoothMidiDevicePairingDialogue::isAvailable() { return false; }
#endif