Changes
4 changed files (+90/-76)
-
-
@@ -14,18 +14,10 @@ // limitations under the License.// // SPDX-License-Identifier: Apache-2.0 import Network import RoonKit import SwiftUI import os enum MainViewState { case loading case found(Communicatable) case error(any Error) } struct MainView: View { struct ConnectionScreen: View { @State private var conn: ConnectionDataModel init(serverID: String) {
-
@@ -39,7 +31,7 @@ case .loading, .closed:// TODO: Create view for closed state ProgressView() case .open(let conn, let (host, port)): ConnectedView(conn: conn) ConnectedScreen(conn: conn) .environment(self.conn) .environment(ImageURLBuilderDataModel(host: host, port: port)) case .error(RoonKit.ServerLookupError.notFound):
-
@@ -70,49 +62,3 @@ }.focusedValue(conn) } } struct ConnectedView: View { @State private var model: ZoneDataModel init(conn: Communicatable & Connectable) { model = ZoneDataModel(conn: conn) } private let actionQueue = DispatchQueue( label: "plac.ConnectedView.actionQueue" ) var body: some View { VStack(spacing: 0) { NavigationSplitView { List { NavigationLink { Text("LIBRARY") } label: { Text("Library") } NavigationLink { Text("DISCOVER") } label: { Text("Discover") } } } detail: { } Divider() PlaybackBar() .frame(maxWidth: .infinity) .environment(model) } .task { do { try await model.watchChanges() } catch { Logger().error("Failed to watch zone changes: \(error)") } } } }
-
-
-
@@ -14,21 +14,20 @@ // limitations under the License.// // SPDX-License-Identifier: Apache-2.0 import OSLog import RoonKit import SwiftUI import os struct ServerDiscovery: View { struct ServerDiscoveryScreen: View { @State private var servers: [RoonKit.Server] = [] @State private var status: ServerDiscoverySceneListStatus = .loading @State private var status: DiscoveryStatus = .loading var onConnectAction: ((RoonKit.Server) -> Void)? private let logger = Logger() private let queue = DispatchQueue(label: "plac.server-discovery") var body: some View { ServerDiscoverySceneList( PureView( servers: servers, status: status, onScan: {
-
@@ -57,9 +56,9 @@ }} } extension ServerDiscovery { extension ServerDiscoveryScreen { func onConnect(_ handler: @escaping (RoonKit.Server) -> Void) -> ServerDiscovery -> ServerDiscoveryScreen { var new = self new.onConnectAction = handler
-
@@ -67,15 +66,15 @@ return new} } enum ServerDiscoverySceneListStatus { private enum DiscoveryStatus { case loading case loaded case failed(any Error) } struct ServerDiscoverySceneList: View { private struct PureView: View { var servers: [RoonKit.Server] var status: ServerDiscoverySceneListStatus var status: DiscoveryStatus var onConnectAction: ((RoonKit.Server) -> Void)? var onScan: (() -> Void)? = nil
-
@@ -193,15 +192,17 @@ }} } extension ServerDiscoverySceneList { extension PureView { func onConnect(_ handler: @escaping (RoonKit.Server) -> Void) -> ServerDiscoverySceneList -> PureView { var new = self new.onConnectAction = handler return new } } // MARK: - Preview #Preview("Loaded") { let logger = Logger()
-
@@ -230,21 +231,21 @@ port: 8000), ] ServerDiscoverySceneList(servers: servers, status: .loaded) PureView(servers: servers, status: .loaded) .refreshable { logger.debug("ServerDiscoverySceneList.refreshable") } } #Preview("No servers") { ServerDiscoverySceneList(servers: [], status: .loaded) PureView(servers: [], status: .loaded) } #Preview("Loading") { ServerDiscoverySceneList(servers: [], status: .loading) PureView(servers: [], status: .loading) } #Preview("SocketError") { ServerDiscoverySceneList( PureView( servers: [], status: .failed( RoonKit.ServerLookupError.socketError(
-
@@ -259,7 +260,7 @@ case doNotUseThisInApplicationCode} #Preview("Unknown error") { ServerDiscoverySceneList( PureView( servers: [], status: .failed(MockUnknownError.doNotUseThisInApplicationCode) )
-
-
-
@@ -0,0 +1,67 @@// Copyright 2025 Shota FUJI // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // SPDX-License-Identifier: Apache-2.0 import OSLog import RoonKit import SwiftUI struct ConnectedScreen: View { private let logger = Logger() @State private var model: ZoneDataModel init(conn: Communicatable & Connectable) { model = ZoneDataModel(conn: conn) } private let actionQueue = DispatchQueue( label: "plac.ConnectedView.actionQueue" ) var body: some View { VStack(spacing: 0) { NavigationSplitView { List { NavigationLink { Text("LIBRARY") } label: { Text("Library") } NavigationLink { Text("DISCOVER") } label: { Text("Discover") } } } detail: { } Divider() PlaybackBar() .frame(maxWidth: .infinity) .environment(model) } .task { do { try await model.watchChanges() } catch { logger.error("Failed to watch zone changes: \(error)") } } } }
-
-
-
@@ -37,16 +37,16 @@ }} @main struct placApp: App { struct PlacApp: App { @AppStorage("PlacApp.connectedServerId") private var connectedServerId: String? var body: some Scene { WindowGroup("Plac", id: "main-window") { if let connectedServerId = connectedServerId { MainView(serverID: connectedServerId) ConnectionScreen(serverID: connectedServerId) } else { ServerDiscovery() ServerDiscoveryScreen() .onConnect { server in connectedServerId = server.id }
-