Skip to content

Commit 136bdaf

Browse files
committed
Unify validation into superclass
1 parent 3bf413e commit 136bdaf

13 files changed

+134
-224
lines changed

Submariner/SBMusicController.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,4 @@
8181
- (void)showAlbumInLibrary:(SBAlbum*)album;
8282
- (void)showArtistInLibrary:(SBArtist*)artist;
8383

84-
- (BOOL)validateUserInterfaceItem: (id<NSValidatedUserInterfaceItem>) item;
85-
8684
@end

Submariner/SBMusicController.m

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -708,39 +708,34 @@ - (BOOL)validateUserInterfaceItem: (id<NSValidatedUserInterfaceItem>) item {
708708
NSInteger tracksSelected = tracksTableView.selectedRowIndexes.count;
709709

710710
NSResponder *responder = self.databaseController.window.firstResponder;
711-
BOOL tracksActive = responder == tracksTableView;
712-
BOOL albumsActive = responder == albumsCollectionView;
713711
BOOL artistsActive = responder == artistsTableView;
714712

715713
if (action == @selector(mergeArtists:)) {
716714
return artistsSelected > 1 && artistsActive;
717715
}
718716

719-
if (action == @selector(addSelectedToTracklist:)) {
720-
return (albumSelected > 0 && albumsActive) || (tracksSelected > 0 && tracksActive) || (artistsSelected > 0 && artistsActive);
721-
}
722-
723-
if (action == @selector(playSelected:)) {
724-
return (albumSelected > 0 && albumsActive) || (tracksSelected > 0 && tracksActive);
717+
if (action == @selector(delete:)) {
718+
return artistsSelected > 0 || albumSelected > 0 || tracksSelected > 0;
725719
}
726720

727-
if (action == @selector(showSelectedInFinder:)
728-
|| action == @selector(delete:)) {
729-
return artistsSelected > 0 || albumSelected > 0 || tracksSelected > 0;
721+
if (action == @selector(removeArtist:)) {
722+
return artistsSelected > 0;
730723
}
731724

732-
// For the sake of context menus; IKImageBrowserView is weird with focus.
733-
if (action == @selector(albumDoubleClick:)
734-
|| action == @selector(removeAlbum:)
735-
|| action == @selector(addAlbumToTracklist:)) {
725+
if (action == @selector(removeAlbum:)) {
736726
return albumSelected > 0;
737727
}
738728

739-
if (action == @selector(createNewLocalPlaylistWithSelectedTracks:)) {
729+
if (action == @selector(removeTrack:)) {
740730
return tracksSelected > 0;
741731
}
732+
733+
if (action == @selector(showSelectedInLibrary:)) {
734+
// We're already in the library, so it doesn't make sense to show this...
735+
return NO;
736+
}
742737

743-
return YES;
738+
return [super validateUserInterfaceItem: item];
744739
}
745740

746741

Submariner/SBMusicSearchController.m

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -160,33 +160,4 @@ - (NSInteger) selectedTrackRow {
160160
return nil;
161161
}
162162

163-
164-
#pragma mark -
165-
#pragma mark UI Validator
166-
167-
- (BOOL)validateUserInterfaceItem: (id<NSValidatedUserInterfaceItem>) item {
168-
SEL action = [item action];
169-
170-
NSInteger tracksSelected = tracksTableView.selectedRowIndexes.count;
171-
172-
SBSelectedRowStatus selectedTrackRowStatus = 0;
173-
selectedTrackRowStatus = [self selectedRowStatus: tracksController.arrangedObjects selectedIndices: tracksTableView.selectedRowIndexes];
174-
175-
if (action == @selector(addSelectedToTracklist:)
176-
|| action == @selector(playSelected:)
177-
|| action == @selector(createNewLocalPlaylistWithSelectedTracks:)) {
178-
return tracksSelected;
179-
}
180-
181-
if (action == @selector(showSelectedInFinder:)) {
182-
return selectedTrackRowStatus & SBSelectedRowShowableInFinder;
183-
}
184-
185-
if (action == @selector(showSelectedInLibrary:)) {
186-
return tracksTableView.selectedRowIndexes.count == 1;
187-
}
188-
189-
return YES;
190-
}
191-
192163
@end

Submariner/SBPlaylistController.swift

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
import Cocoa
1212

13-
@objc(SBPlaylistController) class SBPlaylistController: SBViewController, NSTableViewDelegate, NSTableViewDataSource, NSUserInterfaceValidations {
13+
@objc(SBPlaylistController) class SBPlaylistController: SBViewController, NSTableViewDelegate, NSTableViewDataSource {
1414
// nulled means this playlist got deleted and hopefully the UI switched away from this VC correctly
1515
@objc var playlist: SBPlaylist! {
1616
didSet {
@@ -157,26 +157,16 @@ import Cocoa
157157

158158
// #MARK: - UI Validator
159159

160-
func validateUserInterfaceItem(_ item: any NSValidatedUserInterfaceItem) -> Bool {
160+
override func validateUserInterfaceItem(_ item: any NSValidatedUserInterfaceItem) -> Bool {
161161
let tracksSelected = selectedTracks.count
162162
let selectedTrackRowStatus = self.selectedRowStatus(tracks, selectedIndices: tracksController.selectionIndexes)
163163

164164
switch item.action {
165-
case #selector(SBPlaylistController.addSelectedToTracklist(_:)),
166-
#selector(SBPlaylistController.playSelected(_:)),
167-
#selector(SBPlaylistController.trackDoubleClick(_:)),
168-
#selector(SBPlaylistController.removeTrack(_:)),
169-
#selector(SBPlaylistController.delete(_:)),
170-
#selector(SBPlaylistController.createNewLocalPlaylistWithSelectedTracks(_:)):
165+
case #selector(SBPlaylistController.removeTrack(_:)),
166+
#selector(SBPlaylistController.delete(_:)):
171167
return tracksSelected > 0
172-
case #selector(SBPlaylistController.showSelectedInFinder(_:)):
173-
return selectedTrackRowStatus.contains(.showableInFinder)
174-
case #selector(SBPlaylistController.downloadSelected(_:)):
175-
return selectedTrackRowStatus.contains(.downloadable)
176-
case #selector(SBPlaylistController.showSelectedInLibrary(_:)):
177-
return tracksSelected == 1
178168
default:
179-
return true
169+
return super.validateUserInterfaceItem(item)
180170
}
181171
}
182172
}

Submariner/SBServerHomeController.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,4 @@
5454

5555
- (IBAction)reloadSelected:(id)sender;
5656

57-
- (BOOL)validateUserInterfaceItem: (id<NSValidatedUserInterfaceItem>) item;
58-
5957
@end

Submariner/SBServerHomeController.m

Lines changed: 0 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -445,58 +445,4 @@ - (void)scopeBar:(MGScopeBar *)theScopeBar selectedStateChanged:(BOOL)selected f
445445
}
446446

447447

448-
449-
#pragma mark -
450-
#pragma mark UI Validator
451-
452-
- (BOOL)validateUserInterfaceItem: (id<NSValidatedUserInterfaceItem>) item {
453-
SEL action = [item action];
454-
455-
NSInteger albumSelected = albumsController.selectionIndexes.count;
456-
NSInteger tracksSelected = tracksTableView.selectedRowIndexes.count;
457-
458-
NSResponder *responder = self.databaseController.window.firstResponder;
459-
BOOL tracksActive = responder == tracksTableView;
460-
BOOL albumsActive = responder == albumsCollectionView;
461-
462-
SBSelectedRowStatus selectedTrackRowStatus = 0;
463-
if (tracksActive) {
464-
selectedTrackRowStatus = [self selectedRowStatus: tracksController.arrangedObjects selectedIndices: tracksTableView.selectedRowIndexes];
465-
}
466-
467-
if (action == @selector(addSelectedToTracklist:)
468-
|| action == @selector(playSelected:)) {
469-
return (albumSelected > 0 && albumsActive) || (tracksSelected > 0 && tracksActive);
470-
}
471-
472-
if (action == @selector(createNewPlaylistWithSelectedTracks:)
473-
|| action == @selector(trackDoubleClick:)
474-
|| action == @selector(addTrackToTracklist:)
475-
|| action == @selector(createNewLocalPlaylistWithSelectedTracks:)) {
476-
return tracksSelected > 0;
477-
}
478-
479-
if (action == @selector(showSelectedInFinder:)) {
480-
return selectedTrackRowStatus & SBSelectedRowShowableInFinder;
481-
}
482-
483-
if (action == @selector(downloadTrack:)) {
484-
return selectedTrackRowStatus & SBSelectedRowDownloadable;
485-
}
486-
487-
if (action == @selector(downloadSelected:)) {
488-
return (selectedTrackRowStatus & SBSelectedRowDownloadable) || (albumSelected > 0 && albumsActive);
489-
}
490-
491-
// context menu
492-
if (action == @selector(downloadAlbum:)
493-
|| action == @selector(addAlbumToTracklist:)
494-
|| action == @selector(albumDoubleClick:)) {
495-
return albumSelected > 0;
496-
}
497-
498-
return YES;
499-
}
500-
501-
502448
@end

Submariner/SBServerLibraryController.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,4 @@
7373
- (void)showAlbumInLibrary:(SBAlbum*)album;
7474
- (void)showArtistInLibrary:(SBArtist*)artist;
7575

76-
- (BOOL)validateUserInterfaceItem: (id<NSValidatedUserInterfaceItem>) item;
77-
7876
@end

Submariner/SBServerLibraryController.m

Lines changed: 4 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -493,59 +493,12 @@ - (BOOL)splitView:(NSSplitView *)splitView shouldAdjustSizeOfSubview:(NSView *)v
493493
- (BOOL)validateUserInterfaceItem: (id<NSValidatedUserInterfaceItem>) item {
494494
SEL action = [item action];
495495

496-
NSInteger artistsSelected = artistsTableView.selectedRowIndexes.count;
497-
NSInteger albumSelected = albumsController.selectionIndexes.count;
498-
NSInteger tracksSelected = tracksTableView.selectedRowIndexes.count;
499-
500-
NSResponder *responder = self.databaseController.window.firstResponder;
501-
BOOL tracksActive = responder == tracksTableView;
502-
BOOL albumsActive = responder == albumsCollectionView;
503-
BOOL artistsActive = responder == artistsTableView;
504-
505-
SBSelectedRowStatus selectedTrackRowStatus = 0;
506-
if (tracksActive) {
507-
selectedTrackRowStatus = [self selectedRowStatus: tracksController.arrangedObjects selectedIndices: tracksTableView.selectedRowIndexes];
508-
}
509-
510-
if (action == @selector(playSelected:)) {
511-
return (albumSelected > 0 && albumsActive) || (tracksSelected > 0 && tracksActive);
512-
}
513-
514-
if (action == @selector(addSelectedToTracklist:)) {
515-
return (albumSelected > 0 && albumsActive) || (tracksSelected > 0 && tracksActive) || (artistsSelected > 0 && artistsActive);
516-
}
517-
518-
if (action == @selector(createNewPlaylistWithSelectedTracks:)
519-
|| action == @selector(trackDoubleClick:)
520-
|| action == @selector(addTrackToTracklist:)
521-
|| action == @selector(createNewLocalPlaylistWithSelectedTracks:)) {
522-
return tracksSelected > 0;
523-
}
524-
525-
if (action == @selector(showSelectedInFinder:)) {
526-
return selectedTrackRowStatus & SBSelectedRowShowableInFinder;
527-
}
528-
529-
if (action == @selector(downloadTrack:)) {
530-
return selectedTrackRowStatus & SBSelectedRowDownloadable;
531-
}
532-
533-
if (action == @selector(downloadSelected:)) {
534-
return (selectedTrackRowStatus & SBSelectedRowDownloadable) || (albumSelected > 0 && albumsActive);
535-
}
536-
537-
// for context menus
538-
if (action == @selector(albumDoubleClick:)
539-
|| action == @selector(downloadAlbum:)
540-
|| action == @selector(addAlbumToTracklist:)) {
541-
return albumSelected > 0;
542-
}
543-
544-
if (action == @selector(addArtistToTracklist:)) {
545-
return artistsSelected > 0;
496+
if (action == @selector(showSelectedInLibrary:)) {
497+
// We're already in the library, so it doesn't make sense to show this...
498+
return NO;
546499
}
547500

548-
return YES;
501+
return [super validateUserInterfaceItem: item];
549502
}
550503

551504

Submariner/SBServerSearchController.swift

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
import Cocoa
1212

13-
@objc class SBServerSearchController: SBServerViewController, NSTableViewDataSource, NSUserInterfaceValidations {
13+
@objc class SBServerSearchController: SBServerViewController, NSTableViewDataSource {
1414
@objc dynamic var searchResult: SBSearchResult?
1515

1616
@IBOutlet var tracksTableView: NSTableView!
@@ -78,25 +78,4 @@ import Cocoa
7878

7979
return SBLibraryItemPasteboardWriter(item: tracks[row], index: row)
8080
}
81-
82-
// #MARK: - UI Validator
83-
84-
func validateUserInterfaceItem(_ item: NSValidatedUserInterfaceItem) -> Bool {
85-
let selectedTrackRowStatus = self.selectedRowStatus(selectedTracks)
86-
87-
switch (item.action) {
88-
case #selector(SBServerSearchController.downloadSelected(_:)):
89-
return selectedTrackRowStatus.contains(.downloadable)
90-
case #selector(SBServerSearchController.showSelectedInFinder(_:)):
91-
return selectedTrackRowStatus.contains(.showableInFinder)
92-
case #selector(SBServerSearchController.addSelectedToTracklist(_:)),
93-
#selector(SBServerSearchController.playSelected(_:)),
94-
#selector(SBServerSearchController.createNewLocalPlaylistWithSelectedTracks(_:)):
95-
return selectedTracks.count > 0
96-
case #selector(SBServerSearchController.showSelectedInLibrary(_:)):
97-
return selectedTracks.count == 1
98-
default:
99-
return true
100-
}
101-
}
10281
}

Submariner/SBServerViewController.m

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,20 @@ - (IBAction)createNewPlaylistWithSelectedTracks:(id)sender {
6666
}
6767

6868

69+
#pragma mark - UI Validator
70+
71+
72+
- (BOOL)validateUserInterfaceItem: (id<NSValidatedUserInterfaceItem>) item {
73+
SEL action = [item action];
74+
75+
NSInteger tracksSelected = self.selectedTracks.count;
76+
77+
if (action == @selector(createNewPlaylistWithSelectedTracks:)) {
78+
return tracksSelected > 0;
79+
}
80+
81+
return [super validateUserInterfaceItem: item];
82+
}
83+
84+
6985
@end

Submariner/SBTracklistController.swift

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
import Cocoa
1212

13-
@objc class SBTracklistController: SBViewController, NSTableViewDelegate, NSTableViewDataSource, NSUserInterfaceValidations {
13+
@objc class SBTracklistController: SBViewController, NSTableViewDelegate, NSTableViewDataSource {
1414
@IBOutlet var playlistTableView: NSTableView!
1515
@IBOutlet var tracklistLengthView: NSTextField!
1616

@@ -145,22 +145,12 @@ import Cocoa
145145

146146
// #MARK: - UI Validator
147147

148-
func validateUserInterfaceItem(_ item: NSValidatedUserInterfaceItem) -> Bool {
149-
let selectedTrackRowStatus = self.selectedRowStatus(SBPlayer.sharedInstance().playlist,
150-
selectedIndices: playlistTableView.selectedRowIndexes)
148+
override func validateUserInterfaceItem(_ item: NSValidatedUserInterfaceItem) -> Bool {
151149
let count = playlistTableView.numberOfSelectedRows
152150

153151
switch (item.action) {
154-
case #selector(SBTracklistController.downloadSelected(_:)):
155-
return selectedTrackRowStatus.contains(.downloadable)
156-
case #selector(SBTracklistController.showSelectedInFinder(_:)):
157-
return selectedTrackRowStatus.contains(.showableInFinder)
158-
case #selector(SBTracklistController.playSelected(_:)),
159-
#selector(SBTracklistController.delete(_:)),
160-
#selector(SBTracklistController.createNewLocalPlaylistWithSelectedTracks(_:)):
152+
case #selector(SBTracklistController.delete(_:)):
161153
return count > 0
162-
case #selector(SBTracklistController.showSelectedInLibrary(_:)):
163-
return count == 1
164154
default:
165155
return true
166156
}

Submariner/SBViewController.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
@class SBTrack, SBAlbum, SBArtist;
4141
@protocol SBStarrable;
4242

43-
@interface SBViewController : NSViewController {
43+
@interface SBViewController : NSViewController<NSUserInterfaceValidations> {
4444
@protected
4545
NSManagedObjectContext *managedObjectContext;
4646

@@ -98,6 +98,13 @@ typedef NS_OPTIONS(NSInteger, SBSelectedRowStatus) {
9898
SBSelectedRowFavourited = 4,
9999
};
100100

101+
typedef NS_ENUM(NSInteger, SBSelectedItemType) {
102+
SBSelectedItemTypeNone = 0,
103+
SBSelectedItemTypeArtist = 1,
104+
SBSelectedItemTypeAlbum = 2,
105+
SBSelectedItemTypeTrack = 4,
106+
};
107+
101108
- (SBSelectedRowStatus) selectedRowStatus:(NSArray<SBTrack*>*)trackList selectedIndices:(NSIndexSet*)indexSet;
102109
- (SBSelectedRowStatus) selectedRowStatus:(NSArray<SBTrack*>*)trackList;
103110

0 commit comments

Comments
 (0)