diff --git a/Transmission.xcodeproj/project.pbxproj b/Transmission.xcodeproj/project.pbxproj index 8b365d8fb..89a53e38a 100644 --- a/Transmission.xcodeproj/project.pbxproj +++ b/Transmission.xcodeproj/project.pbxproj @@ -280,6 +280,8 @@ A2E38540130DFECD001F501B /* libminiupnp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BE1183480CE160960002D0F3 /* libminiupnp.a */; }; A2E57ABB1310822C00A7DAB1 /* StatusBarController.m in Sources */ = {isa = PBXBuildFile; fileRef = A2E57ABA1310822C00A7DAB1 /* StatusBarController.m */; }; A2E57AC61310831400A7DAB1 /* StatusBar.xib in Resources */ = {isa = PBXBuildFile; fileRef = A2E57AC51310831400A7DAB1 /* StatusBar.xib */; }; + A2E57B9C13109DC200A7DAB1 /* FilterBar.xib in Resources */ = {isa = PBXBuildFile; fileRef = A2E57B9B13109DC200A7DAB1 /* FilterBar.xib */; }; + A2E57BA713109E6B00A7DAB1 /* FilterBarController.m in Sources */ = {isa = PBXBuildFile; fileRef = A2E57BA613109E6B00A7DAB1 /* FilterBarController.m */; }; A2E669790F5B8E5A00B4251A /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A2E669780F5B8E5A00B4251A /* Security.framework */; }; A2E9AA760C249AF400085DCF /* ToolbarCreateTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = A2E9AA750C249AF400085DCF /* ToolbarCreateTemplate.png */; }; A2ED7D8F0CEF431B00970975 /* FilterButton.m in Sources */ = {isa = PBXBuildFile; fileRef = A2ED7D8E0CEF431B00970975 /* FilterButton.m */; }; @@ -863,6 +865,9 @@ A2E57AB91310822C00A7DAB1 /* StatusBarController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StatusBarController.h; path = macosx/StatusBarController.h; sourceTree = ""; }; A2E57ABA1310822C00A7DAB1 /* StatusBarController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = StatusBarController.m; path = macosx/StatusBarController.m; sourceTree = ""; }; A2E57AC51310831400A7DAB1 /* StatusBar.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = StatusBar.xib; path = macosx/StatusBar.xib; sourceTree = ""; }; + A2E57B9B13109DC200A7DAB1 /* FilterBar.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = FilterBar.xib; path = macosx/FilterBar.xib; sourceTree = ""; }; + A2E57BA513109E6B00A7DAB1 /* FilterBarController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FilterBarController.h; path = macosx/FilterBarController.h; sourceTree = ""; }; + A2E57BA613109E6B00A7DAB1 /* FilterBarController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FilterBarController.m; path = macosx/FilterBarController.m; sourceTree = ""; }; A2E669780F5B8E5A00B4251A /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = /System/Library/Frameworks/Security.framework; sourceTree = ""; }; A2E9AA750C249AF400085DCF /* ToolbarCreateTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ToolbarCreateTemplate.png; path = macosx/Images/ToolbarCreateTemplate.png; sourceTree = ""; }; A2EA8E3C0CC3C9830081201C /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = macosx/fr.lproj/InfoPlist.strings; sourceTree = ""; }; @@ -1110,6 +1115,8 @@ A2E57ABA1310822C00A7DAB1 /* StatusBarController.m */, A21282A50CA6C66800EAEE0F /* StatusBarView.h */, A21282A60CA6C66800EAEE0F /* StatusBarView.m */, + A2E57BA513109E6B00A7DAB1 /* FilterBarController.h */, + A2E57BA613109E6B00A7DAB1 /* FilterBarController.m */, A2661D3A12D0E51A004F69D5 /* FilterBarView.h */, A2661D3B12D0E51B004F69D5 /* FilterBarView.m */, A2ED7D8D0CEF431B00970975 /* FilterButton.h */, @@ -1193,6 +1200,7 @@ A233BD680D8CF2C7007EE7B4 /* StatsWindow.xib */, A231274B0D11D0B7003F9AFF /* AboutWindow.xib */, A2E57AC51310831400A7DAB1 /* StatusBar.xib */, + A2E57B9B13109DC200A7DAB1 /* FilterBar.xib */, A2F7CF5413035F7B0016FF10 /* URLSheetWindow.xib */, A2D307B00D9EC9F50051FD27 /* BlocklistStatusWindow.xib */, A209ECA1114319C3002B02D1 /* InfoWindow.xib */, @@ -2084,6 +2092,7 @@ A21F15AD11729A9F00CF5A9C /* AddMagnetWindow.xib in Resources */, A2F7CF5513035F7B0016FF10 /* URLSheetWindow.xib in Resources */, A2E57AC61310831400A7DAB1 /* StatusBar.xib in Resources */, + A2E57B9C13109DC200A7DAB1 /* FilterBar.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2276,6 +2285,7 @@ A25BB02A12F4F517004B724E /* InfoTabButtonBack.m in Sources */, A2F7CF5F13035FFD0016FF10 /* URLSheetWindowController.m in Sources */, A2E57ABB1310822C00A7DAB1 /* StatusBarController.m in Sources */, + A2E57BA713109E6B00A7DAB1 /* FilterBarController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/macosx/Controller.h b/macosx/Controller.h index 8a1c3f2aa..4af66cc85 100644 --- a/macosx/Controller.h +++ b/macosx/Controller.h @@ -31,8 +31,7 @@ @class AddWindowController; @class Badger; @class DragOverlayWindow; -@class FilterBarView; -@class FilterButton; +@class FilterBarController; @class InfoWindowController; @class MessageWindowController; @class PrefsController; @@ -74,13 +73,10 @@ typedef enum IBOutlet NSButton * fActionButton, * fSpeedLimitButton; IBOutlet NSTextField * fTotalTorrentsField; - IBOutlet StatusBarController * fStatusBar; + StatusBarController * fStatusBar; - IBOutlet FilterBarView * fFilterBar; - IBOutlet FilterButton * fNoFilterButton, * fActiveFilterButton, * fDownloadFilterButton, - * fSeedFilterButton, * fPauseFilterButton; - IBOutlet NSSearchField * fSearchFilterField; - IBOutlet NSMenuItem * fNextFilterItem, * fPrevFilterItem; + FilterBarController * fFilterBar; + IBOutlet NSMenuItem * fNextFilterItem; IBOutlet NSMenuItem * fNextInfoTabItem, * fPrevInfoTabItem; @@ -91,8 +87,7 @@ typedef enum IBOutlet NSMenu * fRatioStopMenu; IBOutlet NSMenuItem * fCheckRatioItem, * fNoCheckRatioItem; - IBOutlet NSMenu * fGroupsSetMenu, * fGroupsSetContextMenu, * fGroupFilterMenu; - IBOutlet NSPopUpButton * fGroupsButton; + IBOutlet NSMenu * fGroupsSetMenu, * fGroupsSetContextMenu; #warning change to QLPreviewPanel id fPreviewPanel; @@ -195,7 +190,7 @@ typedef enum - (void) updateTorrentHistory; -- (void) applyFilter: (id) sender; +- (void) applyFilter; - (void) sortTorrents; - (void) sortTorrentsIgnoreSelected; @@ -203,14 +198,9 @@ typedef enum - (void) setSortByGroup: (id) sender; - (void) setSortReverse: (id) sender; -- (void) setFilter: (id) sender; -- (void) setFilterSearchType: (id) sender; - (void) switchFilter: (id) sender; - (void) setGroup: (id) sender; //used by delegate-generated menu items -- (void) setGroupFilter: (id) sender; -- (void) updateGroupsFilterButton; -- (void) updateGroupsFilters: (NSNotification *) notification; - (void) toggleSpeedLimit: (id) sender; - (void) speedLimitChanged: (id) sender; @@ -248,8 +238,6 @@ typedef enum - (void) setWindowSizeToFit; - (NSRect) sizedWindowFrame; -- (void) resizeFilterBar; - - (void) updateForExpandCollape; - (void) showMainWindow: (id) sender; diff --git a/macosx/Controller.m b/macosx/Controller.m index f1cce9319..d78fc691f 100644 --- a/macosx/Controller.m +++ b/macosx/Controller.m @@ -45,8 +45,7 @@ #import "ToolbarSegmentedCell.h" #import "BlocklistDownloader.h" #import "StatusBarController.h" -#import "FilterBarView.h" -#import "FilterButton.h" +#import "FilterBarController.h" #import "BonjourController.h" #import "Badger.h" #import "DragOverlayWindow.h" @@ -107,20 +106,6 @@ typedef enum SORT_DESC_TAG = 1 } sortOrderTag; -#define FILTER_NONE @"None" -#define FILTER_ACTIVE @"Active" -#define FILTER_DOWNLOAD @"Download" -#define FILTER_SEED @"Seed" -#define FILTER_PAUSE @"Pause" - -#define FILTER_TYPE_NAME @"Name" -#define FILTER_TYPE_TRACKER @"Tracker" - -#define FILTER_TYPE_TAG_NAME 401 -#define FILTER_TYPE_TAG_TRACKER 402 - -#define GROUP_FILTER_ALL_TAG -2 - #define GROWL_DOWNLOAD_COMPLETE @"Download Complete" #define GROWL_SEEDING_COMPLETE @"Seeding Complete" #define GROWL_AUTO_ADD @"Torrent Auto Added" @@ -132,9 +117,6 @@ typedef enum #define ROW_HEIGHT_SMALL 22.0 #define WINDOW_REGULAR_WIDTH 468.0 -#define SEARCH_FILTER_MIN_WIDTH 48.0 -#define SEARCH_FILTER_MAX_WIDTH 95.0 - #define UPDATE_UI_SECONDS 1.0 #define DOCK_SEEDING_TAG 101 @@ -414,20 +396,7 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy [[fTotalTorrentsField cell] setBackgroundStyle: NSBackgroundStyleRaised]; - [self updateGroupsFilterButton]; - //set up filter bar - NSView * contentView = [fWindow contentView]; - NSSize windowSize = [contentView convertSize: [fWindow frame].size fromView: nil]; - [fFilterBar setHidden: YES]; - - NSRect filterBarFrame = [fFilterBar frame]; - filterBarFrame.size.width = windowSize.width; - [fFilterBar setFrame: filterBarFrame]; - - [contentView addSubview: fFilterBar]; - [fFilterBar setFrameOrigin: NSMakePoint(0, NSMaxY([contentView frame]))]; - [self showFilterBar: [fDefaults boolForKey: @"FilterBar"] animate: NO]; //set up status bar @@ -472,43 +441,6 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy } } - //set filter - NSString * filterType = [fDefaults stringForKey: @"Filter"]; - - NSButton * currentFilterButton; - if ([filterType isEqualToString: FILTER_ACTIVE]) - currentFilterButton = fActiveFilterButton; - else if ([filterType isEqualToString: FILTER_PAUSE]) - currentFilterButton = fPauseFilterButton; - else if ([filterType isEqualToString: FILTER_SEED]) - currentFilterButton = fSeedFilterButton; - else if ([filterType isEqualToString: FILTER_DOWNLOAD]) - currentFilterButton = fDownloadFilterButton; - else - { - //safety - if (![filterType isEqualToString: FILTER_NONE]) - [fDefaults setObject: FILTER_NONE forKey: @"Filter"]; - currentFilterButton = fNoFilterButton; - } - [currentFilterButton setState: NSOnState]; - - //set filter search type - NSString * filterSearchType = [fDefaults stringForKey: @"FilterSearchType"]; - - NSMenu * filterSearchMenu = [[fSearchFilterField cell] searchMenuTemplate]; - NSString * filterSearchTypeTitle; - if ([filterSearchType isEqualToString: FILTER_TYPE_TRACKER]) - filterSearchTypeTitle = [[filterSearchMenu itemWithTag: FILTER_TYPE_TAG_TRACKER] title]; - else - { - //safety - if (![filterType isEqualToString: FILTER_TYPE_NAME]) - [fDefaults setObject: FILTER_TYPE_NAME forKey: @"FilterSearchType"]; - filterSearchTypeTitle = [[filterSearchMenu itemWithTag: FILTER_TYPE_TAG_NAME] title]; - } - [[fSearchFilterField cell] setPlaceholderString: filterSearchTypeTitle]; - fBadger = [[Badger alloc] initWithLib: fLib]; //observe notifications @@ -545,6 +477,9 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy [nc addObserver: self selector: @selector(updateTorrentsInQueue) name: @"UpdateQueue" object: nil]; + [nc addObserver: self selector: @selector(applyFilter) + name: @"ApplyFilter" object: nil]; + //open newly created torrent file [nc addObserver: self selector: @selector(beginCreateFile:) name: @"BeginCreateTorrentFile" object: nil]; @@ -552,10 +487,6 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy //open newly created torrent file [nc addObserver: self selector: @selector(openCreatedFile:) name: @"OpenCreatedTorrentFile" object: nil]; - - //update when groups change - [nc addObserver: self selector: @selector(updateGroupsFilters:) - name: @"UpdateGroups" object: nil]; //timer to update the interface every second [self updateUI]; @@ -564,13 +495,14 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy [[NSRunLoop currentRunLoop] addTimer: fTimer forMode: NSModalPanelRunLoopMode]; [[NSRunLoop currentRunLoop] addTimer: fTimer forMode: NSEventTrackingRunLoopMode]; - [self applyFilter: nil]; + [self applyFilter]; [fWindow makeKeyAndOrderFront: nil]; + #warning still needed? //can't be done earlier - if (![fFilterBar isHidden]) - [self resizeFilterBar]; + /*if (![fFilterBar isHidden]) + [self resizeFilterBar];*/ if ([fDefaults boolForKey: @"InfoVisible"]) [self showInfo: nil]; @@ -1266,7 +1198,7 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy } [self updateUI]; - [self applyFilter: nil]; + [self applyFilter]; [[fWindow toolbar] validateVisibleItems]; [self updateTorrentHistory]; } @@ -1290,7 +1222,7 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy [torrents makeObjectsPerformSelector: @selector(stopTransfer)]; [self updateUI]; - [self applyFilter: nil]; + [self applyFilter]; [[fWindow toolbar] validateVisibleItems]; [self updateTorrentHistory]; } @@ -1605,7 +1537,7 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy for (Torrent * torrent in torrents) [torrent resetCache]; - [self applyFilter: nil]; + [self applyFilter]; } - (void) showPreferenceWindow: (id) sender @@ -1760,7 +1692,7 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy } [self updateUI]; - [self applyFilter: nil]; + [self applyFilter]; [[fWindow toolbar] validateVisibleItems]; [self updateTorrentHistory]; } @@ -1923,7 +1855,7 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy } [fDefaults setObject: sortType forKey: @"Sort"]; - [self applyFilter: nil]; //better than calling sortTorrents because it will even apply to queue order + [self applyFilter]; //better than calling sortTorrents because it will even apply to queue order } - (void) setSortByGroup: (id) sender @@ -1935,7 +1867,7 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy if (sortByGroup) [fTableView removeAllCollapsedGroups]; - [self applyFilter: nil]; + [self applyFilter]; } - (void) setSortReverse: (id) sender @@ -2027,7 +1959,7 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy [fTableView reloadData]; } -- (void) applyFilter: (id) sender +- (void) applyFilter { //get all the torrents in the table NSMutableArray * previousTorrents; @@ -2060,8 +1992,8 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy const NSInteger groupFilterValue = [fDefaults integerForKey: @"FilterGroup"]; const BOOL filterGroup = groupFilterValue != GROUP_FILTER_ALL_TAG; - NSString * searchString = [fSearchFilterField stringValue]; - const BOOL filterText = [searchString length] > 0, + NSString * searchString = fFilterBar ? [fFilterBar searchString] : @""; + const BOOL filterText = ![searchString isEqualToString: @""], filterTracker = filterText && [[fDefaults stringForKey: @"FilterSearchType"] isEqualToString: FILTER_TYPE_TRACKER]; NSMutableArray * allTorrents = [NSMutableArray arrayWithCapacity: [fTorrents count]]; @@ -2132,11 +2064,7 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy } //set button tooltips - [fNoFilterButton setCount: [fTorrents count]]; - [fActiveFilterButton setCount: active]; - [fDownloadFilterButton setCount: downloading]; - [fSeedFilterButton setCount: seeding]; - [fPauseFilterButton setCount: paused]; + [fFilterBar setCountAll: [fTorrents count] active: active downloading: downloading seeding: seeding paused: paused]; //clear display cache for not-shown torrents [previousTorrents removeObjectsInArray: allTorrents]; @@ -2219,110 +2147,19 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy [self setWindowSizeToFit]; } -//resets filter and sorts torrents -- (void) setFilter: (id) sender -{ - NSString * oldFilterType = [fDefaults stringForKey: @"Filter"]; - - NSButton * prevFilterButton; - if ([oldFilterType isEqualToString: FILTER_PAUSE]) - prevFilterButton = fPauseFilterButton; - else if ([oldFilterType isEqualToString: FILTER_ACTIVE]) - prevFilterButton = fActiveFilterButton; - else if ([oldFilterType isEqualToString: FILTER_SEED]) - prevFilterButton = fSeedFilterButton; - else if ([oldFilterType isEqualToString: FILTER_DOWNLOAD]) - prevFilterButton = fDownloadFilterButton; - else - prevFilterButton = fNoFilterButton; - - if (sender != prevFilterButton) - { - [prevFilterButton setState: NSOffState]; - [sender setState: NSOnState]; - - NSString * filterType; - if (sender == fActiveFilterButton) - filterType = FILTER_ACTIVE; - else if (sender == fDownloadFilterButton) - filterType = FILTER_DOWNLOAD; - else if (sender == fPauseFilterButton) - filterType = FILTER_PAUSE; - else if (sender == fSeedFilterButton) - filterType = FILTER_SEED; - else - filterType = FILTER_NONE; - - [fDefaults setObject: filterType forKey: @"Filter"]; - } - else - [sender setState: NSOnState]; - - [self applyFilter: nil]; -} - -- (void) setFilterSearchType: (id) sender -{ - NSString * oldFilterType = [fDefaults stringForKey: @"FilterSearchType"]; - - NSInteger prevTag, currentTag = [sender tag]; - if ([oldFilterType isEqualToString: FILTER_TYPE_TRACKER]) - prevTag = FILTER_TYPE_TAG_TRACKER; - else - prevTag = FILTER_TYPE_TAG_NAME; - - if (currentTag != prevTag) - { - NSString * filterType; - if (currentTag == FILTER_TYPE_TAG_TRACKER) - filterType = FILTER_TYPE_TRACKER; - else - filterType = FILTER_TYPE_NAME; - - [fDefaults setObject: filterType forKey: @"FilterSearchType"]; - - [[fSearchFilterField cell] setPlaceholderString: [sender title]]; - } - - [self applyFilter: nil]; -} - - (void) switchFilter: (id) sender { - NSString * filterType = [fDefaults stringForKey: @"Filter"]; - - NSButton * button; - if ([filterType isEqualToString: FILTER_NONE]) - button = sender == fNextFilterItem ? fActiveFilterButton : fPauseFilterButton; - else if ([filterType isEqualToString: FILTER_ACTIVE]) - button = sender == fNextFilterItem ? fDownloadFilterButton : fNoFilterButton; - else if ([filterType isEqualToString: FILTER_DOWNLOAD]) - button = sender == fNextFilterItem ? fSeedFilterButton : fActiveFilterButton; - else if ([filterType isEqualToString: FILTER_SEED]) - button = sender == fNextFilterItem ? fPauseFilterButton : fDownloadFilterButton; - else if ([filterType isEqualToString: FILTER_PAUSE]) - button = sender == fNextFilterItem ? fNoFilterButton : fSeedFilterButton; - else - button = fNoFilterButton; - - [self setFilter: button]; + [fFilterBar switchFilter: sender == fNextFilterItem]; } - (void) menuNeedsUpdate: (NSMenu *) menu { - if (menu == fGroupsSetMenu || menu == fGroupsSetContextMenu || menu == fGroupFilterMenu) + if (menu == fGroupsSetMenu || menu == fGroupsSetContextMenu) { - const BOOL filter = menu == fGroupFilterMenu; - - const NSInteger remaining = filter ? 3 : 0; - for (NSInteger i = [menu numberOfItems]-1; i >= remaining; i--) + for (NSInteger i = [menu numberOfItems]-1; i >= 0; i--) [menu removeItemAtIndex: i]; - NSMenu * groupMenu; - if (!filter) - groupMenu = [[GroupsController groups] groupMenuWithTarget: self action: @selector(setGroup:) isSmall: NO]; - else - groupMenu = [[GroupsController groups] groupMenuWithTarget: self action: @selector(setGroupFilter:) isSmall: YES]; + NSMenu * groupMenu = [[GroupsController groups] groupMenuWithTarget: self action: @selector(setGroup:) isSmall: NO]; const NSInteger groupMenuCount = [groupMenu numberOfItems]; for (NSInteger i = 0; i < groupMenuCount; i++) @@ -2382,47 +2219,11 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy [torrent setGroupValue: [sender tag]]; } - [self applyFilter: nil]; + [self applyFilter]; [self updateUI]; [self updateTorrentHistory]; } -- (void) setGroupFilter: (id) sender -{ - [fDefaults setInteger: [sender tag] forKey: @"FilterGroup"]; - [self updateGroupsFilterButton]; - [self applyFilter: nil]; -} - -- (void) updateGroupsFilterButton -{ - NSInteger groupIndex = [fDefaults integerForKey: @"FilterGroup"]; - - NSImage * icon; - NSString * toolTip; - if (groupIndex == GROUP_FILTER_ALL_TAG) - { - icon = [NSImage imageNamed: @"PinTemplate.png"]; - toolTip = NSLocalizedString(@"All Groups", "Groups -> Button"); - } - else - { - icon = [[GroupsController groups] imageForIndex: groupIndex]; - NSString * groupName = groupIndex != -1 ? [[GroupsController groups] nameForIndex: groupIndex] - : NSLocalizedString(@"None", "Groups -> Button"); - toolTip = [NSLocalizedString(@"Group", "Groups -> Button") stringByAppendingFormat: @": %@", groupName]; - } - - [[fGroupFilterMenu itemAtIndex: 0] setImage: icon]; - [fGroupsButton setToolTip: toolTip]; -} - -- (void) updateGroupsFilters: (NSNotification *) notification -{ - [self updateGroupsFilterButton]; - [self applyFilter: nil]; -} - - (void) toggleSpeedLimit: (id) sender { [fDefaults setBool: ![fDefaults boolForKey: @"SpeedLimit"] forKey: @"SpeedLimit"]; @@ -2786,7 +2587,7 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy [fTorrents insertObjects: movingTorrents atIndexes: insertIndexes]; } - [self applyFilter: nil]; + [self applyFilter]; [fTableView selectValues: selectedValues]; } @@ -2984,8 +2785,8 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy NSSize maxSize = [scrollView convertSize: [[fWindow screen] visibleFrame].size fromView: nil]; if (!fStatusBar) maxSize.height -= [[fStatusBar view] frame].size.height; - if ([fFilterBar isHidden]) - maxSize.height -= [fFilterBar frame].size.height; + if (!fFilterBar) + maxSize.height -= [[fFilterBar view] frame].size.height; if (windowSize.height > maxSize.height) windowSize.height = maxSize.height; } @@ -3025,7 +2826,7 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy [[fStatusBar view] setFrame: statusBarFrame]; [contentView addSubview: [fStatusBar view]]; - [[fStatusBar view] setFrameOrigin: NSMakePoint(0, NSMaxY([contentView frame]))]; + [[fStatusBar view] setFrameOrigin: NSMakePoint(0.0, NSMaxY([contentView frame]))]; } NSRect frame; @@ -3054,8 +2855,12 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy //set views to not autoresize const NSUInteger statsMask = [[fStatusBar view] autoresizingMask]; [[fStatusBar view] setAutoresizingMask: NSViewNotSizable]; - const NSUInteger filterMask = [fFilterBar autoresizingMask]; - [fFilterBar setAutoresizingMask: NSViewNotSizable]; + NSUInteger filterMask; + if (fFilterBar) + { + filterMask = [[fFilterBar view] autoresizingMask]; + [[fFilterBar view] setAutoresizingMask: NSViewNotSizable]; + } const NSUInteger scrollMask = [scrollView autoresizingMask]; [scrollView setAutoresizingMask: NSViewNotSizable]; @@ -3064,7 +2869,8 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy //re-enable autoresize [[fStatusBar view] setAutoresizingMask: statsMask]; - [fFilterBar setAutoresizingMask: filterMask]; + if (fFilterBar) + [[fFilterBar view] setAutoresizingMask: filterMask]; [scrollView setAutoresizingMask: scrollMask]; //change min size @@ -3074,6 +2880,7 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy if (!show) { + [[fStatusBar view] removeFromSuperview]; [fStatusBar release]; fStatusBar = nil; } @@ -3081,38 +2888,56 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy - (void) toggleFilterBar: (id) sender { - //disable filtering when hiding - if (![fFilterBar isHidden]) - { - [fSearchFilterField setStringValue: @""]; - [self setFilter: fNoFilterButton]; - [self setGroupFilter: [fGroupFilterMenu itemWithTag: GROUP_FILTER_ALL_TAG]]; - } - - [self showFilterBar: [fFilterBar isHidden] animate: YES]; - [fDefaults setBool: ![fFilterBar isHidden] forKey: @"FilterBar"]; + const BOOL show = fFilterBar == nil; + + [self showFilterBar: show animate: YES]; + [fDefaults setBool: show forKey: @"FilterBar"]; [[fWindow toolbar] validateVisibleItems]; + + //disable filtering when hiding + if (!show) + { + [[NSUserDefaults standardUserDefaults] setObject: FILTER_NONE forKey: @"Filter"]; + [[NSUserDefaults standardUserDefaults] setInteger: GROUP_FILTER_ALL_TAG forKey: @"FilterGroup"]; + [self applyFilter]; + } } //doesn't save shown state - (void) showFilterBar: (BOOL) show animate: (BOOL) animate { - if (show != [fFilterBar isHidden]) + const BOOL prevShown = fFilterBar != nil; + if (show == prevShown) return; - + if (show) - [fFilterBar setHidden: NO]; - - NSRect frame; - CGFloat heightChange = [fFilterBar frame].size.height; + { + fFilterBar = [[FilterBarController alloc] init]; + + NSView * contentView = [fWindow contentView]; + const NSSize windowSize = [contentView convertSize: [fWindow frame].size fromView: nil]; + + NSRect filterBarFrame = [[fFilterBar view] frame]; + filterBarFrame.size.width = windowSize.width; + [[fFilterBar view] setFrame: filterBarFrame]; + + if (fStatusBar) + [contentView addSubview: [fFilterBar view] positioned: NSWindowBelow relativeTo: [fStatusBar view]]; + else + [contentView addSubview: [fFilterBar view]]; + const CGFloat originY = fStatusBar ? NSMinY([[fStatusBar view] frame]) : NSMaxY([contentView frame]); + [[fFilterBar view] setFrameOrigin: NSMakePoint(0.0, originY)]; + } + + CGFloat heightChange = NSHeight([[fFilterBar view] frame]); if (!show) heightChange *= -1; //allow bar to show even if not enough room if (show && ![fDefaults boolForKey: @"AutoSize"]) { - frame = [self windowFrameByAddingHeight: heightChange checkLimits: NO]; - CGFloat change = [[fWindow screen] visibleFrame].size.height - frame.size.height; + NSRect frame = [self windowFrameByAddingHeight: heightChange checkLimits: NO]; + const CGFloat change = NSHeight([[fWindow screen] visibleFrame]) - NSHeight(frame); if (change < 0.0) { frame = [fWindow frame]; @@ -3125,16 +2950,16 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy NSScrollView * scrollView = [fTableView enclosingScrollView]; //set views to not autoresize - NSUInteger filterMask = [fFilterBar autoresizingMask]; - NSUInteger scrollMask = [scrollView autoresizingMask]; - [fFilterBar setAutoresizingMask: NSViewNotSizable]; + const NSUInteger filterMask = [[fFilterBar view] autoresizingMask]; + const NSUInteger scrollMask = [scrollView autoresizingMask]; + [[fFilterBar view] setAutoresizingMask: NSViewNotSizable]; [scrollView setAutoresizingMask: NSViewNotSizable]; - frame = [self windowFrameByAddingHeight: heightChange checkLimits: NO]; + const NSRect frame = [self windowFrameByAddingHeight: heightChange checkLimits: NO]; [fWindow setFrame: frame display: YES animate: animate]; //re-enable autoresize - [fFilterBar setAutoresizingMask: filterMask]; + [[fFilterBar view] setAutoresizingMask: filterMask]; [scrollView setAutoresizingMask: scrollMask]; //change min size @@ -3144,16 +2969,19 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy if (!show) { - [fFilterBar setHidden: YES]; + [[fFilterBar view] removeFromSuperview]; + [fFilterBar release]; + fFilterBar = nil; [fWindow makeFirstResponder: fTableView]; } } +#warning fix? - (void) focusFilterField { - [fWindow makeFirstResponder: fSearchFilterField]; + /*[fWindow makeFirstResponder: fSearchFilterField]; if ([fFilterBar isHidden]) - [self toggleFilterBar: self]; + [self toggleFilterBar: self];*/ } #warning change from id to QLPreviewPanel @@ -3550,7 +3378,7 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy //set filter image if ([ident isEqualToString: TOOLBAR_FILTER]) { - [(NSButton *)[toolbarItem view] setState: ![fFilterBar isHidden]]; + [(NSButton *)[toolbarItem view] setState: fFilterBar != nil]; return YES; } @@ -3633,12 +3461,6 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy return canUseTable && [fTableView numberOfSelectedRows] > 0; } - if (action == @selector(setGroupFilter:)) - { - [menuItem setState: [menuItem tag] == [fDefaults integerForKey: @"FilterGroup"] ? NSOnState : NSOffState]; - return YES; - } - if (action == @selector(toggleSmallView:)) { [menuItem setState: [fDefaults boolForKey: @"SmallView"] ? NSOnState : NSOffState]; @@ -3724,7 +3546,7 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy //enable toggle filter bar if (action == @selector(toggleFilterBar:)) { - NSString * title = [fFilterBar isHidden] ? NSLocalizedString(@"Show Filter Bar", "View menu -> Filter Bar") + NSString * title = !fFilterBar ? NSLocalizedString(@"Show Filter Bar", "View menu -> Filter Bar") : NSLocalizedString(@"Hide Filter Bar", "View menu -> Filter Bar"); [menuItem setTitle: title]; @@ -3733,7 +3555,7 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy //enable prev/next filter button if (action == @selector(switchFilter:)) - return [fWindow isVisible] && ![fFilterBar isHidden]; + return [fWindow isVisible] && fFilterBar; //enable reveal in finder if (action == @selector(revealFile:)) @@ -3906,21 +3728,6 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy return YES; } - //check proper filter search item - if (action == @selector(setFilterSearchType:)) - { - NSString * filterType = [fDefaults stringForKey: @"FilterSearchType"]; - - BOOL state; - if ([menuItem tag] == FILTER_TYPE_TAG_TRACKER) - state = [filterType isEqualToString: FILTER_TYPE_TRACKER]; - else - state = [filterType isEqualToString: FILTER_TYPE_NAME]; - - [menuItem setState: state ? NSOnState : NSOffState]; - return YES; - } - if (action == @selector(toggleQuickLook:)) { const BOOL visible = [NSApp isOnSnowLeopardOrBetter] && [QLPreviewPanelSL sharedPreviewPanelExists] @@ -4085,66 +3892,6 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy return [self windowFrameByAddingHeight: heightChange checkLimits: YES]; } -- (void) resizeFilterBar -{ - //replace all buttons - [fNoFilterButton sizeToFit]; - [fActiveFilterButton sizeToFit]; - [fDownloadFilterButton sizeToFit]; - [fSeedFilterButton sizeToFit]; - [fPauseFilterButton sizeToFit]; - - NSRect allRect = [fNoFilterButton frame]; - NSRect activeRect = [fActiveFilterButton frame]; - NSRect downloadRect = [fDownloadFilterButton frame]; - NSRect seedRect = [fSeedFilterButton frame]; - NSRect pauseRect = [fPauseFilterButton frame]; - - //size search filter to not overlap buttons - NSRect searchFrame = [fSearchFilterField frame]; - searchFrame.origin.x = NSMaxX(pauseRect) + 5.0; - searchFrame.size.width = [fFilterBar frame].size.width - searchFrame.origin.x - 5.0; - - //make sure it is not too long - if (searchFrame.size.width > SEARCH_FILTER_MAX_WIDTH) - { - searchFrame.origin.x += searchFrame.size.width - SEARCH_FILTER_MAX_WIDTH; - searchFrame.size.width = SEARCH_FILTER_MAX_WIDTH; - } - else if (searchFrame.size.width < SEARCH_FILTER_MIN_WIDTH) - { - searchFrame.origin.x += searchFrame.size.width - SEARCH_FILTER_MIN_WIDTH; - searchFrame.size.width = SEARCH_FILTER_MIN_WIDTH; - - //calculate width the buttons can take up - const CGFloat allowedWidth = (searchFrame.origin.x - 5.0) - allRect.origin.x; - const CGFloat currentWidth = NSWidth(allRect) + NSWidth(activeRect) + NSWidth(downloadRect) + NSWidth(seedRect) - + NSWidth(pauseRect) + 4.0; //add 4 for space between buttons - const CGFloat ratio = allowedWidth / currentWidth; - - //decrease button widths proportionally - allRect.size.width = NSWidth(allRect) * ratio; - activeRect.size.width = NSWidth(activeRect) * ratio; - downloadRect.size.width = NSWidth(downloadRect) * ratio; - seedRect.size.width = NSWidth(seedRect) * ratio; - pauseRect.size.width = NSWidth(pauseRect) * ratio; - } - else; - - activeRect.origin.x = NSMaxX(allRect) + 1.0; - downloadRect.origin.x = NSMaxX(activeRect) + 1.0; - seedRect.origin.x = NSMaxX(downloadRect) + 1.0; - pauseRect.origin.x = NSMaxX(seedRect) + 1.0; - - [fNoFilterButton setFrame: allRect]; - [fActiveFilterButton setFrame: activeRect]; - [fDownloadFilterButton setFrame: downloadRect]; - [fSeedFilterButton setFrame: seedRect]; - [fPauseFilterButton setFrame: pauseRect]; - - [fSearchFilterField setFrame: searchFrame]; -} - - (void) updateForExpandCollape { [self setWindowSizeToFit]; @@ -4170,12 +3917,6 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy return proposedFrameSize; } -- (void) windowDidResize: (NSNotification *) notification -{ - if (![fFilterBar isHidden]) - [self resizeFilterBar]; -} - - (void) applicationWillUnhide: (NSNotification *) notification { [self updateUI]; @@ -4349,7 +4090,7 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy [torrent release]; [self updateUI]; - [self applyFilter: nil]; + [self applyFilter]; [self updateTorrentHistory]; } diff --git a/macosx/FilterBar.xib b/macosx/FilterBar.xib new file mode 100644 index 000000000..982537f13 --- /dev/null +++ b/macosx/FilterBar.xib @@ -0,0 +1,1608 @@ + + + + 1060 + 10J567 + 823 + 1038.35 + 462.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 823 + + + YES + + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + YES + + FilterBarController + + + FirstResponder + + + NSApplication + + + + 266 + + YES + + + 257 + {{357, 4}, {95, 15}} + + YES + + 343014976 + 268698624 + + + LucidaGrande + 9 + 3614 + + + YES + 1 + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + 130560 + 0 + search + + _searchFieldSearch: + + 138690815 + 0 + + 400 + 75 + + + 130560 + 0 + clear + + YES + + YES + + YES + AXDescription + NSAccessibilityEncodedAttributesValueType + + + YES + cancel + + + + + _searchFieldCancel: + + 138428671 + 0 + + 400 + 75 + + 255 + + + + + 268 + {{42, 2}, {30, 17}} + + YES + + 67239488 + 134481920 + All + + LucidaGrande-Bold + 11 + 16 + + + -1232846593 + 173 + + + 400 + 75 + + + + + 268 + {{123, 2}, {89, 17}} + + YES + + 67239488 + 134481920 + Downloading + + + -1232846593 + 173 + + + 400 + 75 + + + + + 268 + {{213, 2}, {59, 17}} + + YES + + 67239488 + 134481920 + Seeding + + + -1232846593 + 173 + + + 400 + 75 + + + + + 268 + {{273, 2}, {55, 17}} + + YES + + 67239488 + 134481920 + Paused + + + -1229700865 + 173 + + + 400 + 75 + + + + + 268 + {{34, 5}, {5, 12}} + + {0, 0} + + 67239424 + 0 + Box + + LucidaGrande + 13 + 1044 + + + + 3 + MCAwLjgwMDAwMDAxAA + + + 3 + 2 + 0 + NO + + + + 268 + {{5, 4}, {26, 14}} + + YES + + -2076049856 + 133120 + + LucidaGrande + 12 + 16 + + + -1229438721 + 173 + + + 400 + 75 + + + YES + + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + _popUpItemAction: + -999 + + + YES + + OtherViews + + YES + + + + All Groups + + 1048576 + 2147483647 + + + _popUpItemAction: + -2 + + + + + YES + YES + + + 1048576 + 2147483647 + + + _popUpItemAction: + -999 + + + + + YES + 1 + YES + YES + + + + + 268 + {{73, 2}, {49, 17}} + + YES + + 67239488 + 134481920 + Active + + + -1232846593 + 173 + + + 400 + 75 + + + + {457, 23} + + FilterBarView + NSView + + + Menu + + YES + + + Name + + 1048576 + 2147483647 + + + 401 + + + + Tracker + + 1048576 + 2147483647 + + + 402 + + + + + + + + YES + + + fNoFilterButton + + + + 27 + + + + fPauseFilterButton + + + + 28 + + + + fDownloadFilterButton + + + + 29 + + + + fActiveFilterButton + + + + 30 + + + + fSearchField + + + + 31 + + + + fSeedFilterButton + + + + 32 + + + + view + + + + 33 + + + + setFilter: + + + + 40 + + + + setFilter: + + + + 41 + + + + setFilter: + + + + 42 + + + + setFilter: + + + + 43 + + + + setFilter: + + + + 44 + + + + setSearchType: + + + + 46 + + + + setSearchType: + + + + 47 + + + + searchMenuTemplate + + + + 48 + + + + fGroupsButton + + + + 49 + + + + setSearchText: + + + + 51 + + + + delegate + + + + 52 + + + + setGroupFilter: + + + + 60 + + + + + YES + + 0 + + YES + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 2 + + + YES + + + + + + + + + + + FilterBar + + + 3 + + + YES + + + + + + 4 + + + YES + + + + + + 5 + + + + + 6 + + + YES + + + + + + 7 + + + YES + + + + + + 8 + + + YES + + + + + + 10 + + + YES + + + + + + 11 + + + + + 13 + + + + + 14 + + + + + 15 + + + + + 16 + + + YES + + + + + + 17 + + + YES + + + + + + + + 21 + + + + + 22 + + + YES + + + + + SearchFilterMenu + + + 23 + + + + + 24 + + + + + 9 + + + YES + + + + + + 12 + + + + + 57 + + + + + 58 + + + + + 59 + + + + + + + YES + + YES + -3.IBPluginDependency + 10.IBPluginDependency + 10.ImportedFromIB2 + 11.IBPluginDependency + 12.IBPluginDependency + 13.IBPluginDependency + 14.IBPluginDependency + 15.IBPluginDependency + 16.IBPluginDependency + 17.IBEditorWindowLastContentRect + 17.IBPluginDependency + 17.ImportedFromIB2 + 2.IBEditorWindowLastContentRect + 2.IBPluginDependency + 2.ImportedFromIB2 + 2.editorWindowContentRectSynchronizationRect + 21.IBPluginDependency + 22.IBEditorWindowLastContentRect + 22.IBPluginDependency + 22.ImportedFromIB2 + 23.IBPluginDependency + 23.ImportedFromIB2 + 24.IBPluginDependency + 24.ImportedFromIB2 + 3.CustomClassName + 3.IBPluginDependency + 3.ImportedFromIB2 + 4.IBPluginDependency + 4.ImportedFromIB2 + 5.IBPluginDependency + 5.ImportedFromIB2 + 57.IBPluginDependency + 57.ImportedFromIB2 + 58.IBPluginDependency + 58.ImportedFromIB2 + 59.IBPluginDependency + 59.ImportedFromIB2 + 6.CustomClassName + 6.IBPluginDependency + 6.ImportedFromIB2 + 7.CustomClassName + 7.IBPluginDependency + 7.ImportedFromIB2 + 8.CustomClassName + 8.IBPluginDependency + 8.ImportedFromIB2 + 9.CustomClassName + 9.IBPluginDependency + 9.IBViewBoundsToFrameTransform + 9.ImportedFromIB2 + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{182, 720}, {116, 47}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{188, 749}, {457, 23}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{0, 972}, {457, 23}} + com.apple.InterfaceBuilder.CocoaPlugin + {{224, 545}, {118, 43}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + FilterButton + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + FilterButton + com.apple.InterfaceBuilder.CocoaPlugin + + FilterButton + com.apple.InterfaceBuilder.CocoaPlugin + + FilterButton + com.apple.InterfaceBuilder.CocoaPlugin + + FilterButton + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCKAAAwYgAAA + + + + + + YES + + + YES + + + + + YES + + + YES + + + + 60 + + + + YES + + FilterBarController + NSViewController + + YES + + YES + setFilter: + setGroupFilter: + setSearchText: + setSearchType: + + + YES + id + id + id + id + + + + YES + + YES + setFilter: + setGroupFilter: + setSearchText: + setSearchType: + + + YES + + setFilter: + id + + + setGroupFilter: + id + + + setSearchText: + id + + + setSearchType: + id + + + + + YES + + YES + fActiveFilterButton + fDownloadFilterButton + fGroupsButton + fNoFilterButton + fPauseFilterButton + fSearchField + fSeedFilterButton + + + YES + FilterButton + FilterButton + NSPopUpButton + FilterButton + FilterButton + NSSearchField + FilterButton + + + + YES + + YES + fActiveFilterButton + fDownloadFilterButton + fGroupsButton + fNoFilterButton + fPauseFilterButton + fSearchField + fSeedFilterButton + + + YES + + fActiveFilterButton + FilterButton + + + fDownloadFilterButton + FilterButton + + + fGroupsButton + NSPopUpButton + + + fNoFilterButton + FilterButton + + + fPauseFilterButton + FilterButton + + + fSearchField + NSSearchField + + + fSeedFilterButton + FilterButton + + + + + IBProjectSource + macosx/FilterBarController.h + + + + FilterBarView + NSView + + IBProjectSource + macosx/FilterBarView.h + + + + FilterButton + NSButton + + IBProjectSource + macosx/FilterButton.h + + + + NSApplication + + IBProjectSource + macosx/NSApplicationAdditions.h + + + + NSObject + + IBProjectSource + macosx/UKKQueue/UKFileWatcher.h + + + + NSObject + + IBProjectSource + macosx/UKKQueue/UKKQueue.h + + + + NSObject + + IBProjectSource + macosx/UKKQueue/UKMainThreadProxy.h + + + + + YES + + NSActionCell + NSCell + + IBFrameworkSource + AppKit.framework/Headers/NSActionCell.h + + + + NSApplication + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSApplication.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSApplicationScripting.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSColorPanel.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSHelpManager.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSPageLayout.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSUserInterfaceItemSearching.h + + + + NSBox + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSBox.h + + + + NSButton + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSButton.h + + + + NSButtonCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSButtonCell.h + + + + NSCell + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSCell.h + + + + NSControl + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSControl.h + + + + NSFormatter + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFormatter.h + + + + NSMenu + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenu.h + + + + NSMenuItem + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenuItem.h + + + + NSMenuItemCell + NSButtonCell + + IBFrameworkSource + AppKit.framework/Headers/NSMenuItemCell.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSAccessibility.h + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDictionaryController.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDragging.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontManager.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontPanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSKeyValueBinding.h + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSNibLoading.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSOutlineView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSPasteboard.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSSavePanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSTableView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSToolbarItem.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSView.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObjectScripting.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSPortCoder.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptObjectSpecifiers.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptWhoseTests.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLDownload.h + + + + NSObject + + IBFrameworkSource + Growl.framework/Headers/GrowlApplicationBridge.h + + + + NSObject + + IBFrameworkSource + ImageKit.framework/Headers/IKImageBrowserView.h + + + + NSObject + + IBFrameworkSource + ImageKit.framework/Headers/IKSaveOptions.h + + + + NSObject + + IBFrameworkSource + ImageKit.framework/Headers/ImageKitDeprecated.h + + + + NSObject + + IBFrameworkSource + PDFKit.framework/Headers/PDFDocument.h + + + + NSObject + + IBFrameworkSource + PDFKit.framework/Headers/PDFView.h + + + + NSObject + + IBFrameworkSource + QuartzComposer.framework/Headers/QCCompositionParameterView.h + + + + NSObject + + IBFrameworkSource + QuartzComposer.framework/Headers/QCCompositionPickerView.h + + + + NSObject + + IBFrameworkSource + QuartzFilters.framework/Headers/QuartzFilterManager.h + + + + NSObject + + IBFrameworkSource + QuickLookUI.framework/Headers/QLPreviewPanel.h + + + + NSObject + + IBFrameworkSource + Sparkle.framework/Headers/SUAppcast.h + + + + NSObject + + IBFrameworkSource + Sparkle.framework/Headers/SUUpdater.h + + + + NSPopUpButton + NSButton + + IBFrameworkSource + AppKit.framework/Headers/NSPopUpButton.h + + + + NSPopUpButtonCell + NSMenuItemCell + + IBFrameworkSource + AppKit.framework/Headers/NSPopUpButtonCell.h + + + + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSInterfaceStyle.h + + + + NSResponder + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSResponder.h + + + + NSSearchField + NSTextField + + IBFrameworkSource + AppKit.framework/Headers/NSSearchField.h + + + + NSSearchFieldCell + NSTextFieldCell + + IBFrameworkSource + AppKit.framework/Headers/NSSearchFieldCell.h + + + + NSTextField + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSTextField.h + + + + NSTextFieldCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSTextFieldCell.h + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSClipView.h + + + + NSView + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSRulerView.h + + + + NSView + NSResponder + + + + NSViewController + NSResponder + + view + NSView + + + view + + view + NSView + + + + IBFrameworkSource + AppKit.framework/Headers/NSViewController.h + + + + + 0 + IBCocoaFramework + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + ../Transmission.xcodeproj + 3 + + YES + + YES + NSMenuCheckmark + NSMenuMixedState + + + YES + {9, 8} + {7, 2} + + + + diff --git a/macosx/FilterBarController.h b/macosx/FilterBarController.h new file mode 100644 index 000000000..6248cec1b --- /dev/null +++ b/macosx/FilterBarController.h @@ -0,0 +1,63 @@ +/****************************************************************************** + * $Id$ + * + * Copyright (c) 2011 Transmission authors and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + *****************************************************************************/ + +#import + +@class FilterButton; + +#define FILTER_NONE @"None" +#define FILTER_ACTIVE @"Active" +#define FILTER_DOWNLOAD @"Download" +#define FILTER_SEED @"Seed" +#define FILTER_PAUSE @"Pause" + +#define FILTER_TYPE_NAME @"Name" +#define FILTER_TYPE_TRACKER @"Tracker" + +#define GROUP_FILTER_ALL_TAG -2 + +@interface FilterBarController : NSViewController +{ + IBOutlet FilterButton * fNoFilterButton, * fActiveFilterButton, * fDownloadFilterButton, + * fSeedFilterButton, * fPauseFilterButton; + + IBOutlet NSSearchField * fSearchField; + + IBOutlet NSPopUpButton * fGroupsButton; +} + +- (id) init; + +- (void) setFilter: (id) sender; +- (void) switchFilter: (BOOL) right; +- (void) setSearchText: (id) sender; +- (void) setSearchType: (id) sender; +- (void) setGroupFilter: (id) sender; + +- (NSString *) searchString; + +- (void) setCountAll: (NSUInteger) all active: (NSUInteger) active downloading: (NSUInteger) downloading + seeding: (NSUInteger) seeding paused: (NSUInteger) paused; + +@end diff --git a/macosx/FilterBarController.m b/macosx/FilterBarController.m new file mode 100644 index 000000000..6c240d726 --- /dev/null +++ b/macosx/FilterBarController.m @@ -0,0 +1,370 @@ +/****************************************************************************** + * $Id$ + * + * Copyright (c) 2011 Transmission authors and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + *****************************************************************************/ + +#import "FilterBarController.h" +#import "FilterButton.h" +#include "GroupsController.h" + +#define FILTER_TYPE_TAG_NAME 401 +#define FILTER_TYPE_TAG_TRACKER 402 + +#define SEARCH_MIN_WIDTH 48.0 +#define SEARCH_MAX_WIDTH 95.0 + +@interface FilterBarController (Private) + +- (void) resizeBar; +- (void) updateGroupsButton; +- (void) updateGroups: (NSNotification *) notification; + +@end + +@implementation FilterBarController + +- (id) init +{ + return (self = [super initWithNibName: @"FilterBar" bundle: nil]); +} + +- (void) awakeFromNib +{ + #warning localize every thing + + [self resizeBar]; + + //set current filter + NSString * filterType = [[NSUserDefaults standardUserDefaults] stringForKey: @"Filter"]; + + NSButton * currentFilterButton; + if ([filterType isEqualToString: FILTER_ACTIVE]) + currentFilterButton = fActiveFilterButton; + else if ([filterType isEqualToString: FILTER_PAUSE]) + currentFilterButton = fPauseFilterButton; + else if ([filterType isEqualToString: FILTER_SEED]) + currentFilterButton = fSeedFilterButton; + else if ([filterType isEqualToString: FILTER_DOWNLOAD]) + currentFilterButton = fDownloadFilterButton; + else + { + //safety + if (![filterType isEqualToString: FILTER_NONE]) + [[NSUserDefaults standardUserDefaults] setObject: FILTER_NONE forKey: @"Filter"]; + currentFilterButton = fNoFilterButton; + } + [currentFilterButton setState: NSOnState]; + + + //set filter search type + NSString * filterSearchType = [[NSUserDefaults standardUserDefaults] stringForKey: @"FilterSearchType"]; + + NSMenu * filterSearchMenu = [[fSearchField cell] searchMenuTemplate]; + NSString * filterSearchTypeTitle; + if ([filterSearchType isEqualToString: FILTER_TYPE_TRACKER]) + filterSearchTypeTitle = [[filterSearchMenu itemWithTag: FILTER_TYPE_TAG_TRACKER] title]; + else + { + //safety + if (![filterType isEqualToString: FILTER_TYPE_NAME]) + [[NSUserDefaults standardUserDefaults] setObject: FILTER_TYPE_NAME forKey: @"FilterSearchType"]; + filterSearchTypeTitle = [[filterSearchMenu itemWithTag: FILTER_TYPE_TAG_NAME] title]; + } + [[fSearchField cell] setPlaceholderString: filterSearchTypeTitle]; + + [self updateGroupsButton]; + + [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(resizeBar) + name: NSWindowDidResizeNotification object: [[self view] window]]; + + //update when groups change + [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(updateGroups:) + name: @"UpdateGroups" object: nil]; +} + +- (void) dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver: self]; + + [super dealloc]; +} + +- (void) setFilter: (id) sender +{ + NSString * oldFilterType = [[NSUserDefaults standardUserDefaults] stringForKey: @"Filter"]; + + NSButton * prevFilterButton; + if ([oldFilterType isEqualToString: FILTER_PAUSE]) + prevFilterButton = fPauseFilterButton; + else if ([oldFilterType isEqualToString: FILTER_ACTIVE]) + prevFilterButton = fActiveFilterButton; + else if ([oldFilterType isEqualToString: FILTER_SEED]) + prevFilterButton = fSeedFilterButton; + else if ([oldFilterType isEqualToString: FILTER_DOWNLOAD]) + prevFilterButton = fDownloadFilterButton; + else + prevFilterButton = fNoFilterButton; + + if (sender != prevFilterButton) + { + [prevFilterButton setState: NSOffState]; + [sender setState: NSOnState]; + + NSString * filterType; + if (sender == fActiveFilterButton) + filterType = FILTER_ACTIVE; + else if (sender == fDownloadFilterButton) + filterType = FILTER_DOWNLOAD; + else if (sender == fPauseFilterButton) + filterType = FILTER_PAUSE; + else if (sender == fSeedFilterButton) + filterType = FILTER_SEED; + else + filterType = FILTER_NONE; + + [[NSUserDefaults standardUserDefaults] setObject: filterType forKey: @"Filter"]; + } + else + [sender setState: NSOnState]; + + [[NSNotificationCenter defaultCenter] postNotificationName: @"ApplyFilter" object: nil]; +} + +- (void) switchFilter: (BOOL) right +{ + NSString * filterType = [[NSUserDefaults standardUserDefaults] stringForKey: @"Filter"]; + + NSButton * button; + if ([filterType isEqualToString: FILTER_NONE]) + button = right ? fActiveFilterButton : fPauseFilterButton; + else if ([filterType isEqualToString: FILTER_ACTIVE]) + button = right ? fDownloadFilterButton : fNoFilterButton; + else if ([filterType isEqualToString: FILTER_DOWNLOAD]) + button = right ? fSeedFilterButton : fActiveFilterButton; + else if ([filterType isEqualToString: FILTER_SEED]) + button = right ? fPauseFilterButton : fDownloadFilterButton; + else if ([filterType isEqualToString: FILTER_PAUSE]) + button = right ? fNoFilterButton : fSeedFilterButton; + else + button = fNoFilterButton; + + [self setFilter: button]; +} + +- (void) setSearchText: (id) sender +{ + [[NSNotificationCenter defaultCenter] postNotificationName: @"ApplyFilter" object: nil]; +} + +- (void) setSearchType: (id) sender +{ + NSString * oldFilterType = [[NSUserDefaults standardUserDefaults] stringForKey: @"FilterSearchType"]; + + NSInteger prevTag, currentTag = [sender tag]; + if ([oldFilterType isEqualToString: FILTER_TYPE_TRACKER]) + prevTag = FILTER_TYPE_TAG_TRACKER; + else + prevTag = FILTER_TYPE_TAG_NAME; + + if (currentTag != prevTag) + { + NSString * filterType; + if (currentTag == FILTER_TYPE_TAG_TRACKER) + filterType = FILTER_TYPE_TRACKER; + else + filterType = FILTER_TYPE_NAME; + + [[NSUserDefaults standardUserDefaults] setObject: filterType forKey: @"FilterSearchType"]; + + [[fSearchField cell] setPlaceholderString: [sender title]]; + } + + [[NSNotificationCenter defaultCenter] postNotificationName: @"ApplyFilter" object: nil]; +} + +- (void) setGroupFilter: (id) sender +{ + [[NSUserDefaults standardUserDefaults] setInteger: [sender tag] forKey: @"FilterGroup"]; + [self updateGroupsButton]; + + [[NSNotificationCenter defaultCenter] postNotificationName: @"ApplyFilter" object: nil]; +} + +- (NSString *) searchString +{ + return [fSearchField stringValue]; +} + +- (void) setCountAll: (NSUInteger) all active: (NSUInteger) active downloading: (NSUInteger) downloading + seeding: (NSUInteger) seeding paused: (NSUInteger) paused +{ + [fNoFilterButton setCount: all]; + [fActiveFilterButton setCount: active]; + [fDownloadFilterButton setCount: downloading]; + [fSeedFilterButton setCount: seeding]; + [fPauseFilterButton setCount: paused]; +} + +- (void) menuNeedsUpdate: (NSMenu *) menu +{ + if (menu == [fGroupsButton menu]) + { + for (NSInteger i = [menu numberOfItems]-1; i >= 3; i--) + [menu removeItemAtIndex: i]; + + NSMenu * groupMenu = [[GroupsController groups] groupMenuWithTarget: self action: @selector(setGroupFilter:) isSmall: YES]; + + const NSInteger groupMenuCount = [groupMenu numberOfItems]; + for (NSInteger i = 0; i < groupMenuCount; i++) + { + NSMenuItem * item = [[groupMenu itemAtIndex: 0] retain]; + [groupMenu removeItemAtIndex: 0]; + [menu addItem: item]; + [item release]; + } + } +} + +- (BOOL) validateMenuItem: (NSMenuItem *) menuItem +{ + const SEL action = [menuItem action]; + + //check proper filter search item + if (action == @selector(setSearchType:)) + { + NSString * filterType = [[NSUserDefaults standardUserDefaults] stringForKey: @"FilterSearchType"]; + + BOOL state; + if ([menuItem tag] == FILTER_TYPE_TAG_TRACKER) + state = [filterType isEqualToString: FILTER_TYPE_TRACKER]; + else + state = [filterType isEqualToString: FILTER_TYPE_NAME]; + + [menuItem setState: state ? NSOnState : NSOffState]; + return YES; + } + + if (action == @selector(setGroupFilter:)) + { + [menuItem setState: [menuItem tag] == [[NSUserDefaults standardUserDefaults] integerForKey: @"FilterGroup"] + ? NSOnState : NSOffState]; + return YES; + } + + return YES; +} + +@end + +@implementation FilterBarController (Private) + +- (void) resizeBar +{ + //replace all buttons + [fNoFilterButton sizeToFit]; + [fActiveFilterButton sizeToFit]; + [fDownloadFilterButton sizeToFit]; + [fSeedFilterButton sizeToFit]; + [fPauseFilterButton sizeToFit]; + + NSRect allRect = [fNoFilterButton frame]; + NSRect activeRect = [fActiveFilterButton frame]; + NSRect downloadRect = [fDownloadFilterButton frame]; + NSRect seedRect = [fSeedFilterButton frame]; + NSRect pauseRect = [fPauseFilterButton frame]; + + //size search filter to not overlap buttons + NSRect searchFrame = [fSearchField frame]; + searchFrame.origin.x = NSMaxX(pauseRect) + 5.0; + searchFrame.size.width = NSWidth([[self view] frame]) - searchFrame.origin.x - 5.0; + + //make sure it is not too long + if (NSWidth(searchFrame) > SEARCH_MAX_WIDTH) + { + searchFrame.origin.x += NSWidth(searchFrame) - SEARCH_MAX_WIDTH; + searchFrame.size.width = SEARCH_MAX_WIDTH; + } + else if (NSWidth(searchFrame) < SEARCH_MIN_WIDTH) + { + searchFrame.origin.x += NSWidth(searchFrame) - SEARCH_MIN_WIDTH; + searchFrame.size.width = SEARCH_MIN_WIDTH; + + //calculate width the buttons can take up + const CGFloat allowedWidth = (searchFrame.origin.x - 5.0) - allRect.origin.x; + const CGFloat currentWidth = NSWidth(allRect) + NSWidth(activeRect) + NSWidth(downloadRect) + NSWidth(seedRect) + + NSWidth(pauseRect) + 4.0; //add 4 for space between buttons + const CGFloat ratio = allowedWidth / currentWidth; + + //decrease button widths proportionally + allRect.size.width = NSWidth(allRect) * ratio; + activeRect.size.width = NSWidth(activeRect) * ratio; + downloadRect.size.width = NSWidth(downloadRect) * ratio; + seedRect.size.width = NSWidth(seedRect) * ratio; + pauseRect.size.width = NSWidth(pauseRect) * ratio; + } + else; + + activeRect.origin.x = NSMaxX(allRect) + 1.0; + downloadRect.origin.x = NSMaxX(activeRect) + 1.0; + seedRect.origin.x = NSMaxX(downloadRect) + 1.0; + pauseRect.origin.x = NSMaxX(seedRect) + 1.0; + + [fNoFilterButton setFrame: allRect]; + [fActiveFilterButton setFrame: activeRect]; + [fDownloadFilterButton setFrame: downloadRect]; + [fSeedFilterButton setFrame: seedRect]; + [fPauseFilterButton setFrame: pauseRect]; + + [fSearchField setFrame: searchFrame]; +} + +- (void) updateGroupsButton +{ + const NSInteger groupIndex = [[NSUserDefaults standardUserDefaults] integerForKey: @"FilterGroup"]; + + NSImage * icon; + NSString * toolTip; + if (groupIndex == GROUP_FILTER_ALL_TAG) + { + icon = [NSImage imageNamed: @"PinTemplate.png"]; + toolTip = NSLocalizedString(@"All Groups", "Groups -> Button"); + } + else + { + icon = [[GroupsController groups] imageForIndex: groupIndex]; + NSString * groupName = groupIndex != -1 ? [[GroupsController groups] nameForIndex: groupIndex] + : NSLocalizedString(@"None", "Groups -> Button"); + toolTip = [NSLocalizedString(@"Group", "Groups -> Button") stringByAppendingFormat: @": %@", groupName]; + } + + [[[fGroupsButton menu] itemAtIndex: 0] setImage: icon]; + [fGroupsButton setToolTip: toolTip]; +} + +- (void) updateGroups: (NSNotification *) notification +{ + [self updateGroupsButton]; + + [[NSNotificationCenter defaultCenter] postNotificationName: @"ApplyFilter" object: nil]; +} + +@end diff --git a/macosx/Makefile.am b/macosx/Makefile.am index 96090980c..0dcf78374 100644 --- a/macosx/Makefile.am +++ b/macosx/Makefile.am @@ -72,6 +72,8 @@ EXTRA_DIST = \ FileOutlineView.m \ FilePriorityCell.h \ FilePriorityCell.m \ + FilterBarController.h \ + FilterBarController.m \ FilterBarView.h \ FilterBarView.m \ FilterButton.h \ diff --git a/macosx/en.lproj/MainMenu.xib b/macosx/en.lproj/MainMenu.xib index 8e5e50564..027b67918 100644 --- a/macosx/en.lproj/MainMenu.xib +++ b/macosx/en.lproj/MainMenu.xib @@ -13,8 +13,8 @@ YES + - YES @@ -61,7 +61,7 @@ -2076049856 134219776 - + LucidaGrande 13 1044 @@ -2190,281 +2190,6 @@ AAAAAAAAAAAAAAAAA - - - 266 - - YES - - - 257 - {{357, 4}, {95, 15}} - - YES - - 343014976 - 268698624 - - - LucidaGrande - 9 - 3614 - - - YES - 1 - - 6 - System - textBackgroundColor - - - - - 130560 - 0 - search - - _searchFieldSearch: - - 138690815 - 0 - - 400 - 75 - - - 130560 - 0 - clear - - YES - - YES - - YES - AXDescription - NSAccessibilityEncodedAttributesValueType - - - YES - cancel - - - - - _searchFieldCancel: - - 138428671 - 0 - - 400 - 75 - - 255 - - - - - 268 - {{42, 2}, {30, 17}} - - YES - - 67239488 - 134481920 - All - - LucidaGrande-Bold - 11 - 16 - - - -1232846593 - 173 - - - 400 - 75 - - - - - 268 - {{123, 2}, {89, 17}} - - YES - - 67239488 - 134481920 - Downloading - - - -1232846593 - 173 - - - 400 - 75 - - - - - 268 - {{213, 2}, {59, 17}} - - YES - - 67239488 - 134481920 - Seeding - - - -1232846593 - 173 - - - 400 - 75 - - - - - 268 - {{273, 2}, {55, 17}} - - YES - - 67239488 - 134481920 - Paused - - - -1229700865 - 173 - - - 400 - 75 - - - - - 268 - {{34, 5}, {5, 12}} - - {0, 0} - - 67239424 - 0 - Box - - - - 3 - MCAwLjgwMDAwMDAxAA - - - 3 - 2 - 0 - NO - - - - 268 - {{5, 4}, {26, 14}} - - YES - - -2076049856 - 133120 - - LucidaGrande - 12 - 16 - - - -1229438721 - 173 - - - 400 - 75 - - - YES - - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - OtherViews - - YES - - - - Item 2 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - Item 3 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - YES - 1 - YES - YES - - - - - 268 - {{73, 2}, {49, 17}} - - YES - - 67239488 - 134481920 - Active - - - -1232846593 - 173 - - - 400 - 75 - - - - {457, 23} - FilterBarView - NSView - SUUpdater @@ -3033,71 +2758,6 @@ AAAAAAAAAAAAAAAAA YES - - Menu - - YES - - - Name - - 1048576 - 2147483647 - - - 401 - - - - Tracker - - 1048576 - 2147483647 - - - 402 - - - - - - StatusMenu - - YES - - - - - 1048576 - 2147483647 - - - -999 - - - - All Groups - - 1048576 - 2147483647 - - - -2 - - - - YES - YES - - - 1048576 - 2147483647 - - - -999 - - - @@ -3494,14 +3154,6 @@ AAAAAAAAAAAAAAAAA 1584 - - - fFilterBar - - - - 1613 - toggleFilterBar: @@ -3654,14 +3306,6 @@ AAAAAAAAAAAAAAAAA 1796 - - - fPrevFilterItem - - - - 1800 - fNextFilterItem @@ -3854,38 +3498,6 @@ AAAAAAAAAAAAAAAAA 1934 - - - setFilterSearchType: - - - - 2051 - - - - setFilterSearchType: - - - - 2052 - - - - fSearchFilterField - - - - 2082 - - - - searchMenuTemplate - - - - 2121 - announceSelectedTorrents: @@ -3918,70 +3530,6 @@ AAAAAAAAAAAAAAAAA 2186 - - - fNoFilterButton - - - - 2216 - - - - fDownloadFilterButton - - - - 2217 - - - - fSeedFilterButton - - - - 2218 - - - - fPauseFilterButton - - - - 2219 - - - - setFilter: - - - - 2230 - - - - setFilter: - - - - 2231 - - - - setFilter: - - - - 2232 - - - - setFilter: - - - - 2233 - toggleAvailabilityBar: @@ -4086,62 +3634,6 @@ AAAAAAAAAAAAAAAAA 2855 - - - fGroupFilterMenu - - - - 2949 - - - - menu - - - - 2982 - - - - delegate - - - - 2983 - - - - setGroupFilter: - - - - 2984 - - - - fGroupsButton - - - - 2985 - - - - fActiveFilterButton - - - - 3013 - - - - setFilter: - - - - 3014 - setRatioGlobalEnabled: @@ -4222,14 +3714,6 @@ AAAAAAAAAAAAAAAAA 3081 - - - applyFilter: - - - - 3083 - dataSource @@ -5770,91 +5254,6 @@ AAAAAAAAAAAAAAAAA - - 1603 - - - YES - - - - - - - - - - - FilterBar - - - 2071 - - - YES - - - - - - 2208 - - - YES - - - - - - 2210 - - - YES - - - - - - 2212 - - - YES - - - - - - 2214 - - - YES - - - - - - 2916 - - - - - 2976 - - - YES - - - - - - 3011 - - - YES - - - - 1812 @@ -5999,54 +5398,6 @@ AAAAAAAAAAAAAAAAA - - 2043 - - - YES - - - - - SearchFilterMenu - - - 2044 - - - - - 2045 - - - - - 2942 - - - YES - - - - - - GroupFilterMenu - - - 2946 - - - - - 2947 - - - - - 2948 - - - 3047 @@ -6066,45 +5417,6 @@ AAAAAAAAAAAAAAAAA - - 3057 - - - - - 3058 - - - - - 3059 - - - - - 3060 - - - - - 3061 - - - - - 3062 - - - YES - - - - - - 3063 - - - 2683 @@ -6131,32 +5443,6 @@ AAAAAAAAAAAAAAAAA - - 2978 - - - YES - - - - - - - - 2981 - - - - - 2980 - - - - - 2979 - - - 3077 @@ -6603,10 +5889,6 @@ AAAAAAAAAAAAAAAAA 1591.ImportedFromIB2 160.IBPluginDependency 160.ImportedFromIB2 - 1603.IBEditorWindowLastContentRect - 1603.IBPluginDependency - 1603.ImportedFromIB2 - 1603.editorWindowContentRectSynchronizationRect 1620.IBPluginDependency 1620.ImportedFromIB2 163.IBPluginDependency @@ -6775,16 +6057,7 @@ AAAAAAAAAAAAAAAAA 2029.ImportedFromIB2 2031.IBPluginDependency 2031.ImportedFromIB2 - 2043.IBEditorWindowLastContentRect - 2043.IBPluginDependency - 2043.ImportedFromIB2 - 2044.IBPluginDependency - 2044.ImportedFromIB2 - 2045.IBPluginDependency - 2045.ImportedFromIB2 206.ImportedFromIB2 - 2071.IBPluginDependency - 2071.ImportedFromIB2 21.IBEditorWindowLastContentRect 21.IBPluginDependency 21.IBWindowTemplateEditedContentRect @@ -6800,18 +6073,6 @@ AAAAAAAAAAAAAAAAA 2123.ImportedFromIB2 2185.IBPluginDependency 2185.ImportedFromIB2 - 2208.CustomClassName - 2208.IBPluginDependency - 2208.ImportedFromIB2 - 2210.CustomClassName - 2210.IBPluginDependency - 2210.ImportedFromIB2 - 2212.CustomClassName - 2212.IBPluginDependency - 2212.ImportedFromIB2 - 2214.CustomClassName - 2214.IBPluginDependency - 2214.ImportedFromIB2 2279.IBPluginDependency 2279.ImportedFromIB2 2301.IBPluginDependency @@ -6859,32 +6120,8 @@ AAAAAAAAAAAAAAAAA 29.IBPluginDependency 29.ImportedFromIB2 29.editorWindowContentRectSynchronizationRect - 2916.IBPluginDependency - 2916.ImportedFromIB2 - 2942.IBEditorWindowLastContentRect - 2942.IBPluginDependency - 2942.ImportedFromIB2 - 2946.IBPluginDependency - 2946.ImportedFromIB2 - 2947.IBPluginDependency - 2947.ImportedFromIB2 - 2948.IBPluginDependency - 2948.ImportedFromIB2 - 2976.IBPluginDependency - 2976.ImportedFromIB2 - 2978.IBPluginDependency - 2978.ImportedFromIB2 - 2979.IBPluginDependency - 2979.ImportedFromIB2 - 2980.IBPluginDependency - 2980.ImportedFromIB2 - 2981.IBPluginDependency - 2981.ImportedFromIB2 301.IBPluginDependency 301.ImportedFromIB2 - 3011.CustomClassName - 3011.IBPluginDependency - 3011.ImportedFromIB2 302.IBEditorWindowLastContentRect 302.IBPluginDependency 302.ImportedFromIB2 @@ -6892,13 +6129,6 @@ AAAAAAAAAAAAAAAAA 3047.IBPluginDependency 3048.IBPluginDependency 3049.IBPluginDependency - 3057.IBPluginDependency - 3058.IBPluginDependency - 3059.IBPluginDependency - 3060.IBPluginDependency - 3061.IBPluginDependency - 3062.IBPluginDependency - 3063.IBPluginDependency 3077.IBPluginDependency 3078.IBPluginDependency 3078.ImportedFromIB2 @@ -7164,10 +6394,6 @@ AAAAAAAAAAAAAAAAA com.apple.InterfaceBuilder.CocoaPlugin - {{382, 705}, {457, 23}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{0, 972}, {457, 23}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -7198,7 +6424,7 @@ AAAAAAAAAAAAAAAAA com.apple.InterfaceBuilder.CocoaPlugin - {{719, 638}, {249, 243}} + {{550, 498}, {249, 243}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -7336,15 +6562,6 @@ AAAAAAAAAAAAAAAAA com.apple.InterfaceBuilder.CocoaPlugin - {{0, 952}, {118, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - - com.apple.InterfaceBuilder.CocoaPlugin {{71, 712}, {515, 248}} com.apple.InterfaceBuilder.CocoaPlugin @@ -7361,18 +6578,6 @@ AAAAAAAAAAAAAAAAA com.apple.InterfaceBuilder.CocoaPlugin - FilterButton - com.apple.InterfaceBuilder.CocoaPlugin - - FilterButton - com.apple.InterfaceBuilder.CocoaPlugin - - FilterButton - com.apple.InterfaceBuilder.CocoaPlugin - - FilterButton - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -7424,30 +6629,6 @@ AAAAAAAAAAAAAAAAA {{468, 888}, {479, 20}} com.apple.InterfaceBuilder.CocoaPlugin - {{0, 756}, {141, 53}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - FilterButton - com.apple.InterfaceBuilder.CocoaPlugin - {{587, 638}, {233, 243}} com.apple.InterfaceBuilder.CocoaPlugin @@ -7457,13 +6638,6 @@ AAAAAAAAAAAAAAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -7615,7 +6789,6 @@ AAAAAAAAAAAAAAAAA YES allToolbarClicked: announceSelectedTorrents: - applyFilter: clearCompleted: copyMagnetLinks: copyTorrentFiles: @@ -7635,8 +6808,6 @@ AAAAAAAAAAAAAAAAA resumeWaitingTorrents: revealFile: selectedToolbarClicked: - setFilter: - setFilterSearchType: setGroup: setGroupFilter: setInfoTab: @@ -7719,9 +6890,6 @@ AAAAAAAAAAAAAAAAA id id id - id - id - id @@ -7730,7 +6898,6 @@ AAAAAAAAAAAAAAAAA YES allToolbarClicked: announceSelectedTorrents: - applyFilter: clearCompleted: copyMagnetLinks: copyTorrentFiles: @@ -7750,8 +6917,6 @@ AAAAAAAAAAAAAAAAA resumeWaitingTorrents: revealFile: selectedToolbarClicked: - setFilter: - setFilterSearchType: setGroup: setGroupFilter: setInfoTab: @@ -7792,10 +6957,6 @@ AAAAAAAAAAAAAAAAA announceSelectedTorrents: id - - applyFilter: - id - clearCompleted: id @@ -7872,14 +7033,6 @@ AAAAAAAAAAAAAAAAA selectedToolbarClicked: id - - setFilter: - id - - - setFilterSearchType: - id - setGroup: id @@ -8003,32 +7156,21 @@ AAAAAAAAAAAAAAAAA YES fActionButton - fActiveFilterButton fCheckRatioItem fDockMenu - fDownloadFilterButton fDownloadLimitItem fDownloadMenu fDownloadNoLimitItem - fFilterBar - fGroupFilterMenu - fGroupsButton fGroupsSetContextMenu fGroupsSetMenu fNextFilterItem fNextInfoTabItem fNoCheckRatioItem - fNoFilterButton fOpenIgnoreDownloadFolder - fPauseFilterButton - fPrevFilterItem fPrevInfoTabItem fPreviewPanel fRatioStopMenu - fSearchFilterField - fSeedFilterButton fSpeedLimitButton - fStatusBar fTableView fTotalTorrentsField fUploadLimitItem @@ -8039,32 +7181,21 @@ AAAAAAAAAAAAAAAAA YES NSButton - FilterButton - NSMenuItem - NSMenu - FilterButton NSMenuItem NSMenu NSMenuItem - FilterBarView NSMenu - NSPopUpButton + NSMenuItem NSMenu NSMenu NSMenuItem NSMenuItem NSMenuItem - FilterButton - NSMenuItem - FilterButton NSMenuItem NSMenuItem id NSMenu - NSSearchField - FilterButton NSButton - StatusBarController TorrentTableView NSTextField NSMenuItem @@ -8078,32 +7209,21 @@ AAAAAAAAAAAAAAAAA YES fActionButton - fActiveFilterButton fCheckRatioItem fDockMenu - fDownloadFilterButton fDownloadLimitItem fDownloadMenu fDownloadNoLimitItem - fFilterBar - fGroupFilterMenu - fGroupsButton fGroupsSetContextMenu fGroupsSetMenu fNextFilterItem fNextInfoTabItem fNoCheckRatioItem - fNoFilterButton fOpenIgnoreDownloadFolder - fPauseFilterButton - fPrevFilterItem fPrevInfoTabItem fPreviewPanel fRatioStopMenu - fSearchFilterField - fSeedFilterButton fSpeedLimitButton - fStatusBar fTableView fTotalTorrentsField fUploadLimitItem @@ -8117,10 +7237,6 @@ AAAAAAAAAAAAAAAAA fActionButton NSButton - - fActiveFilterButton - FilterButton - fCheckRatioItem NSMenuItem @@ -8129,10 +7245,6 @@ AAAAAAAAAAAAAAAAA fDockMenu NSMenu - - fDownloadFilterButton - FilterButton - fDownloadLimitItem NSMenuItem @@ -8145,18 +7257,6 @@ AAAAAAAAAAAAAAAAA fDownloadNoLimitItem NSMenuItem - - fFilterBar - FilterBarView - - - fGroupFilterMenu - NSMenu - - - fGroupsButton - NSPopUpButton - fGroupsSetContextMenu NSMenu @@ -8177,22 +7277,10 @@ AAAAAAAAAAAAAAAAA fNoCheckRatioItem NSMenuItem - - fNoFilterButton - FilterButton - fOpenIgnoreDownloadFolder NSMenuItem - - fPauseFilterButton - FilterButton - - - fPrevFilterItem - NSMenuItem - fPrevInfoTabItem NSMenuItem @@ -8205,22 +7293,10 @@ AAAAAAAAAAAAAAAAA fRatioStopMenu NSMenu - - fSearchFilterField - NSSearchField - - - fSeedFilterButton - FilterButton - fSpeedLimitButton NSButton - - fStatusBar - StatusBarController - fTableView TorrentTableView @@ -8521,30 +7597,6 @@ AAAAAAAAAAAAAAAAA macosx/FileOutlineView.h - - FilterBarView - NSView - - IBProjectSource - macosx/FilterBarView.h - - - - FilterButton - NSButton - - IBProjectSource - macosx/FilterButton.h - - - - FilterButton - NSButton - - IBUserSource - - - FirstResponder NSObject @@ -8658,71 +7710,6 @@ AAAAAAAAAAAAAAAAA - - StatusBarController - NSViewController - - setStatusLabel: - id - - - setStatusLabel: - - setStatusLabel: - id - - - - YES - - YES - fStatusButton - fTotalDLField - fTotalDLImageView - fTotalULField - - - YES - NSButton - NSTextField - NSImageView - NSTextField - - - - YES - - YES - fStatusButton - fTotalDLField - fTotalDLImageView - fTotalULField - - - YES - - fStatusButton - NSButton - - - fTotalDLField - NSTextField - - - fTotalDLImageView - NSImageView - - - fTotalULField - NSTextField - - - - - IBProjectSource - macosx/StatusBarController.h - - TorrentTableView NSOutlineView @@ -8980,14 +7967,6 @@ AAAAAAAAAAAAAAAAA AppKit.framework/Headers/NSUserInterfaceItemSearching.h - - NSBox - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSBox.h - - NSBrowser NSControl @@ -9542,22 +8521,6 @@ AAAAAAAAAAAAAAAAA AppKit.framework/Headers/NSScroller.h - - NSSearchField - NSTextField - - IBFrameworkSource - AppKit.framework/Headers/NSSearchField.h - - - - NSSearchFieldCell - NSTextFieldCell - - IBFrameworkSource - AppKit.framework/Headers/NSSearchFieldCell.h - - NSSegmentedControl NSControl @@ -9642,25 +8605,6 @@ AAAAAAAAAAAAAAAAA NSResponder - - NSViewController - NSResponder - - view - NSView - - - view - - view - NSView - - - - IBFrameworkSource - AppKit.framework/Headers/NSViewController.h - - NSWindow