Enhance UI and configuration for game selection and background processing

This commit is contained in:
Bella 2025-02-10 16:49:14 +13:00
parent 4f3e49a90c
commit a372911f82
No known key found for this signature in database
GPG Key ID: 725FECA79EF56B97
8 changed files with 139 additions and 57 deletions

View File

@ -618,7 +618,7 @@
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = 95J8WZ4TN8; DEVELOPMENT_TEAM = 4TD3JXVDW7;
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
ENABLE_TESTABILITY = NO; ENABLE_TESTABILITY = NO;
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
@ -634,6 +634,8 @@
"$(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/Dynamic\\ Libraries", "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries",
"$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries",
"$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries",
); );
GCC_OPTIMIZATION_LEVEL = fast; GCC_OPTIMIZATION_LEVEL = fast;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
@ -677,9 +679,13 @@
"$(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/Dynamic\\ Libraries", "$(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/Dynamic\\ Libraries",
); );
MARKETING_VERSION = 0.0.8; MARKETING_VERSION = 0.0.8;
PRODUCT_BUNDLE_IDENTIFIER = com.stossy11.MeloNX; PRODUCT_BUNDLE_IDENTIFIER = xyz.belladev.MeloNX;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OBJC_BRIDGING_HEADER = "MeloNX/App/Core/Headers/Ryujinx-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "MeloNX/App/Core/Headers/Ryujinx-Header.h";
@ -697,7 +703,7 @@
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = 95J8WZ4TN8; DEVELOPMENT_TEAM = 4TD3JXVDW7;
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
ENABLE_TESTABILITY = YES; ENABLE_TESTABILITY = YES;
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
@ -713,6 +719,8 @@
"$(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/Dynamic\\ Libraries", "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries",
"$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries",
"$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries",
); );
GCC_OPTIMIZATION_LEVEL = fast; GCC_OPTIMIZATION_LEVEL = fast;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
@ -756,9 +764,13 @@
"$(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/Dynamic\\ Libraries", "$(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/Dynamic\\ Libraries",
); );
MARKETING_VERSION = 0.0.8; MARKETING_VERSION = 0.0.8;
PRODUCT_BUNDLE_IDENTIFIER = com.stossy11.MeloNX; PRODUCT_BUNDLE_IDENTIFIER = xyz.belladev.MeloNX;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OBJC_BRIDGING_HEADER = "MeloNX/App/Core/Headers/Ryujinx-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "MeloNX/App/Core/Headers/Ryujinx-Header.h";

View File

@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1620"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4E80A98C2CD6F54500029585"
BuildableName = "MeloNX.app"
BlueprintName = "MeloNX"
ReferencedContainer = "container:MeloNX.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Release"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Release"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4E80A98C2CD6F54500029585"
BuildableName = "MeloNX.app"
BlueprintName = "MeloNX"
ReferencedContainer = "container:MeloNX.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4E80A98C2CD6F54500029585"
BuildableName = "MeloNX.app"
BlueprintName = "MeloNX"
ReferencedContainer = "container:MeloNX.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Release">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -4,6 +4,11 @@
<dict> <dict>
<key>SchemeUserState</key> <key>SchemeUserState</key>
<dict> <dict>
<key>MeloNX - Release.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>1</integer>
</dict>
<key>MeloNX.xcscheme_^#shared#^_</key> <key>MeloNX.xcscheme_^#shared#^_</key>
<dict> <dict>
<key>orderHint</key> <key>orderHint</key>
@ -12,7 +17,7 @@
<key>Ryujinx.xcscheme_^#shared#^_</key> <key>Ryujinx.xcscheme_^#shared#^_</key>
<dict> <dict>
<key>orderHint</key> <key>orderHint</key>
<integer>1</integer> <integer>3</integer>
</dict> </dict>
<key>com.Stossy11.MeloNX.RyujinxAg.xcscheme_^#shared#^_</key> <key>com.Stossy11.MeloNX.RyujinxAg.xcscheme_^#shared#^_</key>
<dict> <dict>

View File

@ -232,9 +232,16 @@ struct ContentView: View {
} }
Air.play(AnyView( Air.play(AnyView(
Text("Select Game") VStack {
.font(.system(size: 100)) Image(systemName: "gamecontroller")
.font(.system(size: 300))
.foregroundColor(.gray)
.padding(.bottom, 10)
Text("Select Game")
.font(.system(size: 150))
.bold()
}
)) ))
let isJIT = UserDefaults.standard.bool(forKey: "JIT-ENABLED") let isJIT = UserDefaults.standard.bool(forKey: "JIT-ENABLED")

