Return button's index for [NSAlert runModalSheetForWindow].
This commit is contained in:
parent
b9455a997c
commit
a897d5b715
1 changed files with 17 additions and 32 deletions
|
@ -12,54 +12,39 @@
|
||||||
@implementation NSAlert (SynchronousSheet)
|
@implementation NSAlert (SynchronousSheet)
|
||||||
|
|
||||||
-(NSInteger) runModalSheetForWindow:(NSWindow *)aWindow {
|
-(NSInteger) runModalSheetForWindow:(NSWindow *)aWindow {
|
||||||
// Set ourselves as the target for button clicks
|
// Set ourselves as the target for button clicks
|
||||||
for (NSButton *button in [self buttons]) {
|
for (NSButton *button in [self buttons]) {
|
||||||
[button setTarget:self];
|
[button setTarget:self];
|
||||||
[button setAction:@selector(BE_stopSynchronousSheet:)];
|
[button setAction:@selector(BE_stopSynchronousSheet:)];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bring up the sheet and wait until stopSynchronousSheet is triggered by a button click
|
// Bring up the sheet and wait until stopSynchronousSheet is triggered by a button click
|
||||||
[self performSelectorOnMainThread:@selector(BE_beginSheetModalForWindow:) withObject:aWindow waitUntilDone:YES];
|
[self performSelectorOnMainThread:@selector(BE_beginSheetModalForWindow:) withObject:aWindow waitUntilDone:YES];
|
||||||
NSInteger modalCode = [NSApp runModalForWindow:[self window]];
|
NSInteger modalCode = [NSApp runModalForWindow:[self window]];
|
||||||
|
|
||||||
// This is called only after stopSynchronousSheet is called (that is,
|
// This is called only after stopSynchronousSheet is called (that is,
|
||||||
// one of the buttons is clicked)
|
// one of the buttons is clicked)
|
||||||
[NSApp performSelectorOnMainThread:@selector(endSheet:) withObject:[self window] waitUntilDone:YES];
|
[NSApp performSelectorOnMainThread:@selector(endSheet:) withObject:[self window] waitUntilDone:YES];
|
||||||
|
|
||||||
// Remove the sheet from the screen
|
// Remove the sheet from the screen
|
||||||
[[self window] performSelectorOnMainThread:@selector(orderOut:) withObject:self waitUntilDone:YES];
|
[[self window] performSelectorOnMainThread:@selector(orderOut:) withObject:self waitUntilDone:YES];
|
||||||
|
|
||||||
return modalCode;
|
return modalCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
-(NSInteger) runModalSheet {
|
-(NSInteger) runModalSheet {
|
||||||
return [self runModalSheetForWindow:[NSApp mainWindow]];
|
return [self runModalSheetForWindow:[NSApp mainWindow]];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#pragma mark Private methods
|
#pragma mark Private methods
|
||||||
|
|
||||||
-(IBAction) BE_stopSynchronousSheet:(id)sender {
|
-(IBAction) BE_stopSynchronousSheet:(id)sender {
|
||||||
// See which of the buttons was clicked
|
[NSApp stopModalWithCode:[sender tag]];
|
||||||
NSUInteger clickedButtonIndex = [[self buttons] indexOfObject:sender];
|
|
||||||
|
|
||||||
// Be consistent with Apple's documentation (see NSAlert's addButtonWithTitle) so that
|
|
||||||
// the fourth button is numbered NSAlertThirdButtonReturn + 1, and so on
|
|
||||||
NSInteger modalCode = 0;
|
|
||||||
if (clickedButtonIndex == NSAlertFirstButtonReturn)
|
|
||||||
modalCode = NSAlertFirstButtonReturn;
|
|
||||||
else if (clickedButtonIndex == NSAlertSecondButtonReturn)
|
|
||||||
modalCode = NSAlertSecondButtonReturn;
|
|
||||||
else if (clickedButtonIndex == NSAlertThirdButtonReturn)
|
|
||||||
modalCode = NSAlertThirdButtonReturn;
|
|
||||||
else
|
|
||||||
modalCode = NSAlertThirdButtonReturn + (clickedButtonIndex - 2);
|
|
||||||
|
|
||||||
[NSApp stopModalWithCode:modalCode];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
-(void) BE_beginSheetModalForWindow:(NSWindow *)aWindow {
|
-(void) BE_beginSheetModalForWindow:(NSWindow *)aWindow {
|
||||||
[self beginSheetModalForWindow:aWindow modalDelegate:nil didEndSelector:nil contextInfo:nil];
|
[self beginSheetModalForWindow:aWindow modalDelegate:nil didEndSelector:nil contextInfo:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue