diff --git a/src/MeloNX/MeloNX.xcodeproj/project.pbxproj b/src/MeloNX/MeloNX.xcodeproj/project.pbxproj index 8b556f2c1..83e6dd820 100644 --- a/src/MeloNX/MeloNX.xcodeproj/project.pbxproj +++ b/src/MeloNX/MeloNX.xcodeproj/project.pbxproj @@ -631,6 +631,10 @@ "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", "$(PROJECT_DIR)/MeloNX/Dependencies/XCFrameworks", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", ); MARKETING_VERSION = 0.0.8; PRODUCT_BUNDLE_IDENTIFIER = com.stossy11.MeloNX; @@ -774,6 +778,10 @@ "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", "$(PROJECT_DIR)/MeloNX/Dependencies/XCFrameworks", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", ); MARKETING_VERSION = 0.0.8; PRODUCT_BUNDLE_IDENTIFIER = com.stossy11.MeloNX; diff --git a/src/MeloNX/MeloNX.xcodeproj/project.xcworkspace/xcuserdata/stossy11.xcuserdatad/UserInterfaceState.xcuserstate b/src/MeloNX/MeloNX.xcodeproj/project.xcworkspace/xcuserdata/stossy11.xcuserdatad/UserInterfaceState.xcuserstate index 7df9bfab6..208e0d36d 100644 Binary files a/src/MeloNX/MeloNX.xcodeproj/project.xcworkspace/xcuserdata/stossy11.xcuserdatad/UserInterfaceState.xcuserstate and b/src/MeloNX/MeloNX.xcodeproj/project.xcworkspace/xcuserdata/stossy11.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/src/MeloNX/MeloNX.xcodeproj/xcuserdata/stossy11.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/src/MeloNX/MeloNX.xcodeproj/xcuserdata/stossy11.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index bbb99a5a6..a959ba661 100644 --- a/src/MeloNX/MeloNX.xcodeproj/xcuserdata/stossy11.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/src/MeloNX/MeloNX.xcodeproj/xcuserdata/stossy11.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -14,8 +14,8 @@ filePath = "MeloNX/Views/GamesList/GameListView.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "224" - endingLineNumber = "224" + startingLineNumber = "195" + endingLineNumber = "195" landmarkName = "loadGames()" landmarkType = "7"> diff --git a/src/MeloNX/MeloNX/Views/ContentView.swift b/src/MeloNX/MeloNX/Views/ContentView.swift index 526794279..130f6f39a 100644 --- a/src/MeloNX/MeloNX/Views/ContentView.swift +++ b/src/MeloNX/MeloNX/Views/ContentView.swift @@ -39,8 +39,8 @@ struct ContentView: View { _config = State(initialValue: defaultConfig) let defaultSettings: [MoltenVKSettings] = [ - // MoltenVKSettings(string: "MVK_CONFIG_MAX_ACTIVE_METAL_COMMAND_BUFFERS_PER_QUEUE", value: "512"), - MoltenVKSettings(string: "MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS", value: "0"), + // MoltenVKSettings(string: "MVK_CONFIG_MAX_ACTIVE_METAL_COMMAND_BUFFERS_PER_QUEUE", value: "128"), + MoltenVKSettings(string: "MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS", value: "1"), MoltenVKSettings(string: "MVK_CONFIG_PREFILL_METAL_COMMAND_BUFFERS", value: "1"), MoltenVKSettings(string: "MVK_USE_METAL_PRIVATE_API", value: "1"), MoltenVKSettings(string: "MVK_CONFIG_RESUME_LOST_DEVICE", value: "1"), diff --git a/src/MeloNX/MeloNX/Views/GamesList/GameListView.swift b/src/MeloNX/MeloNX/Views/GamesList/GameListView.swift index 75c9a0736..1fdee655e 100644 --- a/src/MeloNX/MeloNX/Views/GamesList/GameListView.swift +++ b/src/MeloNX/MeloNX/Views/GamesList/GameListView.swift @@ -9,35 +9,6 @@ import SwiftUI import UniformTypeIdentifiers -struct MainTabView: View { - @Binding var startemu: URL? - @Binding var config: Ryujinx.Configuration - @Binding var MVKconfig: [MoltenVKSettings] - @Binding var controllersList: [Controller] - @Binding var currentControllers: [Controller] - - @Binding var onscreencontroller: Controller - - var body: some View { - TabView { - GameLibraryView(startemu: $startemu) - .tabItem { - Label("Games", systemImage: "gamecontroller.fill") - } - - SelectControllerView(controllersList: $controllersList, currentControllers: $currentControllers, onscreencontroller: $onscreencontroller) - .tabItem { - Label("Controllers", systemImage: "gamecontroller.fill") - } - - SettingsView(config: $config, MoltenVKSettings: $MVKconfig) - .tabItem { - Label("Settings", systemImage: "gear") - } - } - } -} - struct GameLibraryView: View { @Binding var startemu: URL? @State private var games: [Game] = [] diff --git a/src/MeloNX/MeloNX/Views/SelectController/SelectControllerView.swift b/src/MeloNX/MeloNX/Views/SelectController/SelectControllerView.swift deleted file mode 100644 index 8790db2b7..000000000 --- a/src/MeloNX/MeloNX/Views/SelectController/SelectControllerView.swift +++ /dev/null @@ -1,54 +0,0 @@ -// -// SelectControllerView.swift -// MeloNX -// -// Created by Stossy11 on 9/12/2024. -// - -import SwiftUI - -struct SelectControllerView: View { - - @Binding var controllersList: [Controller] - @Binding var currentControllers: [Controller] - - @Binding var onscreencontroller: Controller - - var body: some View { - - List { - - Section { - ForEach(controllersList, id: \.self) { controller in - controllerRow(for: controller) - } - } footer: { - Text("If no controllers are selected, the keyboard will be used.") - .font(.footnote) - .foregroundColor(.gray) - } - } - } - - - private func controllerRow(for controller: Controller) -> some View { - HStack { - Button(controller.name) { - toggleController(controller) - } - Spacer() - if currentControllers.contains(where: { $0.id == controller.id }) { - Image(systemName: "checkmark.circle.fill") - } - } - } - - private func toggleController(_ controller: Controller) { - if currentControllers.contains(where: { $0.id == controller.id }) { - currentControllers.removeAll(where: { $0.id == controller.id }) - } else { - currentControllers.append(controller) - } - } - -} diff --git a/src/MeloNX/MeloNX/Views/SettingsView/SettingsView.swift b/src/MeloNX/MeloNX/Views/SettingsView/SettingsView.swift index 2525b4180..466f04b72 100644 --- a/src/MeloNX/MeloNX/Views/SettingsView/SettingsView.swift +++ b/src/MeloNX/MeloNX/Views/SettingsView/SettingsView.swift @@ -10,6 +10,12 @@ import SwiftUI struct SettingsView: View { @Binding var config: Ryujinx.Configuration @Binding var MoltenVKSettings: [MoltenVKSettings] + + @Binding var controllersList: [Controller] + @Binding var currentControllers: [Controller] + + @Binding var onscreencontroller: Controller + @AppStorage("ignoreJIT") var ignoreJIT: Bool = false var memoryManagerModes = [ @@ -30,7 +36,7 @@ struct SettingsView: View { } var body: some View { - NavigationStack { + iOSNav { List { // Graphics & Performance Section { @@ -114,9 +120,41 @@ struct SettingsView: View { } footer: { Text("Fine-tune graphics and performance to suit your device and preferences.") } + + // Input Selector + Section { + ForEach(controllersList) { controller in + var customBinding: Binding { + Binding( + get: { currentControllers.contains(controller) }, + set: { bool in + if !bool { + currentControllers.removeAll(where: { $0.id == controller.id }) + } else { + currentControllers.append(controller) + } + // toggleController(controller) + } + ) + } + + Toggle(isOn: customBinding) { + labelWithIcon(controller.name, iconName: "") + } + .tint(.blue) + } + } header: { + Text("Input Selector") + .font(.title3.weight(.semibold)) + .textCase(nil) + .headerProminence(.increased) + } footer: { + Text("Select input devices and on-screen controls to play with.") + } // Input Settings Section { + Toggle(isOn: $config.listinputids) { labelWithIcon("List Input IDs", iconName: "list.bullet") } @@ -126,6 +164,7 @@ struct SettingsView: View { labelWithIcon("On-Screen Controller (Demo)", iconName: "hand.draw") } .tint(.blue) + .disabled(true) } header: { Text("Input Settings") .font(.title3.weight(.semibold)) @@ -230,6 +269,14 @@ struct SettingsView: View { .navigationViewStyle(.stack) } + private func toggleController(_ controller: Controller) { + if currentControllers.contains(where: { $0.id == controller.id }) { + currentControllers.removeAll(where: { $0.id == controller.id }) + } else { + currentControllers.append(controller) + } + } + func saveSettings() { do { let encoder = JSONEncoder() @@ -261,9 +308,11 @@ struct SettingsView: View { @ViewBuilder private func labelWithIcon(_ text: String, iconName: String) -> some View { HStack(spacing: 8) { - Image(systemName: iconName) - .symbolRenderingMode(.hierarchical) - .foregroundStyle(.blue) + if !iconName.isEmpty { + Image(systemName: iconName) + .symbolRenderingMode(.hierarchical) + .foregroundStyle(.blue) + } Text(text) } .font(.body) diff --git a/src/MeloNX/MeloNX/Views/TabView/TabView.swift b/src/MeloNX/MeloNX/Views/TabView/TabView.swift new file mode 100644 index 000000000..21b52e907 --- /dev/null +++ b/src/MeloNX/MeloNX/Views/TabView/TabView.swift @@ -0,0 +1,34 @@ +// +// TabView.swift +// MeloNX +// +// Created by Stossy11 on 10/12/2024. +// + +import SwiftUI +import UniformTypeIdentifiers + + +struct MainTabView: View { + @Binding var startemu: URL? + @Binding var config: Ryujinx.Configuration + @Binding var MVKconfig: [MoltenVKSettings] + @Binding var controllersList: [Controller] + @Binding var currentControllers: [Controller] + + @Binding var onscreencontroller: Controller + + var body: some View { + TabView { + GameLibraryView(startemu: $startemu) + .tabItem { + Label("Games", systemImage: "gamecontroller.fill") + } + + SettingsView(config: $config, MoltenVKSettings: $MVKconfig, controllersList: $controllersList, currentControllers: $currentControllers, onscreencontroller: $onscreencontroller) + .tabItem { + Label("Settings", systemImage: "gear") + } + } + } +}