Add Controller View into Settings and more

This commit is contained in:
Stossy11 2024-12-10 18:20:30 +11:00
parent 1735216de6
commit a61e2a3992
8 changed files with 99 additions and 91 deletions

View File

@ -631,6 +631,10 @@
"$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries",
"$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries",
"$(PROJECT_DIR)/MeloNX/Dependencies/XCFrameworks", "$(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; MARKETING_VERSION = 0.0.8;
PRODUCT_BUNDLE_IDENTIFIER = com.stossy11.MeloNX; 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/Dynamic\\ Libraries", "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries",
"$(PROJECT_DIR)/MeloNX/Dependencies/XCFrameworks", "$(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; MARKETING_VERSION = 0.0.8;
PRODUCT_BUNDLE_IDENTIFIER = com.stossy11.MeloNX; PRODUCT_BUNDLE_IDENTIFIER = com.stossy11.MeloNX;

View File

@ -14,8 +14,8 @@
filePath = "MeloNX/Views/GamesList/GameListView.swift" filePath = "MeloNX/Views/GamesList/GameListView.swift"
startingColumnNumber = "9223372036854775807" startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807"
startingLineNumber = "224" startingLineNumber = "195"
endingLineNumber = "224" endingLineNumber = "195"
landmarkName = "loadGames()" landmarkName = "loadGames()"
landmarkType = "7"> landmarkType = "7">
</BreakpointContent> </BreakpointContent>

View File

@ -39,8 +39,8 @@ struct ContentView: View {
_config = State(initialValue: defaultConfig) _config = State(initialValue: defaultConfig)
let defaultSettings: [MoltenVKSettings] = [ let defaultSettings: [MoltenVKSettings] = [
// MoltenVKSettings(string: "MVK_CONFIG_MAX_ACTIVE_METAL_COMMAND_BUFFERS_PER_QUEUE", value: "512"), // MoltenVKSettings(string: "MVK_CONFIG_MAX_ACTIVE_METAL_COMMAND_BUFFERS_PER_QUEUE", value: "128"),
MoltenVKSettings(string: "MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS", value: "0"), MoltenVKSettings(string: "MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS", value: "1"),
MoltenVKSettings(string: "MVK_CONFIG_PREFILL_METAL_COMMAND_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_USE_METAL_PRIVATE_API", value: "1"),
MoltenVKSettings(string: "MVK_CONFIG_RESUME_LOST_DEVICE", value: "1"), MoltenVKSettings(string: "MVK_CONFIG_RESUME_LOST_DEVICE", value: "1"),

View File

@ -9,35 +9,6 @@ import SwiftUI
import UniformTypeIdentifiers 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 { struct GameLibraryView: View {
@Binding var startemu: URL? @Binding var startemu: URL?
@State private var games: [Game] = [] @State private var games: [Game] = []

View File

@ -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)
}
}
}

View File

@ -10,6 +10,12 @@ import SwiftUI
struct SettingsView: View { struct SettingsView: View {
@Binding var config: Ryujinx.Configuration @Binding var config: Ryujinx.Configuration
@Binding var MoltenVKSettings: [MoltenVKSettings] @Binding var MoltenVKSettings: [MoltenVKSettings]
@Binding var controllersList: [Controller]
@Binding var currentControllers: [Controller]
@Binding var onscreencontroller: Controller
@AppStorage("ignoreJIT") var ignoreJIT: Bool = false @AppStorage("ignoreJIT") var ignoreJIT: Bool = false
var memoryManagerModes = [ var memoryManagerModes = [
@ -30,7 +36,7 @@ struct SettingsView: View {
} }
var body: some View { var body: some View {
NavigationStack { iOSNav {
List { List {
// Graphics & Performance // Graphics & Performance
Section { Section {
@ -114,9 +120,41 @@ struct SettingsView: View {
} footer: { } footer: {
Text("Fine-tune graphics and performance to suit your device and preferences.") Text("Fine-tune graphics and performance to suit your device and preferences.")
} }
// Input Selector
Section {
ForEach(controllersList) { controller in
var customBinding: Binding<Bool> {
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 // Input Settings
Section { Section {
Toggle(isOn: $config.listinputids) { Toggle(isOn: $config.listinputids) {
labelWithIcon("List Input IDs", iconName: "list.bullet") labelWithIcon("List Input IDs", iconName: "list.bullet")
} }
@ -126,6 +164,7 @@ struct SettingsView: View {
labelWithIcon("On-Screen Controller (Demo)", iconName: "hand.draw") labelWithIcon("On-Screen Controller (Demo)", iconName: "hand.draw")
} }
.tint(.blue) .tint(.blue)
.disabled(true)
} header: { } header: {
Text("Input Settings") Text("Input Settings")
.font(.title3.weight(.semibold)) .font(.title3.weight(.semibold))
@ -230,6 +269,14 @@ struct SettingsView: View {
.navigationViewStyle(.stack) .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() { func saveSettings() {
do { do {
let encoder = JSONEncoder() let encoder = JSONEncoder()
@ -261,9 +308,11 @@ struct SettingsView: View {
@ViewBuilder @ViewBuilder
private func labelWithIcon(_ text: String, iconName: String) -> some View { private func labelWithIcon(_ text: String, iconName: String) -> some View {
HStack(spacing: 8) { HStack(spacing: 8) {
Image(systemName: iconName) if !iconName.isEmpty {
.symbolRenderingMode(.hierarchical) Image(systemName: iconName)
.foregroundStyle(.blue) .symbolRenderingMode(.hierarchical)
.foregroundStyle(.blue)
}
Text(text) Text(text)
} }
.font(.body) .font(.body)

View File

@ -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")
}
}
}
}