mirror of
https://github.com/danbee/persephone
synced 2025-03-04 08:39:11 +00:00
Handle closing and opening windows
This commit is contained in:
parent
e6bbe4f35d
commit
49269ca21b
@ -43,6 +43,9 @@
|
|||||||
E4405196227879960090CD6F /* MPDActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4405195227879960090CD6F /* MPDActions.swift */; };
|
E4405196227879960090CD6F /* MPDActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4405195227879960090CD6F /* MPDActions.swift */; };
|
||||||
E440519822787CB40090CD6F /* MPDState.swift in Sources */ = {isa = PBXBuildFile; fileRef = E440519722787CB40090CD6F /* MPDState.swift */; };
|
E440519822787CB40090CD6F /* MPDState.swift in Sources */ = {isa = PBXBuildFile; fileRef = E440519722787CB40090CD6F /* MPDState.swift */; };
|
||||||
E440519A22787CF60090CD6F /* MPDReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = E440519922787CF60090CD6F /* MPDReducer.swift */; };
|
E440519A22787CF60090CD6F /* MPDReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = E440519922787CF60090CD6F /* MPDReducer.swift */; };
|
||||||
|
E440519C227BAF2E0090CD6F /* UIActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E440519B227BAF2E0090CD6F /* UIActions.swift */; };
|
||||||
|
E440519E227BB0720090CD6F /* UIReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = E440519D227BB0720090CD6F /* UIReducer.swift */; };
|
||||||
|
E44051A0227BB0AB0090CD6F /* UIState.swift in Sources */ = {isa = PBXBuildFile; fileRef = E440519F227BB0AB0090CD6F /* UIState.swift */; };
|
||||||
E450AD7E222620A10091BED3 /* Album.swift in Sources */ = {isa = PBXBuildFile; fileRef = E450AD7D222620A10091BED3 /* Album.swift */; };
|
E450AD7E222620A10091BED3 /* Album.swift in Sources */ = {isa = PBXBuildFile; fileRef = E450AD7D222620A10091BED3 /* Album.swift */; };
|
||||||
E450AD8F22262C620091BED3 /* PromiseKit.framework.dSYM in Resources */ = {isa = PBXBuildFile; fileRef = E450AD8E22262C620091BED3 /* PromiseKit.framework.dSYM */; };
|
E450AD8F22262C620091BED3 /* PromiseKit.framework.dSYM in Resources */ = {isa = PBXBuildFile; fileRef = E450AD8E22262C620091BED3 /* PromiseKit.framework.dSYM */; };
|
||||||
E450AD9122262C780091BED3 /* SwiftyJSON.framework.dSYM in Resources */ = {isa = PBXBuildFile; fileRef = E450AD9022262C780091BED3 /* SwiftyJSON.framework.dSYM */; };
|
E450AD9122262C780091BED3 /* SwiftyJSON.framework.dSYM in Resources */ = {isa = PBXBuildFile; fileRef = E450AD9022262C780091BED3 /* SwiftyJSON.framework.dSYM */; };
|
||||||
@ -245,6 +248,9 @@
|
|||||||
E4405195227879960090CD6F /* MPDActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDActions.swift; sourceTree = "<group>"; };
|
E4405195227879960090CD6F /* MPDActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDActions.swift; sourceTree = "<group>"; };
|
||||||
E440519722787CB40090CD6F /* MPDState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDState.swift; sourceTree = "<group>"; };
|
E440519722787CB40090CD6F /* MPDState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDState.swift; sourceTree = "<group>"; };
|
||||||
E440519922787CF60090CD6F /* MPDReducer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDReducer.swift; sourceTree = "<group>"; };
|
E440519922787CF60090CD6F /* MPDReducer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDReducer.swift; sourceTree = "<group>"; };
|
||||||
|
E440519B227BAF2E0090CD6F /* UIActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIActions.swift; sourceTree = "<group>"; };
|
||||||
|
E440519D227BB0720090CD6F /* UIReducer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIReducer.swift; sourceTree = "<group>"; };
|
||||||
|
E440519F227BB0AB0090CD6F /* UIState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIState.swift; sourceTree = "<group>"; };
|
||||||
E450AD7D222620A10091BED3 /* Album.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Album.swift; sourceTree = "<group>"; };
|
E450AD7D222620A10091BED3 /* Album.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Album.swift; sourceTree = "<group>"; };
|
||||||
E450AD8522262AE60091BED3 /* SwiftyJSON.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftyJSON.framework; path = Carthage/Build/Mac/SwiftyJSON.framework; sourceTree = "<group>"; };
|
E450AD8522262AE60091BED3 /* SwiftyJSON.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftyJSON.framework; path = Carthage/Build/Mac/SwiftyJSON.framework; sourceTree = "<group>"; };
|
||||||
E450AD8C22262C590091BED3 /* PromiseKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PromiseKit.framework; path = Carthage/Build/Mac/PromiseKit.framework; sourceTree = "<group>"; };
|
E450AD8C22262C590091BED3 /* PromiseKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PromiseKit.framework; path = Carthage/Build/Mac/PromiseKit.framework; sourceTree = "<group>"; };
|
||||||
@ -603,6 +609,7 @@
|
|||||||
E4B11B78226D346B0075461B /* AlbumListReducer.swift */,
|
E4B11B78226D346B0075461B /* AlbumListReducer.swift */,
|
||||||
E4FF718F227601B400D4C412 /* PreferencesReducer.swift */,
|
E4FF718F227601B400D4C412 /* PreferencesReducer.swift */,
|
||||||
E440519922787CF60090CD6F /* MPDReducer.swift */,
|
E440519922787CF60090CD6F /* MPDReducer.swift */,
|
||||||
|
E440519D227BB0720090CD6F /* UIReducer.swift */,
|
||||||
);
|
);
|
||||||
path = Reducers;
|
path = Reducers;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -613,6 +620,7 @@
|
|||||||
E4B11B6B226A5AF50075461B /* Actions */,
|
E4B11B6B226A5AF50075461B /* Actions */,
|
||||||
E4B11B5F226A4BED0075461B /* Reducers */,
|
E4B11B5F226A4BED0075461B /* Reducers */,
|
||||||
E4B11B52226928F20075461B /* AppState.swift */,
|
E4B11B52226928F20075461B /* AppState.swift */,
|
||||||
|
E440519F227BB0AB0090CD6F /* UIState.swift */,
|
||||||
E4B11B65226A4F830075461B /* PlayerState.swift */,
|
E4B11B65226A4F830075461B /* PlayerState.swift */,
|
||||||
E4B11B67226A4FA00075461B /* QueueState.swift */,
|
E4B11B67226A4FA00075461B /* QueueState.swift */,
|
||||||
E4B11B69226A4FBC0075461B /* AlbumListState.swift */,
|
E4B11B69226A4FBC0075461B /* AlbumListState.swift */,
|
||||||
@ -630,6 +638,7 @@
|
|||||||
E4B11BBF2275EE150075461B /* QueueActions.swift */,
|
E4B11BBF2275EE150075461B /* QueueActions.swift */,
|
||||||
E4FF71912276029000D4C412 /* PreferencesActions.swift */,
|
E4FF71912276029000D4C412 /* PreferencesActions.swift */,
|
||||||
E4405195227879960090CD6F /* MPDActions.swift */,
|
E4405195227879960090CD6F /* MPDActions.swift */,
|
||||||
|
E440519B227BAF2E0090CD6F /* UIActions.swift */,
|
||||||
);
|
);
|
||||||
path = Actions;
|
path = Actions;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -909,6 +918,7 @@
|
|||||||
E45962C62241A78500FC1A1E /* MPDCommand.swift in Sources */,
|
E45962C62241A78500FC1A1E /* MPDCommand.swift in Sources */,
|
||||||
E408D3B9220DE98F0006D9BE /* NSUserInterfaceItemIdentifier.swift in Sources */,
|
E408D3B9220DE98F0006D9BE /* NSUserInterfaceItemIdentifier.swift in Sources */,
|
||||||
E4EB2379220F10B8008C70C0 /* MPDPair.swift in Sources */,
|
E4EB2379220F10B8008C70C0 /* MPDPair.swift in Sources */,
|
||||||
|
E440519E227BB0720090CD6F /* UIReducer.swift in Sources */,
|
||||||
E4FF7190227601B400D4C412 /* PreferencesReducer.swift in Sources */,
|
E4FF7190227601B400D4C412 /* PreferencesReducer.swift in Sources */,
|
||||||
E4F6B463221E125900ACF42A /* QueueItem.swift in Sources */,
|
E4F6B463221E125900ACF42A /* QueueItem.swift in Sources */,
|
||||||
E4A83BF12221FAA00098FED6 /* PreferencesViewController.swift in Sources */,
|
E4A83BF12221FAA00098FED6 /* PreferencesViewController.swift in Sources */,
|
||||||
@ -919,6 +929,7 @@
|
|||||||
E41B22C621FB932700D544F6 /* MPDClient.swift in Sources */,
|
E41B22C621FB932700D544F6 /* MPDClient.swift in Sources */,
|
||||||
E47E2FDD2220A6D100F747E6 /* Time.swift in Sources */,
|
E47E2FDD2220A6D100F747E6 /* Time.swift in Sources */,
|
||||||
E419E2872249B96600216A8C /* Song.swift in Sources */,
|
E419E2872249B96600216A8C /* Song.swift in Sources */,
|
||||||
|
E44051A0227BB0AB0090CD6F /* UIState.swift in Sources */,
|
||||||
E4FF718E2276010E00D4C412 /* PreferencesState.swift in Sources */,
|
E4FF718E2276010E00D4C412 /* PreferencesState.swift in Sources */,
|
||||||
E439109822640213002982E9 /* SongNotifierService.swift in Sources */,
|
E439109822640213002982E9 /* SongNotifierService.swift in Sources */,
|
||||||
E407861C2110CE6E006887B1 /* AppDelegate.swift in Sources */,
|
E407861C2110CE6E006887B1 /* AppDelegate.swift in Sources */,
|
||||||
@ -943,6 +954,7 @@
|
|||||||
E4FF71942276043A00D4C412 /* MPDServer.swift in Sources */,
|
E4FF71942276043A00D4C412 /* MPDServer.swift in Sources */,
|
||||||
E41E530E223EF4CF00173814 /* CoverArtService+Caching.swift in Sources */,
|
E41E530E223EF4CF00173814 /* CoverArtService+Caching.swift in Sources */,
|
||||||
E4E8CC922204F4B80024217A /* QueueViewController.swift in Sources */,
|
E4E8CC922204F4B80024217A /* QueueViewController.swift in Sources */,
|
||||||
|
E440519C227BAF2E0090CD6F /* UIActions.swift in Sources */,
|
||||||
E41E5312223EF74A00173814 /* CoverArtService+Filesystem.swift in Sources */,
|
E41E5312223EF74A00173814 /* CoverArtService+Filesystem.swift in Sources */,
|
||||||
E41E5301223BF99300173814 /* MPDClient+Queue.swift in Sources */,
|
E41E5301223BF99300173814 /* MPDClient+Queue.swift in Sources */,
|
||||||
E4EB237B220F7CF1008C70C0 /* MPDAlbum.swift in Sources */,
|
E4EB237B220F7CF1008C70C0 /* MPDAlbum.swift in Sources */,
|
||||||
|
|||||||
@ -24,7 +24,9 @@ class AppDelegate: NSObject,
|
|||||||
mediaKeyTap?.start()
|
mediaKeyTap?.start()
|
||||||
|
|
||||||
App.store.subscribe(self) {
|
App.store.subscribe(self) {
|
||||||
$0.select { $0.playerState.databaseUpdating }
|
$0.select {
|
||||||
|
$0.uiState
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,17 +109,19 @@ class AppDelegate: NSObject,
|
|||||||
@IBAction func nextTrackMenuAction(_ sender: NSMenuItem) {
|
@IBAction func nextTrackMenuAction(_ sender: NSMenuItem) {
|
||||||
App.store.dispatch(MPDNextTrackAction())
|
App.store.dispatch(MPDNextTrackAction())
|
||||||
}
|
}
|
||||||
@IBAction func prevTrackMenuAction(_ sender: Any) {
|
@IBAction func prevTrackMenuAction(_ sender: NSMenuItem) {
|
||||||
App.store.dispatch(MPDPrevTrackAction())
|
App.store.dispatch(MPDPrevTrackAction())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@IBOutlet weak var mainWindowMenuItem: NSMenuItem!
|
||||||
@IBOutlet weak var updateDatabaseMenuItem: NSMenuItem!
|
@IBOutlet weak var updateDatabaseMenuItem: NSMenuItem!
|
||||||
}
|
}
|
||||||
|
|
||||||
extension AppDelegate: StoreSubscriber {
|
extension AppDelegate: StoreSubscriber {
|
||||||
typealias StoreSubscriberStateType = Bool
|
typealias StoreSubscriberStateType = UIState
|
||||||
|
|
||||||
func newState(state: Bool) {
|
func newState(state: UIState) {
|
||||||
updateDatabaseMenuItem.isEnabled = !state
|
updateDatabaseMenuItem.isEnabled = !state.databaseUpdating
|
||||||
|
mainWindowMenuItem.state = state.mainWindowOpen ? .on : .off
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -53,22 +53,6 @@ class AlbumViewController: NSViewController,
|
|||||||
layout.setScrollPosition()
|
layout.setScrollPosition()
|
||||||
}
|
}
|
||||||
|
|
||||||
override func observeValue(
|
|
||||||
forKeyPath keyPath: String?,
|
|
||||||
of object: Any?,
|
|
||||||
change: [NSKeyValueChangeKey : Any]?,
|
|
||||||
context: UnsafeMutableRawPointer?
|
|
||||||
) {
|
|
||||||
switch keyPath {
|
|
||||||
case "mpdLibraryDir":
|
|
||||||
albumCollectionView.reloadData()
|
|
||||||
case "fetchMissingArtworkFromInternet":
|
|
||||||
App.store.dispatch(ResetAlbumListCoverArtAction())
|
|
||||||
default:
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@IBOutlet var albumScrollView: NSScrollView!
|
@IBOutlet var albumScrollView: NSScrollView!
|
||||||
@IBOutlet var albumCollectionView: NSCollectionView!
|
@IBOutlet var albumCollectionView: NSCollectionView!
|
||||||
}
|
}
|
||||||
@ -78,7 +62,9 @@ extension AlbumViewController: StoreSubscriber {
|
|||||||
|
|
||||||
func newState(state: StoreSubscriberStateType) {
|
func newState(state: StoreSubscriberStateType) {
|
||||||
let oldAlbums = dataSource.albums
|
let oldAlbums = dataSource.albums
|
||||||
|
|
||||||
dataSource.albums = state.albums
|
dataSource.albums = state.albums
|
||||||
|
|
||||||
albumCollectionView.animateItemChanges(
|
albumCollectionView.animateItemChanges(
|
||||||
oldData: oldAlbums,
|
oldData: oldAlbums,
|
||||||
newData: dataSource.albums
|
newData: dataSource.albums
|
||||||
|
|||||||
@ -55,13 +55,13 @@ extension MPDServerController: MPDClientDelegate {
|
|||||||
|
|
||||||
func willStartDatabaseUpdate(mpdClient: MPDClient) {
|
func willStartDatabaseUpdate(mpdClient: MPDClient) {
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
App.store.dispatch(StartedDatabaseUpdateAction())
|
App.store.dispatch(DatabaseUpdateStartedAction())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func didFinishDatabaseUpdate(mpdClient: MPDClient) {
|
func didFinishDatabaseUpdate(mpdClient: MPDClient) {
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
App.store.dispatch(FinishedDatabaseUpdateAction())
|
App.store.dispatch(DatabaseUpdateFinishedAction())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -47,7 +47,7 @@ class QueueViewController: NSViewController,
|
|||||||
func outlineView(
|
func outlineView(
|
||||||
_ outlineView: NSOutlineView,
|
_ outlineView: NSOutlineView,
|
||||||
selectionIndexesForProposedSelection proposedSelectionIndexes: IndexSet
|
selectionIndexesForProposedSelection proposedSelectionIndexes: IndexSet
|
||||||
) -> IndexSet {
|
) -> IndexSet {
|
||||||
if proposedSelectionIndexes.contains(0) {
|
if proposedSelectionIndexes.contains(0) {
|
||||||
return IndexSet()
|
return IndexSet()
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -23,9 +23,13 @@ class WindowController: NSWindowController {
|
|||||||
window?.isExcludedFromWindowsMenu = true
|
window?.isExcludedFromWindowsMenu = true
|
||||||
|
|
||||||
App.store.subscribe(self) {
|
App.store.subscribe(self) {
|
||||||
$0.select { $0.playerState }
|
$0.select {
|
||||||
|
($0.playerState, $0.uiState)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
App.store.dispatch(MainWindowDidOpenAction())
|
||||||
|
|
||||||
trackProgress.font = .timerFont
|
trackProgress.font = .timerFont
|
||||||
trackRemaining.font = .timerFont
|
trackRemaining.font = .timerFont
|
||||||
}
|
}
|
||||||
@ -68,22 +72,14 @@ class WindowController: NSWindowController {
|
|||||||
setTimeRemaining(elapsedTimeMs, totalTime * 1000)
|
setTimeRemaining(elapsedTimeMs, totalTime * 1000)
|
||||||
}
|
}
|
||||||
|
|
||||||
func setDatabaseUpdatingIndicator(_ playerState: PlayerState) {
|
func setDatabaseUpdatingIndicator(_ uiState: UIState) {
|
||||||
if playerState.databaseUpdating {
|
if uiState.databaseUpdating {
|
||||||
startDatabaseUpdatingIndicator()
|
databaseUpdatingIndicator.startAnimation(self)
|
||||||
} else {
|
} else {
|
||||||
stopDatabaseUpdatingIndicator()
|
databaseUpdatingIndicator.stopAnimation(self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func startDatabaseUpdatingIndicator() {
|
|
||||||
databaseUpdatingIndicator.startAnimation(self)
|
|
||||||
}
|
|
||||||
|
|
||||||
func stopDatabaseUpdatingIndicator() {
|
|
||||||
databaseUpdatingIndicator.stopAnimation(self)
|
|
||||||
}
|
|
||||||
|
|
||||||
func setTimeElapsed(_ elapsedTimeMs: UInt?) {
|
func setTimeElapsed(_ elapsedTimeMs: UInt?) {
|
||||||
guard let elapsedTimeMs = elapsedTimeMs else { return }
|
guard let elapsedTimeMs = elapsedTimeMs else { return }
|
||||||
|
|
||||||
@ -149,16 +145,20 @@ class WindowController: NSWindowController {
|
|||||||
@IBOutlet var databaseUpdatingIndicator: NSProgressIndicator!
|
@IBOutlet var databaseUpdatingIndicator: NSProgressIndicator!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension WindowController: NSWindowDelegate {
|
||||||
|
func windowWillClose(_ notification: Notification) {
|
||||||
|
App.store.dispatch(MainWindowDidCloseAction())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
extension WindowController: StoreSubscriber {
|
extension WindowController: StoreSubscriber {
|
||||||
typealias StoreSubscriberStateType = PlayerState
|
typealias StoreSubscriberStateType = (playerState: PlayerState, uiState: UIState)
|
||||||
|
|
||||||
func newState(state: StoreSubscriberStateType) {
|
|
||||||
self.state = state.state
|
|
||||||
|
|
||||||
|
func newState(state: (playerState: PlayerState, uiState: UIState)) {
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
self.setTransportControlState(state)
|
self.setTransportControlState(state.playerState)
|
||||||
self.setTrackProgressControls(state)
|
self.setTrackProgressControls(state.playerState)
|
||||||
self.setDatabaseUpdatingIndicator(state)
|
self.setDatabaseUpdatingIndicator(state.uiState)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,7 +26,7 @@
|
|||||||
<menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW">
|
<menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW">
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="preferencesItemSelected:" target="Voe-Tx-rLC" id="bxe-zW-cho"/>
|
<action selector="preferencesItemSelected:" target="Voe-Tx-rLC" id="bxe-zW-cho"/>
|
||||||
<segue destination="xYu-7w-E5x" kind="show" id="OTW-56-v9E"/>
|
<segue destination="xYu-7w-E5x" kind="show" identifier="Preferences" id="OTW-56-v9E"/>
|
||||||
</connections>
|
</connections>
|
||||||
</menuItem>
|
</menuItem>
|
||||||
<menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
|
<menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
|
||||||
@ -90,8 +90,17 @@
|
|||||||
<action selector="performZoom:" target="Ady-hI-5gd" id="DIl-cC-cCs"/>
|
<action selector="performZoom:" target="Ady-hI-5gd" id="DIl-cC-cCs"/>
|
||||||
</connections>
|
</connections>
|
||||||
</menuItem>
|
</menuItem>
|
||||||
|
<menuItem title="Close" keyEquivalent="w" id="ahn-71-IzA">
|
||||||
|
<connections>
|
||||||
|
<action selector="performClose:" target="Ady-hI-5gd" id="ADY-rv-28Y"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
<menuItem isSeparatorItem="YES" id="QhP-iz-rRa"/>
|
<menuItem isSeparatorItem="YES" id="QhP-iz-rRa"/>
|
||||||
<menuItem title="Persephone" state="on" keyEquivalent="0" id="1Sq-L7-znT"/>
|
<menuItem title="Persephone" keyEquivalent="0" id="1Sq-L7-znT">
|
||||||
|
<connections>
|
||||||
|
<segue destination="B8D-0N-5wS" kind="show" identifier="Main Window" id="D1q-xT-4O8"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
<menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
|
<menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
|
||||||
<menuItem title="Bring All to Front" id="LE2-aR-0XJ">
|
<menuItem title="Bring All to Front" id="LE2-aR-0XJ">
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
@ -122,6 +131,7 @@
|
|||||||
</application>
|
</application>
|
||||||
<customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="Persephone" customModuleProvider="target">
|
<customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="Persephone" customModuleProvider="target">
|
||||||
<connections>
|
<connections>
|
||||||
|
<outlet property="mainWindowMenuItem" destination="1Sq-L7-znT" id="dC6-yY-6Ss"/>
|
||||||
<outlet property="updateDatabaseMenuItem" destination="EJg-93-1F6" id="gMf-SQ-lyI"/>
|
<outlet property="updateDatabaseMenuItem" destination="EJg-93-1F6" id="gMf-SQ-lyI"/>
|
||||||
</connections>
|
</connections>
|
||||||
</customObject>
|
</customObject>
|
||||||
@ -133,7 +143,7 @@
|
|||||||
<!--Window Controller-->
|
<!--Window Controller-->
|
||||||
<scene sceneID="R2V-B0-nI4">
|
<scene sceneID="R2V-B0-nI4">
|
||||||
<objects>
|
<objects>
|
||||||
<windowController id="B8D-0N-5wS" customClass="WindowController" customModule="Persephone" customModuleProvider="target" sceneMemberID="viewController">
|
<windowController showSeguePresentationStyle="single" id="B8D-0N-5wS" customClass="WindowController" customModule="Persephone" customModuleProvider="target" sceneMemberID="viewController">
|
||||||
<window key="window" title="Persephone" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="IQv-IB-iLA" customClass="MainWindow" customModule="Persephone" customModuleProvider="target">
|
<window key="window" title="Persephone" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="IQv-IB-iLA" customClass="MainWindow" customModule="Persephone" customModuleProvider="target">
|
||||||
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
|
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
|
||||||
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
|
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
|
||||||
@ -267,8 +277,8 @@
|
|||||||
<!--Window Controller-->
|
<!--Window Controller-->
|
||||||
<scene sceneID="Rpk-bo-5kf">
|
<scene sceneID="Rpk-bo-5kf">
|
||||||
<objects>
|
<objects>
|
||||||
<windowController id="xYu-7w-E5x" customClass="PreferencesWindowController" customModule="Persephone" customModuleProvider="target" sceneMemberID="viewController">
|
<windowController showSeguePresentationStyle="single" id="xYu-7w-E5x" customClass="PreferencesWindowController" customModule="Persephone" customModuleProvider="target" sceneMemberID="viewController">
|
||||||
<window key="window" title="Preferences" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="" animationBehavior="default" id="3FN-my-6kU">
|
<window key="window" title="Preferences" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="" animationBehavior="default" titleVisibility="hidden" id="3FN-my-6kU">
|
||||||
<windowStyleMask key="styleMask" titled="YES" closable="YES"/>
|
<windowStyleMask key="styleMask" titled="YES" closable="YES"/>
|
||||||
<rect key="contentRect" x="245" y="301" width="416" height="100"/>
|
<rect key="contentRect" x="245" y="301" width="416" height="100"/>
|
||||||
<rect key="screenRect" x="0.0" y="0.0" width="1680" height="1027"/>
|
<rect key="screenRect" x="0.0" y="0.0" width="1680" height="1027"/>
|
||||||
|
|||||||
@ -24,7 +24,3 @@ struct UpdateElapsedTimeAction: Action {
|
|||||||
struct UpdateStatusAction: Action {
|
struct UpdateStatusAction: Action {
|
||||||
var status: MPDClient.MPDStatus
|
var status: MPDClient.MPDStatus
|
||||||
}
|
}
|
||||||
|
|
||||||
struct StartedDatabaseUpdateAction: Action {}
|
|
||||||
|
|
||||||
struct FinishedDatabaseUpdateAction: Action {}
|
|
||||||
|
|||||||
17
Persephone/State/Actions/UIActions.swift
Normal file
17
Persephone/State/Actions/UIActions.swift
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
//
|
||||||
|
// UIActions.swift
|
||||||
|
// Persephone
|
||||||
|
//
|
||||||
|
// Created by Daniel Barber on 2019/5/02.
|
||||||
|
// Copyright © 2019 Dan Barber. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import ReSwift
|
||||||
|
|
||||||
|
struct MainWindowDidOpenAction: Action {}
|
||||||
|
|
||||||
|
struct MainWindowDidCloseAction: Action {}
|
||||||
|
|
||||||
|
struct DatabaseUpdateStartedAction: Action {}
|
||||||
|
|
||||||
|
struct DatabaseUpdateFinishedAction: Action {}
|
||||||
@ -14,4 +14,5 @@ struct AppState: StateType {
|
|||||||
var albumListState = AlbumListState()
|
var albumListState = AlbumListState()
|
||||||
var preferencesState = PreferencesState()
|
var preferencesState = PreferencesState()
|
||||||
var mpdState = MPDState()
|
var mpdState = MPDState()
|
||||||
|
var uiState = UIState()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,15 +18,12 @@ struct PlayerState: StateType {
|
|||||||
|
|
||||||
var totalTime: UInt?
|
var totalTime: UInt?
|
||||||
var elapsedTimeMs: UInt?
|
var elapsedTimeMs: UInt?
|
||||||
|
|
||||||
var databaseUpdating: Bool = false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extension PlayerState: Equatable {
|
extension PlayerState: Equatable {
|
||||||
static func == (lhs: PlayerState, rhs: PlayerState) -> Bool {
|
static func == (lhs: PlayerState, rhs: PlayerState) -> Bool {
|
||||||
return (lhs.state == rhs.state) &&
|
return (lhs.state == rhs.state) &&
|
||||||
(lhs.totalTime == rhs.totalTime) &&
|
(lhs.totalTime == rhs.totalTime) &&
|
||||||
(lhs.elapsedTimeMs == rhs.elapsedTimeMs) &&
|
(lhs.elapsedTimeMs == rhs.elapsedTimeMs)
|
||||||
(lhs.databaseUpdating == rhs.databaseUpdating)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,6 +14,7 @@ func appReducer(action: Action, state: AppState?) -> AppState {
|
|||||||
queueState: queueReducer(action: action, state: state?.queueState),
|
queueState: queueReducer(action: action, state: state?.queueState),
|
||||||
albumListState: albumListReducer(action: action, state: state?.albumListState),
|
albumListState: albumListReducer(action: action, state: state?.albumListState),
|
||||||
preferencesState: preferencesReducer(action: action, state: state?.preferencesState),
|
preferencesState: preferencesReducer(action: action, state: state?.preferencesState),
|
||||||
mpdState: mpdReducer(action: action, state: state?.mpdState)
|
mpdState: mpdReducer(action: action, state: state?.mpdState),
|
||||||
|
uiState: uiReducer(action: action, state: state?.uiState)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -60,12 +60,6 @@ func playerReducer(action: Action, state: PlayerState?) -> PlayerState {
|
|||||||
case let action as UpdateElapsedTimeAction:
|
case let action as UpdateElapsedTimeAction:
|
||||||
state.elapsedTimeMs = action.elapsedTimeMs
|
state.elapsedTimeMs = action.elapsedTimeMs
|
||||||
|
|
||||||
case is StartedDatabaseUpdateAction:
|
|
||||||
state.databaseUpdating = true
|
|
||||||
|
|
||||||
case is FinishedDatabaseUpdateAction:
|
|
||||||
state.databaseUpdating = false
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|||||||
32
Persephone/State/Reducers/UIReducer.swift
Normal file
32
Persephone/State/Reducers/UIReducer.swift
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
//
|
||||||
|
// UIReducer.swift
|
||||||
|
// Persephone
|
||||||
|
//
|
||||||
|
// Created by Daniel Barber on 2019/5/02.
|
||||||
|
// Copyright © 2019 Dan Barber. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import ReSwift
|
||||||
|
|
||||||
|
func uiReducer(action: Action, state: UIState?) -> UIState {
|
||||||
|
var state = state ?? UIState()
|
||||||
|
|
||||||
|
switch action {
|
||||||
|
case is MainWindowDidOpenAction:
|
||||||
|
state.mainWindowOpen = true
|
||||||
|
|
||||||
|
case is MainWindowDidCloseAction:
|
||||||
|
state.mainWindowOpen = false
|
||||||
|
|
||||||
|
case is DatabaseUpdateStartedAction:
|
||||||
|
state.databaseUpdating = true
|
||||||
|
|
||||||
|
case is DatabaseUpdateFinishedAction:
|
||||||
|
state.databaseUpdating = false
|
||||||
|
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
return state
|
||||||
|
}
|
||||||
14
Persephone/State/UIState.swift
Normal file
14
Persephone/State/UIState.swift
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
//
|
||||||
|
// UIState.swift
|
||||||
|
// Persephone
|
||||||
|
//
|
||||||
|
// Created by Daniel Barber on 2019/5/02.
|
||||||
|
// Copyright © 2019 Dan Barber. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import ReSwift
|
||||||
|
|
||||||
|
struct UIState: StateType {
|
||||||
|
var mainWindowOpen: Bool = false
|
||||||
|
var databaseUpdating: Bool = false
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user