diff options
Diffstat (limited to 'Hotline/macOS')
| -rw-r--r-- | Hotline/macOS/ServerView.swift | 54 | ||||
| -rw-r--r-- | Hotline/macOS/SettingsView.swift | 94 |
2 files changed, 125 insertions, 23 deletions
diff --git a/Hotline/macOS/ServerView.swift b/Hotline/macOS/ServerView.swift index a385109..337882b 100644 --- a/Hotline/macOS/ServerView.swift +++ b/Hotline/macOS/ServerView.swift @@ -112,13 +112,13 @@ private func connectionStatusToProgress(status: HotlineClientStatus) -> Double { struct ServerView: View { @Environment(Hotline.self) private var model: Hotline + @Environment(Prefs.self) private var preferences: Prefs @Environment(\.dismiss) var dismiss @Environment(\.controlActiveState) private var controlActiveState @State private var agreementShown: Bool = false @State private var selection: MenuItem? = ServerView.menuItems.first - let server: Server static var menuItems = [ @@ -129,6 +129,28 @@ struct ServerView: View { // MenuItem(name: "Tasks", image: "arrow.up.circle", type: .tasks), ] + @MainActor func sendPreferences() { + if self.model.status == .loggedIn { + var options: HotlineUserOptions = HotlineUserOptions() + + if preferences.refusePrivateMessages { + options.update(with: .refusePrivateMessages) + } + + if preferences.refusePrivateChat { + options.update(with: .refusePrivateChat) + } + + if preferences.enableAutomaticMessage { + options.update(with: .automaticResponse) + } + + print("Updating preferences with server") + + self.model.sendUserInfo(username: preferences.username, iconID: preferences.userIconID, options: options, autoresponse: preferences.automaticMessage) + } + } + var body: some View { NavigationSplitView { List(selection: $selection) { @@ -238,13 +260,13 @@ struct ServerView: View { .navigationTitle("") .onAppear { print(" YAYY") - self.model.login(server: self.server, login: "", password: "", username: "bolt", iconID: 128) { success in + self.model.login(server: self.server, login: "", password: "", username: preferences.username, iconID: preferences.userIconID) { success in if !success { print("FAILED LOGIN??") } else { print("GETTING USER LIST????!") - self.model.sendUserInfo(username: "bolt", iconID: 128) + self.sendPreferences() self.model.getUserList() } } @@ -257,26 +279,12 @@ struct ServerView: View { dismiss() } } -// .onChange(of: model.agreement) { -// if model.agreement != nil { -// agreementShown = true -// } -// } -// .sheet(isPresented: $agreementShown, onDismiss: { -// if model.status == .disconnected { -// dismiss() -// } -// }, content: { -// if let text = model.agreement { -// AgreementView(text: text, disagree: { -// self.model.disconnect() -// print("DISAGREE") -// }, agree: { -// print("AGREE?") -// }) -//// .frame(minWidth: 300, maxWidth: 500, minHeight: 300) -// } -// }) + .onChange(of: preferences.userIconID) { self.sendPreferences() } + .onChange(of: preferences.username) { self.sendPreferences() } + .onChange(of: preferences.refusePrivateMessages) { self.sendPreferences() } + .onChange(of: preferences.refusePrivateChat) { self.sendPreferences() } + .onChange(of: preferences.enableAutomaticMessage) { self.sendPreferences() } + .onChange(of: preferences.automaticMessage) { self.sendPreferences() } } } diff --git a/Hotline/macOS/SettingsView.swift b/Hotline/macOS/SettingsView.swift new file mode 100644 index 0000000..2b11ecc --- /dev/null +++ b/Hotline/macOS/SettingsView.swift @@ -0,0 +1,94 @@ +import SwiftUI + +struct GeneralSettingsView: View { + @Environment(Prefs.self) private var preferences: Prefs + + var body: some View { + @Bindable var preferences = preferences + + Form { + TextField("Your Name", text: $preferences.username, prompt: Text("guest")) + Toggle("Refuse private messages", isOn: $preferences.refusePrivateMessages) + Toggle("Refuse private chat", isOn: $preferences.refusePrivateChat) + Toggle("Automatic Response", isOn: $preferences.enableAutomaticMessage) + if preferences.enableAutomaticMessage { + TextField("", text: $preferences.automaticMessage, prompt: Text("Write a response message")) + .lineLimit(2) + .multilineTextAlignment(.leading) +// .fixedSize(horizontal: true, vertical: false) + .frame(maxWidth: .infinity) +// .lineLimit(2, reservesSpace: true) + } + } + .padding(20) + .frame(width: 350) + } +} + +struct IconSettingsView: View { + @Environment(Prefs.self) private var preferences: Prefs + +// @AppStorage(Prefs.userIconID) private var userIconID: Int = Prefs.defaultIconID + + var body: some View { + @Bindable var preferences = preferences + + Form { + ScrollView { + LazyVGrid(columns: [ + GridItem(.flexible(minimum: 20, maximum: 50)), + GridItem(.flexible(minimum: 20, maximum: 50)), + GridItem(.flexible(minimum: 20, maximum: 50)), + GridItem(.flexible(minimum: 20, maximum: 50)), + GridItem(.flexible(minimum: 20, maximum: 50)), + GridItem(.flexible(minimum: 20, maximum: 50)), + GridItem(.flexible(minimum: 20, maximum: 50)) + ]) { + ForEach(Hotline.defaultIconSet.sorted(by: >), id: \.key) { iconID, iconText in + Text(iconText) + .font(.largeTitle) + .frame(maxWidth: .infinity) + .padding(4) + .background(iconID == preferences.userIconID ? .blue : .clear) + .clipShape(RoundedRectangle(cornerRadius: 5)) + .onTapGesture { + preferences.userIconID = iconID + } + } + } + .padding() + } +// for (iconID, iconText) in Hotline.defaultIconSet { + +// Text(iconText) +// } + } + .frame(width: 350, height: 300) + + } +} + +struct SettingsView: View { + private enum Tabs: Hashable { + case general, icon + } + + var body: some View { + TabView { + GeneralSettingsView() + .tabItem { + Label("General", systemImage: "gear") + } + .tag(Tabs.general) + IconSettingsView() + .tabItem { + Label("Icon", systemImage: "person.crop.circle") + } + .tag(Tabs.icon) + } + } +} + +#Preview { + SettingsView() +} |