diff --git a/macosx/English.lproj/InfoWindow.nib/classes.nib b/macosx/English.lproj/InfoWindow.nib/classes.nib index 531d23143..b9f854592 100644 --- a/macosx/English.lproj/InfoWindow.nib/classes.nib +++ b/macosx/English.lproj/InfoWindow.nib/classes.nib @@ -8,7 +8,7 @@ revealDataFile = id; revealFile = id; revealTorrentFile = id; - setLimitCheck = id; + setLimitSetting = id; setRatioLimit = id; setRatioSetting = id; setSpeedLimit = id; @@ -23,9 +23,9 @@ fDataLocationField = NSTextField; fDateCreatedField = NSTextField; fDateStartedField = NSTextField; - fDownloadLimitCheck = NSButton; fDownloadLimitField = NSTextField; fDownloadLimitLabel = NSTextField; + fDownloadLimitPopUp = NSPopUpButton; fDownloadedTotalField = NSTextField; fDownloadedValidField = NSTextField; fDownloadingFromField = NSTextField; @@ -39,9 +39,9 @@ fPeerTable = NSTableView; fPiecesField = NSTextField; fPiecesView = PiecesView; - fRatioCheck = NSButton; fRatioField = NSTextField; fRatioLimitField = NSTextField; + fRatioPopUp = NSPopUpButton; fRevealDataButton = NSButton; fRevealTorrentButton = NSButton; fSecureField = NSTextField; @@ -52,9 +52,9 @@ fTabView = NSTabView; fTorrentLocationField = NSTextField; fTrackerField = NSTextField; - fUploadLimitCheck = NSButton; fUploadLimitField = NSTextField; fUploadLimitLabel = NSTextField; + fUploadLimitPopUp = NSPopUpButton; fUploadedTotalField = NSTextField; fUploadingToField = NSTextField; }; diff --git a/macosx/English.lproj/InfoWindow.nib/keyedobjects.nib b/macosx/English.lproj/InfoWindow.nib/keyedobjects.nib index 507f7854c..ad03b9a09 100644 Binary files a/macosx/English.lproj/InfoWindow.nib/keyedobjects.nib and b/macosx/English.lproj/InfoWindow.nib/keyedobjects.nib differ diff --git a/macosx/InfoWindowController.h b/macosx/InfoWindowController.h index e826481ba..af180ea5a 100644 --- a/macosx/InfoWindowController.h +++ b/macosx/InfoWindowController.h @@ -56,7 +56,7 @@ IBOutlet NSOutlineView * fFileOutline; IBOutlet NSTextField * fFileTableStatusField; - IBOutlet NSButton * fRatioCheck, * fUploadLimitCheck, * fDownloadLimitCheck; + IBOutlet NSPopUpButton * fRatioPopUp, * fUploadLimitPopUp, * fDownloadLimitPopUp; IBOutlet NSTextField * fUploadLimitField, * fDownloadLimitField, * fRatioLimitField, * fUploadLimitLabel, * fDownloadLimitLabel; } @@ -71,7 +71,7 @@ - (void) revealDataFile: (id) sender; - (void) revealFile: (id) sender; -- (void) setLimitCheck: (id) sender; +- (void) setLimitSetting: (id) sender; - (void) setSpeedLimit: (id) sender; - (void) setRatioSetting: (id) sender; diff --git a/macosx/InfoWindowController.m b/macosx/InfoWindowController.m index ecbab6411..7287ab26d 100644 --- a/macosx/InfoWindowController.m +++ b/macosx/InfoWindowController.m @@ -41,7 +41,11 @@ #define TAB_ACTIVITY_HEIGHT 170.0 #define TAB_PEERS_HEIGHT 268.0 #define TAB_FILES_HEIGHT 268.0 -#define TAB_OPTIONS_HEIGHT 112.0 +#define TAB_OPTIONS_HEIGHT 117.0 + +#define OPTION_POPUP_GLOBAL 0 +#define OPTION_POPUP_NO_LIMIT 1 +#define OPTION_POPUP_LIMIT 2 #define INVALID -99 @@ -58,6 +62,9 @@ - (void) setFileCheckState: (int) state forItem: (NSMutableDictionary *) item; - (NSMutableDictionary *) resetFileCheckStateForItemParent: (NSMutableDictionary *) originalChild; +- (int) stateSettingToPopUpIndex: (int) index; +- (int) popUpIndexToStateSetting: (int) index; + @end @implementation InfoWindowController @@ -399,36 +406,36 @@ uploadLimit = [torrent uploadLimit], downloadLimit = [torrent downloadLimit]; - while ((checkUpload != NSMixedState || uploadLimit != INVALID - || checkDownload != NSMixedState || downloadLimit != INVALID) + while ((checkUpload != INVALID || uploadLimit != INVALID + || checkDownload != INVALID || downloadLimit != INVALID) && (torrent = [enumerator nextObject])) { - if (checkUpload != NSMixedState && checkUpload != [torrent checkUpload]) - checkUpload = NSMixedState; + if (checkUpload != INVALID && checkUpload != [torrent checkUpload]) + checkUpload = INVALID; if (uploadLimit != INVALID && uploadLimit != [torrent uploadLimit]) uploadLimit = INVALID; - if (checkDownload != NSMixedState && checkDownload != [torrent checkDownload]) - checkDownload = NSMixedState; + if (checkDownload != INVALID && checkDownload != [torrent checkDownload]) + checkDownload = INVALID; if (downloadLimit != INVALID && downloadLimit != [torrent downloadLimit]) downloadLimit = INVALID; } - [fUploadLimitCheck setEnabled: YES]; - [fUploadLimitCheck setState: checkUpload]; - [fUploadLimitLabel setEnabled: checkUpload == NSOnState]; - [fUploadLimitField setEnabled: checkUpload == NSOnState]; + [fUploadLimitPopUp setEnabled: YES]; + [fUploadLimitPopUp selectItemAtIndex: [self stateSettingToPopUpIndex: checkUpload]]; + [fUploadLimitLabel setHidden: checkUpload != NSOnState]; + [fUploadLimitField setHidden: checkUpload != NSOnState]; if (uploadLimit != INVALID) [fUploadLimitField setIntValue: uploadLimit]; else [fUploadLimitField setStringValue: @""]; - [fDownloadLimitCheck setEnabled: YES]; - [fDownloadLimitCheck setState: checkDownload]; - [fDownloadLimitLabel setEnabled: checkDownload == NSOnState]; - [fDownloadLimitField setEnabled: checkDownload == NSOnState]; + [fDownloadLimitPopUp setEnabled: YES]; + [fDownloadLimitPopUp selectItemAtIndex: [self stateSettingToPopUpIndex: checkDownload]]; + [fDownloadLimitLabel setHidden: checkDownload != NSOnState]; + [fDownloadLimitField setHidden: checkDownload != NSOnState]; if (downloadLimit != INVALID) [fDownloadLimitField setIntValue: downloadLimit]; else @@ -438,22 +445,22 @@ enumerator = [fTorrents objectEnumerator]; torrent = [enumerator nextObject]; //first torrent - int ratioSetting = [torrent ratioSetting]; + int checkRatio = [torrent ratioSetting]; float ratioLimit = [torrent ratioLimit]; - while ((ratioSetting != NSMixedState || ratioLimit != INVALID) + while ((checkRatio != INVALID || checkRatio != INVALID) && (torrent = [enumerator nextObject])) { - if (ratioSetting != NSMixedState && ratioSetting != [torrent ratioSetting]) - ratioSetting = NSMixedState; + if (checkRatio != INVALID && checkRatio != [torrent ratioSetting]) + checkRatio = INVALID; if (ratioLimit != INVALID && ratioLimit != [torrent ratioLimit]) ratioLimit = INVALID; } - [fRatioCheck setEnabled: YES]; - [fRatioCheck setState: ratioSetting]; - [fRatioLimitField setEnabled: ratioSetting == NSOnState]; + [fRatioPopUp setEnabled: YES]; + [fRatioPopUp selectItemAtIndex: [self stateSettingToPopUpIndex: checkRatio]]; + [fRatioLimitField setHidden: checkRatio != NSOnState]; if (ratioLimit != INVALID) [fRatioLimitField setFloatValue: ratioLimit]; else @@ -461,27 +468,51 @@ } else { - [fUploadLimitCheck setEnabled: NO]; - [fUploadLimitCheck setState: NSOffState]; - [fUploadLimitField setEnabled: NO]; + [fUploadLimitPopUp setEnabled: NO]; + [fUploadLimitPopUp selectItemAtIndex: -1]; + [fUploadLimitField setHidden: YES]; + [fUploadLimitLabel setHidden: YES]; [fUploadLimitField setStringValue: @""]; - [fUploadLimitLabel setEnabled: NO]; - [fDownloadLimitCheck setEnabled: NO]; - [fDownloadLimitCheck setState: NSOffState]; - [fDownloadLimitField setEnabled: NO]; + [fDownloadLimitPopUp setEnabled: NO]; + [fDownloadLimitPopUp selectItemAtIndex: -1]; + [fDownloadLimitField setHidden: YES]; + [fDownloadLimitLabel setHidden: YES]; [fDownloadLimitField setStringValue: @""]; - [fDownloadLimitLabel setEnabled: NO]; - [fRatioCheck setEnabled: NO]; - [fRatioCheck setState: NSOffState]; - [fRatioLimitField setEnabled: NO]; + [fRatioPopUp setEnabled: NO]; + [fRatioPopUp selectItemAtIndex: -1]; + [fRatioLimitField setHidden: YES]; [fRatioLimitField setStringValue: @""]; } [self updateInfoStats]; } +- (int) stateSettingToPopUpIndex: (int) index +{ + if (index == NSOnState) + return OPTION_POPUP_LIMIT; + else if (index == NSOffState) + return OPTION_POPUP_NO_LIMIT; + else if (index == NSMixedState) + return OPTION_POPUP_GLOBAL; + else + return -1; +} + +- (int) popUpIndexToStateSetting: (int) index +{ + if (index == OPTION_POPUP_LIMIT) + return NSOnState; + else if (index == OPTION_POPUP_NO_LIMIT) + return NSOffState; + else if (index == OPTION_POPUP_GLOBAL) + return NSMixedState; + else + return INVALID; +} + - (BOOL) validateMenuItem: (NSMenuItem *) menuItem { SEL action = [menuItem action]; @@ -808,18 +839,22 @@ [[fFileOutline itemAtRow: i] objectForKey: @"Path"]] inFileViewerRootedAtPath: nil]; } -- (void) setLimitCheck: (id) sender +- (void) setLimitSetting: (id) sender { - BOOL upload = sender == fUploadLimitCheck; - int state = [sender state]; + BOOL upload = sender == fUploadLimitPopUp; + int setting; + if ((setting = [self popUpIndexToStateSetting: [sender indexOfSelectedItem]]) == INVALID) + return; Torrent * torrent; NSEnumerator * enumerator = [fTorrents objectEnumerator]; while ((torrent = [enumerator nextObject])) - upload ? [torrent setCheckUpload: state] : [torrent setCheckDownload: state]; + upload ? [torrent setCheckUpload: setting] : [torrent setCheckDownload: setting]; NSTextField * field = upload ? fUploadLimitField : fDownloadLimitField; - [field setEnabled: state == NSOnState]; + [field setHidden: setting != NSOnState]; + NSTextField * label = upload ? fUploadLimitLabel : fDownloadLimitLabel; + [label setHidden: setting != NSOnState]; } - (void) setSpeedLimit: (id) sender @@ -854,14 +889,16 @@ - (void) setRatioSetting: (id) sender { - int state = [sender state]; + int setting; + if ((setting = [self popUpIndexToStateSetting: [sender indexOfSelectedItem]]) == INVALID) + return; Torrent * torrent; NSEnumerator * enumerator = [fTorrents objectEnumerator]; while ((torrent = [enumerator nextObject])) - [torrent setRatioSetting: state]; + [torrent setRatioSetting: setting]; - [fRatioLimitField setEnabled: state == NSOnState]; + [fRatioLimitField setHidden: setting != NSOnState]; } - (void) setRatioLimit: (id) sender