From 94517feeeb363a8eb0e0d4920d918b3a530fa4ef Mon Sep 17 00:00:00 2001 From: Mitchell Livingston Date: Fri, 5 Feb 2010 02:51:42 +0000 Subject: [PATCH] #2860 Display trackers for all selected torrents in the inspector --- macosx/DragOverlayWindow.m | 3 +- macosx/InfoWindowController.m | 52 ++++++++++++++++------------------- macosx/Torrent.h | 2 +- macosx/Torrent.m | 9 ++++-- macosx/TrackerTableView.m | 10 +++---- 5 files changed, 38 insertions(+), 38 deletions(-) diff --git a/macosx/DragOverlayWindow.m b/macosx/DragOverlayWindow.m index 09ee5b9bb..39b988549 100644 --- a/macosx/DragOverlayWindow.m +++ b/macosx/DragOverlayWindow.m @@ -36,7 +36,7 @@ - (id) initWithLib: (tr_session *) lib forWindow: (NSWindow *) window { - if ((self = ([super initWithContentRect: NSZeroRect styleMask: NSBorderlessWindowMask + if ((self = ([super initWithContentRect: [window frame] styleMask: NSBorderlessWindowMask backing: NSBackingStoreBuffered defer: NO]))) { fLib = lib; @@ -66,7 +66,6 @@ [fFadeOutAnimation setAnimationBlockingMode: NSAnimationNonblockingThreaded]; [window addChildWindow: self ordered: NSWindowAbove]; - [self setFrame: [window frame] display: NO]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(resizeWindow) name: NSWindowDidResizeNotification object: window]; diff --git a/macosx/InfoWindowController.m b/macosx/InfoWindowController.m index abde4285e..adf654cc0 100644 --- a/macosx/InfoWindowController.m +++ b/macosx/InfoWindowController.m @@ -675,14 +675,7 @@ typedef enum return [webSeed objectForKey: @"Address"]; } else if (tableView == fTrackerTable) - { - id item = [fTrackers objectAtIndex: row]; - - if ([item isKindOfClass: [NSNumber class]]) - return [NSString stringWithFormat: NSLocalizedString(@"Tier %d", "Inspector -> tracker table"), [item integerValue]]; - else - return item; - } + return [fTrackers objectAtIndex: row]; return nil; } @@ -701,7 +694,7 @@ typedef enum { if (tableView == fTrackerTable) { - if ([[fTrackers objectAtIndex: row] isKindOfClass: [NSNumber class]]) + if (![[fTrackers objectAtIndex: row] isKindOfClass: [TrackerNode class]] && [tableView editedRow] != row) return TRACKER_GROUP_SEPARATOR_HEIGHT; } @@ -756,16 +749,14 @@ typedef enum - (void) tableViewSelectionDidChange: (NSNotification *) notification { if ([notification object] == fTrackerTable) - { - NSInteger numSelected = [fTrackerTable numberOfSelectedRows]; - [fTrackerAddRemoveControl setEnabled: numSelected > 0 forSegment: TRACKER_REMOVE_TAG]; - } + [fTrackerAddRemoveControl setEnabled: [fTorrents count] == 1 && [fTrackerTable numberOfSelectedRows] > 0 + forSegment: TRACKER_REMOVE_TAG]; } - (BOOL) tableView: (NSTableView *) tableView isGroupRow: (NSInteger) row { if (tableView == fTrackerTable) - return [[fTrackers objectAtIndex: row] isKindOfClass: [NSNumber class]]; + return ![[fTrackers objectAtIndex: row] isKindOfClass: [TrackerNode class]] && [tableView editedRow] != row; return NO; } @@ -857,7 +848,7 @@ typedef enum else if (tableView == fTrackerTable) { id node = [fTrackers objectAtIndex: row]; - if (![node isKindOfClass: [NSNumber class]]) + if ([node isKindOfClass: [TrackerNode class]]) return [(TrackerNode *)node fullAnnounceAddress]; } @@ -882,7 +873,7 @@ typedef enum //reset table with either new or old value [fTrackers release]; - fTrackers = [[torrent allTrackerStats] retain]; + fTrackers = [[torrent allTrackerStatsWithTransferName: NO] retain]; [fTrackerTable setTrackers: fTrackers]; [fTrackerTable reloadData]; @@ -1485,28 +1476,33 @@ typedef enum - (void) updateInfoTracker { - if ([fTorrents count] != 1) + if ([fTorrents count] == 0) return; - Torrent * torrent = [fTorrents objectAtIndex: 0]; //get updated tracker stats if ([fTrackerTable editedRow] == -1) { + const BOOL multiple = [fTorrents count] != 1; + [fTrackers release]; - fTrackers = [[torrent allTrackerStats] retain]; + fTrackers = [[NSMutableArray alloc] init]; + for (Torrent * torrent in fTorrents) + [fTrackers addObjectsFromArray: [torrent allTrackerStatsWithTransferName: multiple]]; [fTrackerTable setTrackers: fTrackers]; [fTrackerTable reloadData]; } else { + NSAssert1([fTorrents count] == 1, @"Attempting to add tracker with %d transfers selected", [fTorrents count]); + if ([NSApp isOnSnowLeopardOrBetter]) { NSIndexSet * addedIndexes = [NSIndexSet indexSetWithIndexesInRange: NSMakeRange([fTrackers count]-2, 2)]; NSArray * tierAndTrackerBeingAdded = [fTrackers objectsAtIndexes: addedIndexes]; [fTrackers release]; - fTrackers = [[torrent allTrackerStats] retain]; + fTrackers = [[[fTorrents objectAtIndex: 0] allTrackerStatsWithTransferName: NO] retain]; [fTrackers addObjectsFromArray: tierAndTrackerBeingAdded]; [fTrackerTable setTrackers: fTrackers]; @@ -1717,7 +1713,7 @@ typedef enum { [[self window] makeKeyWindow]; - [fTrackers addObject: [NSNumber numberWithInt: [(TrackerNode *)[fTrackers lastObject] tier]+1]]; + [fTrackers addObject: NSLocalizedString(@"New Tier", "inspector -> add tracker")]; [fTrackers addObject: @""]; [fTrackerTable setTrackers: fTrackers]; @@ -1735,17 +1731,17 @@ typedef enum for (NSUInteger i = 0; i < [fTrackers count]; ++i) { id object = [fTrackers objectAtIndex: i]; - if ([object isKindOfClass: [NSNumber class]]) + if ([object isKindOfClass: [TrackerNode class]]) + { + if (groupSelected || [selectedIndexes containsIndex: i]) + [removeIdentifiers addIndex: [(TrackerNode *)object identifier]]; + } + else { groupSelected = [selectedIndexes containsIndex: i]; if (!groupSelected && i > [selectedIndexes lastIndex]) break; } - else - { - if (groupSelected || [selectedIndexes containsIndex: i]) - [removeIdentifiers addIndex: [(TrackerNode *)object identifier]]; - } } NSAssert([removeIdentifiers count] > 0, @"Trying to remove no trackers."); @@ -1787,7 +1783,7 @@ typedef enum //reset table with either new or old value [fTrackers release]; - fTrackers = [[torrent allTrackerStats] retain]; + fTrackers = [[torrent allTrackerStatsWithTransferName: NO] retain]; [fTrackerTable setTrackers: fTrackers]; [fTrackerTable reloadData]; diff --git a/macosx/Torrent.h b/macosx/Torrent.h index 703847776..3907b0b53 100644 --- a/macosx/Torrent.h +++ b/macosx/Torrent.h @@ -128,7 +128,7 @@ - (uint64_t) size; - (uint64_t) sizeLeft; -- (NSMutableArray *) allTrackerStats; +- (NSMutableArray *) allTrackerStatsWithTransferName: (BOOL) includeTransferName; - (NSArray *) allTrackersFlat; //used by GroupRules - (BOOL) addTrackerToNewTier: (NSString *) tracker; - (void) removeTrackersWithIdentifiers: (NSIndexSet *) removeIdentifiers; diff --git a/macosx/Torrent.m b/macosx/Torrent.m index fe3569d42..84aab710c 100644 --- a/macosx/Torrent.m +++ b/macosx/Torrent.m @@ -583,7 +583,7 @@ int trashDataFile(const char * filename) return fStat->leftUntilDone; } -- (NSMutableArray *) allTrackerStats +- (NSMutableArray *) allTrackerStatsWithTransferName: (BOOL) includeTransferName { int count; tr_tracker_stat * stats = tr_torrentTrackers(fHandle, &count); @@ -595,7 +595,12 @@ int trashDataFile(const char * filename) { if (stats[i].tier != prevTier) { - [trackers addObject: [NSNumber numberWithInteger: stats[i].tier]]; + NSString * tierString = [NSString stringWithFormat: NSLocalizedString(@"Tier %d", "Inspector -> tracker table"), + stats[i].tier]; + if (includeTransferName) + tierString = [tierString stringByAppendingFormat: @" - %@", [self name]]; + + [trackers addObject: tierString]; prevTier = stats[i].tier; } diff --git a/macosx/TrackerTableView.m b/macosx/TrackerTableView.m index d98bba3b9..264415c9f 100644 --- a/macosx/TrackerTableView.m +++ b/macosx/TrackerTableView.m @@ -52,9 +52,9 @@ for (NSUInteger i = [indexes firstIndex]; i != NSNotFound; i = [indexes indexGreaterThanIndex: i]) { id item = [fTrackers objectAtIndex: i]; - if ([item isKindOfClass: [NSNumber class]]) + if (![item isKindOfClass: [TrackerNode class]]) { - for (++i; i < [fTrackers count] && ![[fTrackers objectAtIndex: i] isKindOfClass: [NSNumber class]]; ++i) + for (++i; i < [fTrackers count] && [[fTrackers objectAtIndex: i] isKindOfClass: [TrackerNode class]]; ++i) [addresses addObject: [(TrackerNode *)[fTrackers objectAtIndex: i] fullAnnounceAddress]]; --i; } @@ -141,11 +141,11 @@ if (rows.length > 0) { //determine what the first row color should be - if (![[fTrackers objectAtIndex: rows.location] isKindOfClass: [NSNumber class]]) + if ([[fTrackers objectAtIndex: rows.location] isKindOfClass: [TrackerNode class]] || [self editedRow] == rows.location) { for (NSInteger i = rows.location-1; i>=0; i--) { - if ([[fTrackers objectAtIndex: i] isKindOfClass: [NSNumber class]]) + if (![[fTrackers objectAtIndex: i] isKindOfClass: [TrackerNode class]]) break; start = !start; } @@ -159,7 +159,7 @@ NSInteger i; for (i = rows.location; i < NSMaxRange(rows); i++) { - if ([[fTrackers objectAtIndex: i] isKindOfClass: [NSNumber class]]) + if (![[fTrackers objectAtIndex: i] isKindOfClass: [TrackerNode class]] && [self editedRow] != i) { start = YES; continue;