diff --git a/Moblin/Various/Model.swift b/Moblin/Various/Model.swift index fee67c34..2703b15b 100644 --- a/Moblin/Various/Model.swift +++ b/Moblin/Various/Model.swift @@ -5992,6 +5992,15 @@ final class Model: NSObject, ObservableObject, @unchecked Sendable { } } + private func toggleWidgetOnOff(id: UUID) { + guard let widget = findWidget(id: id) else { + return + } + widget.enabled!.toggle() + reloadSpeechToText() + sceneUpdated() + } + func sceneUpdated(imageEffectChanged: Bool = false, attachCamera: Bool = false) { if imageEffectChanged { reloadImageEffects() @@ -6107,6 +6116,8 @@ final class Model: NSObject, ObservableObject, @unchecked Sendable { toggleBlackScreen() case .scene: selectScene(id: key.sceneId) + case .widget: + toggleWidgetOnOff(id: key.widgetId!) } updateButtonStates() return .handled diff --git a/Moblin/Various/Settings.swift b/Moblin/Various/Settings.swift index 25f5eba9..13dc46ec 100644 --- a/Moblin/Various/Settings.swift +++ b/Moblin/Various/Settings.swift @@ -2330,6 +2330,7 @@ enum SettingsKeyboardKeyFunction: String, Codable, CaseIterable { case torch = "Torch" case blackScreen = "Black screen" case scene = "Scene" + case widget = "Widget" public init(from decoder: Decoder) throws { var value = try decoder.singleValueContainer().decode(RawValue.self) @@ -2355,6 +2356,8 @@ enum SettingsKeyboardKeyFunction: String, Codable, CaseIterable { return .blackScreen case String(localized: "Scene"): return .scene + case String(localized: "Widget"): + return .widget default: return .unused } @@ -2376,6 +2379,8 @@ enum SettingsKeyboardKeyFunction: String, Codable, CaseIterable { return String(localized: "Black screen") case .scene: return String(localized: "Scene") + case .widget: + return String(localized: "Widget") } } } @@ -2387,6 +2392,7 @@ class SettingsKeyboardKey: Codable, Identifiable { var key: String = "" var function: SettingsKeyboardKeyFunction = .unused var sceneId: UUID = .init() + var widgetId: UUID? = .init() } class SettingsKeyboard: Codable { @@ -4546,5 +4552,9 @@ final class Settings { scene.overrideVideoStabilizationMode = false store() } + for key in realDatabase.keyboard!.keys where key.widgetId == nil { + key.widgetId = .init() + store() + } } } diff --git a/Moblin/View/Settings/Keyboard/KeyboardKeySettingsView.swift b/Moblin/View/Settings/Keyboard/KeyboardKeySettingsView.swift index 4754ced3..07815eda 100644 --- a/Moblin/View/Settings/Keyboard/KeyboardKeySettingsView.swift +++ b/Moblin/View/Settings/Keyboard/KeyboardKeySettingsView.swift @@ -5,6 +5,7 @@ struct KeyboardKeySettingsView: View { var key: SettingsKeyboardKey @State var selection: String @State var sceneSelection: UUID + @State var widgetSelection: UUID private func onFunctionChange(function: String) { selection = function @@ -49,6 +50,24 @@ struct KeyboardKeySettingsView: View { Text("Scene") } } + if key.function == .widget { + Section { + Picker("", selection: $widgetSelection) { + ForEach(model.database.widgets) { widget in + Text(widget.name) + .tag(widget.id) + } + } + .onChange(of: widgetSelection) { widgetId in + key.widgetId = widgetId + model.objectWillChange.send() + } + .pickerStyle(.inline) + .labelsHidden() + } header: { + Text("Widget") + } + } } .navigationTitle("Game controller button") } diff --git a/Moblin/View/Settings/Keyboard/KeyboardSettingsView.swift b/Moblin/View/Settings/Keyboard/KeyboardSettingsView.swift index 281ea69a..d34011aa 100644 --- a/Moblin/View/Settings/Keyboard/KeyboardSettingsView.swift +++ b/Moblin/View/Settings/Keyboard/KeyboardSettingsView.swift @@ -33,7 +33,8 @@ struct KeyboardSettingsView: View { KeyboardKeySettingsView( key: key, selection: key.function.toString(), - sceneSelection: key.sceneId + sceneSelection: key.sceneId, + widgetSelection: key.widgetId! ) } label: { HStack {