Use sheets for native file dialogs if the dialog has its parent set.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@59346 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -277,6 +277,24 @@ protected :
|
||||
|
||||
void WXDLLIMPEXP_CORE wxOSXCocoaClassAddWXMethods(Class c);
|
||||
|
||||
/*
|
||||
We need this for ShowModal, as the sheet just disables the parent window and
|
||||
returns control to the app, whereas we don't want to return from ShowModal
|
||||
until the sheet has been dismissed.
|
||||
*/
|
||||
@interface ModalDialogDelegate : NSObject
|
||||
{
|
||||
BOOL sheetFinished;
|
||||
int resultCode;
|
||||
}
|
||||
|
||||
- (BOOL)finished;
|
||||
- (int)code;
|
||||
- (void)waitForSheetToFinish;
|
||||
- (void)sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo;
|
||||
@end
|
||||
|
||||
|
||||
#endif // __OBJC__
|
||||
|
||||
// NSCursor
|
||||
|
@@ -51,7 +51,6 @@ wxFileDialog::wxFileDialog(
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
NSArray* GetTypesFromFilter( const wxString filter )
|
||||
{
|
||||
NSMutableArray* types = nil;
|
||||
@@ -150,6 +149,14 @@ int wxFileDialog::ShowModal()
|
||||
m_path = wxEmptyString;
|
||||
m_fileNames.Clear();
|
||||
|
||||
wxNonOwnedWindow* parentWindow = NULL;
|
||||
int returnCode = -1;
|
||||
|
||||
if (GetParent())
|
||||
{
|
||||
parentWindow = dynamic_cast<wxNonOwnedWindow*>(wxGetTopLevelParent(GetParent()));
|
||||
}
|
||||
|
||||
if (HasFlag(wxFD_SAVE))
|
||||
{
|
||||
NSSavePanel* sPanel = [NSSavePanel savePanel];
|
||||
@@ -165,7 +172,24 @@ int wxFileDialog::ShowModal()
|
||||
{
|
||||
}
|
||||
|
||||
if ( [sPanel runModalForDirectory:dir.AsNSString() file:file.AsNSString() ] == NSOKButton )
|
||||
if (parentWindow)
|
||||
{
|
||||
NSWindow* nativeParent = parentWindow->GetWXWindow();
|
||||
ModalDialogDelegate* sheetDelegate = [[ModalDialogDelegate alloc] init];
|
||||
[sPanel beginSheetForDirectory:dir.AsNSString() file:file.AsNSString()
|
||||
modalForWindow: nativeParent modalDelegate: sheetDelegate
|
||||
didEndSelector: @selector(sheetDidEnd:returnCode:contextInfo:)
|
||||
contextInfo: nil];
|
||||
[sheetDelegate waitForSheetToFinish];
|
||||
result = [sheetDelegate code];
|
||||
[sheetDelegate release];
|
||||
}
|
||||
else
|
||||
{
|
||||
result = [sPanel runModalForDirectory:dir.AsNSString() file:file.AsNSString() ];
|
||||
}
|
||||
|
||||
if (result == NSOKButton )
|
||||
{
|
||||
panel = sPanel;
|
||||
result = wxID_OK;
|
||||
@@ -187,7 +211,25 @@ int wxFileDialog::ShowModal()
|
||||
[oPanel setCanChooseFiles:YES];
|
||||
[oPanel setMessage:cf.AsNSString()];
|
||||
|
||||
if ( [oPanel runModalForDirectory:dir.AsNSString() file:file.AsNSString() types:types] == NSOKButton )
|
||||
if (parentWindow)
|
||||
{
|
||||
NSWindow* nativeParent = parentWindow->GetWXWindow();
|
||||
ModalDialogDelegate* sheetDelegate = [[ModalDialogDelegate alloc] init];
|
||||
[oPanel beginSheetForDirectory:dir.AsNSString() file:file.AsNSString()
|
||||
types: types modalForWindow: nativeParent
|
||||
modalDelegate: sheetDelegate
|
||||
didEndSelector: @selector(sheetDidEnd:returnCode:contextInfo:)
|
||||
contextInfo: nil];
|
||||
[sheetDelegate waitForSheetToFinish];
|
||||
result = [sheetDelegate code];
|
||||
[sheetDelegate release];
|
||||
}
|
||||
else
|
||||
{
|
||||
result = [oPanel runModalForDirectory:dir.AsNSString()
|
||||
file:file.AsNSString() types:types];
|
||||
}
|
||||
if (result == NSOKButton )
|
||||
{
|
||||
panel = oPanel;
|
||||
result = wxID_OK;
|
||||
|
@@ -138,6 +138,45 @@ void wxMacWakeUp()
|
||||
}
|
||||
@end
|
||||
|
||||
/*
|
||||
allows ShowModal to work when using sheets.
|
||||
see include/wx/osx/cocoa/private.h for more info
|
||||
*/
|
||||
@implementation ModalDialogDelegate
|
||||
- (id)init
|
||||
{
|
||||
[super init];
|
||||
sheetFinished = NO;
|
||||
resultCode = -1;
|
||||
return self;
|
||||
}
|
||||
|
||||
- (BOOL)finished
|
||||
{
|
||||
return sheetFinished;
|
||||
}
|
||||
|
||||
- (int)code
|
||||
{
|
||||
return resultCode;
|
||||
}
|
||||
|
||||
- (void)waitForSheetToFinish
|
||||
{
|
||||
while (!sheetFinished)
|
||||
{
|
||||
wxSafeYield();
|
||||
}
|
||||
}
|
||||
|
||||
- (void)sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo
|
||||
{
|
||||
resultCode = returnCode;
|
||||
sheetFinished = YES;
|
||||
[sheet orderOut: self];
|
||||
}
|
||||
@end
|
||||
|
||||
bool wxApp::DoInitGui()
|
||||
{
|
||||
[NSApplication sharedApplication];
|
||||
|
Reference in New Issue
Block a user