wizard: refactor common code to VMWizardContent
Also hide row separator which appears on macOS Sonoma.
This commit is contained in:
parent
f4834cb580
commit
cc582f53ce
|
@ -0,0 +1,55 @@
|
|||
//
|
||||
// Copyright © 2023 osy. All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct VMWizardContent<Content>: View where Content: View {
|
||||
let titleKey: LocalizedStringKey
|
||||
let content: Content
|
||||
|
||||
init(_ titleKey: LocalizedStringKey, @ViewBuilder content: () -> Content) {
|
||||
self.titleKey = titleKey
|
||||
self.content = content()
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
#if os(macOS)
|
||||
Text(titleKey)
|
||||
.font(.largeTitle)
|
||||
#endif
|
||||
List {
|
||||
#if os(macOS)
|
||||
if #available(macOS 13, *) {
|
||||
content.listRowSeparator(.hidden)
|
||||
} else {
|
||||
content
|
||||
}
|
||||
#else
|
||||
content
|
||||
#endif
|
||||
}
|
||||
#if os(iOS) || os(visionOS)
|
||||
.navigationTitle(Text(titleKey))
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#Preview {
|
||||
VMWizardContent("Test") {
|
||||
Text("Test 1")
|
||||
Text("Test 2")
|
||||
}
|
||||
}
|
|
@ -20,11 +20,7 @@ struct VMWizardDrivesView: View {
|
|||
@ObservedObject var wizardState: VMWizardState
|
||||
|
||||
var body: some View {
|
||||
#if os(macOS)
|
||||
Text("Storage")
|
||||
.font(.largeTitle)
|
||||
#endif
|
||||
List {
|
||||
VMWizardContent("Storage") {
|
||||
Section {
|
||||
HStack {
|
||||
Text("Specify the size of the drive where data will be stored into.")
|
||||
|
@ -43,9 +39,6 @@ struct VMWizardDrivesView: View {
|
|||
}
|
||||
|
||||
}
|
||||
#if os(iOS) || os(visionOS)
|
||||
.navigationTitle(Text("Storage"))
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -55,11 +55,7 @@ struct VMWizardHardwareView: View {
|
|||
}
|
||||
|
||||
var body: some View {
|
||||
#if os(macOS)
|
||||
Text("Hardware")
|
||||
.font(.largeTitle)
|
||||
#endif
|
||||
List {
|
||||
VMWizardContent("Hardware") {
|
||||
if !wizardState.useVirtualization {
|
||||
Section {
|
||||
VMConfigConstantPicker(selection: $wizardState.systemArchitecture)
|
||||
|
@ -120,9 +116,6 @@ struct VMWizardHardwareView: View {
|
|||
|
||||
}
|
||||
}
|
||||
#if os(iOS) || os(visionOS)
|
||||
.navigationTitle(Text("Hardware"))
|
||||
#endif
|
||||
.textFieldStyle(.roundedBorder)
|
||||
.onAppear {
|
||||
if wizardState.useVirtualization {
|
||||
|
|
|
@ -37,11 +37,7 @@ struct VMWizardOSLinuxView: View {
|
|||
}
|
||||
|
||||
var body: some View {
|
||||
#if os(macOS)
|
||||
Text("Linux")
|
||||
.font(.largeTitle)
|
||||
#endif
|
||||
List {
|
||||
VMWizardContent("Linux") {
|
||||
#if os(macOS)
|
||||
if wizardState.useVirtualization {
|
||||
DetailedSection("Virtualization Engine", description: "Apple Virtualization is experimental and only for advanced use cases. Leave unchecked to use QEMU, which is recommended.") {
|
||||
|
@ -144,9 +140,6 @@ struct VMWizardOSLinuxView: View {
|
|||
|
||||
|
||||
}
|
||||
#if os(iOS) || os(visionOS)
|
||||
.navigationTitle(Text("Linux"))
|
||||
#endif
|
||||
.fileImporter(isPresented: $isFileImporterPresented, allowedContentTypes: [.data], onCompletion: processImage)
|
||||
}
|
||||
|
||||
|
|
|
@ -23,11 +23,7 @@ struct VMWizardOSMacView: View {
|
|||
@State private var isFileImporterPresented = false
|
||||
|
||||
var body: some View {
|
||||
#if os(macOS)
|
||||
Text("macOS")
|
||||
.font(.largeTitle)
|
||||
#endif
|
||||
List {
|
||||
VMWizardContent("macOS") {
|
||||
Section {
|
||||
Text("To install macOS, you need to download a recovery IPSW. If you do not select an existing IPSW, the latest macOS IPSW will be downloaded from Apple.")
|
||||
Spacer()
|
||||
|
|
|
@ -21,11 +21,7 @@ struct VMWizardOSOtherView: View {
|
|||
@State private var isFileImporterPresented: Bool = false
|
||||
|
||||
var body: some View {
|
||||
#if os(macOS)
|
||||
Text("Other")
|
||||
.font(.largeTitle)
|
||||
#endif
|
||||
List {
|
||||
VMWizardContent("Other") {
|
||||
if !wizardState.isSkipBootImage {
|
||||
Section {
|
||||
FileBrowseField(url: $wizardState.bootImageURL, isFileImporterPresented: $isFileImporterPresented, hasClearButton: false)
|
||||
|
@ -43,9 +39,6 @@ struct VMWizardOSOtherView: View {
|
|||
Text("Advanced")
|
||||
}
|
||||
}
|
||||
#if os(iOS) || os(visionOS)
|
||||
.navigationTitle(Text("Other"))
|
||||
#endif
|
||||
.fileImporter(isPresented: $isFileImporterPresented, allowedContentTypes: [.data], onCompletion: processImage)
|
||||
}
|
||||
|
||||
|
|
|
@ -19,11 +19,7 @@ import SwiftUI
|
|||
struct VMWizardOSView: View {
|
||||
@ObservedObject var wizardState: VMWizardState
|
||||
var body: some View {
|
||||
#if os(macOS)
|
||||
Text("Operating System")
|
||||
.font(.largeTitle)
|
||||
#endif
|
||||
List {
|
||||
VMWizardContent("Operating System") {
|
||||
Section {
|
||||
#if os(macOS) && arch(arm64)
|
||||
if #available(macOS 12, *), wizardState.useVirtualization {
|
||||
|
@ -77,9 +73,6 @@ struct VMWizardOSView: View {
|
|||
}
|
||||
|
||||
}
|
||||
#if os(iOS) || os(visionOS)
|
||||
.navigationTitle(Text("Operating System"))
|
||||
#endif
|
||||
.buttonStyle(.inList)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,11 +22,7 @@ struct VMWizardOSWindowsView: View {
|
|||
@State private var useVhdx: Bool = false
|
||||
|
||||
var body: some View {
|
||||
#if os(macOS)
|
||||
Text("Windows")
|
||||
.font(.largeTitle)
|
||||
#endif
|
||||
List {
|
||||
VMWizardContent("Windows") {
|
||||
Section {
|
||||
Toggle("Install Windows 10 or higher", isOn: $wizardState.isWindows10OrHigher)
|
||||
.onChange(of: wizardState.isWindows10OrHigher) { newValue in
|
||||
|
@ -121,9 +117,6 @@ struct VMWizardOSWindowsView: View {
|
|||
}
|
||||
}
|
||||
}
|
||||
#if os(iOS) || os(visionOS)
|
||||
.navigationTitle(Text("Windows"))
|
||||
#endif
|
||||
.fileImporter(isPresented: $isFileImporterPresented, allowedContentTypes: [.data], onCompletion: processImage)
|
||||
}
|
||||
|
||||
|
|
|
@ -21,11 +21,7 @@ struct VMWizardSharingView: View {
|
|||
@State private var isFileImporterPresented: Bool = false
|
||||
|
||||
var body: some View {
|
||||
#if os(macOS)
|
||||
Text("Shared Directory")
|
||||
.font(.largeTitle)
|
||||
#endif
|
||||
List {
|
||||
VMWizardContent("Shared Directory") {
|
||||
DetailedSection("Shared Directory Path", description: "Optionally select a directory to make accessible inside the VM. Note that support for shared directories varies by the guest operating system and may require additional guest drivers to be installed. See UTM support pages for more details.") {
|
||||
FileBrowseField(url: $wizardState.sharingDirectoryURL, isFileImporterPresented: $isFileImporterPresented)
|
||||
|
||||
|
@ -38,9 +34,6 @@ struct VMWizardSharingView: View {
|
|||
}
|
||||
}
|
||||
}
|
||||
#if os(iOS) || os(visionOS)
|
||||
.navigationTitle(Text("Shared Directory"))
|
||||
#endif
|
||||
.fileImporter(isPresented: $isFileImporterPresented, allowedContentTypes: [.folder], onCompletion: processDirectory)
|
||||
}
|
||||
|
||||
|
|
|
@ -39,11 +39,7 @@ struct VMWizardStartView: View {
|
|||
}
|
||||
|
||||
var body: some View {
|
||||
#if os(macOS)
|
||||
Text("Start")
|
||||
.font(.largeTitle)
|
||||
#endif
|
||||
List {
|
||||
VMWizardContent("Start") {
|
||||
Section {
|
||||
let virtButton = Button {
|
||||
wizardState.useVirtualization = true
|
||||
|
@ -130,9 +126,6 @@ struct VMWizardStartView: View {
|
|||
}
|
||||
|
||||
}
|
||||
#if os(iOS) || os(visionOS)
|
||||
.navigationTitle(Text("Start"))
|
||||
#endif
|
||||
}
|
||||
|
||||
private func processIsTranslated() -> Bool {
|
||||
|
|
|
@ -227,6 +227,9 @@
|
|||
84B36D2A27B790BE00C22685 /* DestructiveButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B36D2827B790BE00C22685 /* DestructiveButton.swift */; };
|
||||
84B36D2B27B790BE00C22685 /* DestructiveButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B36D2827B790BE00C22685 /* DestructiveButton.swift */; };
|
||||
84BB993A2899E8D500DF28B2 /* VMHeadlessSessionState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84BB99392899E8D500DF28B2 /* VMHeadlessSessionState.swift */; };
|
||||
84C2E8652AA429E800B17308 /* VMWizardContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C2E8642AA429E800B17308 /* VMWizardContent.swift */; };
|
||||
84C2E8662AA429E800B17308 /* VMWizardContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C2E8642AA429E800B17308 /* VMWizardContent.swift */; };
|
||||
84C2E8672AA429E800B17308 /* VMWizardContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C2E8642AA429E800B17308 /* VMWizardContent.swift */; };
|
||||
84C4D9022880CA8A00EC3B2B /* VMSettingsAddDeviceMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C4D9012880CA8A00EC3B2B /* VMSettingsAddDeviceMenuView.swift */; };
|
||||
84C4D9032880CA8A00EC3B2B /* VMSettingsAddDeviceMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C4D9012880CA8A00EC3B2B /* VMSettingsAddDeviceMenuView.swift */; };
|
||||
84C4D9042880CA8A00EC3B2B /* VMSettingsAddDeviceMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C4D9012880CA8A00EC3B2B /* VMSettingsAddDeviceMenuView.swift */; };
|
||||
|
@ -1370,6 +1373,7 @@
|
|||
84B36D2427B704C200C22685 /* UTMDownloadVMTask.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UTMDownloadVMTask.swift; sourceTree = "<group>"; };
|
||||
84B36D2827B790BE00C22685 /* DestructiveButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DestructiveButton.swift; sourceTree = "<group>"; };
|
||||
84BB99392899E8D500DF28B2 /* VMHeadlessSessionState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VMHeadlessSessionState.swift; sourceTree = "<group>"; };
|
||||
84C2E8642AA429E800B17308 /* VMWizardContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VMWizardContent.swift; sourceTree = "<group>"; };
|
||||
84C4D9012880CA8A00EC3B2B /* VMSettingsAddDeviceMenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VMSettingsAddDeviceMenuView.swift; sourceTree = "<group>"; };
|
||||
84C505AB28C588EC007CE8FF /* SizeTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SizeTextField.swift; sourceTree = "<group>"; };
|
||||
84C5068528CA5702007CE8FF /* Hypervisor.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Hypervisor.framework; path = "$(SYSROOT_DIR)/Frameworks/Hypervisor.framework"; sourceTree = "<group>"; };
|
||||
|
@ -2434,6 +2438,7 @@
|
|||
84C4D9012880CA8A00EC3B2B /* VMSettingsAddDeviceMenuView.swift */,
|
||||
CE8813D424CD265700532628 /* VMShareFileModifier.swift */,
|
||||
CE2D953824AD4F980059923A /* VMToolbarModifier.swift */,
|
||||
84C2E8642AA429E800B17308 /* VMWizardContent.swift */,
|
||||
CEBE820226A4C1B5007AAB12 /* VMWizardDrivesView.swift */,
|
||||
CEF0307326A2B40B00667B63 /* VMWizardHardwareView.swift */,
|
||||
CEF0305726A2AFDE00667B63 /* VMWizardOSLinuxView.swift */,
|
||||
|
@ -2945,6 +2950,7 @@
|
|||
84B36D2527B704C200C22685 /* UTMDownloadVMTask.swift in Sources */,
|
||||
8432329828C3017F00CFBC97 /* GlobalFileImporter.swift in Sources */,
|
||||
84CE3DAE2904C17C00FF068B /* IASKAppSettings.swift in Sources */,
|
||||
84C2E8652AA429E800B17308 /* VMWizardContent.swift in Sources */,
|
||||
841E58CB28937EE200137A20 /* UTMExternalSceneDelegate.swift in Sources */,
|
||||
CEB63A7A24F469E300CAF323 /* UTMJailbreak.m in Sources */,
|
||||
841619B228431DA5000034B2 /* UTMQemuConfigurationQEMU.swift in Sources */,
|
||||
|
@ -3139,6 +3145,7 @@
|
|||
848A98BA286A17A8006F0550 /* UTMAppleConfigurationNetwork.swift in Sources */,
|
||||
84018699288B71BF0050AC51 /* BusyIndicator.swift in Sources */,
|
||||
CEB54C852931E32F000D2AA9 /* UTMPatches.swift in Sources */,
|
||||
84C2E8672AA429E800B17308 /* VMWizardContent.swift in Sources */,
|
||||
848A98C0286A20E3006F0550 /* UTMAppleConfigurationBoot.swift in Sources */,
|
||||
848D99B6286300160055C215 /* QEMUArgument.swift in Sources */,
|
||||
CE2D958A24AD4F990059923A /* VMConfigSystemView.swift in Sources */,
|
||||
|
@ -3221,6 +3228,7 @@
|
|||
CEA45E63263519B5002FA97D /* UTMLegacyViewState.m in Sources */,
|
||||
CEA45E64263519B5002FA97D /* UTMLoggingSwift.swift in Sources */,
|
||||
841619A7284315C1000034B2 /* UTMQemuConfiguration.swift in Sources */,
|
||||
84C2E8662AA429E800B17308 /* VMWizardContent.swift in Sources */,
|
||||
CEF0305F26A2AFDF00667B63 /* VMWizardState.swift in Sources */,
|
||||
CEA45E69263519B5002FA97D /* VMConfigQEMUView.swift in Sources */,
|
||||
CEA45E6A263519B5002FA97D /* VMDisplayMetalViewController+Touch.m in Sources */,
|
||||
|
|
Loading…
Reference in New Issue