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);
|
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__
|
#endif // __OBJC__
|
||||||
|
|
||||||
// NSCursor
|
// NSCursor
|
||||||
|
@@ -51,7 +51,6 @@ wxFileDialog::wxFileDialog(
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NSArray* GetTypesFromFilter( const wxString filter )
|
NSArray* GetTypesFromFilter( const wxString filter )
|
||||||
{
|
{
|
||||||
NSMutableArray* types = nil;
|
NSMutableArray* types = nil;
|
||||||
@@ -149,6 +148,14 @@ int wxFileDialog::ShowModal()
|
|||||||
|
|
||||||
m_path = wxEmptyString;
|
m_path = wxEmptyString;
|
||||||
m_fileNames.Clear();
|
m_fileNames.Clear();
|
||||||
|
|
||||||
|
wxNonOwnedWindow* parentWindow = NULL;
|
||||||
|
int returnCode = -1;
|
||||||
|
|
||||||
|
if (GetParent())
|
||||||
|
{
|
||||||
|
parentWindow = dynamic_cast<wxNonOwnedWindow*>(wxGetTopLevelParent(GetParent()));
|
||||||
|
}
|
||||||
|
|
||||||
if (HasFlag(wxFD_SAVE))
|
if (HasFlag(wxFD_SAVE))
|
||||||
{
|
{
|
||||||
@@ -164,8 +171,25 @@ int wxFileDialog::ShowModal()
|
|||||||
if ( HasFlag(wxFD_OVERWRITE_PROMPT) )
|
if ( HasFlag(wxFD_OVERWRITE_PROMPT) )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
panel = sPanel;
|
||||||
result = wxID_OK;
|
result = wxID_OK;
|
||||||
@@ -187,7 +211,25 @@ int wxFileDialog::ShowModal()
|
|||||||
[oPanel setCanChooseFiles:YES];
|
[oPanel setCanChooseFiles:YES];
|
||||||
[oPanel setMessage:cf.AsNSString()];
|
[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;
|
panel = oPanel;
|
||||||
result = wxID_OK;
|
result = wxID_OK;
|
||||||
|
@@ -138,6 +138,45 @@ void wxMacWakeUp()
|
|||||||
}
|
}
|
||||||
@end
|
@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()
|
bool wxApp::DoInitGui()
|
||||||
{
|
{
|
||||||
[NSApplication sharedApplication];
|
[NSApplication sharedApplication];
|
||||||
|
Reference in New Issue
Block a user