From 28cd39da136a632803467fbbc74e1d17f12b90c1 Mon Sep 17 00:00:00 2001 From: Mitchell Livingston Date: Sat, 23 Jun 2007 22:00:09 +0000 Subject: [PATCH] only show the priority chooser when moused over (the text is a placeholder and the window has to currently be made active for it to appear) --- Transmission.xcodeproj/project.pbxproj | 16 +++ .../English.lproj/InfoWindow.nib/classes.nib | 1 + macosx/English.lproj/InfoWindow.nib/info.nib | 2 +- .../InfoWindow.nib/keyedobjects.nib | Bin 50239 -> 50122 bytes macosx/FileBrowserCell.m | 4 +- macosx/FileOutlineView.h | 5 + macosx/FileOutlineView.m | 27 +++++ macosx/FilePriorityCell.h | 15 +++ macosx/FilePriorityCell.m | 102 ++++++++++++++++++ macosx/InfoWindow.h | 8 ++ macosx/InfoWindow.m | 17 +++ macosx/InfoWindowController.h | 7 +- macosx/InfoWindowController.m | 45 ++------ macosx/PeerProgressIndicatorCell.h | 2 +- macosx/PeerProgressIndicatorCell.m | 8 +- macosx/Torrent.m | 2 +- 16 files changed, 215 insertions(+), 46 deletions(-) create mode 100644 macosx/FilePriorityCell.h create mode 100644 macosx/FilePriorityCell.m create mode 100644 macosx/InfoWindow.h create mode 100644 macosx/InfoWindow.m diff --git a/Transmission.xcodeproj/project.pbxproj b/Transmission.xcodeproj/project.pbxproj index 5d7bdb8dc..7fe7c2c98 100644 --- a/Transmission.xcodeproj/project.pbxproj +++ b/Transmission.xcodeproj/project.pbxproj @@ -10,6 +10,10 @@ 002C9EE60C19CD2500C2F6F4 /* fastresume.c in Sources */ = {isa = PBXBuildFile; fileRef = 002C9EE50C19CD2500C2F6F4 /* fastresume.c */; }; 35B038130AC5B6EB00A10FDF /* ResumeNoWaitOn.png in Resources */ = {isa = PBXBuildFile; fileRef = 35B037F90AC5B53800A10FDF /* ResumeNoWaitOn.png */; }; 35B038140AC5B6EC00A10FDF /* ResumeNoWaitOff.png in Resources */ = {isa = PBXBuildFile; fileRef = 35B037FA0AC5B53800A10FDF /* ResumeNoWaitOff.png */; }; + 35F372140C2D780600DAA8F2 /* InfoWindow.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 35F372120C2D780500DAA8F2 /* InfoWindow.h */; }; + 35F372150C2D780600DAA8F2 /* InfoWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 35F372130C2D780600DAA8F2 /* InfoWindow.m */; }; + 35F373020C2DA88F00DAA8F2 /* FilePriorityCell.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 35F373000C2DA88F00DAA8F2 /* FilePriorityCell.h */; }; + 35F373030C2DA89000DAA8F2 /* FilePriorityCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 35F373010C2DA88F00DAA8F2 /* FilePriorityCell.m */; }; 4D043A7F090AE979009FEDA8 /* TransmissionDocument.icns in Resources */ = {isa = PBXBuildFile; fileRef = 4D043A7E090AE979009FEDA8 /* TransmissionDocument.icns */; }; 4D118E1A08CB46B20033958F /* PrefsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D118E1908CB46B20033958F /* PrefsController.m */; }; 4D1838DD09DEC0E80047D688 /* libtransmission.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D18389709DEC0030047D688 /* libtransmission.a */; }; @@ -250,6 +254,8 @@ A261F1E40A69A1B10002815A /* Growl.framework in CopyFiles */, A24F19210A3A796800C9C145 /* Sparkle.framework in CopyFiles */, A2DF37060C220D03006523C1 /* CreatorWindowController.h in CopyFiles */, + 35F372140C2D780600DAA8F2 /* InfoWindow.h in CopyFiles */, + 35F373020C2DA88F00DAA8F2 /* FilePriorityCell.h in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -267,6 +273,10 @@ 32CA4F630368D1EE00C91783 /* Transmission_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Transmission_Prefix.pch; path = macosx/Transmission_Prefix.pch; sourceTree = ""; }; 35B037F90AC5B53800A10FDF /* ResumeNoWaitOn.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ResumeNoWaitOn.png; path = macosx/Images/ResumeNoWaitOn.png; sourceTree = ""; }; 35B037FA0AC5B53800A10FDF /* ResumeNoWaitOff.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ResumeNoWaitOff.png; path = macosx/Images/ResumeNoWaitOff.png; sourceTree = ""; }; + 35F372120C2D780500DAA8F2 /* InfoWindow.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = InfoWindow.h; path = macosx/InfoWindow.h; sourceTree = ""; }; + 35F372130C2D780600DAA8F2 /* InfoWindow.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = InfoWindow.m; path = macosx/InfoWindow.m; sourceTree = ""; }; + 35F373000C2DA88F00DAA8F2 /* FilePriorityCell.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = FilePriorityCell.h; path = macosx/FilePriorityCell.h; sourceTree = ""; }; + 35F373010C2DA88F00DAA8F2 /* FilePriorityCell.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = FilePriorityCell.m; path = macosx/FilePriorityCell.m; sourceTree = ""; }; 4C9F8F060BC5B68A002E5433 /* French */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = French; path = macosx/French.lproj/InfoPlist.strings; sourceTree = ""; }; 4C9F8F070BC5B68A002E5433 /* French */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = French; path = macosx/French.lproj/InfoWindow.nib; sourceTree = ""; }; 4C9F8F080BC5B68A002E5433 /* French */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = French; path = macosx/French.lproj/Localizable.strings; sourceTree = ""; }; @@ -612,6 +622,10 @@ E1B6FC000C0D72A00015FE4D /* Overlay Window */, E138A9720C04D88F00C5426C /* CTGradient */, E1B6FBEB0C0D70AC0015FE4D /* UKKQueue */, + 35F372120C2D780500DAA8F2 /* InfoWindow.h */, + 35F372130C2D780600DAA8F2 /* InfoWindow.m */, + 35F373000C2DA88F00DAA8F2 /* FilePriorityCell.h */, + 35F373010C2DA88F00DAA8F2 /* FilePriorityCell.m */, ); name = Sources; sourceTree = ""; @@ -1278,6 +1292,8 @@ A24838820C0BA608005CC3FE /* FilterBarView.m in Sources */, A215760B0C0D449A0057A26A /* BezierPathAdditions.m in Sources */, A2DF37070C220D03006523C1 /* CreatorWindowController.m in Sources */, + 35F372150C2D780600DAA8F2 /* InfoWindow.m in Sources */, + 35F373030C2DA89000DAA8F2 /* FilePriorityCell.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/macosx/English.lproj/InfoWindow.nib/classes.nib b/macosx/English.lproj/InfoWindow.nib/classes.nib index 0c096a969..baa630998 100644 --- a/macosx/English.lproj/InfoWindow.nib/classes.nib +++ b/macosx/English.lproj/InfoWindow.nib/classes.nib @@ -2,6 +2,7 @@ IBClasses = ( {CLASS = FileOutlineView; LANGUAGE = ObjC; SUPERCLASS = NSOutlineView; }, {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + {CLASS = InfoWindow; LANGUAGE = ObjC; SUPERCLASS = NSPanel; }, { ACTIONS = { revealDataFile = id; diff --git a/macosx/English.lproj/InfoWindow.nib/info.nib b/macosx/English.lproj/InfoWindow.nib/info.nib index deb3e720f..d5f83ea10 100644 --- a/macosx/English.lproj/InfoWindow.nib/info.nib +++ b/macosx/English.lproj/InfoWindow.nib/info.nib @@ -3,7 +3,7 @@ IBDocumentLocation - 35 67 356 240 0 0 1152 842 + 29 56 356 240 0 0 1024 746 IBEditorPositions 549 diff --git a/macosx/English.lproj/InfoWindow.nib/keyedobjects.nib b/macosx/English.lproj/InfoWindow.nib/keyedobjects.nib index 88b55fa13ee038a0fd0d21db6356add21709f407..cf47294980aab5e3a4d676d89df9b4de35245a0d 100644 GIT binary patch delta 23256 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 S)vFgD|GV4xzx)5RFaH-wZ0-2~ delta 23382 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 diff --git a/macosx/FileBrowserCell.m b/macosx/FileBrowserCell.m index 036a01c9c..ab588ef55 100644 --- a/macosx/FileBrowserCell.m +++ b/macosx/FileBrowserCell.m @@ -51,9 +51,7 @@ - (void) drawWithFrame: (NSRect) cellFrame inView: (NSView *) controlView { - NSMutableDictionary * item; - if (!(item = [self objectValue])) - return; + NSMutableDictionary * item = [self objectValue]; //image float imageHeight = cellFrame.size.height - 2.0; diff --git a/macosx/FileOutlineView.h b/macosx/FileOutlineView.h index 8909b4819..505896ee2 100644 --- a/macosx/FileOutlineView.h +++ b/macosx/FileOutlineView.h @@ -27,6 +27,11 @@ @interface FileOutlineView : NSOutlineView { NSColor * fNormalColor, * fHighPriorityColor, * fLowPriorityColor; + + int fHoverRow; } +- (void) setHoverRowForEvent: (NSEvent *) event; +- (int) hoverRow; + @end diff --git a/macosx/FileOutlineView.m b/macosx/FileOutlineView.m index d9dd79edc..1d3eb0329 100644 --- a/macosx/FileOutlineView.m +++ b/macosx/FileOutlineView.m @@ -39,6 +39,8 @@ fNormalColor = [self backgroundColor]; fHighPriorityColor = [[NSColor colorWithCalibratedRed: 0.678 green: 0.937 blue: 0.451 alpha: 1.0] retain]; fLowPriorityColor = [[NSColor colorWithCalibratedRed: 0.984 green: 0.878 blue: 0.431 alpha: 1.0] retain]; + + fHoverRow = -1; } - (void) dealloc @@ -70,6 +72,31 @@ return [self menu]; } +- (void) setHoverRowForEvent: (NSEvent *) event +{ + int row = -1; + if (event) + { + NSPoint point = [self convertPoint: [event locationInWindow] fromView: nil]; + if (NSPointInRect(point, [self frame])) + row = [self rowAtPoint: point]; + } + + if (row != fHoverRow) + { + if (fHoverRow != -1) + [self reloadItem: [self itemAtRow: fHoverRow]]; + fHoverRow = row; + if (fHoverRow != -1) + [self reloadItem: [self itemAtRow: fHoverRow]]; + } +} + +- (int) hoverRow +{ + return fHoverRow; +} + - (void) drawRow: (int) row clipRect: (NSRect) clipRect { if (![self isRowSelected: row]) diff --git a/macosx/FilePriorityCell.h b/macosx/FilePriorityCell.h new file mode 100644 index 000000000..7954e76ca --- /dev/null +++ b/macosx/FilePriorityCell.h @@ -0,0 +1,15 @@ +/* FilePriorityCell */ + +#import +#import "FileOutlineView.h" + +@interface FilePriorityCell : NSSegmentedCell +{ + FileOutlineView * fParentView; + NSMutableDictionary * fItem; +} + +- (id) initForParentView: (FileOutlineView *) parentView; +- (void) setItem: (NSMutableDictionary *) item; + +@end diff --git a/macosx/FilePriorityCell.m b/macosx/FilePriorityCell.m new file mode 100644 index 000000000..eb9e4f809 --- /dev/null +++ b/macosx/FilePriorityCell.m @@ -0,0 +1,102 @@ +#import "FilePriorityCell.h" +#import "Torrent.h" + +@implementation FilePriorityCell + +- (id) initForParentView: (FileOutlineView *) parentView +{ + if ((self = [super init])) + { + [self setTrackingMode: NSSegmentSwitchTrackingSelectAny]; + [self setControlSize: NSMiniControlSize]; + [self setSegmentCount: 3]; + + int i; + for (i = 0; i < [self segmentCount]; i++) + { + [self setLabel: @"" forSegment: i]; + [self setWidth: 6.0 forSegment: i]; + } + + #warning better way? + fParentView = parentView; + } + return self; +} + +- (void) setItem: (NSMutableDictionary *) item +{ + fItem = item; +} + +- (void) setSelected: (BOOL) flag forSegment: (int) segment +{ + [super setSelected: flag forSegment: segment]; + + //only for when clicking manually + Torrent * torrent = [fItem objectForKey: @"Torrent"]; + if (![torrent canChangeDownloadCheckForFiles: [fItem objectForKey: @"Indexes"]]) + return; + + int priority = segment, actualPriority; + if (priority == 0) + actualPriority = PRIORITY_LOW; + else if (priority == 2) + actualPriority = PRIORITY_HIGH; + else + actualPriority = PRIORITY_NORMAL; + + [torrent setFilePriority: actualPriority forIndexes: [fItem objectForKey: @"Indexes"]]; + [fParentView reloadData]; +} + +- (void) drawWithFrame: (NSRect) cellFrame inView: (NSView *) controlView +{ + Torrent * torrent = [fItem objectForKey: @"Torrent"]; + NSIndexSet * indexSet = [fItem objectForKey: @"Indexes"]; + + if (![torrent canChangeDownloadCheckForFiles: indexSet]) + return; + + BOOL low = [torrent hasFilePriority: PRIORITY_LOW forIndexes: indexSet], + normal = [torrent hasFilePriority: PRIORITY_NORMAL forIndexes: indexSet], + high = [torrent hasFilePriority: PRIORITY_HIGH forIndexes: indexSet]; + + int row = [fParentView hoverRow]; + if (row != -1 && [fParentView itemAtRow: row] == fItem) + { + [super setSelected: low forSegment: 0]; + [super setSelected: normal forSegment: 1]; + [super setSelected: high forSegment: 2]; + + [super drawWithFrame: cellFrame inView: controlView]; + } + else + { + if (high || low) + { + BOOL highlighted = [self isHighlighted] && [[self highlightColorWithFrame: cellFrame inView: controlView] + isEqual: [NSColor alternateSelectedControlColor]]; + NSDictionary * attributes = [[NSDictionary alloc] initWithObjectsAndKeys: + highlighted ? [NSColor whiteColor] : [NSColor controlTextColor], NSForegroundColorAttributeName, + [NSFont messageFontOfSize: 18.0], NSFontAttributeName, nil]; + + NSString * text; + if (low && !normal && !high) + text = @"-"; + else if (!low && !normal && high) + text = @"+"; + else + text = @"*"; + + NSSize textSize = [text sizeWithAttributes: attributes]; + NSRect textRect = NSMakeRect(cellFrame.origin.x + (cellFrame.size.width - textSize.width) * 0.5, + cellFrame.origin.y + (cellFrame.size.height - textSize.height) * 0.5, + textSize.width, textSize.height); + + [text drawInRect: textRect withAttributes: attributes]; + } + } +} + +@end diff --git a/macosx/InfoWindow.h b/macosx/InfoWindow.h new file mode 100644 index 000000000..7899767d8 --- /dev/null +++ b/macosx/InfoWindow.h @@ -0,0 +1,8 @@ +/* InfoWindow */ + +#import + +@interface InfoWindow : NSPanel +{ +} +@end diff --git a/macosx/InfoWindow.m b/macosx/InfoWindow.m new file mode 100644 index 000000000..89caf9596 --- /dev/null +++ b/macosx/InfoWindow.m @@ -0,0 +1,17 @@ +#import "InfoWindow.h" +#import "InfoWindowController.h" + +@implementation InfoWindow + +- (void) awakeFromNib +{ + [self setBecomesKeyOnlyIfNeeded: YES]; + [self setAcceptsMouseMovedEvents: YES]; +} + +- (void) mouseMoved: (NSEvent *) event +{ + [(InfoWindowController *)[self windowController] setFileOutlineHoverRowForEvent: event]; +} + +@end diff --git a/macosx/InfoWindowController.h b/macosx/InfoWindowController.h index faa0de8ba..59c45ab41 100644 --- a/macosx/InfoWindowController.h +++ b/macosx/InfoWindowController.h @@ -24,6 +24,7 @@ #import #import "Torrent.h" +#import "FileOutlineView.h" #import "PiecesView.h" #import @@ -53,7 +54,7 @@ IBOutlet PiecesView * fPiecesView; IBOutlet NSSegmentedControl * fPiecesControl; - IBOutlet NSOutlineView * fFileOutline; + IBOutlet FileOutlineView * fFileOutline; IBOutlet NSTextField * fFileTableStatusField; IBOutlet NSMenuItem * fFileCheckItem, * fFileUncheckItem, * fFilePriorityNormal, * fFilePriorityHigh, * fFilePriorityLow; @@ -61,7 +62,7 @@ IBOutlet NSPopUpButton * fRatioPopUp, * fUploadLimitPopUp, * fDownloadLimitPopUp; IBOutlet NSTextField * fUploadLimitField, * fDownloadLimitField, * fRatioLimitField, * fUploadLimitLabel, * fDownloadLimitLabel; - IBOutlet NSButton * fPexCheck; + IBOutlet NSButton * fPexCheck; } - (void) updateInfoForTorrents: (NSArray *) torrents; @@ -72,6 +73,8 @@ - (void) setNextTab; - (void) setPreviousTab; +- (void) setFileOutlineHoverRowForEvent: (NSEvent *) event; + - (void) setPiecesView: (id) sender; - (void) setPiecesViewForAvailable: (BOOL) available; diff --git a/macosx/InfoWindowController.m b/macosx/InfoWindowController.m index 71692e5da..4dade5fb3 100644 --- a/macosx/InfoWindowController.m +++ b/macosx/InfoWindowController.m @@ -24,6 +24,7 @@ #import "InfoWindowController.h" #import "FileBrowserCell.h" +#import "FilePriorityCell.h" #import "StringAdditions.h" #define MIN_WINDOW_WIDTH 300 @@ -87,8 +88,6 @@ //window location and size NSPanel * window = (NSPanel *)[self window]; - [window setBecomesKeyOnlyIfNeeded: YES]; - [window setFrameAutosaveName: @"InspectorWindowFrame"]; [window setFrameUsingName: @"InspectorWindowFrame"]; @@ -109,13 +108,8 @@ [fFileOutline setDoubleAction: @selector(revealFile:)]; //set file outline - NSSegmentedCell * priorityCell = [[fFileOutline tableColumnWithIdentifier: @"Priority"] dataCell]; - int i; - for (i = 0; i < [priorityCell segmentCount]; i++) - { - [priorityCell setLabel: @"" forSegment: i]; - [priorityCell setWidth: 6.0 forSegment: i]; - } + FilePriorityCell * priorityCell = [[[FilePriorityCell alloc] initForParentView: fFileOutline] autorelease]; + [[fFileOutline tableColumnWithIdentifier: @"Priority"] setDataCell: priorityCell]; //set blank inspector [self updateInfoForTorrents: [NSArray array]]; @@ -884,15 +878,7 @@ else if ([identifier isEqualToString: @"Check"]) [cell setEnabled: [[fTorrents objectAtIndex: 0] canChangeDownloadCheckForFiles: [item objectForKey: @"Indexes"]]]; else if ([identifier isEqualToString: @"Priority"]) - { - Torrent * torrent = [fTorrents objectAtIndex: 0]; - NSIndexSet * indexeSet = [item objectForKey: @"Indexes"]; - [(NSSegmentedCell *)cell setSelected: [torrent hasFilePriority: PRIORITY_LOW forIndexes: indexeSet] forSegment: 0]; - [(NSSegmentedCell *)cell setSelected: [torrent hasFilePriority: PRIORITY_NORMAL forIndexes: indexeSet] forSegment: 1]; - [(NSSegmentedCell *)cell setSelected: [torrent hasFilePriority: PRIORITY_HIGH forIndexes: indexeSet] forSegment: 2]; - - [cell setEnabled: [[fTorrents objectAtIndex: 0] canChangeDownloadCheckForFiles: [item objectForKey: @"Indexes"]]]; - } + [(FilePriorityCell *)cell setItem: item]; else; } @@ -907,22 +893,6 @@ forIndexes: [item objectForKey: @"Indexes"]]; [fFileOutline reloadData]; } - else if ([identifier isEqualToString: @"Priority"]) - { - if (![[fTorrents objectAtIndex: 0] canChangeDownloadCheckForFiles: [item objectForKey: @"Indexes"]]) - return; - - int priority = [object intValue], actualPriority; - if (priority == 0) - actualPriority = PRIORITY_LOW; - else if (priority == 2) - actualPriority = PRIORITY_HIGH; - else - actualPriority = PRIORITY_NORMAL; - - [[fTorrents objectAtIndex: 0] setFilePriority: actualPriority forIndexes: [item objectForKey: @"Indexes"]]; - [fFileOutline reloadData]; - } else; } @@ -944,6 +914,7 @@ } else if ([ident isEqualToString: @"Priority"]) { + #warning consider hidden Torrent * torrent = [fTorrents objectAtIndex: 0]; NSIndexSet * indexSet = [item objectForKey: @"Indexes"]; BOOL low = [torrent hasFilePriority: PRIORITY_LOW forIndexes: indexSet], @@ -971,6 +942,12 @@ return [outlineView rowHeight]; } +#warning need? +- (void) setFileOutlineHoverRowForEvent: (NSEvent *) event +{ + [fFileOutline setHoverRowForEvent: [[[fTabView selectedTabViewItem] identifier] isEqualToString: TAB_FILES_IDENT] ? event : nil]; +} + - (NSArray *) peerSortDescriptors { NSMutableArray * descriptors = [NSMutableArray array]; diff --git a/macosx/PeerProgressIndicatorCell.h b/macosx/PeerProgressIndicatorCell.h index cb2fb21be..89a86a95c 100644 --- a/macosx/PeerProgressIndicatorCell.h +++ b/macosx/PeerProgressIndicatorCell.h @@ -26,6 +26,6 @@ @interface PeerProgressIndicatorCell : NSLevelIndicatorCell { - BOOL isHidden; + BOOL fIsHidden; } @end diff --git a/macosx/PeerProgressIndicatorCell.m b/macosx/PeerProgressIndicatorCell.m index 0844f4523..79046dae5 100644 --- a/macosx/PeerProgressIndicatorCell.m +++ b/macosx/PeerProgressIndicatorCell.m @@ -28,17 +28,17 @@ - (BOOL) hidden { - return isHidden; + return fIsHidden; } -- (void) setHidden: (BOOL) hidden +- (void) setHidden: (BOOL) isHidden { - isHidden = hidden; + fIsHidden = isHidden; } - (void) drawWithFrame: (NSRect) cellFrame inView: (NSView *) controlView { - if (!isHidden) + if (!fIsHidden) [super drawWithFrame: cellFrame inView: controlView]; } diff --git a/macosx/Torrent.m b/macosx/Torrent.m index 54ecf0e5e..53877c29c 100644 --- a/macosx/Torrent.m +++ b/macosx/Torrent.m @@ -1674,6 +1674,7 @@ static uint32_t kRed = BE(0xFF6450FF), //255, 100, 80 [NSNumber numberWithBool: isFolder], @"IsFolder", currentPath, @"Path", nil]; [siblings addObject: dict]; + [dict setObject: self forKey: @"Torrent"]; if (isFolder) { [dict setObject: [NSMutableArray array] forKey: @"Children"]; @@ -1685,7 +1686,6 @@ static uint32_t kRed = BE(0xFF6450FF), //255, 100, 80 [dict setObject: [NSNumber numberWithUnsignedLongLong: size] forKey: @"Size"]; [dict setObject: [[NSWorkspace sharedWorkspace] iconForFileType: [name pathExtension]] forKey: @"Icon"]; [dict setObject: [NSNumber numberWithInt: priority] forKey: @"Priority"]; - [dict setObject: self forKey: @"Torrent"]; [flatList addObject: dict]; }