Fix add button. Fix hotkeys in settings. Add Workspace hotkeys
This commit is contained in:
@@ -17,8 +17,13 @@ struct HotkeySettingsView: View {
|
||||
HotkeyRecorderView(label: "Detach tab", binding: settingsController.binding(\.hotkeys.detachTab))
|
||||
}
|
||||
|
||||
Section("Workspaces (active when notch is open)") {
|
||||
HotkeyRecorderView(label: "Next workspace", binding: settingsController.binding(\.hotkeys.nextWorkspace))
|
||||
HotkeyRecorderView(label: "Previous workspace", binding: settingsController.binding(\.hotkeys.previousWorkspace))
|
||||
}
|
||||
|
||||
Section {
|
||||
Text("⌘1–9 always switch to tab by number. Size preset hotkeys are configured in Terminal > Size Presets.")
|
||||
Text("⌘1–9 always switch to tab by number. Size preset hotkeys are configured in Terminal > Size Presets. Per-workspace jump hotkeys are configured in Workspaces.")
|
||||
.font(.caption)
|
||||
.foregroundStyle(.secondary)
|
||||
}
|
||||
|
||||
@@ -2,21 +2,7 @@ import SwiftUI
|
||||
|
||||
struct TerminalSettingsView: View {
|
||||
@ObservedObject private var settingsController = AppSettingsController.shared
|
||||
|
||||
private var sizePresetsBinding: Binding<[TerminalSizePreset]> {
|
||||
Binding(
|
||||
get: {
|
||||
TerminalSizePresetStore.decodePresets(
|
||||
from: settingsController.settings.terminal.sizePresetsJSON
|
||||
) ?? TerminalSizePresetStore.loadDefaults()
|
||||
},
|
||||
set: { newValue in
|
||||
settingsController.update {
|
||||
$0.terminal.sizePresetsJSON = TerminalSizePresetStore.encodePresets(newValue)
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
@State private var sizePresets: [TerminalSizePreset] = []
|
||||
|
||||
var body: some View {
|
||||
Form {
|
||||
@@ -55,7 +41,7 @@ struct TerminalSettingsView: View {
|
||||
}
|
||||
|
||||
Section("Size Presets") {
|
||||
ForEach(sizePresetsBinding) { $preset in
|
||||
ForEach($sizePresets) { $preset in
|
||||
TerminalSizePresetEditor(
|
||||
preset: $preset,
|
||||
currentOpenWidth: settingsController.settings.display.openWidth,
|
||||
@@ -67,20 +53,18 @@ struct TerminalSettingsView: View {
|
||||
|
||||
HStack {
|
||||
Button("Add Preset") {
|
||||
var presets = sizePresetsBinding.wrappedValue
|
||||
presets.append(
|
||||
sizePresets.append(
|
||||
TerminalSizePreset(
|
||||
name: "Preset \(presets.count + 1)",
|
||||
name: "Preset \(sizePresets.count + 1)",
|
||||
width: settingsController.settings.display.openWidth,
|
||||
height: settingsController.settings.display.openHeight,
|
||||
hotkey: TerminalSizePresetStore.suggestedHotkey(for: presets)
|
||||
hotkey: TerminalSizePresetStore.suggestedHotkey(for: sizePresets)
|
||||
)
|
||||
)
|
||||
sizePresetsBinding.wrappedValue = presets
|
||||
}
|
||||
|
||||
Button("Reset Presets") {
|
||||
sizePresetsBinding.wrappedValue = TerminalSizePresetStore.loadDefaults()
|
||||
sizePresets = TerminalSizePresetStore.loadDefaults()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -90,10 +74,24 @@ struct TerminalSettingsView: View {
|
||||
}
|
||||
}
|
||||
.formStyle(.grouped)
|
||||
.onAppear {
|
||||
synchronizePresetsFromSettings()
|
||||
}
|
||||
.onChange(of: settingsController.settings.terminal.sizePresetsJSON) { _, _ in
|
||||
synchronizePresetsFromSettings()
|
||||
}
|
||||
.onChange(of: sizePresets) { _, newValue in
|
||||
let encoded = TerminalSizePresetStore.encodePresets(newValue)
|
||||
guard encoded != settingsController.settings.terminal.sizePresetsJSON else { return }
|
||||
|
||||
settingsController.update {
|
||||
$0.terminal.sizePresetsJSON = encoded
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func deletePreset(id: UUID) {
|
||||
sizePresetsBinding.wrappedValue.removeAll { $0.id == id }
|
||||
sizePresets.removeAll { $0.id == id }
|
||||
}
|
||||
|
||||
private func applyPreset(_ preset: TerminalSizePreset) {
|
||||
@@ -103,6 +101,15 @@ struct TerminalSettingsView: View {
|
||||
}
|
||||
ScreenManager.shared.applySizePreset(preset)
|
||||
}
|
||||
|
||||
private func synchronizePresetsFromSettings() {
|
||||
let decoded = TerminalSizePresetStore.decodePresets(
|
||||
from: settingsController.settings.terminal.sizePresetsJSON
|
||||
) ?? TerminalSizePresetStore.loadDefaults()
|
||||
|
||||
guard decoded != sizePresets else { return }
|
||||
sizePresets = decoded
|
||||
}
|
||||
}
|
||||
|
||||
private struct TerminalSizePresetEditor: View {
|
||||
|
||||
@@ -75,6 +75,11 @@ struct WorkspacesSettingsView: View {
|
||||
renameSelectedWorkspace()
|
||||
}
|
||||
|
||||
OptionalHotkeyRecorderView(
|
||||
label: "Jump Hotkey",
|
||||
binding: workspaceHotkeyBinding(for: summary.id)
|
||||
)
|
||||
|
||||
HStack {
|
||||
Button("Save Name") {
|
||||
renameSelectedWorkspace()
|
||||
@@ -86,6 +91,10 @@ struct WorkspacesSettingsView: View {
|
||||
}
|
||||
.accessibilityIdentifier("settings.workspaces.new")
|
||||
}
|
||||
|
||||
Text("Workspace jump hotkeys are active when the notch is open and switch the current screen to this workspace.")
|
||||
.font(.caption)
|
||||
.foregroundStyle(.secondary)
|
||||
}
|
||||
|
||||
Section("Usage") {
|
||||
@@ -256,6 +265,17 @@ struct WorkspacesSettingsView: View {
|
||||
renameDraft = workspaceRegistry.summary(for: workspaceID)?.name ?? ""
|
||||
}
|
||||
|
||||
private func workspaceHotkeyBinding(for workspaceID: WorkspaceID) -> Binding<HotkeyBinding?> {
|
||||
Binding(
|
||||
get: {
|
||||
workspaceRegistry.summary(for: workspaceID)?.hotkey
|
||||
},
|
||||
set: { newValue in
|
||||
workspaceRegistry.updateWorkspaceHotkey(id: workspaceID, to: newValue)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
private func deleteSelectedWorkspace() {
|
||||
guard let effectiveSelectedWorkspaceID,
|
||||
let fallbackWorkspaceID = screenRegistry.deleteWorkspace(
|
||||
|
||||
Reference in New Issue
Block a user