From 8873ff76282ffb6eb32e5450e9c9891c23929d70 Mon Sep 17 00:00:00 2001 From: shinra-electric <50119606+shinra-electric@users.noreply.github.com> Date: Sat, 31 Jan 2026 13:35:57 +0000 Subject: [PATCH 1/9] Add unlock framerate button --- .../swiftui/EmulationToolbarItems.swift | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/frontend/swiftui/EmulationToolbarItems.swift b/src/frontend/swiftui/EmulationToolbarItems.swift index 37c0eac1..d11714c4 100644 --- a/src/frontend/swiftui/EmulationToolbarItems.swift +++ b/src/frontend/swiftui/EmulationToolbarItems.swift @@ -4,6 +4,7 @@ struct EmulationToolbarItems: ToolbarContent { @EnvironmentObject var globalState: GlobalState @State private var isRunning: Bool = false + @State private var isFramerateUnlocked = false var body: some ToolbarContent { #if os(macOS) @@ -29,6 +30,38 @@ struct EmulationToolbarItems: ToolbarContent { } } + ToolbarItemGroup(placement: .confirmationAction) { + if isFramerateUnlocked { + Button{ + isFramerateUnlocked.toggle() + } label: { + ZStack { + Image(systemName: "square.stack.3d.down.forward") + Image(systemName: "lock") + .symbolVariant(.none) + .font(.footnote) + .offset(x: 10, y: 5) + } + } + .help("Unlock Framerate") + } else { + Button{ + isFramerateUnlocked.toggle() + } label: { + ZStack { + Image(systemName: "square.stack.3d.down.forward") + Image(systemName: "lock.open") + .symbolVariant(.none) + .font(.footnote) + .offset(x: 10, y: 5) + } + } + .help("Lock Framerate to 60fps") + } + } + + ToolbarSpacer(.fixed) + ToolbarItemGroup(placement: .confirmationAction) { Button("Console Mode", systemImage: "inset.filled.tv") { globalState.isHandheldMode.toggle() From de32c4a4921e715c49765e8f08435a84f66b5fa9 Mon Sep 17 00:00:00 2001 From: shinra-electric <50119606+shinra-electric@users.noreply.github.com> Date: Sat, 31 Jan 2026 13:49:11 +0000 Subject: [PATCH 2/9] ToolbarSpacer is for macOS 26 or later --- src/frontend/swiftui/EmulationToolbarItems.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/frontend/swiftui/EmulationToolbarItems.swift b/src/frontend/swiftui/EmulationToolbarItems.swift index d11714c4..52430e5f 100644 --- a/src/frontend/swiftui/EmulationToolbarItems.swift +++ b/src/frontend/swiftui/EmulationToolbarItems.swift @@ -60,7 +60,9 @@ struct EmulationToolbarItems: ToolbarContent { } } - ToolbarSpacer(.fixed) + if #available(macOS 26, *) { + ToolbarSpacer(.fixed) + } ToolbarItemGroup(placement: .confirmationAction) { Button("Console Mode", systemImage: "inset.filled.tv") { From d246c6ed242a7f26faa6271e70cb1a439503a60b Mon Sep 17 00:00:00 2001 From: shinra-electric <50119606+shinra-electric@users.noreply.github.com> Date: Mon, 2 Feb 2026 14:30:22 +0000 Subject: [PATCH 3/9] Fix compiling on Sequoia --- src/frontend/swiftui/EmulationToolbarItems.swift | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/frontend/swiftui/EmulationToolbarItems.swift b/src/frontend/swiftui/EmulationToolbarItems.swift index 52430e5f..340ed2fb 100644 --- a/src/frontend/swiftui/EmulationToolbarItems.swift +++ b/src/frontend/swiftui/EmulationToolbarItems.swift @@ -60,9 +60,12 @@ struct EmulationToolbarItems: ToolbarContent { } } - if #available(macOS 26, *) { - ToolbarSpacer(.fixed) - } + // This compiler check is only needed when compiling on a macOS version earlier than 26 + #if compiler(>=6.2.3) + if #available(macOS 26.0, *) { + ToolbarSpacer(.fixed) + } + #endif ToolbarItemGroup(placement: .confirmationAction) { Button("Console Mode", systemImage: "inset.filled.tv") { @@ -82,5 +85,4 @@ struct EmulationToolbarItems: ToolbarContent { ToolbarItemGroup(placement: .principal) {} #endif } - } From 41ecec187918d39aa3a6f5aaadaa560b37c0ceb1 Mon Sep 17 00:00:00 2001 From: shinra-electric <50119606+shinra-electric@users.noreply.github.com> Date: Mon, 2 Feb 2026 15:58:28 +0000 Subject: [PATCH 4/9] Use picker for selecting handheld mode --- .../swiftui/EmulationToolbarItems.swift | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/frontend/swiftui/EmulationToolbarItems.swift b/src/frontend/swiftui/EmulationToolbarItems.swift index 340ed2fb..0bfb3c97 100644 --- a/src/frontend/swiftui/EmulationToolbarItems.swift +++ b/src/frontend/swiftui/EmulationToolbarItems.swift @@ -68,17 +68,16 @@ struct EmulationToolbarItems: ToolbarContent { #endif ToolbarItemGroup(placement: .confirmationAction) { - Button("Console Mode", systemImage: "inset.filled.tv") { - globalState.isHandheldMode.toggle() + Picker("Mode", selection: $globalState.isHandheldMode) { + Label("Console Mode", systemImage: "inset.filled.tv") + .tag(false) + .help("Change to Console Mode") + + Label("Handheld Mode", systemImage: "formfitting.gamecontroller.fill") + .tag(true) + .help("Change to Handheld Mode") } - .disabled(!globalState.isHandheldMode) - .help("Change to Console mode") - - Button("Handheld Mode", systemImage: "formfitting.gamecontroller.fill") { - globalState.isHandheldMode.toggle() - } - .disabled(globalState.isHandheldMode) - .help("Change to Handheld mode") + .pickerStyle(.segmented) } #else // TODO: options From 133f3b3d7d00539c0d67719149fd717a002f3164 Mon Sep 17 00:00:00 2001 From: shinra-electric <50119606+shinra-electric@users.noreply.github.com> Date: Mon, 2 Feb 2026 16:13:08 +0000 Subject: [PATCH 5/9] Only have one console mode button on Sequoia --- .../swiftui/EmulationToolbarItems.swift | 39 ++++++++++++++----- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/src/frontend/swiftui/EmulationToolbarItems.swift b/src/frontend/swiftui/EmulationToolbarItems.swift index 0bfb3c97..ea784a42 100644 --- a/src/frontend/swiftui/EmulationToolbarItems.swift +++ b/src/frontend/swiftui/EmulationToolbarItems.swift @@ -67,17 +67,36 @@ struct EmulationToolbarItems: ToolbarContent { } #endif - ToolbarItemGroup(placement: .confirmationAction) { - Picker("Mode", selection: $globalState.isHandheldMode) { - Label("Console Mode", systemImage: "inset.filled.tv") - .tag(false) - .help("Change to Console Mode") - - Label("Handheld Mode", systemImage: "formfitting.gamecontroller.fill") - .tag(true) - .help("Change to Handheld Mode") + if #available(macOS 26.0, *) { + ToolbarItemGroup(placement: .confirmationAction) { + Button("Console Mode", systemImage: "inset.filled.tv") { + globalState.isHandheldMode.toggle() + } + .disabled(!globalState.isHandheldMode) + .help("Change to Console mode") + + Button("Handheld Mode", systemImage: "formfitting.gamecontroller.fill") { + globalState.isHandheldMode.toggle() + } + .disabled(globalState.isHandheldMode) + .help("Change to Handheld mode") + } + } else { + ToolbarItemGroup(placement: .confirmationAction) { + if globalState.isHandheldMode { + Button("Console Mode", systemImage: "inset.filled.tv") { + globalState.isHandheldMode.toggle() + } + .disabled(!globalState.isHandheldMode) + .help("Change to Console mode") + } else { + Button("Handheld Mode", systemImage: "formfitting.gamecontroller.fill") { + globalState.isHandheldMode.toggle() + } + .disabled(globalState.isHandheldMode) + .help("Change to Handheld mode") + } } - .pickerStyle(.segmented) } #else // TODO: options From eb28a6641583d6acaaf6e4da724077cef0b17bbe Mon Sep 17 00:00:00 2001 From: shinra-electric <50119606+shinra-electric@users.noreply.github.com> Date: Mon, 2 Feb 2026 16:17:07 +0000 Subject: [PATCH 6/9] Remove disabled modifiers from Sequoia --- src/frontend/swiftui/EmulationToolbarItems.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/frontend/swiftui/EmulationToolbarItems.swift b/src/frontend/swiftui/EmulationToolbarItems.swift index ea784a42..d742c797 100644 --- a/src/frontend/swiftui/EmulationToolbarItems.swift +++ b/src/frontend/swiftui/EmulationToolbarItems.swift @@ -87,13 +87,11 @@ struct EmulationToolbarItems: ToolbarContent { Button("Console Mode", systemImage: "inset.filled.tv") { globalState.isHandheldMode.toggle() } - .disabled(!globalState.isHandheldMode) .help("Change to Console mode") } else { Button("Handheld Mode", systemImage: "formfitting.gamecontroller.fill") { globalState.isHandheldMode.toggle() } - .disabled(globalState.isHandheldMode) .help("Change to Handheld mode") } } From fe7fec27aab48e7b1efcec3da879df8cf8781bf4 Mon Sep 17 00:00:00 2001 From: shinra-electric <50119606+shinra-electric@users.noreply.github.com> Date: Tue, 3 Feb 2026 16:57:29 +0000 Subject: [PATCH 7/9] Switch function of lock/unlock --- src/frontend/swiftui/EmulationToolbarItems.swift | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/frontend/swiftui/EmulationToolbarItems.swift b/src/frontend/swiftui/EmulationToolbarItems.swift index d742c797..e93df9d6 100644 --- a/src/frontend/swiftui/EmulationToolbarItems.swift +++ b/src/frontend/swiftui/EmulationToolbarItems.swift @@ -37,26 +37,26 @@ struct EmulationToolbarItems: ToolbarContent { } label: { ZStack { Image(systemName: "square.stack.3d.down.forward") - Image(systemName: "lock") + Image(systemName: "lock.open") .symbolVariant(.none) .font(.footnote) - .offset(x: 10, y: 5) + .offset(x: 10, y: 5) } } - .help("Unlock Framerate") + .help("Lock Framerate to 60fps") } else { Button{ isFramerateUnlocked.toggle() } label: { ZStack { Image(systemName: "square.stack.3d.down.forward") - Image(systemName: "lock.open") + Image(systemName: "lock") .symbolVariant(.none) .font(.footnote) - .offset(x: 10, y: 5) + .offset(x: 10, y: 5) } } - .help("Lock Framerate to 60fps") + .help("Unlock Framerate") } } From 4373fafdca77683929c1a3b682a056b75031f41e Mon Sep 17 00:00:00 2001 From: shinra-electric <50119606+shinra-electric@users.noreply.github.com> Date: Tue, 3 Feb 2026 17:17:01 +0000 Subject: [PATCH 8/9] Revert tooltips --- src/frontend/swiftui/EmulationToolbarItems.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/frontend/swiftui/EmulationToolbarItems.swift b/src/frontend/swiftui/EmulationToolbarItems.swift index e93df9d6..3e7de289 100644 --- a/src/frontend/swiftui/EmulationToolbarItems.swift +++ b/src/frontend/swiftui/EmulationToolbarItems.swift @@ -43,7 +43,7 @@ struct EmulationToolbarItems: ToolbarContent { .offset(x: 10, y: 5) } } - .help("Lock Framerate to 60fps") + .help("Unlock Framerate") } else { Button{ isFramerateUnlocked.toggle() @@ -56,7 +56,7 @@ struct EmulationToolbarItems: ToolbarContent { .offset(x: 10, y: 5) } } - .help("Unlock Framerate") + .help("Lock Framerate to 60fps") } } From 9c9a1a61af57aec3da0bea752323752b3914677f Mon Sep 17 00:00:00 2001 From: shinra-electric <50119606+shinra-electric@users.noreply.github.com> Date: Tue, 3 Feb 2026 17:27:46 +0000 Subject: [PATCH 9/9] Fiddle with the lock/unlock state again --- src/frontend/swiftui/EmulationToolbarItems.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/frontend/swiftui/EmulationToolbarItems.swift b/src/frontend/swiftui/EmulationToolbarItems.swift index 3e7de289..8887b161 100644 --- a/src/frontend/swiftui/EmulationToolbarItems.swift +++ b/src/frontend/swiftui/EmulationToolbarItems.swift @@ -37,26 +37,26 @@ struct EmulationToolbarItems: ToolbarContent { } label: { ZStack { Image(systemName: "square.stack.3d.down.forward") - Image(systemName: "lock.open") + Image(systemName: "lock") .symbolVariant(.none) .font(.footnote) .offset(x: 10, y: 5) } } - .help("Unlock Framerate") + .help("Lock Framerate to 60fps") } else { Button{ isFramerateUnlocked.toggle() } label: { ZStack { Image(systemName: "square.stack.3d.down.forward") - Image(systemName: "lock") + Image(systemName: "lock.open") .symbolVariant(.none) .font(.footnote) .offset(x: 10, y: 5) } } - .help("Lock Framerate to 60fps") + .help("Unlock Framerate") } }