1
1
mirror of https://github.com/danbee/persephone synced 2025-03-04 08:39:11 +00:00
persephone/Persephone/Components/Browser/Album Browser/AlbumViewController.swift

88 lines
2.1 KiB
Swift

//
// AlbumViewController.swift
// Persephone
//
// Created by Daniel Barber on 2019/2/08.
// Copyright © 2019 Dan Barber. All rights reserved.
//
import AppKit
import ReSwift
import Differ
class AlbumViewController: NSViewController,
NSCollectionViewDelegateFlowLayout {
var dataSource = AlbumDataSource()
let layout = FlexibleGridViewLayout(coder: NSCoder())
override func viewDidLoad() {
super.viewDidLoad()
App.store.subscribe(self) {
$0.select { $0.albumListState }
}
NotificationCenter.default.addObserver(self, selector: #selector(didConnect), name: .didConnect, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(willDisconnect), name: .willDisconnect, object: nil)
albumScrollView.postsBoundsChangedNotifications = true
albumCollectionView.dataSource = dataSource
layout?.extraHeight = 44
albumCollectionView.collectionViewLayout = layout
registerForDragAndDrop(albumCollectionView)
}
deinit {
App.store.unsubscribe(self)
}
override func viewWillLayout() {
super.viewWillLayout()
if let layout = albumCollectionView.collectionViewLayout as? FlexibleGridViewLayout {
layout.saveScrollPosition()
}
albumCollectionView.collectionViewLayout?.invalidateLayout()
}
override func viewDidLayout() {
super.viewDidLayout()
guard let layout = albumCollectionView.collectionViewLayout as? FlexibleGridViewLayout
else { return }
layout.setScrollPosition()
}
@objc func didConnect() {
App.mpdClient.fetchAllAlbums()
}
@objc func willDisconnect() {
DispatchQueue.main.async {
App.store.dispatch(UpdateAlbumListAction(albums: []))
}
}
@IBOutlet var albumScrollView: NSScrollView!
@IBOutlet var albumCollectionView: NSCollectionView!
}
extension AlbumViewController: StoreSubscriber {
typealias StoreSubscriberStateType = AlbumListState
func newState(state: StoreSubscriberStateType) {
let oldAlbums = dataSource.albums
dataSource.albums = state.albums
albumCollectionView.animateItemChanges(
oldData: oldAlbums,
newData: dataSource.albums
)
}
}