mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-09 23:34:20 +00:00
added the AppleRemoteDevice class
This commit is contained in:
parent
eabf835cb7
commit
2f7be7bcbe
5 changed files with 621 additions and 206 deletions
|
|
@ -1,178 +1,178 @@
|
|||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library - "Jules' Utility Class Extensions"
|
||||
Copyright 2004-7 by Raw Material Software ltd.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
JUCE can be redistributed and/or modified under the terms of the
|
||||
GNU General Public License, as published by the Free Software Foundation;
|
||||
either version 2 of the License, or (at your option) any later version.
|
||||
|
||||
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.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with JUCE; if not, visit www.gnu.org/licenses or write to the
|
||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
Boston, MA 02111-1307 USA
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
If you'd like to release a closed-source product which uses JUCE, commercial
|
||||
licenses are also available: visit www.rawmaterialsoftware.com/juce for
|
||||
more information.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#include "jucedemo_headers.h"
|
||||
#include "MainDemoWindow.h"
|
||||
|
||||
|
||||
//==============================================================================
|
||||
class JUCEDemoApplication : public JUCEApplication
|
||||
{
|
||||
/* Important! NEVER embed objects directly inside your JUCEApplication class! Use
|
||||
ONLY pointers to objects, which you should create during the initialise() method
|
||||
(NOT in the constructor!) and delete in the shutdown() method (NOT in the
|
||||
destructor!)
|
||||
|
||||
This is because the application object gets created before Juce has been properly
|
||||
initialised, so any embedded objects would also get constructed too soon.
|
||||
*/
|
||||
MainDemoWindow* theMainWindow;
|
||||
|
||||
public:
|
||||
//==============================================================================
|
||||
JUCEDemoApplication()
|
||||
: theMainWindow (0)
|
||||
{
|
||||
// NEVER do anything in here that could involve any Juce function being called
|
||||
// - leave all your startup tasks until the initialise() method.
|
||||
}
|
||||
|
||||
~JUCEDemoApplication()
|
||||
{
|
||||
// Your shutdown() method should already have done all the things necessary to
|
||||
// clean up this app object, so you should never need to put anything in
|
||||
// the destructor.
|
||||
|
||||
// Making any Juce calls in here could be very dangerous...
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
void initialise (const String& commandLine)
|
||||
{
|
||||
// just create the main window...
|
||||
theMainWindow = new MainDemoWindow();
|
||||
theMainWindow->centreWithSize (700, 600);
|
||||
theMainWindow->setVisible (true);
|
||||
|
||||
// this little function just demonstrates a few system info calls
|
||||
Logger::outputDebugString (collectSomeSystemInfo());
|
||||
|
||||
/* on return from this method, the app will go into its the main event
|
||||
dispatch loop, and this will run until something calls
|
||||
JUCEAppliction::quit().
|
||||
|
||||
In this case, JUCEAppliction::quit() will be called by the
|
||||
demo window when the user clicks on its close button.
|
||||
*/
|
||||
}
|
||||
|
||||
void shutdown()
|
||||
{
|
||||
delete theMainWindow;
|
||||
theMainWindow = 0;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
const String getApplicationName()
|
||||
{
|
||||
return T("JUCE Demo");
|
||||
}
|
||||
|
||||
const String getApplicationVersion()
|
||||
{
|
||||
return T("1.0");
|
||||
}
|
||||
|
||||
bool moreThanOneInstanceAllowed()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
void anotherInstanceStarted (const String& commandLine)
|
||||
{
|
||||
// This will get called if the user launches another copy of the app, but
|
||||
// there's nothing that the demo app needs to do here.
|
||||
}
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
// this little function just demonstrates a few system info calls
|
||||
static const String collectSomeSystemInfo()
|
||||
{
|
||||
String systemInfo;
|
||||
|
||||
systemInfo
|
||||
<< T("Time and date: ") << Time::getCurrentTime().toString (true, true)
|
||||
<< T("\nOperating system: ") << SystemStats::getOperatingSystemName()
|
||||
<< T("\nCPU vendor: ") << SystemStats::getCpuVendor()
|
||||
<< T("\nCPU speed: ") << SystemStats::getCpuSpeedInMegaherz() << T("MHz\n")
|
||||
<< T("\nNumber of physical CPUs: ") << SystemStats::getNumPhysicalCpus()
|
||||
<< T("\nNumber of logical CPUs: ") << SystemStats::getNumLogicalCpus()
|
||||
<< T("\nCPU has MMX: ") << (SystemStats::hasMMX() ? T("yes") : T("no"))
|
||||
<< T("\nCPU has SSE: ") << (SystemStats::hasSSE() ? T("yes") : T("no"))
|
||||
<< T("\nCPU has SSE2: ") << (SystemStats::hasSSE2() ? T("yes") : T("no"))
|
||||
<< T("\nCPU has 3DNOW: ") << (SystemStats::has3DNow() ? T("yes") : T("no"))
|
||||
<< T("\nCPU has hyperthreading: ") << (SystemStats::hasHyperThreading() ? T("yes") : T("no"))
|
||||
<< T("\nMemory size: ") << SystemStats::getMemorySizeInMegabytes() << T("MB\n");
|
||||
|
||||
int64 macAddresses[8];
|
||||
const int numAddresses = SystemStats::getMACAddresses (macAddresses, 8);
|
||||
|
||||
for (int i = 0; i < numAddresses; ++i)
|
||||
{
|
||||
systemInfo
|
||||
<< T("Found network card MAC address: ")
|
||||
<< String::formatted (T("%02x-%02x-%02x-%02x-%02x-%02x\n"),
|
||||
0xff & (int) (macAddresses [i] >> 40),
|
||||
0xff & (int) (macAddresses [i] >> 32),
|
||||
0xff & (int) (macAddresses [i] >> 24),
|
||||
0xff & (int) (macAddresses [i] >> 16),
|
||||
0xff & (int) (macAddresses [i] >> 8),
|
||||
0xff & (int) macAddresses [i]);
|
||||
}
|
||||
|
||||
systemInfo
|
||||
<< T("Current executable file: ")
|
||||
<< File::getSpecialLocation (File::currentExecutableFile).getFullPathName()
|
||||
<< T("\nCurrent application file: ")
|
||||
<< File::getSpecialLocation (File::currentApplicationFile).getFullPathName()
|
||||
<< T("\nUser home directory: ")
|
||||
<< File::getSpecialLocation (File::userHomeDirectory).getFullPathName()
|
||||
<< T("\nUser documents directory: ")
|
||||
<< File::getSpecialLocation (File::userDocumentsDirectory).getFullPathName()
|
||||
<< T("\nUser application data directory: ")
|
||||
<< File::getSpecialLocation (File::userApplicationDataDirectory).getFullPathName()
|
||||
<< T("\nCommon application data directory: ")
|
||||
<< File::getSpecialLocation (File::commonApplicationDataDirectory).getFullPathName()
|
||||
<< T("\nTemp directory: ")
|
||||
<< File::getSpecialLocation (File::tempDirectory).getFullPathName()
|
||||
<< T("\n\n");
|
||||
|
||||
return systemInfo;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//==============================================================================
|
||||
/*
|
||||
This macro creates the application's main() function..
|
||||
*/
|
||||
START_JUCE_APPLICATION (JUCEDemoApplication)
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library - "Jules' Utility Class Extensions"
|
||||
Copyright 2004-7 by Raw Material Software ltd.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
JUCE can be redistributed and/or modified under the terms of the
|
||||
GNU General Public License, as published by the Free Software Foundation;
|
||||
either version 2 of the License, or (at your option) any later version.
|
||||
|
||||
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.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with JUCE; if not, visit www.gnu.org/licenses or write to the
|
||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
Boston, MA 02111-1307 USA
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
If you'd like to release a closed-source product which uses JUCE, commercial
|
||||
licenses are also available: visit www.rawmaterialsoftware.com/juce for
|
||||
more information.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#include "jucedemo_headers.h"
|
||||
#include "MainDemoWindow.h"
|
||||
|
||||
|
||||
//==============================================================================
|
||||
class JUCEDemoApplication : public JUCEApplication
|
||||
{
|
||||
/* Important! NEVER embed objects directly inside your JUCEApplication class! Use
|
||||
ONLY pointers to objects, which you should create during the initialise() method
|
||||
(NOT in the constructor!) and delete in the shutdown() method (NOT in the
|
||||
destructor!)
|
||||
|
||||
This is because the application object gets created before Juce has been properly
|
||||
initialised, so any embedded objects would also get constructed too soon.
|
||||
*/
|
||||
MainDemoWindow* theMainWindow;
|
||||
|
||||
public:
|
||||
//==============================================================================
|
||||
JUCEDemoApplication()
|
||||
: theMainWindow (0)
|
||||
{
|
||||
// NEVER do anything in here that could involve any Juce function being called
|
||||
// - leave all your startup tasks until the initialise() method.
|
||||
}
|
||||
|
||||
~JUCEDemoApplication()
|
||||
{
|
||||
// Your shutdown() method should already have done all the things necessary to
|
||||
// clean up this app object, so you should never need to put anything in
|
||||
// the destructor.
|
||||
|
||||
// Making any Juce calls in here could be very dangerous...
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
void initialise (const String& commandLine)
|
||||
{
|
||||
// just create the main window...
|
||||
theMainWindow = new MainDemoWindow();
|
||||
theMainWindow->centreWithSize (700, 600);
|
||||
theMainWindow->setVisible (true);
|
||||
|
||||
// this little function just demonstrates a few system info calls
|
||||
Logger::outputDebugString (collectSomeSystemInfo());
|
||||
|
||||
/* on return from this method, the app will go into its the main event
|
||||
dispatch loop, and this will run until something calls
|
||||
JUCEAppliction::quit().
|
||||
|
||||
In this case, JUCEAppliction::quit() will be called by the
|
||||
demo window when the user clicks on its close button.
|
||||
*/
|
||||
}
|
||||
|
||||
void shutdown()
|
||||
{
|
||||
delete theMainWindow;
|
||||
theMainWindow = 0;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
const String getApplicationName()
|
||||
{
|
||||
return T("JUCE Demo");
|
||||
}
|
||||
|
||||
const String getApplicationVersion()
|
||||
{
|
||||
return T("1.0");
|
||||
}
|
||||
|
||||
bool moreThanOneInstanceAllowed()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
void anotherInstanceStarted (const String& commandLine)
|
||||
{
|
||||
// This will get called if the user launches another copy of the app, but
|
||||
// there's nothing that the demo app needs to do here.
|
||||
}
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
// this little function just demonstrates a few system info calls
|
||||
static const String collectSomeSystemInfo()
|
||||
{
|
||||
String systemInfo;
|
||||
|
||||
systemInfo
|
||||
<< T("Time and date: ") << Time::getCurrentTime().toString (true, true)
|
||||
<< T("\nOperating system: ") << SystemStats::getOperatingSystemName()
|
||||
<< T("\nCPU vendor: ") << SystemStats::getCpuVendor()
|
||||
<< T("\nCPU speed: ") << SystemStats::getCpuSpeedInMegaherz() << T("MHz\n")
|
||||
<< T("\nNumber of physical CPUs: ") << SystemStats::getNumPhysicalCpus()
|
||||
<< T("\nNumber of logical CPUs: ") << SystemStats::getNumLogicalCpus()
|
||||
<< T("\nCPU has MMX: ") << (SystemStats::hasMMX() ? T("yes") : T("no"))
|
||||
<< T("\nCPU has SSE: ") << (SystemStats::hasSSE() ? T("yes") : T("no"))
|
||||
<< T("\nCPU has SSE2: ") << (SystemStats::hasSSE2() ? T("yes") : T("no"))
|
||||
<< T("\nCPU has 3DNOW: ") << (SystemStats::has3DNow() ? T("yes") : T("no"))
|
||||
<< T("\nCPU has hyperthreading: ") << (SystemStats::hasHyperThreading() ? T("yes") : T("no"))
|
||||
<< T("\nMemory size: ") << SystemStats::getMemorySizeInMegabytes() << T("MB\n");
|
||||
|
||||
int64 macAddresses[8];
|
||||
const int numAddresses = SystemStats::getMACAddresses (macAddresses, 8);
|
||||
|
||||
for (int i = 0; i < numAddresses; ++i)
|
||||
{
|
||||
systemInfo
|
||||
<< T("Found network card MAC address: ")
|
||||
<< String::formatted (T("%02x-%02x-%02x-%02x-%02x-%02x\n"),
|
||||
0xff & (int) (macAddresses [i] >> 40),
|
||||
0xff & (int) (macAddresses [i] >> 32),
|
||||
0xff & (int) (macAddresses [i] >> 24),
|
||||
0xff & (int) (macAddresses [i] >> 16),
|
||||
0xff & (int) (macAddresses [i] >> 8),
|
||||
0xff & (int) macAddresses [i]);
|
||||
}
|
||||
|
||||
systemInfo
|
||||
<< T("Current executable file: ")
|
||||
<< File::getSpecialLocation (File::currentExecutableFile).getFullPathName()
|
||||
<< T("\nCurrent application file: ")
|
||||
<< File::getSpecialLocation (File::currentApplicationFile).getFullPathName()
|
||||
<< T("\nUser home directory: ")
|
||||
<< File::getSpecialLocation (File::userHomeDirectory).getFullPathName()
|
||||
<< T("\nUser documents directory: ")
|
||||
<< File::getSpecialLocation (File::userDocumentsDirectory).getFullPathName()
|
||||
<< T("\nUser application data directory: ")
|
||||
<< File::getSpecialLocation (File::userApplicationDataDirectory).getFullPathName()
|
||||
<< T("\nCommon application data directory: ")
|
||||
<< File::getSpecialLocation (File::commonApplicationDataDirectory).getFullPathName()
|
||||
<< T("\nTemp directory: ")
|
||||
<< File::getSpecialLocation (File::tempDirectory).getFullPathName()
|
||||
<< T("\n\n");
|
||||
|
||||
return systemInfo;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//==============================================================================
|
||||
/*
|
||||
This macro creates the application's main() function..
|
||||
*/
|
||||
START_JUCE_APPLICATION (JUCEDemoApplication)
|
||||
|
|
|
|||
|
|
@ -1024,6 +1024,85 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
#if JUCE_MAC
|
||||
|
||||
//==============================================================================
|
||||
/** This pops open a dialog box and waits for you to press keys on your Apple Remote,
|
||||
which it describes in the box.
|
||||
*/
|
||||
class AppleRemoteTestWindow : public AlertWindow,
|
||||
public AppleRemoteDevice
|
||||
{
|
||||
public:
|
||||
AppleRemoteTestWindow()
|
||||
: AlertWindow ("Apple Remote Control Test!",
|
||||
"If you've got an Apple Remote, press some buttons now...",
|
||||
AlertWindow::NoIcon)
|
||||
{
|
||||
addButton (T("done"), 0);
|
||||
|
||||
// (To open the device in non-exclusive mode, pass 'false' in here)..
|
||||
if (! start (true))
|
||||
setMessage ("Couldn't open the remote control device!");
|
||||
}
|
||||
|
||||
~AppleRemoteTestWindow()
|
||||
{
|
||||
stop();
|
||||
}
|
||||
|
||||
void buttonPressed (const ButtonType buttonId, const bool isDown)
|
||||
{
|
||||
String desc;
|
||||
|
||||
switch (buttonId)
|
||||
{
|
||||
case menuButton:
|
||||
desc = "menu button (short)";
|
||||
break;
|
||||
case playButton:
|
||||
desc = "play button";
|
||||
break;
|
||||
case plusButton:
|
||||
desc = "plus button";
|
||||
break;
|
||||
case minusButton:
|
||||
desc = "minus button";
|
||||
break;
|
||||
case rightButton:
|
||||
desc = "right button (short)";
|
||||
break;
|
||||
case leftButton:
|
||||
desc = "left button (short)";
|
||||
break;
|
||||
case rightButton_Long:
|
||||
desc = "right button (long)";
|
||||
break;
|
||||
case leftButton_Long:
|
||||
desc = "left button (long)";
|
||||
break;
|
||||
case menuButton_Long:
|
||||
desc = "menu button (long)";
|
||||
break;
|
||||
case playButtonSleepMode:
|
||||
desc = "play (sleep mode)";
|
||||
break;
|
||||
case switched:
|
||||
desc = "remote switched";
|
||||
break;
|
||||
}
|
||||
|
||||
if (isDown)
|
||||
desc << " -- [down]";
|
||||
else
|
||||
desc << " -- [up]";
|
||||
|
||||
setMessage (desc);
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
//==============================================================================
|
||||
const int numGroups = 4;
|
||||
|
||||
|
|
@ -1085,67 +1164,71 @@ public:
|
|||
else if (button == menuButton)
|
||||
{
|
||||
PopupMenu m;
|
||||
m.addItem (1, T("normal item"));
|
||||
m.addItem (2, T("disabled item"), false);
|
||||
m.addItem (3, T("ticked item"), true, true);
|
||||
m.addColouredItem (4, T("coloured item"), Colours::green);
|
||||
m.addItem (1, T("Normal item"));
|
||||
m.addItem (2, T("Disabled item"), false);
|
||||
m.addItem (3, T("Ticked item"), true, true);
|
||||
m.addColouredItem (4, T("Coloured item"), Colours::green);
|
||||
m.addSeparator();
|
||||
m.addCustomItem (5, new CustomMenuComponent());
|
||||
|
||||
m.addSeparator();
|
||||
|
||||
PopupMenu tabsMenu;
|
||||
tabsMenu.addItem (1001, T("show tabs at the top"), true, tabs->getOrientation() == TabbedButtonBar::TabsAtTop);
|
||||
tabsMenu.addItem (1002, T("show tabs at the bottom"), true, tabs->getOrientation() == TabbedButtonBar::TabsAtBottom);
|
||||
tabsMenu.addItem (1003, T("show tabs at the left"), true, tabs->getOrientation() == TabbedButtonBar::TabsAtLeft);
|
||||
tabsMenu.addItem (1004, T("show tabs at the right"), true, tabs->getOrientation() == TabbedButtonBar::TabsAtRight);
|
||||
m.addSubMenu (T("tab position"), tabsMenu);
|
||||
tabsMenu.addItem (1001, T("Show tabs at the top"), true, tabs->getOrientation() == TabbedButtonBar::TabsAtTop);
|
||||
tabsMenu.addItem (1002, T("Show tabs at the bottom"), true, tabs->getOrientation() == TabbedButtonBar::TabsAtBottom);
|
||||
tabsMenu.addItem (1003, T("Show tabs at the left"), true, tabs->getOrientation() == TabbedButtonBar::TabsAtLeft);
|
||||
tabsMenu.addItem (1004, T("Show tabs at the right"), true, tabs->getOrientation() == TabbedButtonBar::TabsAtRight);
|
||||
m.addSubMenu (T("Tab position"), tabsMenu);
|
||||
|
||||
m.addSeparator();
|
||||
|
||||
PopupMenu dialogMenu;
|
||||
dialogMenu.addItem (100, T("show a plain alert-window..."));
|
||||
dialogMenu.addItem (101, T("show an alert-window with a 'warning' icon..."));
|
||||
dialogMenu.addItem (102, T("show an alert-window with an 'info' icon..."));
|
||||
dialogMenu.addItem (103, T("show an alert-window with a 'question' icon..."));
|
||||
dialogMenu.addItem (100, T("Show a plain alert-window..."));
|
||||
dialogMenu.addItem (101, T("Show an alert-window with a 'warning' icon..."));
|
||||
dialogMenu.addItem (102, T("Show an alert-window with an 'info' icon..."));
|
||||
dialogMenu.addItem (103, T("Show an alert-window with a 'question' icon..."));
|
||||
|
||||
dialogMenu.addSeparator();
|
||||
|
||||
dialogMenu.addItem (110, T("show an ok/cancel alert-window..."));
|
||||
dialogMenu.addItem (110, T("Show an ok/cancel alert-window..."));
|
||||
|
||||
dialogMenu.addSeparator();
|
||||
|
||||
dialogMenu.addItem (111, T("show an alert-window with some extra components..."));
|
||||
dialogMenu.addItem (111, T("Show an alert-window with some extra components..."));
|
||||
|
||||
dialogMenu.addSeparator();
|
||||
|
||||
dialogMenu.addItem (112, T("show a ThreadWithProgressWindow demo..."));
|
||||
dialogMenu.addItem (112, T("Show a ThreadWithProgressWindow demo..."));
|
||||
|
||||
m.addSubMenu (T("AlertWindow demonstrations"), dialogMenu);
|
||||
|
||||
dialogMenu.addSeparator();
|
||||
m.addSeparator();
|
||||
|
||||
m.addItem (120, T("show a colour selector demo..."));
|
||||
m.addItem (120, T("Show a colour selector demo..."));
|
||||
m.addSeparator();
|
||||
|
||||
dialogMenu.addSeparator();
|
||||
#if JUCE_MAC
|
||||
m.addItem (140, T("Run the Apple Remote Control test..."));
|
||||
m.addSeparator();
|
||||
#endif
|
||||
|
||||
PopupMenu nativeFileChoosers;
|
||||
nativeFileChoosers.addItem (121, T("'load' file browser..."));
|
||||
nativeFileChoosers.addItem (124, T("'load' file browser with an image file preview..."));
|
||||
nativeFileChoosers.addItem (122, T("'save' file browser..."));
|
||||
nativeFileChoosers.addItem (123, T("choose directory file browser..."));
|
||||
nativeFileChoosers.addItem (121, T("'Load' file browser..."));
|
||||
nativeFileChoosers.addItem (124, T("'Load' file browser with an image file preview..."));
|
||||
nativeFileChoosers.addItem (122, T("'Save' file browser..."));
|
||||
nativeFileChoosers.addItem (123, T("'Choose directory' file browser..."));
|
||||
|
||||
PopupMenu juceFileChoosers;
|
||||
juceFileChoosers.addItem (131, T("'load' file browser..."));
|
||||
juceFileChoosers.addItem (134, T("'load' file browser with an image file preview..."));
|
||||
juceFileChoosers.addItem (132, T("'save' file browser..."));
|
||||
juceFileChoosers.addItem (133, T("choose directory file browser..."));
|
||||
juceFileChoosers.addItem (131, T("'Load' file browser..."));
|
||||
juceFileChoosers.addItem (134, T("'Load' file browser with an image file preview..."));
|
||||
juceFileChoosers.addItem (132, T("'Save' file browser..."));
|
||||
juceFileChoosers.addItem (133, T("'Choose directory' file browser..."));
|
||||
|
||||
PopupMenu fileChoosers;
|
||||
fileChoosers.addSubMenu (T("Operating system dialogs"), nativeFileChoosers);
|
||||
fileChoosers.addSubMenu (T("Juce dialogs"), juceFileChoosers);
|
||||
|
||||
m.addSubMenu (T("file chooser dialogs"), fileChoosers);
|
||||
m.addSubMenu (T("File chooser dialogs"), fileChoosers);
|
||||
|
||||
int result = m.showAt (menuButton);
|
||||
|
||||
|
|
@ -1232,6 +1315,13 @@ public:
|
|||
// method causes the loop to exit.
|
||||
colourDialog.runModalLoop();
|
||||
}
|
||||
else if (result == 140)
|
||||
{
|
||||
#if JUCE_MAC
|
||||
AppleRemoteTestWindow test;
|
||||
test.runModalLoop();
|
||||
#endif
|
||||
}
|
||||
else if (result >= 121 && result < 139)
|
||||
{
|
||||
const bool useNativeVersion = result < 130;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue