Changeset 920 for trunk/macosx


Ignore:
Timestamp:
Sep 25, 2006, 6:37:45 PM (15 years ago)
Author:
joshe
Message:

Merge nat-traversal branch to trunk.

Location:
trunk/macosx
Files:
20 edited
10 copied

Legend:

Unmodified
Added
Removed
  • trunk/macosx/Controller.h

    r852 r920  
    3131#import "InfoWindowController.h"
    3232#import "MessageWindowController.h"
     33#import "PiecesWindowController.h"
    3334#import "Badger.h"
    3435#import "ImageBackgroundView.h"
     
    5051    InfoWindowController            * fInfoController;
    5152    MessageWindowController         * fMessageController;
     53    PiecesWindowController          * fPiecesWindowController;
    5254
    5355    IBOutlet NSWindow               * fWindow;
     
    106108- (void) resumeSelectedTorrents:    (id) sender;
    107109- (void) resumeAllTorrents:         (id) sender;
    108 - (void) resumeWaitingTorrents:     (id) sender;
    109110- (void) resumeTorrents:            (NSArray *) torrents;
     111
     112- (void) resumeSelectedTorrentsNoWait:  (id) sender;
     113- (void) resumeWaitingTorrents:         (id) sender;
     114- (void) resumeTorrentsNoWait:          (NSArray *) torrents;
    110115
    111116- (void) stopSelectedTorrents:      (id) sender;
     
    137142
    138143- (void) showMessageWindow: (id) sender;
     144- (void) showPiecesView: (id) sender;
    139145
    140146- (void) updateControlTint: (NSNotification *) notification;
     
    173179- (void) attemptToStartMultipleAuto: (NSArray *) torrents;
    174180
    175 - (void) reloadInspectorSettings: (NSNotification *) notification;
    176 
    177181- (void) checkAutoImportDirectory;
    178182
  • trunk/macosx/Controller.m

    r855 r920  
    8787        fMessageController = [[MessageWindowController alloc] initWithWindowNibName: @"MessageWindow"];
    8888        fInfoController = [[InfoWindowController alloc] initWithWindowNibName: @"InfoWindow"];
     89        fPiecesWindowController = [[PiecesWindowController alloc] initWithWindowNibName: @"PiecesWindow"];
    8990        fPrefsController = [[PrefsController alloc] initWithWindowNibName: @"PrefsWindow" handle: fLib];
    9091       
     
    101102{
    102103    [[NSNotificationCenter defaultCenter] removeObserver: self];
    103 
     104   
     105    [fInfoController release];
     106    [fMessageController release];
     107    [fPiecesWindowController release];
     108    [fPrefsController release];
     109   
     110    [fToolbar release];
    104111    [fTorrents release];
    105112    [fDisplayedTorrents release];
    106    
    107     [fToolbar release];
    108     [fInfoController release];
    109     [fPrefsController release];
    110113    [fBadger release];
    111114   
     
    333336    [nc addObserver: self selector: @selector(globalStartSettingChange:)
    334337                    name: @"GlobalStartSettingChange" object: nil];
    335 
    336     //check if torrent should now start
    337     [nc addObserver: self selector: @selector(torrentStartSettingChange:)
    338                     name: @"TorrentStartSettingChange" object: nil];
    339338   
    340339    //check if torrent should now start
    341340    [nc addObserver: self selector: @selector(torrentStoppedForRatio:)
    342341                    name: @"TorrentStoppedForRatio" object: nil];
    343    
    344     //change that just impacts the inspector
    345     [nc addObserver: self selector: @selector(reloadInspectorSettings:)
    346                     name: @"TorrentSettingChange" object: nil];
    347342   
    348343    //change that just impacts the dock badge
     
    364359    if ([fDefaults boolForKey: @"InfoVisible"])
    365360        [self showInfo: nil];
     361   
     362    if ([fDefaults boolForKey: @"PiecesViewerVisible"])
     363        [self showPiecesView: nil];
    366364   
    367365    //timer to auto toggle speed limit
     
    426424    [fTorrents makeObjectsPerformSelector: @selector(stopTransferForQuit)];
    427425   
     426    //disable NAT traversal
     427    tr_natTraversalDisable(fLib);
     428   
    428429    //remember window states and close all windows
    429430    [fDefaults setBool: [[fInfoController window] isVisible] forKey: @"InfoVisible"];
     431    [fDefaults setBool: [[fPiecesWindowController window] isVisible] forKey: @"PiecesViewerVisible"];
    430432    [[NSApp windows] makeObjectsPerformSelector: @selector(close)];
    431433    [self showStatusBar: NO animate: NO];
     
    439441        return;
    440442
    441     //wait for running transfers to stop (5 second timeout)
     443    //wait for running transfers to stop (5 second timeout) and for NAT to be disabled
    442444    NSDate * start = [NSDate date];
    443445    BOOL timeUp = NO;
     
    445447    NSEnumerator * enumerator = [fTorrents objectEnumerator];
    446448    Torrent * torrent;
    447     while (!timeUp && (torrent = [enumerator nextObject]))
     449    while (!timeUp && ((torrent = [enumerator nextObject]) || tr_natTraversalStatus(fLib) != TR_NAT_TRAVERSAL_DISABLED))
    448450        while (![torrent isPaused] && !(timeUp = [start timeIntervalSinceNow] < -5.0))
    449451        {
     
    544546    [panel setMessage: [NSString stringWithFormat: @"Select the download folder for \"%@\"", [torrent name]]];
    545547   
    546     NSDictionary * dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:
    547                                     torrent, @"Torrent", files, @"Files", nil];
     548    NSDictionary * dictionary = [[NSDictionary alloc] initWithObjectsAndKeys: torrent, @"Torrent", files, @"Files", nil];
    548549
    549550    [panel beginSheetForDirectory: nil file: nil types: nil modalForWindow: fWindow modalDelegate: self
     
    625626{
    626627    [self resumeTorrents: fTorrents];
     628}
     629
     630- (void) resumeTorrents: (NSArray *) torrents
     631{
     632    NSEnumerator * enumerator = [torrents objectEnumerator];
     633    Torrent * torrent;
     634    while ((torrent = [enumerator nextObject]))
     635        [torrent setWaitToStart: YES];
     636   
     637    [self attemptToStartMultipleAuto: torrents];
     638   
     639    [self updateUI: nil];
     640    [self applyFilter: nil];
     641    [self updateTorrentHistory];
     642}
     643
     644- (void) resumeSelectedTorrentsNoWait:  (id) sender
     645{
     646    [self resumeTorrentsNoWait: [self torrentsAtIndexes: [fTableView selectedRowIndexes]]];
    627647}
    628648
     
    637657            [torrents addObject: torrent];
    638658   
    639     [self resumeTorrents: torrents];
    640 }
    641 
    642 - (void) resumeTorrents: (NSArray *) torrents
     659    [self resumeTorrentsNoWait: torrents];
     660}
     661
     662- (void) resumeTorrentsNoWait: (NSArray *) torrents
    643663{
    644664    [torrents makeObjectsPerformSelector: @selector(startTransfer)];
     
    646666    [self updateUI: nil];
    647667    [self applyFilter: nil];
    648     [fInfoController updateInfoStatsAndSettings];
    649668    [self updateTorrentHistory];
    650669}
     
    672691    [self updateUI: nil];
    673692    [self applyFilter: nil];
    674     [fInfoController updateInfoStatsAndSettings];
    675693    [self updateTorrentHistory];
    676694}
     
    919937}
    920938
     939- (void) showPiecesView: (id) sender
     940{
     941    if ([[fPiecesWindowController window] isVisible])
     942        [fPiecesWindowController close];
     943    else
     944    {
     945        [fPiecesWindowController updateView: NO];
     946        [[fPiecesWindowController window] orderFront: nil];
     947    }
     948}
     949
    921950- (void) updateControlTint: (NSNotification *) notification
    922951{
     
    948977    if ([[fInfoController window] isVisible])
    949978        [fInfoController updateInfoStats];
     979   
     980    //update pieces viewer
     981    if ([[fPiecesWindowController window] isVisible])
     982        [fPiecesWindowController updateView: NO];
    950983
    951984    //badge dock
     
    13881421    [self updateUI: nil];
    13891422    [self applyFilter: nil];
    1390     [fInfoController updateInfoStatsAndSettings];
    13911423    [self updateTorrentHistory];
    13921424}
     
    13951427{
    13961428    //don't try to start a transfer if there should be none waiting
    1397     if (![[fDefaults stringForKey: @"StartSetting"] isEqualToString: @"Wait"])
     1429    if (![fDefaults boolForKey: @"Queue"])
    13981430        return;
    13991431
    1400     int desiredActive = [fDefaults integerForKey: @"WaitToStartNumber"];
     1432    int desiredActive = [fDefaults integerForKey: @"QueueDownloadNumber"];
    14011433   
    14021434    NSEnumerator * enumerator = [fTorrents objectEnumerator];
     
    14331465        [self updateUI: nil];
    14341466        [self applyFilter: nil];
    1435         [fInfoController updateInfoStatsAndSettings];
    14361467        [self updateTorrentHistory];
    14371468    }
     
    14441475    [self updateUI: nil];
    14451476    [self applyFilter: nil];
    1446     [fInfoController updateInfoStatsAndSettings];
    14471477    [self updateTorrentHistory];
    14481478}
     
    14541484    [self updateUI: nil];
    14551485    [self applyFilter: nil];
    1456     [fInfoController updateInfoStatsAndSettings];
    14571486    [self updateTorrentHistory];
    14581487}
     
    14611490{
    14621491    [self applyFilter: nil];
    1463     [fInfoController updateInfoStatsAndSettings];
     1492    [fInfoController updateInfoStats];
     1493    [fInfoController updateInfoSettings];
    14641494   
    14651495    if ([fDefaults boolForKey: @"PlaySeedingSound"])
     
    14821512- (void) attemptToStartMultipleAuto: (NSArray *) torrents
    14831513{
    1484     NSString * startSetting = [fDefaults stringForKey: @"StartSetting"];
    1485     if ([startSetting isEqualToString: @"Start"])
     1514    if (![fDefaults boolForKey: @"Queue"])
    14861515    {
    14871516        NSEnumerator * enumerator = [torrents objectEnumerator];
     
    14931522        return;
    14941523    }
    1495     else if (![startSetting isEqualToString: @"Wait"])
    1496         return;
    1497     else;
    14981524   
    14991525    //determine the number of downloads needed to start
    1500     int desiredActive = [fDefaults integerForKey: @"WaitToStartNumber"];
     1526    int desiredActive = [fDefaults integerForKey: @"QueueDownloadNumber"];
    15011527           
    15021528    NSEnumerator * enumerator = [fTorrents objectEnumerator];
     
    15441570}
    15451571
    1546 - (void) reloadInspectorSettings: (NSNotification *) notification
    1547 {
    1548     [fInfoController updateInfoStatsAndSettings];
    1549 }
    1550 
    15511572-(void) watcher: (id<UKFileWatcher>) watcher receivedNotification: (NSString *) notification forPath: (NSString *) path
    15521573{
     
    15871608}
    15881609
    1589 /*- (void) tableView: (NSTableView *) t willDisplayCell: (id) cell
    1590     forTableColumn: (NSTableColumn *) tableColumn row: (int) row
    1591 {
    1592     [cell setTorrent: [fDisplayedTorrents objectAtIndex: row]];
    1593 }*/
    1594 
    15951610- (id) tableView: (NSTableView *) tableView objectValueForTableColumn: (NSTableColumn *) tableColumn row: (int) row
    15961611{
     
    17131728- (void) tableViewSelectionDidChange: (NSNotification *) notification
    17141729{
    1715     [fInfoController updateInfoForTorrents: [self torrentsAtIndexes: [fTableView selectedRowIndexes]]];
     1730    NSArray * torrents = [self torrentsAtIndexes: [fTableView selectedRowIndexes]];
     1731    [fInfoController updateInfoForTorrents: torrents];
     1732   
     1733    Torrent * torrent = [torrents count] == 1 ? [torrents objectAtIndex: 0] : nil;
     1734    [fPiecesWindowController setTorrent: torrent];
    17161735}
    17171736
     
    19822001        NSEnumerator * enumerator = [fTorrents objectEnumerator];
    19832002        while ((torrent = [enumerator nextObject]))
    1984             if ([torrent isActive])
     2003            if ([torrent isActive] || [torrent waitingToStart])
    19852004                return YES;
    19862005        return NO;
     
    19932012        NSEnumerator * enumerator = [fTorrents objectEnumerator];
    19942013        while ((torrent = [enumerator nextObject]))
    1995             if ([torrent isPaused])
     2014            if ([torrent isPaused] && ![torrent waitingToStart])
    19962015                return YES;
    19972016        return NO;
     
    20062025       
    20072026        for (i = [indexSet firstIndex]; i != NSNotFound; i = [indexSet indexGreaterThanIndex: i])
    2008             if ([[fDisplayedTorrents objectAtIndex: i] isActive])
     2027        {
     2028            torrent = [fDisplayedTorrents objectAtIndex: i];
     2029            if ([torrent isActive] || [torrent waitingToStart])
    20092030                return YES;
     2031        }
    20102032        return NO;
    20112033    }
     
    20142036    if ([ident isEqualToString: TOOLBAR_RESUME_SELECTED])
    20152037    {
     2038        Torrent * torrent;
    20162039        NSIndexSet * indexSet = [fTableView selectedRowIndexes];
    20172040        unsigned int i;
    20182041       
    20192042        for (i = [indexSet firstIndex]; i != NSNotFound; i = [indexSet indexGreaterThanIndex: i])
    2020             if ([[fDisplayedTorrents objectAtIndex: i] isPaused])
     2043        {
     2044            torrent = [fDisplayedTorrents objectAtIndex: i];
     2045            if ([torrent isPaused] && ![torrent waitingToStart])
    20212046                return YES;
     2047        }
    20222048        return NO;
    20232049    }
     
    20452071    {
    20462072        NSString * title = [[fInfoController window] isVisible] ? @"Hide Inspector" : @"Show Inspector";
     2073        if (![[menuItem title] isEqualToString: title])
     2074                [menuItem setTitle: title];
     2075
     2076        return YES;
     2077    }
     2078   
     2079    //enable show pieces window
     2080    if (action == @selector(showPiecesView:))
     2081    {
     2082        NSString * title = [[fPiecesWindowController window] isVisible] ? @"Hide Pieces Viewer" : @"Show Pieces Viewer";
    20472083        if (![[menuItem title] isEqualToString: title])
    20482084                [menuItem setTitle: title];
     
    21332169        NSEnumerator * enumerator = [fTorrents objectEnumerator];
    21342170        while ((torrent = [enumerator nextObject]))
    2135             if ([torrent isActive])
     2171            if ([torrent isActive] || [torrent waitingToStart])
    21362172                return YES;
    21372173        return NO;
     
    21442180        NSEnumerator * enumerator = [fTorrents objectEnumerator];
    21452181        while ((torrent = [enumerator nextObject]))
    2146             if ([torrent isPaused])
     2182            if ([torrent isPaused] && ![torrent waitingToStart])
    21472183                return YES;
    21482184        return NO;
    21492185    }
    21502186   
    2151     //enable resume waiting item
     2187    //enable resume all waiting item
    21522188    if (action == @selector(resumeWaitingTorrents:))
    21532189    {
    2154         if (![[fDefaults stringForKey: @"StartSetting"] isEqualToString: @"Wait"])
     2190        if (![fDefaults boolForKey: @"Queue"])
    21552191            return NO;
    21562192   
     
    21622198        return NO;
    21632199    }
    2164 
    2165     //enable pause item
    2166     if (action == @selector(stopSelectedTorrents:))
    2167     {
    2168         if (!canUseTable)
    2169             return NO;
    2170    
    2171         Torrent * torrent;
    2172         NSIndexSet * indexSet = [fTableView selectedRowIndexes];
    2173         unsigned int i;
    2174        
    2175         for (i = [indexSet firstIndex]; i != NSNotFound; i = [indexSet indexGreaterThanIndex: i])
    2176         {
    2177             torrent = [fDisplayedTorrents objectAtIndex: i];
    2178             if ([torrent isActive])
    2179                 return YES;
    2180         }
    2181         return NO;
    2182     }
    2183    
    2184     //enable resume item
    2185     if (action == @selector(resumeSelectedTorrents:))
    2186     {
    2187         if (!canUseTable)
     2200   
     2201    //enable resume selected waiting item
     2202    if (action == @selector(resumeSelectedTorrentsNoWait:))
     2203    {
     2204        if (![fDefaults boolForKey: @"Queue"])
    21882205            return NO;
    21892206   
     
    21962213            torrent = [fDisplayedTorrents objectAtIndex: i];
    21972214            if ([torrent isPaused])
     2215                return YES;
     2216        }
     2217        return NO;
     2218    }
     2219
     2220    //enable pause item
     2221    if (action == @selector(stopSelectedTorrents:))
     2222    {
     2223        if (!canUseTable)
     2224            return NO;
     2225   
     2226        Torrent * torrent;
     2227        NSIndexSet * indexSet = [fTableView selectedRowIndexes];
     2228        unsigned int i;
     2229       
     2230        for (i = [indexSet firstIndex]; i != NSNotFound; i = [indexSet indexGreaterThanIndex: i])
     2231        {
     2232            torrent = [fDisplayedTorrents objectAtIndex: i];
     2233            if ([torrent isActive] || [torrent waitingToStart])
     2234                return YES;
     2235        }
     2236        return NO;
     2237    }
     2238   
     2239    //enable resume item
     2240    if (action == @selector(resumeSelectedTorrents:))
     2241    {
     2242        if (!canUseTable)
     2243            return NO;
     2244   
     2245        Torrent * torrent;
     2246        NSIndexSet * indexSet = [fTableView selectedRowIndexes];
     2247        unsigned int i;
     2248       
     2249        for (i = [indexSet firstIndex]; i != NSNotFound; i = [indexSet indexGreaterThanIndex: i])
     2250        {
     2251            torrent = [fDisplayedTorrents objectAtIndex: i];
     2252            if ([torrent isPaused] && ![torrent waitingToStart])
    21982253                return YES;
    21992254        }
  • trunk/macosx/Defaults.plist

    r807 r920  
    5353        <key>MoveFolder</key>
    5454        <string>~/Desktop</string>
     55        <key>NatTraversal</key>
     56        <true/>
     57        <key>PiecesViewerVisible</key>
     58        <false/>
    5559        <key>PlayDownloadSound</key>
    5660        <true/>
    5761        <key>PlaySeedingSound</key>
    5862        <false/>
     63        <key>Queue</key>
     64        <false/>
     65        <key>QueueDownloadNumber</key>
     66        <integer>3</integer>
    5967        <key>RatioCheck</key>
    6068        <false/>
     
    8795        <key>SpeedLimitUploadLimit</key>
    8896        <integer>10</integer>
    89         <key>StartSetting</key>
    90         <string>Start</string>
     97        <key>StartAtOpen</key>
     98        <true/>
    9199        <key>StatusBar</key>
    92100        <true/>
     
    97105        <key>UseAdvancedBar</key>
    98106        <false/>
    99         <key>WaitToStartNumber</key>
    100         <integer>3</integer>
    101107</dict>
    102108</plist>
  • trunk/macosx/English.lproj/InfoWindow.nib/classes.nib

    r797 r920  
    99        {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
    1010        {
    11             ACTIONS = {
    12                 revealFile = id;
    13                 setRatioCheck = id;
    14                 setRatioLimit = id;
    15                 setWaitToStart = id;
    16             };
     11            ACTIONS = {revealFile = id; setRatioCheck = id; setRatioLimit = id; };
    1712            CLASS = InfoWindowController;
    1813            LANGUAGE = ObjC;
     
    4742                fUploadedTotalField = NSTextField;
    4843                fUploadingToField = NSTextField;
    49                 fWaitToStartButton = NSButton;
    5044            };
    5145            SUPERCLASS = NSWindowController;
  • trunk/macosx/English.lproj/MainMenu.nib/classes.nib

    r852 r920  
    1616                resumeAllTorrents = id;
    1717                resumeSelectedTorrents = id;
     18                resumeSelectedTorrentsNoWait = id;
    1819                resumeWaitingTorrents = id;
    1920                revealFile = id;
     
    2829                showMainWindow = id;
    2930                showMessageWindow = id;
     31                showPiecesView = id;
    3032                showPreferenceWindow = id;
    3133                stopAllTorrents = id;
  • trunk/macosx/English.lproj/MainMenu.nib/info.nib

    r852 r920  
    88        <dict>
    99                <key>1041</key>
    10                 <string>439 418 208 130 0 0 1152 842 </string>
     10                <string>379 362 208 130 0 0 1024 746 </string>
    1111                <key>1480</key>
    1212                <string>366 546 420 63 0 0 1152 842 </string>
     
    1414                <string>337 545 477 67 0 0 1152 842 </string>
    1515                <key>29</key>
    16                 <string>104 684 451 44 0 0 1152 842 </string>
     16                <string>280 699 451 44 0 0 1152 842 </string>
    1717                <key>456</key>
    18                 <string>396 374 216 206 0 0 1152 842 </string>
     18                <string>340 316 240 225 0 0 1024 746 </string>
    1919                <key>581</key>
    2020                <string>571 464 115 99 0 0 1152 842 </string>
     
    3232        <key>IBOpenObjects</key>
    3333        <array>
     34                <integer>29</integer>
    3435                <integer>21</integer>
    35                 <integer>29</integer>
    3636        </array>
    3737        <key>IBSystem Version</key>
  • trunk/macosx/English.lproj/PrefsWindow.nib/classes.nib

    r752 r920  
    1818                setLimitCheck = id;
    1919                setMoveTorrent = id;
     20                setNat = id;
    2021                setPlaySound = id;
    2122                setPort = id;
     23                setQueueNumber = id;
    2224                setRatio = id;
    2325                setRatioCheck = id;
     
    2527                setSound = id;
    2628                setSpeedLimit = id;
    27                 setStartNumber = id;
    28                 setStartSetting = id;
     29                setStartAtOpen = id;
    2930                setUpdate = id;
     31                setUseQueue = id;
    3032            };
    3133            CLASS = PrefsController;
     
    4547                fGeneralView = NSView;
    4648                fImportFolderPopUp = NSPopUpButton;
     49                fNatCheck = NSButton;
     50                fNatStatusField = NSTextField;
     51                fNatStatusImage = NSImageView;
    4752                fNetworkView = NSView;
    4853                fPlayDownloadSoundCheck = NSButton;
    4954                fPlaySeedingSoundCheck = NSButton;
    5055                fPortField = NSTextField;
     56                fQueueCheck = NSButton;
     57                fQueueNumberField = NSTextField;
    5158                fQuitCheck = NSButton;
    5259                fQuitDownloadingCheck = NSButton;
     
    6168                fSpeedLimitDownloadField = NSTextField;
    6269                fSpeedLimitUploadField = NSTextField;
    63                 fStartMatrix = NSMatrix;
    64                 fStartNumberField = NSTextField;
     70                fStartAtOpenCheck = NSButton;
    6571                fTransfersView = NSView;
    6672                fUpdatePopUp = NSPopUpButton;
  • trunk/macosx/English.lproj/PrefsWindow.nib/info.nib

    r753 r920  
    44<dict>
    55        <key>IBDocumentLocation</key>
    6         <string>49 68 356 240 0 0 1152 842 </string>
     6        <string>15 73 356 240 0 0 1024 746 </string>
    77        <key>IBEditorPositions</key>
    88        <dict>
    99                <key>153</key>
    10                 <string>285 423 582 311 0 0 1152 842 </string>
     10                <string>30 315 577 267 0 0 1024 746 </string>
    1111                <key>28</key>
    12                 <string>58 372 582 290 0 0 1152 842 </string>
     12                <string>22 331 577 290 0 0 1024 746 </string>
    1313                <key>41</key>
    14                 <string>285 427 582 304 0 0 1152 842 </string>
     14                <string>230 355 563 317 0 0 1024 746 </string>
    1515                <key>66</key>
    16                 <string>164 527 582 104 0 0 1152 842 </string>
     16                <string>29 426 563 159 0 0 1024 746 </string>
    1717        </dict>
    1818        <key>IBFramework Version</key>
     
    2424        <key>IBOpenObjects</key>
    2525        <array>
    26                 <integer>153</integer>
     26                <integer>41</integer>
    2727        </array>
    2828        <key>IBSystem Version</key>
  • trunk/macosx/InfoWindowController.h

    r797 r920  
    5353    IBOutlet NSMatrix * fRatioMatrix;
    5454    IBOutlet NSTextField * fRatioLimitField;
    55     IBOutlet NSButton * fWaitToStartButton;
    5655}
    5756
    5857- (void) updateInfoForTorrents: (NSArray *) torrents;
    5958- (void) updateInfoStats;
    60 - (void) updateInfoStatsAndSettings;
     59- (void) updateInfoSettings;
    6160
    6261- (void) setNextTab;
     
    6766- (void) setRatioLimit: (id) sender;
    6867
    69 - (void) setWaitToStart: (id) sender;
    70 
    7168@end
  • trunk/macosx/InfoWindowController.m

    r842 r920  
    4444#define TAB_PEERS_HEIGHT 255.0
    4545#define TAB_FILES_HEIGHT 255.0
    46 #define TAB_OPTIONS_HEIGHT 116.0
     46#define TAB_OPTIONS_HEIGHT 83.0
    4747
    4848@interface InfoWindowController (Private)
     
    210210   
    211211    //update stats and settings
    212     [self updateInfoStatsAndSettings];
     212    [self updateInfoStats];
     213    [self updateInfoSettings];
    213214
    214215    //set file table
     
    283284}
    284285
    285 - (void) updateInfoStatsAndSettings
     286- (void) updateInfoSettings
    286287{
    287288    int numberSelected = [fTorrents count];
    288 
    289     //set wait to start
    290     BOOL waiting = NO, notWaiting = NO, canEnableWaiting = numberSelected > 0,
    291         waitingSettingOn = [[[NSUserDefaults standardUserDefaults] stringForKey: @"StartSetting"]
    292                                 isEqualToString: @"Wait"];
    293    
    294     NSEnumerator * enumerator = [fTorrents objectEnumerator];
    295     Torrent * torrent;
    296     while ((torrent = [enumerator nextObject]))
    297     {
    298         if ([torrent waitingToStart])
    299             waiting = YES;
    300         else
    301             notWaiting = YES;
    302        
    303         if (canEnableWaiting && !(![torrent isActive] && [torrent progress] < 1.0 && waitingSettingOn))
    304             canEnableWaiting = NO;
    305     }
    306    
    307     [fWaitToStartButton setState: waiting && notWaiting ? NSMixedState : (waiting ? NSOnState : NSOffState)];
    308     [fWaitToStartButton setEnabled: canEnableWaiting];
    309289
    310290    //set ratio settings
    311291    if (numberSelected > 0)
    312292    {
    313         enumerator = [fTorrents objectEnumerator];
    314         torrent = [enumerator nextObject]; //first torrent
     293        NSEnumerator * enumerator = [fTorrents objectEnumerator];
     294        Torrent * torrent = [enumerator nextObject]; //first torrent
    315295        const int INVALID = -99;
    316296        int ratioSetting = [torrent stopRatioSetting];
     
    593573}
    594574
    595 - (void) setWaitToStart: (id) sender
    596 {
    597     int state = [sender state];
    598 
    599     NSEnumerator * enumerator = [fTorrents objectEnumerator];
    600     Torrent * torrent;
    601     while ((torrent = [enumerator nextObject]))
    602         [torrent setWaitToStart: state];
    603    
    604     [[NSNotificationCenter defaultCenter] postNotificationName: @"TorrentStartSettingChange" object: fTorrents];
    605 }
    606 
    607575@end
  • trunk/macosx/MessageWindowController.m

    r844 r920  
    3131
    3232#define UPDATE_SECONDS  0.6
    33 #define MAX_LINES       1000
     33#define MAX_LINES       2500
    3434
    3535@interface MessageWindowController (Private)
  • trunk/macosx/PrefsController.h

    r752 r920  
    5151                            * fSpeedLimitAutoCheck;
    5252
    53     IBOutlet NSTextField    * fPortField;
     53    IBOutlet NSTextField    * fPortField, * fNatStatusField;
     54    IBOutlet NSButton       * fNatCheck;
     55    IBOutlet NSImageView    * fNatStatusImage;
     56    NSTimer                 * fNatStatusTimer;
     57    int                     fNatStatus;
    5458   
    5559    IBOutlet NSButton       * fRatioCheck;
    5660    IBOutlet NSTextField    * fRatioField;
    5761   
    58     IBOutlet NSMatrix       * fStartMatrix;
    59     IBOutlet NSTextField    * fStartNumberField;
     62    IBOutlet NSButton       * fQueueCheck, * fStartAtOpenCheck;
     63    IBOutlet NSTextField    * fQueueNumberField;
    6064   
    6165    IBOutlet SUUpdater      * fUpdater;
     
    7478- (void) checkUpdate;
    7579
    76 - (void) setStartSetting:   (id) sender;
    77 - (void) setStartNumber:    (id) sender;
     80- (void) setStartAtOpen:    (id) sender;
     81
     82- (void) setUseQueue:       (id) sender;
     83- (void) setQueueNumber:    (id) sender;
    7884
    7985- (void) setMoveTorrent:        (id) sender;
     
    8187- (void) folderSheetShow:       (id) sender;
    8288
    83 - (void) setPort:       (id) sender;
     89- (void) setPort:   (id) sender;
     90- (void) setNat:    (id) sender;
     91- (void) updateNatStatus;
     92
    8493- (void) setSpeedLimit: (id) sender;
    8594
  • trunk/macosx/PrefsController.m

    r850 r920  
    3434#define DOWNLOAD_ASK        3
    3535
    36 #define START_YES_CHECK_TAG     0
    37 #define START_WAIT_CHECK_TAG    1
    38 #define START_NO_CHECK_TAG      2
    39 
    4036#define UPDATE_DAILY    0
    4137#define UPDATE_WEEKLY   1
     
    8076- (void) dealloc
    8177{
     78    [fNatStatusTimer invalidate];
     79
    8280    [fDownloadFolder release];
    8381    [fImportFolder release];
     
    126124    [fPortField setIntValue: bindPort];
    127125    tr_setBindPort(fHandle, bindPort);
     126   
     127    //set NAT
     128    BOOL natShouldEnable = [fDefaults boolForKey: @"NatTraversal"];
     129    if (natShouldEnable)
     130        tr_natTraversalEnable(fHandle);
     131    [fNatCheck setState: natShouldEnable];
     132   
     133    fNatStatus = -1;
     134    [self updateNatStatus];
     135    fNatStatusTimer = [NSTimer scheduledTimerWithTimeInterval: 5.0 target: self
     136                        selector: @selector(updateNatStatus) userInfo: nil repeats: YES];
    128137   
    129138    //checks for old version upload speed of -1
     
    250259        [fDefaults setObject: [fSeedingSoundPopUp titleOfSelectedItem] forKey: @"SeedingSound"];
    251260   
    252     //set start setting
    253     NSString * startSetting = [fDefaults stringForKey: @"StartSetting"];
    254     int tag;
    255     if ([startSetting isEqualToString: @"Start"])
    256         tag = START_YES_CHECK_TAG;
    257     else if ([startSetting isEqualToString: @"Wait"])
    258         tag = START_WAIT_CHECK_TAG;
    259     else
    260         tag = START_NO_CHECK_TAG;
    261    
    262     [fStartMatrix selectCellWithTag: tag];
    263     [fStartNumberField setEnabled: tag == START_WAIT_CHECK_TAG];
    264     [fStartNumberField setIntValue: [fDefaults integerForKey: @"WaitToStartNumber"]];
     261    //set start settings
     262    BOOL useQueue = [fDefaults boolForKey: @"Queue"];
     263    [fQueueCheck setState: useQueue];
     264    [fQueueNumberField setEnabled: useQueue];
     265    [fQueueNumberField setIntValue: [fDefaults integerForKey: @"QueueDownloadNumber"]];
     266   
     267    [fStartAtOpenCheck setState: [fDefaults boolForKey: @"StartAtOpen"]];
    265268   
    266269    //set private torrents
     
    355358        tr_setBindPort(fHandle, bindPort);
    356359        [fDefaults setInteger: bindPort forKey: @"BindPort"];
     360       
     361        [self updateNatStatus];
     362    }
     363}
     364
     365- (void) setNat: (id) sender
     366{
     367    BOOL enable = [sender state] == NSOnState;
     368    enable ? tr_natTraversalEnable(fHandle) : tr_natTraversalDisable(fHandle);
     369    [fDefaults setBool: enable forKey: @"NatTraversal"];
     370   
     371    [self updateNatStatus];
     372}
     373
     374- (void) updateNatStatus
     375{
     376    int status = tr_natTraversalStatus(fHandle);
     377    if (fNatStatus == status)
     378        return;
     379    fNatStatus = status;
     380   
     381    if (status == 2)
     382    {
     383        [fNatStatusField setStringValue: @"Ports successfully mapped"];
     384        [fNatStatusImage setImage: [NSImage imageNamed: @"Check.png"]];
     385    }
     386    else if (status == 3 || status == 4)
     387    {
     388        [fNatStatusField setStringValue: @"Error mapping ports"];
     389        [fNatStatusImage setImage: [NSImage imageNamed: @"Error.tiff"]];
     390    }
     391    else
     392    {
     393        [fNatStatusField setStringValue: @""];
     394        [fNatStatusImage setImage: nil];
    357395    }
    358396}
     
    662700}
    663701
    664 - (void) setStartSetting: (id) sender
    665 {
    666     NSString * startSetting;
    667 
    668     int tag = [[fStartMatrix selectedCell] tag];
    669     if (tag == START_YES_CHECK_TAG)
    670         startSetting = @"Start";
    671     else if (tag == START_WAIT_CHECK_TAG)
    672         startSetting = @"Wait";
    673     else
    674         startSetting = @"Manual";
    675    
    676     [fDefaults setObject: startSetting forKey: @"StartSetting"];
    677    
    678     [self setStartNumber: fStartNumberField];
    679     [fStartNumberField setEnabled: tag == START_WAIT_CHECK_TAG];
    680 }
    681 
    682 - (void) setStartNumber: (id) sender
    683 {
    684     int waitNumber = [sender intValue];
    685     if (![[sender stringValue] isEqualToString: [NSString stringWithInt: waitNumber]] || waitNumber < 1)
     702- (void) setStartAtOpen: (id) sender
     703{
     704    [fDefaults setBool: [sender state] == NSOnState forKey: @"StartAtOpen"];
     705}
     706
     707- (void) setUseQueue: (id) sender
     708{
     709    BOOL useQueue = [sender state] == NSOnState;
     710   
     711    [fDefaults setBool: useQueue forKey: @"Queue"];
     712    [self setQueueNumber: fQueueNumberField];
     713    [fQueueNumberField setEnabled: useQueue];
     714}
     715
     716- (void) setQueueNumber: (id) sender
     717{
     718    int queueNumber = [sender intValue];
     719    if (![[sender stringValue] isEqualToString: [NSString stringWithInt: queueNumber]] || queueNumber < 1)
    686720    {
    687721        NSBeep();
    688         waitNumber = [fDefaults floatForKey: @"WaitToStartNumber"];
    689         [sender setIntValue: waitNumber];
    690     }
    691     else
    692         [fDefaults setInteger: waitNumber forKey: @"WaitToStartNumber"];
     722        queueNumber = [fDefaults integerForKey: @"QueueDownloadNumber"];
     723        [sender setIntValue: queueNumber];
     724    }
     725    else
     726        [fDefaults setInteger: queueNumber forKey: @"QueueDownloadNumber"];
    693727   
    694728    [[NSNotificationCenter defaultCenter] postNotificationName: @"GlobalStartSettingChange" object: self];
  • trunk/macosx/Torrent.m

    r861 r920  
    5252                kBlue3 = BE(0x50A0FFFF), //80, 160, 255
    5353                kBlue4 = BE(0x1E46B4FF), //30, 70, 180
    54                 kGray  = BE(0x828282FF), //130, 130, 130
     54                kGray  = BE(0x969696FF), //150, 150, 150
    5555                kGreen = BE(0x00FF00FF), //0, 255, 0
    5656                kWhite = BE(0xFFFFFFFF); //255, 255, 255
     
    193193            if (fFinishedSeeding)
    194194                tempString = @"Seeding complete";
    195             else if (fWaitToStart && [[fDefaults stringForKey: @"StartSetting"] isEqualToString: @"Wait"])
     195            else if (fWaitToStart)
    196196                tempString = [@"Waiting to start" stringByAppendingEllipsis];
    197197            else
     
    316316}
    317317
     318- (void) startTransfer
     319{
     320    if (![self isActive])
     321    {
     322        tr_torrentStart(fHandle);
     323
     324        fFinishedSeeding = NO;
     325        fWaitToStart = NO;
     326    }
     327}
     328
     329- (void) stopTransfer
     330{
     331    if ([self isActive])
     332    {
     333        BOOL wasSeeding = [self isSeeding];
     334   
     335        tr_torrentStop(fHandle);
     336
     337        if (!wasSeeding)
     338            [[NSNotificationCenter defaultCenter] postNotificationName: @"StoppedDownloading" object: self];
     339    }
     340}
     341
     342- (void) stopTransferForQuit
     343{
     344    if ([self isActive])
     345        tr_torrentStop(fHandle);
     346}
     347
     348- (void) removeForever
     349{
     350    if (fPrivateTorrent)
     351        tr_torrentRemoveSaved(fHandle);
     352}
     353
     354- (void) sleep
     355{
     356    if ((fResumeOnWake = [self isActive]))
     357        tr_torrentStop(fHandle);
     358}
     359
     360- (void) wakeUp
     361{
     362    if (fResumeOnWake)
     363        tr_torrentStart(fHandle);
     364}
     365
     366- (float) ratio
     367{
     368    float downloaded = [self downloadedTotal];
     369    return downloaded > 0 ? (float)[self uploadedTotal] / downloaded : -1;
     370}
     371
     372- (int) stopRatioSetting
     373{
     374        return fStopRatioSetting;
     375}
     376
     377- (void) setStopRatioSetting: (int) setting
     378{
     379    fStopRatioSetting = setting;
     380}
     381
     382- (float) ratioLimit
     383{
     384    return fRatioLimit;
     385}
     386
     387- (void) setRatioLimit: (float) limit
     388{
     389    if (limit >= 0)
     390        fRatioLimit = limit;
     391}
     392
     393- (void) setWaitToStart: (BOOL) wait
     394{
     395    fWaitToStart = wait;
     396}
     397
     398- (BOOL) waitingToStart
     399{
     400    return fWaitToStart;
     401}
     402
     403- (void) revealData
     404{
     405    [[NSWorkspace sharedWorkspace] selectFile: [self dataLocation] inFileViewerRootedAtPath: nil];
     406}
     407
     408- (void) trashData
     409{
     410    [self trashFile: [self dataLocation]];
     411}
     412
     413- (void) trashTorrent
     414{
     415    if (fPublicTorrent)
     416        [self trashFile: [self publicTorrentLocation]];
     417}
     418
     419- (NSImage *) icon
     420{
     421    return fIcon;
     422}
     423
     424- (NSImage *) iconFlipped
     425{
     426    return fIconFlipped;
     427}
     428
     429- (NSImage *) iconSmall
     430{
     431    return fIconSmall;
     432}
     433
     434- (NSString *) name
     435{
     436    return [NSString stringWithUTF8String: fInfo->name];
     437}
     438
     439- (uint64_t) size
     440{
     441    return fInfo->totalSize;
     442}
     443
     444- (NSString *) tracker
     445{
     446    return [NSString stringWithFormat: @"%s:%d", fInfo->trackerAddress, fInfo->trackerPort];
     447}
     448
     449- (NSString *) announce
     450{
     451    return [NSString stringWithUTF8String: fInfo->trackerAnnounce];
     452}
     453
     454- (int) pieceSize
     455{
     456    return fInfo->pieceSize;
     457}
     458
     459- (int) pieceCount
     460{
     461    return fInfo->pieceCount;
     462}
     463
     464- (NSString *) hashString
     465{
     466    return [NSString stringWithUTF8String: fInfo->hashString];
     467}
     468
     469- (NSString *) torrentLocation
     470{
     471    return [NSString stringWithUTF8String: fInfo->torrent];
     472}
     473
     474- (NSString *) publicTorrentLocation
     475{
     476    return fPublicTorrentLocation;
     477}
     478
     479- (NSString *) torrentLocationString
     480{
     481    return fPrivateTorrent ? @"Transmission Support Folder" : [fPublicTorrentLocation stringByAbbreviatingWithTildeInPath];
     482}
     483
     484- (NSString *) dataLocation
     485{
     486    return [[self downloadFolder] stringByAppendingPathComponent: [self name]];
     487}
     488
     489- (BOOL) publicTorrent
     490{
     491    return fPublicTorrent;
     492}
     493
     494- (BOOL) privateTorrent
     495{
     496    return fPrivateTorrent;
     497}
     498
     499- (NSString *) stateString
     500{
     501    switch( fStat->status )
     502    {
     503        case TR_STATUS_PAUSE:
     504            return @"Paused";
     505            break;
     506
     507        case TR_STATUS_CHECK:
     508            return [@"Checking existing files" stringByAppendingEllipsis];
     509            break;
     510
     511        case TR_STATUS_DOWNLOAD:
     512            return @"Downloading";
     513            break;
     514
     515        case TR_STATUS_SEED:
     516            return @"Seeding";
     517            break;
     518
     519        case TR_STATUS_STOPPING:
     520            return [@"Stopping" stringByAppendingEllipsis];
     521            break;
     522       
     523        default:
     524            return @"N/A";
     525    }
     526}
     527
     528- (float) progress
     529{
     530    return fStat->progress;
     531}
     532
     533- (int) eta
     534{
     535    return fStat->eta;
     536}
     537
     538- (BOOL) isActive
     539{
     540    return fStat->status & TR_STATUS_ACTIVE;
     541}
     542
     543- (BOOL) isSeeding
     544{
     545    return fStat->status == TR_STATUS_SEED;
     546}
     547
     548- (BOOL) isPaused
     549{
     550    return fStat->status == TR_STATUS_PAUSE;
     551}
     552
     553- (BOOL) isError
     554{
     555    return fStat->error & TR_ETRACKER;
     556}
     557
     558- (BOOL) justFinished
     559{
     560    return tr_getFinished(fHandle);
     561}
     562
     563- (NSArray *) peers
     564{
     565    int totalPeers, i;
     566    tr_peer_stat_t * peers = tr_torrentPeers(fHandle, & totalPeers);
     567   
     568    NSMutableArray * peerDics = [NSMutableArray arrayWithCapacity: totalPeers];
     569    tr_peer_stat_t peer;
     570    NSString * client;
     571    for (i = 0; i < totalPeers; i++)
     572    {
     573        peer = peers[i];
     574        [peerDics addObject: [NSDictionary dictionaryWithObjectsAndKeys:
     575            [NSNumber numberWithBool: peer.isConnected], @"Connected",
     576            [NSString stringWithCString: (char *) peer.addr encoding: NSUTF8StringEncoding], @"IP",
     577            [NSString stringWithCString: (char *) peer.client encoding: NSUTF8StringEncoding], @"Client",
     578            [NSNumber numberWithBool: peer.isDownloading], @"UL To",
     579            [NSNumber numberWithBool: peer.isUploading], @"DL From", nil]];
     580    }
     581   
     582    tr_torrentPeersFree(peers, totalPeers);
     583   
     584    return peerDics;
     585}
     586
     587- (NSString *) progressString
     588{
     589    return fProgressString;
     590}
     591
     592- (NSString *) statusString
     593{
     594    return fStatusString;
     595}
     596
     597- (NSString *) shortStatusString
     598{
     599    return fShortStatusString;
     600}
     601
     602- (NSString *) remainingTimeString
     603{
     604    return fRemainingTimeString;
     605}
     606
     607- (int) seeders
     608{
     609    return fStat->seeders;
     610}
     611
     612- (int) leechers
     613{
     614    return fStat->leechers;
     615}
     616
     617- (int) totalPeers
     618{
     619    return fStat->peersTotal;
     620}
     621
     622//peers uploading to you
     623- (int) peersUploading
     624{
     625    return fStat->peersUploading;
     626}
     627
     628//peers downloading from you
     629- (int) peersDownloading
     630{
     631    return fStat->peersDownloading;
     632}
     633
     634- (float) downloadRate
     635{
     636    return fStat->rateDownload;
     637}
     638
     639- (float) uploadRate
     640{
     641    return fStat->rateUpload;
     642}
     643
     644- (float) downloadedValid
     645{
     646    return [self progress] * [self size];
     647}
     648
     649- (uint64_t) downloadedTotal
     650{
     651    return fStat->downloaded;
     652}
     653
     654- (uint64_t) uploadedTotal
     655{
     656    return fStat->uploaded;
     657}
     658
     659- (float) swarmSpeed
     660{
     661    return fStat->swarmspeed;
     662}
     663
     664- (NSNumber *) orderValue
     665{
     666    return [NSNumber numberWithInt: fOrderValue];
     667}
     668
     669- (void) setOrderValue: (int) orderValue
     670{
     671    fOrderValue = orderValue;
     672}
     673
     674- (NSArray *) fileList
     675{
     676    int count = fInfo->fileCount, i;
     677    tr_file_t file;
     678    NSMutableArray * files = [NSMutableArray arrayWithCapacity: count];
     679   
     680    for (i = 0; i < count; i++)
     681    {
     682        file = fInfo->files[i];
     683        [files addObject: [NSDictionary dictionaryWithObjectsAndKeys:
     684            [[self downloadFolder] stringByAppendingPathComponent: [NSString stringWithUTF8String: file.name]], @"Name",
     685            [NSNumber numberWithUnsignedLongLong: file.length], @"Size", nil]];
     686    }
     687   
     688    return files;
     689}
     690
     691- (NSDate *) date
     692{
     693    return fDate;
     694}
     695
     696- (NSNumber *) stateSortKey
     697{
     698    if (![self isActive])
     699        return [NSNumber numberWithInt: 0];
     700    else if ([self isSeeding])
     701        return [NSNumber numberWithInt: 1];
     702    else
     703        return [NSNumber numberWithInt: 2];
     704}
     705
     706- (NSNumber *) progressSortKey
     707{
     708    //if finished downloading sort by ratio instead of progress
     709    float progress = [self progress];
     710    return [NSNumber numberWithFloat: progress < 1.0 ? progress : 2.0 + [self ratio]];
     711}
     712
     713@end
     714
     715
     716@implementation Torrent (Private)
     717
     718//if a hash is given, attempt to load that; otherwise, attempt to open file at path
     719- (id) initWithHash: (NSString *) hashString path: (NSString *) path lib: (tr_handle_t *) lib
     720        privateTorrent: (NSNumber *) privateTorrent publicTorrent: (NSNumber *) publicTorrent
     721        date: (NSDate *) date stopRatioSetting: (NSNumber *) stopRatioSetting
     722        ratioLimit: (NSNumber *) ratioLimit waitToStart: (NSNumber *) waitToStart
     723        orderValue: (NSNumber *) orderValue
     724{
     725    if (!(self = [super init]))
     726        return nil;
     727
     728    fLib = lib;
     729    fDefaults = [NSUserDefaults standardUserDefaults];
     730
     731    fPrivateTorrent = privateTorrent ? [privateTorrent boolValue] : [fDefaults boolForKey: @"SavePrivateTorrent"];
     732    fPublicTorrent = !fPrivateTorrent || (publicTorrent ? [publicTorrent boolValue]
     733                                            : ![fDefaults boolForKey: @"DeleteOriginalTorrent"]);
     734
     735    int error;
     736    if (fPrivateTorrent && hashString)
     737        fHandle = tr_torrentInitSaved(fLib, [hashString UTF8String], TR_FSAVEPRIVATE, & error);
     738   
     739    if (!fHandle && path)
     740        fHandle = tr_torrentInit(fLib, [path UTF8String], fPrivateTorrent ? TR_FSAVEPRIVATE : 0, & error);
     741
     742    if (!fHandle)
     743    {
     744        [self release];
     745        return nil;
     746    }
     747   
     748    fInfo = tr_torrentInfo( fHandle );
     749
     750    if (fPublicTorrent)
     751        fPublicTorrentLocation = [path retain];
     752
     753    fDate = date ? [date retain] : [[NSDate alloc] init];
     754   
     755    fStopRatioSetting = stopRatioSetting ? [stopRatioSetting intValue] : -1;
     756    fRatioLimit = ratioLimit ? [ratioLimit floatValue] : [fDefaults floatForKey: @"RatioLimit"];
     757    fFinishedSeeding = NO;
     758   
     759    fWaitToStart = waitToStart ? [waitToStart boolValue] : [fDefaults boolForKey: @"StartAtOpen"];
     760    fOrderValue = orderValue ? [orderValue intValue] : tr_torrentCount(fLib) - 1;
     761   
     762    NSString * fileType = fInfo->multifile ? NSFileTypeForHFSTypeCode('fldr') : [[self name] pathExtension];
     763    fIcon = [[NSWorkspace sharedWorkspace] iconForFileType: fileType];
     764    [fIcon retain];
     765   
     766    fIconFlipped = [fIcon copy];
     767    [fIconFlipped setFlipped: YES];
     768   
     769    fIconSmall = [fIconFlipped copy];
     770    [fIconSmall setScalesWhenResized: YES];
     771    [fIconSmall setSize: NSMakeSize(16.0, 16.0)];
     772
     773    fProgressString = [[NSMutableString alloc] initWithCapacity: 50];
     774    fStatusString = [[NSMutableString alloc] initWithCapacity: 75];
     775    fShortStatusString = [[NSMutableString alloc] initWithCapacity: 30];
     776    fRemainingTimeString = [[NSMutableString alloc] initWithCapacity: 30];
     777
     778    [self update];
     779    return self;
     780}
     781
    318782- (NSImage *) advancedBar
    319783{
    320     #warning figure out length
    321784    int width = 250; //integers for bars
    322785   
     
    351814        p[w + bytesPerRow / 4] = kGreen;
    352815    }
    353     for (; w < width - 2; w++)
     816    for (; w < width; w++)
    354817    {
    355818        p[w] = kWhite;
     
    362825    {
    363826        if (pieces[w] < 0)
     827            color = kGreen;
     828        else if (pieces[w] == 0)
    364829            color = kGray;
    365         else if (pieces[w] == 0)
    366             color = kRed;
    367830        else if (pieces[w] == 1)
    368831            color = kBlue1;
     
    393856}
    394857
    395 - (void) startTransfer
    396 {
    397     if (![self isActive])
    398     {
    399         tr_torrentStart(fHandle);
    400 
    401         fFinishedSeeding = NO;
    402         fWaitToStart = NO;
    403        
    404         [[NSNotificationCenter defaultCenter] postNotificationName: @"TorrentSettingChange" object: self];
    405     }
    406 }
    407 
    408 - (void) stopTransfer
    409 {
    410     if ([self isActive])
    411     {
    412         BOOL wasSeeding = [self isSeeding];
    413    
    414         tr_torrentStop(fHandle);
    415 
    416         if (!wasSeeding)
    417             [[NSNotificationCenter defaultCenter] postNotificationName: @"StoppedDownloading" object: self];
    418     }
    419 }
    420 
    421 - (void) stopTransferForQuit
    422 {
    423     if ([self isActive])
    424         tr_torrentStop(fHandle);
    425 }
    426 
    427 - (void) removeForever
    428 {
    429     if (fPrivateTorrent)
    430         tr_torrentRemoveSaved(fHandle);
    431 }
    432 
    433 - (void) sleep
    434 {
    435     if ((fResumeOnWake = [self isActive]))
    436         tr_torrentStop(fHandle);
    437 }
    438 
    439 - (void) wakeUp
    440 {
    441     if (fResumeOnWake)
    442         tr_torrentStart(fHandle);
    443 }
    444 
    445 - (float) ratio
    446 {
    447     float downloaded = [self downloadedTotal];
    448     return downloaded > 0 ? (float)[self uploadedTotal] / downloaded : -1;
    449 }
    450 
    451 - (int) stopRatioSetting
    452 {
    453         return fStopRatioSetting;
    454 }
    455 
    456 - (void) setStopRatioSetting: (int) setting
    457 {
    458     fStopRatioSetting = setting;
    459 }
    460 
    461 - (float) ratioLimit
    462 {
    463     return fRatioLimit;
    464 }
    465 
    466 - (void) setRatioLimit: (float) limit
    467 {
    468     if (limit >= 0)
    469         fRatioLimit = limit;
    470 }
    471 
    472 - (void) setWaitToStart: (BOOL) wait
    473 {
    474     fWaitToStart = wait;
    475 }
    476 
    477 - (BOOL) waitingToStart
    478 {
    479     return fWaitToStart;
    480 }
    481 
    482 - (void) revealData
    483 {
    484     [[NSWorkspace sharedWorkspace] selectFile: [self dataLocation] inFileViewerRootedAtPath: nil];
    485 }
    486 
    487 - (void) trashData
    488 {
    489     [self trashFile: [self dataLocation]];
    490 }
    491 
    492 - (void) trashTorrent
    493 {
    494     if (fPublicTorrent)
    495         [self trashFile: [self publicTorrentLocation]];
    496 }
    497 
    498 - (NSImage *) icon
    499 {
    500     return fIcon;
    501 }
    502 
    503 - (NSImage *) iconFlipped
    504 {
    505     return fIconFlipped;
    506 }
    507 
    508 - (NSImage *) iconSmall
    509 {
    510     return fIconSmall;
    511 }
    512 
    513 - (NSString *) name
    514 {
    515     return [NSString stringWithUTF8String: fInfo->name];
    516 }
    517 
    518 - (uint64_t) size
    519 {
    520     return fInfo->totalSize;
    521 }
    522 
    523 - (NSString *) tracker
    524 {
    525     return [NSString stringWithFormat: @"%s:%d", fInfo->trackerAddress, fInfo->trackerPort];
    526 }
    527 
    528 - (NSString *) announce
    529 {
    530     return [NSString stringWithUTF8String: fInfo->trackerAnnounce];
    531 }
    532 
    533 - (int) pieceSize
    534 {
    535     return fInfo->pieceSize;
    536 }
    537 
    538 - (int) pieceCount
    539 {
    540     return fInfo->pieceCount;
    541 }
    542 
    543 - (NSString *) hashString
    544 {
    545     return [NSString stringWithUTF8String: fInfo->hashString];
    546 }
    547 
    548 - (NSString *) torrentLocation
    549 {
    550     return [NSString stringWithUTF8String: fInfo->torrent];
    551 }
    552 
    553 - (NSString *) publicTorrentLocation
    554 {
    555     return fPublicTorrentLocation;
    556 }
    557 
    558 - (NSString *) torrentLocationString
    559 {
    560     return fPrivateTorrent ? @"Transmission Support Folder" : [fPublicTorrentLocation stringByAbbreviatingWithTildeInPath];
    561 }
    562 
    563 - (NSString *) dataLocation
    564 {
    565     return [[self downloadFolder] stringByAppendingPathComponent: [self name]];
    566 }
    567 
    568 - (BOOL) publicTorrent
    569 {
    570     return fPublicTorrent;
    571 }
    572 
    573 - (BOOL) privateTorrent
    574 {
    575     return fPrivateTorrent;
    576 }
    577 
    578 - (NSString *) stateString
    579 {
    580     switch( fStat->status )
    581     {
    582         case TR_STATUS_PAUSE:
    583             return @"Paused";
    584             break;
    585 
    586         case TR_STATUS_CHECK:
    587             return [@"Checking existing files" stringByAppendingEllipsis];
    588             break;
    589 
    590         case TR_STATUS_DOWNLOAD:
    591             return @"Downloading";
    592             break;
    593 
    594         case TR_STATUS_SEED:
    595             return @"Seeding";
    596             break;
    597 
    598         case TR_STATUS_STOPPING:
    599             return [@"Stopping" stringByAppendingEllipsis];
    600             break;
    601        
    602         default:
    603             return @"N/A";
    604     }
    605 }
    606 
    607 - (float) progress
    608 {
    609     return fStat->progress;
    610 }
    611 
    612 - (int) eta
    613 {
    614     return fStat->eta;
    615 }
    616 
    617 - (BOOL) isActive
    618 {
    619     return fStat->status & TR_STATUS_ACTIVE;
    620 }
    621 
    622 - (BOOL) isSeeding
    623 {
    624     return fStat->status == TR_STATUS_SEED;
    625 }
    626 
    627 - (BOOL) isPaused
    628 {
    629     return fStat->status == TR_STATUS_PAUSE;
    630 }
    631 
    632 - (BOOL) isError
    633 {
    634     return fStat->error & TR_ETRACKER;
    635 }
    636 
    637 - (BOOL) justFinished
    638 {
    639     return tr_getFinished(fHandle);
    640 }
    641 
    642 - (NSArray *) peers
    643 {
    644     int totalPeers, i;
    645     tr_peer_stat_t * peers = tr_torrentPeers(fHandle, & totalPeers);
    646    
    647     NSMutableArray * peerDics = [NSMutableArray arrayWithCapacity: totalPeers];
    648     tr_peer_stat_t peer;
    649     NSString * client;
    650     for (i = 0; i < totalPeers; i++)
    651     {
    652         peer = peers[i];
    653         [peerDics addObject: [NSDictionary dictionaryWithObjectsAndKeys:
    654             [NSNumber numberWithBool: peer.isConnected], @"Connected",
    655             [NSString stringWithCString: (char *) peer.addr encoding: NSUTF8StringEncoding], @"IP",
    656             [NSString stringWithCString: (char *) peer.client encoding: NSUTF8StringEncoding], @"Client",
    657             [NSNumber numberWithBool: peer.isDownloading], @"UL To",
    658             [NSNumber numberWithBool: peer.isUploading], @"DL From", nil]];
    659     }
    660    
    661     tr_torrentPeersFree(peers, totalPeers);
    662    
    663     return peerDics;
    664 }
    665 
    666 - (NSString *) progressString
    667 {
    668     return fProgressString;
    669 }
    670 
    671 - (NSString *) statusString
    672 {
    673     return fStatusString;
    674 }
    675 
    676 - (NSString *) shortStatusString
    677 {
    678     return fShortStatusString;
    679 }
    680 
    681 - (NSString *) remainingTimeString
    682 {
    683     return fRemainingTimeString;
    684 }
    685 
    686 - (int) seeders
    687 {
    688     return fStat->seeders;
    689 }
    690 
    691 - (int) leechers
    692 {
    693     return fStat->leechers;
    694 }
    695 
    696 - (int) totalPeers
    697 {
    698     return fStat->peersTotal;
    699 }
    700 
    701 //peers uploading to you
    702 - (int) peersUploading
    703 {
    704     return fStat->peersUploading;
    705 }
    706 
    707 //peers downloading from you
    708 - (int) peersDownloading
    709 {
    710     return fStat->peersDownloading;
    711 }
    712 
    713 - (float) downloadRate
    714 {
    715     return fStat->rateDownload;
    716 }
    717 
    718 - (float) uploadRate
    719 {
    720     return fStat->rateUpload;
    721 }
    722 
    723 - (float) downloadedValid
    724 {
    725     return [self progress] * [self size];
    726 }
    727 
    728 - (uint64_t) downloadedTotal
    729 {
    730     return fStat->downloaded;
    731 }
    732 
    733 - (uint64_t) uploadedTotal
    734 {
    735     return fStat->uploaded;
    736 }
    737 
    738 - (float) swarmSpeed
    739 {
    740     return fStat->swarmspeed;
    741 }
    742 
    743 - (NSNumber *) orderValue
    744 {
    745     return [NSNumber numberWithInt: fOrderValue];
    746 }
    747 
    748 - (void) setOrderValue: (int) orderValue
    749 {
    750     fOrderValue = orderValue;
    751 }
    752 
    753 - (NSArray *) fileList
    754 {
    755     int count = fInfo->fileCount, i;
    756     tr_file_t file;
    757     NSMutableArray * files = [NSMutableArray arrayWithCapacity: count];
    758    
    759     for (i = 0; i < count; i++)
    760     {
    761         file = fInfo->files[i];
    762         [files addObject: [NSDictionary dictionaryWithObjectsAndKeys:
    763             [[self downloadFolder] stringByAppendingPathComponent: [NSString stringWithUTF8String: file.name]], @"Name",
    764             [NSNumber numberWithUnsignedLongLong: file.length], @"Size", nil]];
    765     }
    766    
    767     return files;
    768 }
    769 
    770 - (NSDate *) date
    771 {
    772     return fDate;
    773 }
    774 
    775 - (NSNumber *) stateSortKey
    776 {
    777     if (![self isActive])
    778         return [NSNumber numberWithInt: 0];
    779     else if ([self isSeeding])
    780         return [NSNumber numberWithInt: 1];
    781     else
    782         return [NSNumber numberWithInt: 2];
    783 }
    784 
    785 - (NSNumber *) progressSortKey
    786 {
    787     //if finished downloading sort by ratio instead of progress
    788     float progress = [self progress];
    789     return [NSNumber numberWithFloat: progress < 1.0 ? progress : 2.0 + [self ratio]];
    790 }
    791 
    792 @end
    793 
    794 
    795 @implementation Torrent (Private)
    796 
    797 //if a hash is given, attempt to load that; otherwise, attempt to open file at path
    798 - (id) initWithHash: (NSString *) hashString path: (NSString *) path lib: (tr_handle_t *) lib
    799         privateTorrent: (NSNumber *) privateTorrent publicTorrent: (NSNumber *) publicTorrent
    800         date: (NSDate *) date stopRatioSetting: (NSNumber *) stopRatioSetting
    801         ratioLimit: (NSNumber *) ratioLimit waitToStart: (NSNumber *) waitToStart
    802         orderValue: (NSNumber *) orderValue
    803 {
    804     if (!(self = [super init]))
    805         return nil;
    806 
    807     fLib = lib;
    808     fDefaults = [NSUserDefaults standardUserDefaults];
    809 
    810     fPrivateTorrent = privateTorrent ? [privateTorrent boolValue] : [fDefaults boolForKey: @"SavePrivateTorrent"];
    811     fPublicTorrent = !fPrivateTorrent || (publicTorrent ? [publicTorrent boolValue]
    812                                             : ![fDefaults boolForKey: @"DeleteOriginalTorrent"]);
    813 
    814     int error;
    815     if (fPrivateTorrent && hashString)
    816         fHandle = tr_torrentInitSaved(fLib, [hashString UTF8String], TR_FSAVEPRIVATE, & error);
    817    
    818     if (!fHandle && path)
    819         fHandle = tr_torrentInit(fLib, [path UTF8String], fPrivateTorrent ? TR_FSAVEPRIVATE : 0, & error);
    820 
    821     if (!fHandle)
    822     {
    823         [self release];
    824         return nil;
    825     }
    826    
    827     fInfo = tr_torrentInfo( fHandle );
    828 
    829     if (fPublicTorrent)
    830         fPublicTorrentLocation = [path retain];
    831 
    832     fDate = date ? [date retain] : [[NSDate alloc] init];
    833    
    834     fStopRatioSetting = stopRatioSetting ? [stopRatioSetting intValue] : -1;
    835     fRatioLimit = ratioLimit ? [ratioLimit floatValue] : [fDefaults floatForKey: @"RatioLimit"];
    836     fFinishedSeeding = NO;
    837    
    838     fWaitToStart = waitToStart ? [waitToStart boolValue]
    839                     : ![[fDefaults stringForKey: @"StartSetting"] isEqualToString: @"Manual"];
    840     fOrderValue = orderValue ? [orderValue intValue] : tr_torrentCount(fLib) - 1;
    841    
    842     NSString * fileType = fInfo->multifile ? NSFileTypeForHFSTypeCode('fldr') : [[self name] pathExtension];
    843     fIcon = [[NSWorkspace sharedWorkspace] iconForFileType: fileType];
    844     [fIcon retain];
    845    
    846     fIconFlipped = [fIcon copy];
    847     [fIconFlipped setFlipped: YES];
    848    
    849     fIconSmall = [fIconFlipped copy];
    850     [fIconSmall setScalesWhenResized: YES];
    851     [fIconSmall setSize: NSMakeSize(16.0, 16.0)];
    852 
    853     fProgressString = [[NSMutableString alloc] initWithCapacity: 50];
    854     fStatusString = [[NSMutableString alloc] initWithCapacity: 75];
    855     fShortStatusString = [[NSMutableString alloc] initWithCapacity: 30];
    856     fRemainingTimeString = [[NSMutableString alloc] initWithCapacity: 30];
    857 
    858     [self update];
    859     return self;
    860 }
    861 
    862858- (void) trashFile: (NSString *) path
    863859{
  • trunk/macosx/TorrentCell.m

    r858 r920  
    152152    NSDictionary * info = [self objectValue];
    153153   
    154     //if seeding, there's no need for the advanced bar
    155     if ([[info objectForKey: @"Seeding"] boolValue])
    156     {
    157         [self buildSimpleBar: widthFloat point: point];
    158         return;
    159     }
    160    
    161154    //draw overlay over advanced bar
    162155    [fProgressEndAdvanced compositeToPoint: point operation: NSCompositeSourceOver];
  • trunk/macosx/TorrentTableView.h

    r699 r920  
    4040   
    4141    IBOutlet NSMenu     * fContextRow, * fContextNoRow;
    42     NSImage             * fResumeOnIcon, * fResumeOffIcon, * fPauseOnIcon, * fPauseOffIcon,
     42    NSImage             * fResumeOnIcon, * fResumeOffIcon,
     43                        * fPauseOnIcon, * fPauseOffIcon,
     44                        * fResumeNoWaitOnIcon, * fResumeNoWaitOffIcon,
    4345                        * fRevealOnIcon, * fRevealOffIcon;
    4446   
  • trunk/macosx/TorrentTableView.m

    r729 r920  
    5656        fResumeOffIcon = [NSImage imageNamed: @"ResumeOff.png"];
    5757        fPauseOnIcon = [NSImage imageNamed: @"PauseOn.png"];
     58        fResumeNoWaitOnIcon = [NSImage imageNamed: @"ResumeNoWaitOn.png"];
     59        fResumeNoWaitOffIcon = [NSImage imageNamed: @"ResumeNoWaitOff.png"];
    5860        fPauseOffIcon = [NSImage imageNamed: @"PauseOff.png"];
    5961        fRevealOnIcon = [NSImage imageNamed: @"RevealOn.png"];
     
    9597    fClickPoint = [self convertPoint: [event locationInWindow] fromView: nil];
    9698
    97     if ([event modifierFlags] & NSAlternateKeyMask)
    98     {
    99         [fController toggleAdvancedBar: self];
    100         fClickPoint = NSZeroPoint;
    101     }
    102     else if (![self pointInPauseRect: fClickPoint] && ![self pointInRevealRect: fClickPoint])
    103     {
    104         if ([self pointInMinimalStatusRect: fClickPoint])
    105             [(TorrentCell *)[[self tableColumnWithIdentifier: @"Torrent"] dataCell] toggleMinimalStatus];
    106 
    107         [super mouseDown: event];
     99    if (![self pointInPauseRect: fClickPoint] && ![self pointInRevealRect: fClickPoint])
     100    {
     101        if ([event modifierFlags] & NSAlternateKeyMask)
     102        {
     103            [fController toggleAdvancedBar: self];
     104            fClickPoint = NSZeroPoint;
     105        }
     106        else
     107        {
     108            if ([self pointInMinimalStatusRect: fClickPoint])
     109                [(TorrentCell *)[[self tableColumnWithIdentifier: @"Torrent"] dataCell] toggleMinimalStatus];
     110
     111            [super mouseDown: event];
     112        }
    108113    }
    109114    else;
     
    122127        Torrent * torrent = [fTorrents objectAtIndex: row];
    123128
    124                 if ([torrent isPaused])
    125                         [fController resumeTorrents: [NSArray arrayWithObject: torrent]];
    126                 else if ([torrent isActive])
     129        if ([torrent isActive])
    127130            [fController stopTorrents: [NSArray arrayWithObject: torrent]];
    128                 else;
     131        else if ([torrent isPaused])
     132        {
     133            if ([[NSApp currentEvent] modifierFlags] & NSAlternateKeyMask)
     134                [fController resumeTorrentsNoWait: [NSArray arrayWithObject: torrent]];
     135            else if ([torrent waitingToStart])
     136                [fController stopTorrents: [NSArray arrayWithObject: torrent]];
     137            else
     138                [fController resumeTorrents: [NSArray arrayWithObject: torrent]];
     139        }
     140        else;
    129141    }
    130142    else if (sameRow && [self pointInRevealRect: point] && [self pointInRevealRect: fClickPoint])
    131143        [[fTorrents objectAtIndex: row] revealData];
    132         else if ([event clickCount] == 2)
     144    else if ([event clickCount] == 2)
    133145    {
    134146        if ([self pointInIconRect: point])
     
    139151    else;
    140152   
    141         [super mouseUp: event];
     153    [super mouseUp: event];
    142154
    143155    fClickPoint = NSZeroPoint;
     
    183195        [super keyDown: event];
    184196    }
     197}
     198
     199- (void) flagsChanged: (NSEvent *) event
     200{
     201    [self display];
     202    [super flagsChanged: event];
    185203}
    186204
     
    224242        rect  = [self pauseRectForRow: i];
    225243
    226         if ([torrent isPaused])
    227             image = NSPointInRect(fClickPoint, rect) ? fResumeOnIcon : fResumeOffIcon;
    228         else if ([torrent isActive])
     244        if ([torrent isActive])
    229245            image = NSPointInRect(fClickPoint, rect) ? fPauseOnIcon : fPauseOffIcon;
     246        else if ([torrent isPaused])
     247        {
     248            if ([[NSApp currentEvent] modifierFlags] & NSAlternateKeyMask && [fDefaults boolForKey: @"Queue"])
     249                image = NSPointInRect(fClickPoint, rect) ? fResumeNoWaitOnIcon : fResumeNoWaitOffIcon;
     250            else if ([torrent waitingToStart])
     251                image = NSPointInRect(fClickPoint, rect) ? fPauseOnIcon : fPauseOffIcon;
     252            else
     253                image = NSPointInRect(fClickPoint, rect) ? fResumeOnIcon : fResumeOffIcon;
     254        }
    230255        else
    231256            image = nil;
Note: See TracChangeset for help on using the changeset viewer.