Skip to content

Commit

Permalink
Add album sort preference
Browse files Browse the repository at this point in the history
Fixes GH-191
  • Loading branch information
NattyNarwhal committed Feb 18, 2024
1 parent 2835403 commit 34baf3f
Show file tree
Hide file tree
Showing 8 changed files with 54 additions and 1 deletion.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ Doing so isn't fatal (it's not a secret), but it is annoying for other contribut
* A basic AppleScript dictionary has been added as a way to inspect and control playback programatically.
* Files can be dropped onto the dock icon to import them.
* Empty artists entries are deleted from the local library on deleting downloaded items.
* The album sort order is configurable. By default, it sorts from oldest to newest.
* Move request handling into an off-thread queue.
* The album selection view has been rewritten to avoid deprecated types.
* Fix tracks not having a cover when imported.
Expand Down
3 changes: 2 additions & 1 deletion Submariner/SBAppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ fileprivate let logger = Logger(subsystem: Bundle.main.bundleIdentifier!, catego
"MaxCoverSize": NSNumber(value: 300),
"scrobbleToServer": NSNumber(value: true),
"deleteAfterPlay": NSNumber(value: false),
"SkipIncrement": NSNumber(value: 5.0)
"SkipIncrement": NSNumber(value: 5.0),
"albumSortOrder": "OldestFirst",
]
UserDefaults.standard.register(defaults: defaults)

Expand Down
9 changes: 9 additions & 0 deletions Submariner/SBMusicController.m
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ - (void)viewDidAppear {

- (void)dealloc
{
[[NSUserDefaults standardUserDefaults] removeObserver: self forKeyPath: @"albumSortOrder"];
[artistsController removeObserver:self forKeyPath:@"selectedObjects"];
[albumsController removeObserver:self forKeyPath:@"selectedObjects"];
[tracksController removeObserver:self forKeyPath:@"selectedObjects"];
Expand Down Expand Up @@ -125,6 +126,11 @@ - (void)loadView {
forKeyPath:@"selectedObjects"
options:NSKeyValueObservingOptionNew
context:nil];

[[NSUserDefaults standardUserDefaults] addObserver: self
forKeyPath: @"albumSortOrder"
options: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial
context: nil];
}


Expand All @@ -147,6 +153,9 @@ - (void)observeValueForKeyPath:(NSString *)keyPath
} else if (object == tracksController && [keyPath isEqualToString:@"selectedObjects"] && self.view.window != nil) {
[[NSNotificationCenter defaultCenter] postNotificationName: @"SBTrackSelectionChanged"
object: tracksController.selectedObjects];
} else if (object == [NSUserDefaults standardUserDefaults] && [keyPath isEqualToString: @"albumSortOrder"]) {
albumSortDescriptor = [self sortDescriptorsForPreference];
albumsController.sortDescriptors = albumSortDescriptor;
}
}

