diff --git a/Persephone.xcodeproj/project.pbxproj b/Persephone.xcodeproj/project.pbxproj index 7d1a650..0aa3b34 100644 --- a/Persephone.xcodeproj/project.pbxproj +++ b/Persephone.xcodeproj/project.pbxproj @@ -294,6 +294,7 @@ E4B11BBE2275EDAA0075461B /* PlayerActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4B11BBD2275EDAA0075461B /* PlayerActions.swift */; }; E4B11BC02275EE150075461B /* QueueActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4B11BBF2275EE150075461B /* QueueActions.swift */; }; E4B11BC22275EE410075461B /* AlbumListActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4B11BC12275EE410075461B /* AlbumListActions.swift */; }; + E4B28EE02436D56E003B28AE /* AlbumDetailFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4B28EDE2436D548003B28AE /* AlbumDetailFooterView.swift */; }; E4B3B3642432DB7A007E25D2 /* AlbumSongCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4B3B3622432DA4B007E25D2 /* AlbumSongCell.swift */; }; E4B3B3672432DF1B007E25D2 /* AlbumSongListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4B3B3652432DEDB007E25D2 /* AlbumSongListViewController.swift */; }; E4B3DF6523D66A4400728F6B /* QueueSongCoverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4B3DF6423D66A4400728F6B /* QueueSongCoverView.swift */; }; @@ -654,6 +655,7 @@ E4B11BBD2275EDAA0075461B /* PlayerActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayerActions.swift; sourceTree = ""; }; E4B11BBF2275EE150075461B /* QueueActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QueueActions.swift; sourceTree = ""; }; E4B11BC12275EE410075461B /* AlbumListActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbumListActions.swift; sourceTree = ""; }; + E4B28EDE2436D548003B28AE /* AlbumDetailFooterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbumDetailFooterView.swift; sourceTree = ""; }; E4B3B3622432DA4B007E25D2 /* AlbumSongCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbumSongCell.swift; sourceTree = ""; }; E4B3B3652432DEDB007E25D2 /* AlbumSongListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbumSongListViewController.swift; sourceTree = ""; }; E4B3DF6423D66A4400728F6B /* QueueSongCoverView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QueueSongCoverView.swift; sourceTree = ""; }; @@ -961,6 +963,7 @@ E4B3B3622432DA4B007E25D2 /* AlbumSongCell.swift */, E4B3B3652432DEDB007E25D2 /* AlbumSongListViewController.swift */, E412222F2432B0A300473C1D /* AlbumTracksDataSource.swift */, + E4B28EDE2436D548003B28AE /* AlbumDetailFooterView.swift */, ); path = "Album Detail"; sourceTree = ""; @@ -1940,6 +1943,7 @@ E4805A292426D73600362CF3 /* player.c in Sources */, E480514724255E7700362CF3 /* ServerReducer.swift in Sources */, E480514E24255E7D00362CF3 /* UIActions.swift in Sources */, + E4B28EE02436D56E003B28AE /* AlbumDetailFooterView.swift in Sources */, E480513C24255E7200362CF3 /* AppState.swift in Sources */, E480514024255E7200362CF3 /* ServerState.swift in Sources */, E480514224255E7700362CF3 /* AlbumListReducer.swift in Sources */, diff --git a/Shared/Models/Time.swift b/Shared/Models/Time.swift index 4c2596f..5629691 100644 --- a/Shared/Models/Time.swift +++ b/Shared/Models/Time.swift @@ -25,4 +25,8 @@ struct Time { return formatter.string(from: TimeInterval(timeInSeconds))! } + + var hours: Int { timeInSeconds / 3600 } + + var minutes: Int { timeInSeconds % 3600 / 60 } } diff --git a/iOS/Base.lproj/Main.storyboard b/iOS/Base.lproj/Main.storyboard index 1f842b9..698dd02 100644 --- a/iOS/Base.lproj/Main.storyboard +++ b/iOS/Base.lproj/Main.storyboard @@ -88,6 +88,7 @@ + @@ -161,6 +162,24 @@ + + + + + + + + + + + + + @@ -241,6 +260,7 @@ + @@ -268,6 +288,7 @@ + @@ -280,7 +301,6 @@ - diff --git a/iOS/Components/Browser/Album Detail/AlbumDetailFooterView.swift b/iOS/Components/Browser/Album Detail/AlbumDetailFooterView.swift index 3e7618a..451f2e8 100644 --- a/iOS/Components/Browser/Album Detail/AlbumDetailFooterView.swift +++ b/iOS/Components/Browser/Album Detail/AlbumDetailFooterView.swift @@ -6,4 +6,20 @@ // Copyright © 2020 Dan Barber. All rights reserved. // -import Foundation +import UIKit + +class AlbumDetailFooterView: UIView { + override func didMoveToSuperview() { + super.didMoveToSuperview() + + let separator = CALayer() + separator.frame = CGRect( + x: 20, + y: -0.5, + width: UIScreen.main.bounds.width - 20, + height: 0.5 + ) + separator.backgroundColor = UIColor.separator.cgColor + layer.addSublayer(separator) + } +} diff --git a/iOS/Components/Browser/Album Detail/AlbumSongListViewController.swift b/iOS/Components/Browser/Album Detail/AlbumSongListViewController.swift index 25cf33b..89fcbf2 100644 --- a/iOS/Components/Browser/Album Detail/AlbumSongListViewController.swift +++ b/iOS/Components/Browser/Album Detail/AlbumSongListViewController.swift @@ -66,9 +66,16 @@ class AlbumSongListViewController: UITableViewController { guard let self = self else { return } DispatchQueue.main.async { + var totalDurationInSeconds = 0 + self.dataSource.setAlbumSongs( - mpdSongs.map { Song(mpdSong: $0) } + mpdSongs.map { + totalDurationInSeconds += $0.duration + return Song(mpdSong: $0) + } ) + + let totalDuration = Time(timeInSeconds: totalDurationInSeconds) self.albumTracksView.reloadData() @@ -76,6 +83,16 @@ class AlbumSongListViewController: UITableViewController { else { return } self.getBigCoverArt(song: Song(mpdSong: mpdSong), album: album) + + var metadata = "\(mpdSongs.count) song" + metadata += mpdSongs.count > 1 ? "s," : "," + if totalDuration.hours > 0 { + metadata += " \(totalDuration.hours) hour" + metadata += totalDuration.hours > 1 ? "s" : "" + } + metadata += " \(totalDuration.minutes) minute" + metadata += totalDuration.minutes > 1 ? "s" : "" + self.songListMetadata.text = metadata } } } @@ -116,6 +133,8 @@ class AlbumSongListViewController: UITableViewController { App.mpdClient.addAlbumToQueue(album: album.mpdAlbum, at: queueLength) } + @IBOutlet var songListMetadata: UILabel! + @IBOutlet var addAlbumToQueueButton: UIButton! @IBOutlet var playAlbumButton: UIButton! @IBOutlet var albumTitle: UILabel!