Changeset 1040
- Timestamp:
- 10/28/07 12:01:36 (15 months ago)
- Location:
- trunk
- Files:
-
- 3 modified
-
AudioLibrary/AudioLibrary.m (modified) (17 diffs)
-
Utilities/UtilityFunctions.h (modified) (1 diff)
-
Utilities/UtilityFunctions.m (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/AudioLibrary/AudioLibrary.m
r1038 r1040 92 92 #import "ImageAndTextCell.h" 93 93 94 // Hacky 10.4 workarounds 94 95 #import "NSTreeController_Extensions.h" 95 96 … … 162 163 #define STREAM_TABLE_COLUMNS_MENU_ITEM_INDEX 6 163 164 164 #if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4165 165 // ======================================== 166 // Completely bogus NSTreeController bindings hack 166 // Completely bogus NSTreeController bindings hack (unnecessary on 10.5) 167 167 // ======================================== 168 168 @interface NSObject (NSTreeControllerBogosity) 169 169 - (id) observedObject; 170 170 @end 171 #endif172 171 173 172 // ======================================== … … 208 207 - (void) saveBrowserStateToDefaults; 209 208 - (void) restoreBrowserStateFromDefaults; 209 - (BOOL) selectBrowserNode:(BrowserNode *)node; 210 210 211 211 - (void) setupStreamTableColumns; … … 711 711 - (IBAction) browseLibrary:(id)sender 712 712 { 713 /*BOOL success =*/ [_browserController setSelectionIndexPath:[_browserController arrangedIndexPathForObject:_libraryNode]];713 [self selectBrowserNode:_libraryNode]; 714 714 } 715 715 716 716 - (IBAction) browseMostPopular:(id)sender 717 717 { 718 /*BOOL success =*/ [_browserController setSelectionIndexPath:[_browserController arrangedIndexPathForObject:_mostPopularNode]];718 [self selectBrowserNode:_mostPopularNode]; 719 719 } 720 720 721 721 - (IBAction) browseHighestRated:(id)sender 722 722 { 723 /*BOOL success =*/ [_browserController setSelectionIndexPath:[_browserController arrangedIndexPathForObject:_highestRatedNode]];723 [self selectBrowserNode:_highestRatedNode]; 724 724 } 725 725 726 726 - (IBAction) browseRecentlyAdded:(id)sender 727 727 { 728 /*BOOL success =*/ [_browserController setSelectionIndexPath:[_browserController arrangedIndexPathForObject:_recentlyAddedNode]];728 [self selectBrowserNode:_recentlyAddedNode]; 729 729 } 730 730 731 731 - (IBAction) browseRecentlyPlayed:(id)sender 732 732 { 733 /*BOOL success =*/ [_browserController setSelectionIndexPath:[_browserController arrangedIndexPathForObject:_recentlyPlayedNode]];733 [self selectBrowserNode:_recentlyPlayedNode]; 734 734 } 735 735 736 736 - (IBAction) browseRecentlySkipped:(id)sender 737 737 { 738 /*BOOL success =*/ [_browserController setSelectionIndexPath:[_browserController arrangedIndexPathForObject:_recentlySkippedNode]];738 [self selectBrowserNode:_recentlySkippedNode]; 739 739 } 740 740 … … 745 745 BrowserNode *artistNode = [_artistsNode findChildNamed:artist]; 746 746 if(nil != artistNode) 747 return [ _browserController setSelectionIndexPath:[_browserController arrangedIndexPathForObject:artistNode]];747 return [self selectBrowserNode:artistNode]; 748 748 else 749 749 return NO; … … 756 756 BrowserNode *albumNode = [_albumsNode findChildNamed:album]; 757 757 if(nil != albumNode) 758 return [ _browserController setSelectionIndexPath:[_browserController arrangedIndexPathForObject:albumNode]];758 return [self selectBrowserNode:albumNode]; 759 759 else 760 760 return NO; … … 767 767 BrowserNode *composerNode = [_composersNode findChildNamed:composer]; 768 768 if(nil != composerNode) 769 return [ _browserController setSelectionIndexPath:[_browserController arrangedIndexPathForObject:composerNode]];769 return [self selectBrowserNode:composerNode]; 770 770 else 771 771 return NO; … … 778 778 BrowserNode *genreNode = [_genresNode findChildNamed:genre]; 779 779 if(nil != genreNode) 780 return [ _browserController setSelectionIndexPath:[_browserController arrangedIndexPathForObject:genreNode]];780 return [self selectBrowserNode:genreNode]; 781 781 else 782 782 return NO; … … 789 789 BrowserNode *playlistNode = [_playlistsNode findChildNamed:playlistName]; 790 790 if(nil != playlistNode) 791 return [ _browserController setSelectionIndexPath:[_browserController arrangedIndexPathForObject:playlistNode]];791 return [self selectBrowserNode:playlistNode]; 792 792 else 793 793 return NO; … … 800 800 BrowserNode *smartPlaylistNode = [_smartPlaylistsNode findChildNamed:smartPlaylistName]; 801 801 if(nil != smartPlaylistNode) 802 return [ _browserController setSelectionIndexPath:[_browserController arrangedIndexPathForObject:smartPlaylistName]];802 return [self selectBrowserNode:smartPlaylistNode]; 803 803 else 804 804 return NO; … … 1766 1766 - (BOOL) outlineView:(NSOutlineView *)outlineView shouldEditTableColumn:(NSTableColumn *)tableColumn item:(id)item 1767 1767 { 1768 BrowserNode *node = [item observedObject]; 1768 BrowserNode *node = nil; 1769 1770 // In Leopard observedObject no longer works (which is a good thing) 1771 if(nil != NSClassFromString(@"NSTreeNode")) 1772 node = [item representedObject]; 1773 else 1774 node = [item observedObject]; 1775 1769 1776 return [node nameIsEditable]; 1770 1777 } … … 1782 1789 - (void) outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item 1783 1790 { 1784 BrowserNode *node = [item observedObject]; 1791 BrowserNode *node = nil; 1792 1793 // In Leopard observedObject no longer works (which is a good thing) 1794 if(nil != NSClassFromString(@"NSTreeNode")) 1795 node = [item representedObject]; 1796 else 1797 node = [item observedObject]; 1798 1785 1799 [(ImageAndTextCell *)cell setImage:[node icon]]; 1786 1800 … … 1797 1811 int selectedRow = [outlineView selectedRow]; 1798 1812 id opaqueNode = [outlineView itemAtRow:selectedRow]; 1799 BrowserNode *node = [opaqueNode observedObject];1813 BrowserNode *node = nil; 1800 1814 NSArray *selected = [_streamController selectedObjects]; 1801 1815 NSDictionary *bindingInfo = [_streamController infoForBinding:@"contentArray"]; 1802 1816 AudioStreamCollectionNode *oldStreamsNode = [bindingInfo valueForKey:NSObservedObjectKey]; 1817 1818 // In Leopard observedObject no longer works (which is a good thing) 1819 if(nil != NSClassFromString(@"NSTreeNode")) 1820 node = [opaqueNode representedObject]; 1821 else 1822 node = [opaqueNode observedObject]; 1803 1823 1804 1824 // Unbind the current stream source … … 1809 1829 // Don't do anything except possibly save the sort descriptors if the user selected nothing 1810 1830 if(nil == node) { 1811 1812 1831 if(NO == [oldStreamsNode streamsAreOrdered]) { 1813 1832 [_streamTableSavedSortDescriptors release], _streamTableSavedSortDescriptors = nil; … … 2490 2509 } 2491 2510 2511 - (BOOL) selectBrowserNode:(BrowserNode *)node 2512 { 2513 NSParameterAssert(nil != node); 2514 2515 NSIndexPath *indexPath = nil; 2516 2517 // If the NSTreeNode class is present, use it 2518 if(nil != NSClassFromString(@"NSTreeNode")) { 2519 NSEnumerator *enumerator = [[[_browserController arrangedObjects] childNodes] objectEnumerator]; 2520 NSTreeNode *child = nil; 2521 NSTreeNode *match = nil; 2522 2523 while(nil == match && (child = [enumerator nextObject])) 2524 match = treeNodeForRepresentedObject(child, node); 2525 2526 indexPath = [match indexPath]; 2527 } 2528 // Otherwise use hacky-10.4 workarounds 2529 else 2530 indexPath = [_browserController arrangedIndexPathForObject:node]; 2531 2532 return [_browserController setSelectionIndexPath:indexPath]; 2533 } 2534 2492 2535 - (void) setupStreamTableColumns 2493 2536 { … … 2557 2600 [contextMenuItem setState:([[visibleDictionary objectForKey:[obj identifier]] boolValue] ? NSOnState : NSOffState)]; 2558 2601 2559 // NSLog(@"setting width of %@ to %f", [obj identifier], [[sizesDictionary objectForKey:[obj identifier]] floatValue]);2602 // NSLog(@"setting width of %@ to %f", [obj identifier], [[sizesDictionary objectForKey:[obj identifier]] floatValue]); 2560 2603 [obj setWidth:[[sizesDictionary objectForKey:[obj identifier]] floatValue]]; 2561 2604 2562 if([[visibleDictionary objectForKey:[obj identifier]] boolValue]) {2605 if([[visibleDictionary objectForKey:[obj identifier]] boolValue]) 2563 2606 [_streamTableVisibleColumns addObject:obj]; 2564 } 2565 else { 2607 else 2566 2608 [_streamTableHiddenColumns addObject:obj]; 2567 [_streamTable removeTableColumn:obj]; 2568 } 2569 } 2570 2609 } 2610 2611 // Don't modify table columns while enumerating 2612 enumerator = [_streamTableHiddenColumns objectEnumerator]; 2613 while((obj = [enumerator nextObject])) 2614 [_streamTable removeTableColumn:obj]; 2615 2571 2616 i = 0; 2572 2617 enumerator = [orderArray objectEnumerator]; … … 2649 2694 [obj setWidth:[[sizesDictionary objectForKey:[obj identifier]] floatValue]]; 2650 2695 2651 if([[visibleDictionary objectForKey:[obj identifier]] boolValue]) {2696 if([[visibleDictionary objectForKey:[obj identifier]] boolValue]) 2652 2697 [_playQueueTableVisibleColumns addObject:obj]; 2653 } 2654 else { 2698 else 2655 2699 [_playQueueTableHiddenColumns addObject:obj]; 2656 [_playQueueTable removeTableColumn:obj]; 2657 } 2658 } 2700 } 2701 2702 // Don't modify table columns while enumerating 2703 enumerator = [_playQueueTableHiddenColumns objectEnumerator]; 2704 while((obj = [enumerator nextObject])) 2705 [_playQueueTable removeTableColumn:obj]; 2659 2706 2660 2707 i = 0; -
trunk/Utilities/UtilityFunctions.h
r359 r1040 45 45 NSData * getBitmapDataForImage(NSImage *image, NSBitmapImageFileType type); 46 46 47 NSTreeNode * treeNodeForRepresentedObject(NSTreeNode *root, id representedObject); 48 47 49 #ifdef __cplusplus 48 50 } -
trunk/Utilities/UtilityFunctions.m
r245 r1040 219 219 return [bitmapRep representationUsingType:type properties:nil]; 220 220 } 221 222 NSTreeNode * 223 treeNodeForRepresentedObject(NSTreeNode *root, id representedObject) 224 { 225 NSCParameterAssert(nil != root); 226 NSCParameterAssert(nil != representedObject); 227 228 // Termination condition 229 if([[root representedObject] isEqual:representedObject]) 230 return root; 231 232 NSEnumerator *enumerator = [[root childNodes] objectEnumerator]; 233 NSTreeNode *child = nil; 234 NSTreeNode *match = nil; 235 236 // Perform a breadth-first search 237 while(nil == match && (child = [enumerator nextObject])) { 238 if([[child representedObject] isEqual:representedObject]) 239 match = child; 240 } 241 242 if(nil == match) { 243 enumerator = [[root childNodes] objectEnumerator]; 244 child = nil; 245 246 while(nil == match && (child = [enumerator nextObject])) 247 match = treeNodeForRepresentedObject(child, representedObject); 248 } 249 250 return match; 251 }
