Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions Foundation Lab/Commands/FoundationLabNavigationCommands.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#if os(macOS)
import SwiftUI

struct FoundationLabNavigationCommands: Commands {
@FocusedValue(\.foundationLabNavigationCoordinator) private var navigationCoordinator

var body: some Commands {
CommandMenu("Navigate") {
destinationButton(.library, shortcut: "1")
destinationButton(.playground, shortcut: "2")
destinationButton(.runs, shortcut: "3")
}
}

private func destinationButton(
_ destination: TabSelection,
shortcut: KeyEquivalent
) -> some View {
Button(
destination.displayName,
systemImage: destination.systemImage
) {
navigationCoordinator?.navigate(to: destination)
}
.keyboardShortcut(shortcut, modifiers: .command)
.disabled(navigationCoordinator == nil)
}
}

extension FocusedValues {
@Entry var foundationLabNavigationCoordinator: NavigationCoordinator?
}
#endif
17 changes: 16 additions & 1 deletion Foundation Lab/FoundationLabApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,10 @@ struct FoundationLabApp: App {
AdaptiveNavigationView()
.modelContainer(for: [HealthMetric.self, HealthSession.self])
#if os(macOS)
.frame(minWidth: 800, minHeight: 600)
.frame(
minWidth: FoundationLabLayout.macOSMinimumWindowWidth,
minHeight: FoundationLabLayout.macOSMinimumWindowHeight
)
.environment(agentBridgeController)
.task {
agentBridgeController.activatePersistedPreference()
Expand All @@ -38,6 +41,18 @@ struct FoundationLabApp: App {
ModelUnavailableView(reason: unavailabilityReason)
}
}
#if os(macOS)
.defaultSize(
width: FoundationLabLayout.macOSDefaultWindowWidth,
height: FoundationLabLayout.macOSDefaultWindowHeight
)
.commands {
SidebarCommands()
InspectorCommands()
FoundationLabNavigationCommands()
}
#endif

#if os(macOS)
Settings {
SettingsView()
Expand Down
260 changes: 260 additions & 0 deletions Foundation Lab/Localizable.xcstrings
Original file line number Diff line number Diff line change
Expand Up @@ -11064,6 +11064,266 @@
}
}
},
"Phase" : {
"extractionState" : "manual",
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Phase"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Phase"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fase"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Phase"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fase"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "フェーズ"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "단계"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fase"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "阶段"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "階段"
}
}
}
},
"Phase %lld of %lld" : {
"extractionState" : "manual",
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Phase %lld von %lld"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Phase %lld of %lld"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fase %lld de %lld"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Phase %lld sur %lld"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fase %lld di %lld"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "フェーズ %lld/%lld"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "%lld/%lld단계"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Fase %lld de %lld"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "第 %lld 阶段,共 %lld 阶段"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "第 %lld 階段,共 %lld 階段"
}
}
}
},
"Reference workspace" : {
"extractionState" : "manual",
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Referenzarbeitsbereich"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reference workspace"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Espacio de trabajo de referencia"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Espace de travail de référence"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Area di lavoro di riferimento"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "リファレンスワークスペース"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "참조 작업 공간"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Espaço de trabalho de referência"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "参考工作区"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "參考工作區"
}
}
}
},
"Navigate" : {
"extractionState" : "manual",
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Navigieren"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Navigate"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Navegar"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Navigation"
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Naviga"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "ナビゲート"
}
},
"ko" : {
"stringUnit" : {
"state" : "translated",
"value" : "탐색"
}
},
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
"value" : "Navegar"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "导航"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "導覽"
}
}
}
},
"Name" : {
"localizations" : {
"de" : {
Expand Down
11 changes: 11 additions & 0 deletions Foundation Lab/Models/FoundationLabPreferenceKey.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
enum FoundationLabPreferenceKey {
static let navigationSelection = "FoundationLab.navigation.selection"
static let sidebarIsVisible = "FoundationLab.navigation.sidebarIsVisible"
static let sidebarWidth = "FoundationLab.navigation.sidebarWidth"
static let playgroundInspectorIsVisible = "FoundationLab.playground.inspectorIsVisible"
static let playgroundInspectorWidth = "FoundationLab.playground.inspectorWidth"

static func workspaceStage(for workspace: Workspace) -> String {
"FoundationLab.workspace.\(workspace.rawValue).stage"
}
}
4 changes: 4 additions & 0 deletions Foundation Lab/Models/WorkspaceStage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,8 @@ enum WorkspaceStage: String, CaseIterable, Identifiable {
case output

var id: Self { self }

var ordinal: Int {
Self.allCases.firstIndex(of: self).map { $0 + 1 } ?? 1
}
}
Loading
Loading