Expand Down
7 changes: 7 additions & 0 deletions Submariner/SBPreferencesController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ class SBPreferencesController: NSWindowController {

struct AppearanceView: View {
@AppStorage("coverSize") var coverSize = 0.75
@AppStorage("albumSortOrder") var albumSortOrder = "OldestFirst"

var body: some View {
Form {
Expand All @@ -173,6 +174,12 @@ class SBPreferencesController: NSWindowController {
// the default minimum intrinsic width for a slider is paltry
.frame(minWidth: 300)
}
Section {
Picker(selection: $albumSortOrder, label: Text("Album sort order")) {
Text("Alphabetical").tag("Alphabetical")
Text("Oldest to newest").tag("OldestFirst")
}
}
}
.fixedSize()
.padding(14)
Expand Down
9 changes: 9 additions & 0 deletions Submariner/SBServerHomeController.m
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ - (id)initWithManagedObjectContext:(NSManagedObjectContext *)context {


- (void)dealloc {
[[NSUserDefaults standardUserDefaults] removeObserver: self forKeyPath: @"albumSortOrder"];
[albumsController removeObserver:self forKeyPath:@"arrangedObjects"];
[tracksController removeObserver:self forKeyPath:@"selectedObjects"];
}
Expand Down Expand Up @@ -168,6 +169,11 @@ - (void)loadView {
forKeyPath:@"selectedObjects"
options:NSKeyValueObservingOptionNew
context:nil];

[[NSUserDefaults standardUserDefaults] addObserver: self
forKeyPath: @"albumSortOrder"
options: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial
context: nil];
}


Expand Down Expand Up @@ -361,6 +367,9 @@ - (void)observeValueForKeyPath:(NSString *)keyPath
} else if (object == albumsController && [keyPath isEqualToString:@"arrangedObjects"]) {
[albumsCollectionView reloadData];
[albumsCollectionView setSelectionIndexes: albumsController.selectionIndexes];
} else if (object == [NSUserDefaults standardUserDefaults] && [keyPath isEqualToString: @"albumSortOrder"]) {
albumSortDescriptor = [self sortDescriptorsForPreference];
albumsController.sortDescriptors = albumSortDescriptor;
}
}

Expand Down
9 changes: 9 additions & 0 deletions Submariner/SBServerLibraryController.m
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ - (void)viewDidAppear {
- (void)dealloc
{
// remove subsonic observers
[[NSUserDefaults standardUserDefaults] removeObserver: self forKeyPath: @"albumSortOrder"];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"SBSubsonicCoversUpdatedNotification" object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"SBSubsonicTracksUpdatedNotification" object:nil];
[albumsController removeObserver:self forKeyPath:@"arrangedObjects"];
Expand Down Expand Up @@ -153,6 +154,11 @@ - (void)loadView {
forKeyPath:@"selectedObjects"
options:NSKeyValueObservingOptionNew
context:nil];

[[NSUserDefaults standardUserDefaults] addObserver: self
forKeyPath: @"albumSortOrder"
options: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial
context: nil];
}


Expand All @@ -173,6 +179,9 @@ - (void)observeValueForKeyPath:(NSString *)keyPath
} else if (object == albumsController && [keyPath isEqualToString:@"arrangedObjects"]) {
[albumsCollectionView reloadData];
[albumsCollectionView setSelectionIndexes: albumsController.selectionIndexes];
} else if (object == [NSUserDefaults standardUserDefaults] && [keyPath isEqualToString: @"albumSortOrder"]) {
albumSortDescriptor = [self sortDescriptorsForPreference];
albumsController.sortDescriptors = albumSortDescriptor;
}
}

Expand Down
2 changes: 2 additions & 0 deletions Submariner/SBViewController.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,4 +69,6 @@ typedef NS_OPTIONS(NSInteger, SBSelectedRowStatus) {
- (SBSelectedRowStatus) selectedRowStatus:(NSArray<SBTrack*>*)trackList selectedIndices:(NSIndexSet*)indexSet;
- (SBSelectedRowStatus) selectedRowStatus:(NSArray<SBTrack*>*)trackList;

- (NSArray<NSSortDescriptor*>*) sortDescriptorsForPreference;

@end
15 changes: 15 additions & 0 deletions Submariner/SBViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,21 @@ - (void)viewDidAppear {
#pragma mark -
#pragma mark Library View Helper Functions

- (NSArray<NSSortDescriptor*>*) sortDescriptorsForPreference: (NSString*)preference {
NSSortDescriptor *albumNameDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"itemName" ascending:YES];
if ([preference isEqualToString: @"OldestFirst"]) {
NSSortDescriptor *albumYearDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"year" ascending:YES];
return @[albumYearDescriptor, albumNameDescriptor];
} else {
return @[albumNameDescriptor];
}
}

- (NSArray<NSSortDescriptor*>*) sortDescriptorsForPreference {
NSString *newOrderType = [[NSUserDefaults standardUserDefaults] stringForKey: @"albumSortOrder"];
return [self sortDescriptorsForPreference: newOrderType];
}

-(void)showTracksInFinder:(NSArray<SBTrack*>*)trackList selectedIndices:(NSIndexSet*)indexSet
{
NSArray *selectedTracks = [trackList objectsAtIndexes: indexSet];
Expand Down

0 comments on commit 34baf3f

Please sign in to comment.