View File

@ -48,8 +48,6 @@ struct SettingsView: View {
var body: some View { var body: some View {
iOSNav { iOSNav {
List { List {
// Graphics & Performance // Graphics & Performance
Section { Section {
Picker(selection: $config.aspectRatio) { Picker(selection: $config.aspectRatio) {
@ -80,8 +78,6 @@ struct SettingsView: View {
labelWithIcon("Macro HLE", iconName: "gearshape") labelWithIcon("Macro HLE", iconName: "gearshape")
}.tint(.blue) }.tint(.blue)
VStack(alignment: .leading, spacing: 10) { VStack(alignment: .leading, spacing: 10) {
HStack { HStack {
labelWithIcon("Resolution Scale", iconName: "magnifyingglass") labelWithIcon("Resolution Scale", iconName: "magnifyingglass")
@ -205,7 +201,6 @@ struct SettingsView: View {
ForEach(currentControllers) { controller in ForEach(currentControllers) { controller in
var customBinding: Binding<Bool> { var customBinding: Binding<Bool> {
Binding( Binding(
get: { currentControllers.contains(controller) }, get: { currentControllers.contains(controller) },
@ -327,35 +322,32 @@ struct SettingsView: View {
} }
Section { Section {
Toggle(isOn: $config.expandRam) {
labelWithIcon("Expand Guest Ram (6GB)", iconName: "exclamationmark.bubble")
Toggle(isOn: $config.expandRam) { }
labelWithIcon("Expand Guest Ram (6GB)", iconName: "exclamationmark.bubble") .tint(.red)
}
.tint(.red)
Toggle(isOn: $config.ignoreMissingServices) { Toggle(isOn: $config.ignoreMissingServices) {
labelWithIcon("Ignore Missing Services", iconName: "waveform.path") labelWithIcon("Ignore Missing Services", iconName: "waveform.path")
}
.tint(.red)
} header: {
Text("Hacks")
.font(.title3.weight(.semibold))
.textCase(nil)
.headerProminence(.increased)
} }
.tint(.red)
} header: {
Text("Hacks")
.font(.title3.weight(.semibold))
.textCase(nil)
.headerProminence(.increased)
}
// Other Settings // Other Settings
Section { Section {
Toggle(isOn: $ssb) { Toggle(isOn: $ssb) {
labelWithIcon("Screenshot Button", iconName: "square.and.arrow.up") labelWithIcon("Screenshot Button", iconName: "square.and.arrow.up")
} }
.tint(.blue) .tint(.blue)
Toggle(isOn: $useTrollStore) { Toggle(isOn: $useTrollStore) {
labelWithIcon("TrollStore", iconName: "troll.svg") labelWithIcon("TrollStore JIT", iconName: "troll.svg")
} }
.tint(.blue) .tint(.blue)
@ -368,21 +360,18 @@ struct SettingsView: View {
labelWithIcon("Trace Logs", iconName: "waveform.path") labelWithIcon("Trace Logs", iconName: "waveform.path")
} }
.tint(.blue) .tint(.blue)
} header: { } header: {
Text("Miscellaneous Options") Text("Miscellaneous Options")
.font(.title3.weight(.semibold)) .font(.title3.weight(.semibold))
.textCase(nil) .textCase(nil)
.headerProminence(.increased) .headerProminence(.increased)
} footer: { } footer: {
Text("Enable trace and debug logs for troubleshooting, enable Screenshotting without distractions and Enable automatic TrollStore JIT.") Text("Enable trace and debug logs for advanced troubleshooting (Note: This degrades performance),\nEnable Screenshot Button for better screenshots\nand Enable TrollStore for automatic TrollStore JIT.")
} }
// Advanced // Advanced
Section { Section {
DisclosureGroup { DisclosureGroup {
Toggle(isOn: $mVKPreFillBuffer) { Toggle(isOn: $mVKPreFillBuffer) {
labelWithIcon("MVK: Pre-Fill Metal Command Buffers", iconName: "gearshape") labelWithIcon("MVK: Pre-Fill Metal Command Buffers", iconName: "gearshape")
}.tint(.blue) }.tint(.blue)
@ -392,9 +381,12 @@ struct SettingsView: View {
Spacer() Spacer()
Text("\(String(Int(getpagesize())))") Text("\(String(Int(getpagesize())))")
.foregroundColor(.secondary) .foregroundColor(.secondary)
} }
Toggle(isOn: $config.dfsIntegrityChecks) {
labelWithIcon("Disable FS Integrity Checks", iconName: "checkmark.shield")
}.tint(.blue)
TextField("Additional Arguments", text: Binding( TextField("Additional Arguments", text: Binding(
get: { get: {
config.additionalArgs.joined(separator: " ") config.additionalArgs.joined(separator: " ")
@ -417,7 +409,6 @@ struct SettingsView: View {
.font(.body) .font(.body)
} }
} label: { } label: {
Text("Advanced Options") Text("Advanced Options")
} }
@ -429,7 +420,6 @@ struct SettingsView: View {
} footer: { } footer: {
Text("For advanced users. See page size or add custom arguments for experimental features. (Please don't touch this if you don't know what you're doing)") Text("For advanced users. See page size or add custom arguments for experimental features. (Please don't touch this if you don't know what you're doing)")
} }
} }
.searchable(text: $searchText, placement: .navigationBarDrawer(displayMode: .always)) .searchable(text: $searchText, placement: .navigationBarDrawer(displayMode: .always))
.navigationTitle("Settings") .navigationTitle("Settings")
@ -542,8 +532,6 @@ struct SVGView: UIViewRepresentable {
svgName.removeLast(4) svgName.removeLast(4)
} }
let svgLayer = UIView(SVGNamed: svgName) { svgLayer in let svgLayer = UIView(SVGNamed: svgName) { svgLayer in
svgLayer.fillColor = UIColor(color).cgColor // Apply the provided color svgLayer.fillColor = UIColor(color).cgColor // Apply the provided color
svgLayer.resizeToFit(hammock.frame) svgLayer.resizeToFit(hammock.frame)

View File

@ -4,6 +4,11 @@
<dict> <dict>
<key>MeloID</key> <key>MeloID</key>
<string>83f67a0a96bd8628a150d7853e360db5bae64e7769524fae399c4b8e7e6aff17</string> <string>83f67a0a96bd8628a150d7853e360db5bae64e7769524fae399c4b8e7e6aff17</string>
<key>UIBackgroundModes</key>
<array>
<string>processing</string>
<string>fetch</string>
</array>
<key>UIFileSharingEnabled</key> <key>UIFileSharingEnabled</key>
<true/> <true/>
<key>UTExportedTypeDeclarations</key> <key>UTExportedTypeDeclarations</key>

View File

@ -9,14 +9,10 @@ import SwiftUI
import UIKit import UIKit
import CryptoKit import CryptoKit
@main @main
struct MeloNXApp: App { struct MeloNXApp: App {
@State var showed = false @State var showed = false
var body: some Scene { var body: some Scene {
WindowGroup { WindowGroup {
ZStack { ZStack {
@ -37,7 +33,11 @@ struct MeloNXApp: App {
} }
} }
.onAppear { .onAppear {
#if RELEASE
initR() initR()
#else
showed = true
#endif
} }
.frame(maxWidth: .infinity, maxHeight: .infinity) .frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.black.opacity(1)) .background(Color.black.opacity(1))
@ -69,19 +69,13 @@ struct MeloNXApp: App {
} }
} }
} }
} }
} else { } else {
showDMCAAlert() showDMCAAlert()
} }
} }
} }
} }
} }
@ -175,7 +169,6 @@ func drmcheck(completion: @escaping (Bool) -> Void) {
} else { } else {
completion(false) completion(false)
} }
} }
*/ */
@ -187,8 +180,6 @@ func InitializeRyujinx(completion: @escaping (Bool) -> Void) {
return return
} }
if (detectRoms(path: path) != value) { if (detectRoms(path: path) != value) {
completion(false) completion(false)
} }
@ -209,7 +200,6 @@ func InitializeRyujinx(completion: @escaping (Bool) -> Void) {
completion(false) completion(false)
} }
guard let httpResponse = response as? HTTPURLResponse else { guard let httpResponse = response as? HTTPURLResponse else {
completion(false) completion(false)
return return
@ -231,8 +221,6 @@ func detectRoms(path string: String) -> String {
return romHash.compactMap { String(format: "%02x", $0) }.joined() return romHash.compactMap { String(format: "%02x", $0) }.joined()
} }
func addFolders(_ folderPath: String) -> String? { func addFolders(_ folderPath: String) -> String? {
let fileManager = FileManager.default let fileManager = FileManager.default
if let data = Data(base64Encoded: folderPath), if let data = Data(base64Encoded: folderPath),
@ -243,7 +231,6 @@ func addFolders(_ folderPath: String) -> String? {
} }
extension String { extension String {
func print() { func print() {
Swift.print(self) Swift.print(self)
} }