From 626135159800c3839937939ece5b7fe5e1f5eb9e Mon Sep 17 00:00:00 2001 From: James Magahern Date: Thu, 11 Sep 2025 15:33:56 -0700 Subject: [PATCH] osx: wiring for opening a new window, but not connected to gesture yet when I add `.tapGesture(count: 2)` to list items, this seems to block single clicks because SwiftUI sucks. Need to find a better way to invoke this. --- osx/kordophone2/App.swift | 43 ++++++++++++++++++++++ osx/kordophone2/ConversationListView.swift | 3 +- osx/kordophone2/Models.swift | 2 +- 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/osx/kordophone2/App.swift b/osx/kordophone2/App.swift index 118ef67..2f0806e 100644 --- a/osx/kordophone2/App.swift +++ b/osx/kordophone2/App.swift @@ -18,6 +18,10 @@ struct KordophoneApp: App TextEditingCommands() } + WindowGroup(id: .transcriptWindow, for: Display.Conversation.self) { selectedConversation in + TranscriptWindowView(conversation: selectedConversation) + } + Settings { PreferencesView() } @@ -28,3 +32,42 @@ struct KordophoneApp: App print("Error: \(e.localizedDescription)") } } + +struct TranscriptWindowView: View +{ + @State private var transcriptViewModel = TranscriptView.ViewModel() + @State private var entryViewModel = MessageEntryView.ViewModel() + private let displayedConversation: Binding + + public init(conversation: Binding) { + self.displayedConversation = conversation + transcriptViewModel.displayedConversation = conversation.wrappedValue + observeDisplayedConversationChanges() + } + + private func observeDisplayedConversationChanges() { + withObservationTracking { + _ = displayedConversation.wrappedValue + } onChange: { + Task { @MainActor in + guard let displayedConversation = self.displayedConversation.wrappedValue else { return } + transcriptViewModel.displayedConversation = displayedConversation + + observeDisplayedConversationChanges() + } + } + } + + var body: some View { + VStack { + ConversationView(transcriptModel: $transcriptViewModel, entryModel: $entryViewModel) + .navigationTitle(displayedConversation.wrappedValue?.displayName ?? "Kordophone") + .selectedConversation(displayedConversation.wrappedValue) + } + } +} + +extension String +{ + static let transcriptWindow = "TranscriptWindow" +} diff --git a/osx/kordophone2/ConversationListView.swift b/osx/kordophone2/ConversationListView.swift index cdf5a1a..fa714a7 100644 --- a/osx/kordophone2/ConversationListView.swift +++ b/osx/kordophone2/ConversationListView.swift @@ -11,7 +11,8 @@ struct ConversationListView: View { @Binding var model: ViewModel @Environment(\.xpcClient) private var xpcClient - + @Environment(\.openWindow) private var openWindow + var body: some View { List($model.conversations, selection: $model.selectedConversation) { conv in let isUnread = conv.wrappedValue.unreadCount > 0 diff --git a/osx/kordophone2/Models.swift b/osx/kordophone2/Models.swift index 2acf22a..b0c8780 100644 --- a/osx/kordophone2/Models.swift +++ b/osx/kordophone2/Models.swift @@ -10,7 +10,7 @@ import XPC enum Display { - struct Conversation: Identifiable, Hashable + struct Conversation: Identifiable, Hashable, Codable { let id: String let name: String?