mirror of
https://github.com/danbee/persephone
synced 2025-03-04 08:39:11 +00:00
110 lines
2.8 KiB
Swift
110 lines
2.8 KiB
Swift
//
|
|
// AlbumDetailView.swift
|
|
// Persephone
|
|
//
|
|
// Created by Daniel Barber on 2019/5/18.
|
|
// Copyright © 2019 Dan Barber. All rights reserved.
|
|
//
|
|
|
|
import Cocoa
|
|
|
|
class AlbumDetailView: NSViewController {
|
|
var album: Album?
|
|
var dataSource = AlbumTracksDataSource()
|
|
|
|
@IBOutlet var albumTracksView: NSTableView!
|
|
@IBOutlet var albumTitle: NSTextField!
|
|
@IBOutlet var albumArtist: NSTextField!
|
|
@IBOutlet var albumCoverView: NSImageView!
|
|
|
|
override func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
|
|
albumTracksView.dataSource = dataSource
|
|
albumTracksView.delegate = self
|
|
|
|
albumCoverView.wantsLayer = true
|
|
albumCoverView.layer?.cornerRadius = 5
|
|
albumCoverView.layer?.borderWidth = 1
|
|
setAppearance()
|
|
|
|
guard let album = album else { return }
|
|
|
|
getAlbumSongs(for: album)
|
|
|
|
albumTitle.stringValue = album.title
|
|
albumArtist.stringValue = album.artist
|
|
|
|
switch album.coverArt {
|
|
case .loaded(let coverArt):
|
|
albumCoverView.image = coverArt ?? .defaultCoverArt
|
|
default:
|
|
albumCoverView.image = .defaultCoverArt
|
|
}
|
|
}
|
|
|
|
func getAlbumSongs(for album: Album) {
|
|
App.mpdClient.getAlbumSongs(for: album.mpdAlbum) { (mpdSongs: [MPDClient.MPDSong]) in
|
|
self.dataSource.albumTracks = mpdSongs.map {
|
|
return Song(mpdSong: $0)
|
|
}
|
|
|
|
DispatchQueue.main.async {
|
|
self.albumTracksView.reloadData()
|
|
}
|
|
}
|
|
}
|
|
|
|
func setAppearance() {
|
|
if #available(OSX 10.14, *) {
|
|
let darkMode = NSApp.effectiveAppearance.bestMatch(from:
|
|
[.darkAqua, .aqua]) == .darkAqua
|
|
|
|
albumCoverView.layer?.borderColor = darkMode ? .albumBorderColorDark : .albumBorderColorLight
|
|
} else {
|
|
albumCoverView.layer?.borderColor = .albumBorderColorLight
|
|
}
|
|
}
|
|
|
|
func setAlbum(_ album: Album) {
|
|
self.album = album
|
|
}
|
|
}
|
|
|
|
extension AlbumDetailView: NSTableViewDelegate {
|
|
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
|
|
let song = dataSource.albumTracks[row]
|
|
|
|
switch tableColumn?.identifier.rawValue {
|
|
case "trackNumberColumn":
|
|
return cellForTrackNumber(tableView, with: song)
|
|
case "trackTitleColumn":
|
|
return cellForSongTitle(tableView, with: song)
|
|
default:
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func cellForTrackNumber(_ tableView: NSTableView, with song: Song) -> NSView {
|
|
let cellView = tableView.makeView(
|
|
withIdentifier: .trackNumber,
|
|
owner: self
|
|
) as! NSTableCellView
|
|
|
|
cellView.textField?.stringValue = "\(song.trackNumber)."
|
|
|
|
return cellView
|
|
}
|
|
|
|
func cellForSongTitle(_ tableView: NSTableView, with song: Song) -> NSView {
|
|
let cellView = tableView.makeView(
|
|
withIdentifier: .songTitle,
|
|
owner: self
|
|
) as! NSTableCellView
|
|
|
|
cellView.textField?.stringValue = song.title
|
|
|
|
return cellView
|
|
}
|
|
}
|