1 /******************************************************************************
2 * $Id: InfoOptionsViewController.m 11046 2010-07-24 03:19:41Z livings124 $
4 * Copyright (c) 2010 Transmission authors and contributors
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 *****************************************************************************/
25 #import "InfoOptionsViewController.h"
28 #define OPTION_POPUP_GLOBAL 0
29 #define OPTION_POPUP_NO_LIMIT 1
30 #define OPTION_POPUP_LIMIT 2
32 #define OPTION_POPUP_PRIORITY_HIGH 0
33 #define OPTION_POPUP_PRIORITY_NORMAL 1
34 #define OPTION_POPUP_PRIORITY_LOW 2
38 @interface InfoOptionsViewController (Private)
44 @implementation InfoOptionsViewController
48 if ((self = [super initWithNibName: @"InfoOptionsView" bundle: nil]))
50 [self setTitle: NSLocalizedString(@"Options", "Inspector view -> title")];
63 - (void) setInfoForTorrents: (NSArray *) torrents
65 //don't check if it's the same in case the metadata changed
67 fTorrents = [torrents retain];
80 - (void) updateOptions
82 if ([fTorrents count] == 0)
86 NSEnumerator * enumerator = [fTorrents objectEnumerator];
87 Torrent * torrent = [enumerator nextObject]; //first torrent
89 NSInteger uploadUseSpeedLimit = [torrent usesSpeedLimit: YES] ? NSOnState : NSOffState,
90 uploadSpeedLimit = [torrent speedLimit: YES],
91 downloadUseSpeedLimit = [torrent usesSpeedLimit: NO] ? NSOnState : NSOffState,
92 downloadSpeedLimit = [torrent speedLimit: NO],
93 globalUseSpeedLimit = [torrent usesGlobalSpeedLimit] ? NSOnState : NSOffState;
95 while ((torrent = [enumerator nextObject])
96 && (uploadUseSpeedLimit != NSMixedState || uploadSpeedLimit != INVALID
97 || downloadUseSpeedLimit != NSMixedState || downloadSpeedLimit != INVALID
98 || globalUseSpeedLimit != NSMixedState))
100 if (uploadUseSpeedLimit != NSMixedState && uploadUseSpeedLimit != ([torrent usesSpeedLimit: YES] ? NSOnState : NSOffState))
101 uploadUseSpeedLimit = NSMixedState;
103 if (uploadSpeedLimit != INVALID && uploadSpeedLimit != [torrent speedLimit: YES])
104 uploadSpeedLimit = INVALID;
106 if (downloadUseSpeedLimit != NSMixedState && downloadUseSpeedLimit != ([torrent usesSpeedLimit: NO] ? NSOnState : NSOffState))
107 downloadUseSpeedLimit = NSMixedState;
109 if (downloadSpeedLimit != INVALID && downloadSpeedLimit != [torrent speedLimit: NO])
110 downloadSpeedLimit = INVALID;
112 if (globalUseSpeedLimit != NSMixedState && globalUseSpeedLimit != ([torrent usesGlobalSpeedLimit] ? NSOnState : NSOffState))
113 globalUseSpeedLimit = NSMixedState;
117 [fUploadLimitCheck setState: uploadUseSpeedLimit];
118 [fUploadLimitCheck setEnabled: YES];
120 [fUploadLimitLabel setEnabled: uploadUseSpeedLimit == NSOnState];
121 [fUploadLimitField setEnabled: uploadUseSpeedLimit == NSOnState];
122 if (uploadSpeedLimit != INVALID)
123 [fUploadLimitField setIntValue: uploadSpeedLimit];
125 [fUploadLimitField setStringValue: @""];
128 [fDownloadLimitCheck setState: downloadUseSpeedLimit];
129 [fDownloadLimitCheck setEnabled: YES];
131 [fDownloadLimitLabel setEnabled: downloadUseSpeedLimit == NSOnState];
132 [fDownloadLimitField setEnabled: downloadUseSpeedLimit == NSOnState];
133 if (downloadSpeedLimit != INVALID)
134 [fDownloadLimitField setIntValue: downloadSpeedLimit];
136 [fDownloadLimitField setStringValue: @""];
139 [fGlobalLimitCheck setState: globalUseSpeedLimit];
140 [fGlobalLimitCheck setEnabled: YES];
142 //get ratio and idle info
143 enumerator = [fTorrents objectEnumerator];
144 torrent = [enumerator nextObject]; //first torrent
146 NSInteger checkRatio = [torrent ratioSetting], checkIdle = [torrent idleSetting];
147 CGFloat ratioLimit = [torrent ratioLimit];
148 NSUInteger idleLimit = [torrent idleLimitMinutes];
150 while ((torrent = [enumerator nextObject])
151 && (checkRatio != INVALID || ratioLimit != INVALID || checkIdle != INVALID || idleLimit != INVALID))
153 if (checkRatio != INVALID && checkRatio != [torrent ratioSetting])
154 checkRatio = INVALID;
156 if (ratioLimit != INVALID && ratioLimit != [torrent ratioLimit])
157 ratioLimit = INVALID;
159 if (checkIdle != INVALID && checkIdle != [torrent idleSetting])
162 if (idleLimit != INVALID && idleLimit != [torrent idleLimitMinutes])
168 if (checkRatio == TR_RATIOLIMIT_SINGLE)
169 index = OPTION_POPUP_LIMIT;
170 else if (checkRatio == TR_RATIOLIMIT_UNLIMITED)
171 index = OPTION_POPUP_NO_LIMIT;
172 else if (checkRatio == TR_RATIOLIMIT_GLOBAL)
173 index = OPTION_POPUP_GLOBAL;
176 [fRatioPopUp selectItemAtIndex: index];
177 [fRatioPopUp setEnabled: YES];
179 [fRatioLimitField setHidden: checkRatio != TR_RATIOLIMIT_SINGLE];
180 if (ratioLimit != INVALID)
181 [fRatioLimitField setFloatValue: ratioLimit];
183 [fRatioLimitField setStringValue: @""];
186 if (checkIdle == TR_IDLELIMIT_SINGLE)
187 index = OPTION_POPUP_LIMIT;
188 else if (checkIdle == TR_IDLELIMIT_UNLIMITED)
189 index = OPTION_POPUP_NO_LIMIT;
190 else if (checkIdle == TR_IDLELIMIT_GLOBAL)
191 index = OPTION_POPUP_GLOBAL;
194 [fIdlePopUp selectItemAtIndex: index];
195 [fIdlePopUp setEnabled: YES];
197 [fIdleLimitField setHidden: checkIdle != TR_IDLELIMIT_SINGLE];
198 if (idleLimit != INVALID)
199 [fIdleLimitField setIntegerValue: idleLimit];
201 [fIdleLimitField setStringValue: @""];
202 [fIdleLimitLabel setHidden: checkIdle != TR_IDLELIMIT_SINGLE];
205 enumerator = [fTorrents objectEnumerator];
206 torrent = [enumerator nextObject]; //first torrent
208 NSInteger priority = [torrent priority];
210 while ((torrent = [enumerator nextObject]) && priority != INVALID)
212 if (priority != INVALID && priority != [torrent priority])
217 if (priority == TR_PRI_HIGH)
218 index = OPTION_POPUP_PRIORITY_HIGH;
219 else if (priority == TR_PRI_NORMAL)
220 index = OPTION_POPUP_PRIORITY_NORMAL;
221 else if (priority == TR_PRI_LOW)
222 index = OPTION_POPUP_PRIORITY_LOW;
225 [fPriorityPopUp selectItemAtIndex: index];
226 [fPriorityPopUp setEnabled: YES];
229 enumerator = [fTorrents objectEnumerator];
230 torrent = [enumerator nextObject]; //first torrent
232 NSInteger maxPeers = [torrent maxPeerConnect];
234 while ((torrent = [enumerator nextObject]))
236 if (maxPeers != [torrent maxPeerConnect])
244 [fPeersConnectField setEnabled: YES];
245 [fPeersConnectLabel setEnabled: YES];
246 if (maxPeers != INVALID)
247 [fPeersConnectField setIntValue: maxPeers];
249 [fPeersConnectField setStringValue: @""];
252 - (void) setUseSpeedLimit: (id) sender
254 const BOOL upload = sender == fUploadLimitCheck;
256 if ([sender state] == NSMixedState)
257 [sender setState: NSOnState];
258 const BOOL limit = [sender state] == NSOnState;
260 for (Torrent * torrent in fTorrents)
261 [torrent setUseSpeedLimit: limit upload: upload];
263 NSTextField * field = upload ? fUploadLimitField : fDownloadLimitField;
264 [field setEnabled: limit];
267 [field selectText: self];
268 [[[self view] window] makeKeyAndOrderFront: self];
271 NSTextField * label = upload ? fUploadLimitLabel : fDownloadLimitLabel;
272 [label setEnabled: limit];
275 - (void) setUseGlobalSpeedLimit: (id) sender
277 if ([sender state] == NSMixedState)
278 [sender setState: NSOnState];
279 const BOOL limit = [sender state] == NSOnState;
281 for (Torrent * torrent in fTorrents)
282 [torrent setUseGlobalSpeedLimit: limit];
285 - (void) setSpeedLimit: (id) sender
287 const BOOL upload = sender == fUploadLimitField;
288 const NSInteger limit = [sender intValue];
290 for (Torrent * torrent in fTorrents)
291 [torrent setSpeedLimit: limit upload: upload];
294 - (void) setRatioSetting: (id) sender
298 switch ([sender indexOfSelectedItem])
300 case OPTION_POPUP_LIMIT:
301 setting = TR_RATIOLIMIT_SINGLE;
304 case OPTION_POPUP_NO_LIMIT:
305 setting = TR_RATIOLIMIT_UNLIMITED;
307 case OPTION_POPUP_GLOBAL:
308 setting = TR_RATIOLIMIT_GLOBAL;
311 NSAssert1(NO, @"Unknown option selected in ratio popup: %d", [sender indexOfSelectedItem]);
315 for (Torrent * torrent in fTorrents)
316 [torrent setRatioSetting: setting];
318 [fRatioLimitField setHidden: !single];
321 [fRatioLimitField selectText: self];
322 [[[self view] window] makeKeyAndOrderFront: self];
326 - (void) setRatioLimit: (id) sender
328 const CGFloat limit = [sender floatValue];
330 for (Torrent * torrent in fTorrents)
331 [torrent setRatioLimit: limit];
334 - (void) setIdleSetting: (id) sender
338 switch ([sender indexOfSelectedItem])
340 case OPTION_POPUP_LIMIT:
341 setting = TR_IDLELIMIT_SINGLE;
344 case OPTION_POPUP_NO_LIMIT:
345 setting = TR_IDLELIMIT_UNLIMITED;
347 case OPTION_POPUP_GLOBAL:
348 setting = TR_IDLELIMIT_GLOBAL;
351 NSAssert1(NO, @"Unknown option selected in idle popup: %d", [sender indexOfSelectedItem]);
355 for (Torrent * torrent in fTorrents)
356 [torrent setIdleSetting: setting];
358 [fIdleLimitField setHidden: !single];
359 [fIdleLimitLabel setHidden: !single];
362 [fIdleLimitField selectText: self];
363 [[[self view] window] makeKeyAndOrderFront: self];
367 - (void) setIdleLimit: (id) sender
369 const NSUInteger limit = [sender integerValue];
371 for (Torrent * torrent in fTorrents)
372 [torrent setIdleLimitMinutes: limit];
375 - (void) setPriority: (id) sender
377 tr_priority_t priority;
378 switch ([sender indexOfSelectedItem])
380 case OPTION_POPUP_PRIORITY_HIGH:
381 priority = TR_PRI_HIGH;
383 case OPTION_POPUP_PRIORITY_NORMAL:
384 priority = TR_PRI_NORMAL;
386 case OPTION_POPUP_PRIORITY_LOW:
387 priority = TR_PRI_LOW;
390 NSAssert1(NO, @"Unknown option selected in priority popup: %d", [sender indexOfSelectedItem]);
394 for (Torrent * torrent in fTorrents)
395 [torrent setPriority: priority];
397 [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateUI" object: nil];
400 - (void) setPeersConnectLimit: (id) sender
402 NSInteger limit = [sender intValue];
404 for (Torrent * torrent in fTorrents)
405 [torrent setMaxPeerConnect: limit];
408 - (BOOL) control: (NSControl *) control textShouldBeginEditing: (NSText *) fieldEditor
410 [fInitialString release];
411 fInitialString = [[control stringValue] retain];
416 - (BOOL) control: (NSControl *) control didFailToFormatString: (NSString *) string errorDescription: (NSString *) error
421 [control setStringValue: fInitialString];
422 [fInitialString release];
423 fInitialString = nil;
430 @implementation InfoOptionsViewController (Private)
434 if ([fTorrents count] == 0)
436 [fUploadLimitCheck setEnabled: NO];
437 [fUploadLimitCheck setState: NSOffState];
438 [fUploadLimitField setEnabled: NO];
439 [fUploadLimitLabel setEnabled: NO];
440 [fUploadLimitField setStringValue: @""];
442 [fDownloadLimitCheck setEnabled: NO];
443 [fDownloadLimitCheck setState: NSOffState];
444 [fDownloadLimitField setEnabled: NO];
445 [fDownloadLimitLabel setEnabled: NO];
446 [fDownloadLimitField setStringValue: @""];
448 [fGlobalLimitCheck setEnabled: NO];
449 [fGlobalLimitCheck setState: NSOffState];
451 [fPriorityPopUp setEnabled: NO];
452 [fPriorityPopUp selectItemAtIndex: -1];
454 [fRatioPopUp setEnabled: NO];
455 [fRatioPopUp selectItemAtIndex: -1];
456 [fRatioLimitField setHidden: YES];
457 [fRatioLimitField setStringValue: @""];
459 [fIdlePopUp setEnabled: NO];
460 [fIdlePopUp selectItemAtIndex: -1];
461 [fIdleLimitField setHidden: YES];
462 [fIdleLimitField setStringValue: @""];
463 [fIdleLimitLabel setHidden: YES];
465 [fPeersConnectField setEnabled: NO];
466 [fPeersConnectField setStringValue: @""];
467 [fPeersConnectLabel setEnabled: NO];
470 [self updateOptions];