fix(macos): toggle Join Voice / Share Screen toolbar item labels

setVoiceJoinedState / setShareScreenButton updated only the inner NSButton's
title+image, but the text shown beneath a custom-view NSToolbarItem comes from
the item's label, not the button's title -- so the toolbar kept reading
"Join Voice" / "Share Screen Audio" after joining. Hold references to the
NSToolbarItems and update their label/paletteLabel alongside the button.
This commit is contained in:
2026-06-21 02:09:08 +02:00
parent ef88af14c2
commit c5ad080692

View File

@@ -69,7 +69,9 @@ final class MainWindowController: NSWindowController, NSWindowDelegate {
// MARK: - Toolbar controls (kept as fields so we can update their state) // MARK: - Toolbar controls (kept as fields so we can update their state)
private var joinVoiceButton: NSButton? private var joinVoiceButton: NSButton?
private var joinVoiceItem: NSToolbarItem?
private var shareScreenButton: NSButton? private var shareScreenButton: NSButton?
private var shareScreenItem: NSToolbarItem?
private var muteButton: NSButton? private var muteButton: NSButton?
private var deafenButton: NSButton? private var deafenButton: NSButton?
private var outputVolumeSlider: NSSlider? private var outputVolumeSlider: NSSlider?
@@ -706,6 +708,10 @@ final class MainWindowController: NSWindowController, NSWindowDelegate {
joinVoiceButton?.title = joined ? "Leave Voice" : "Join Voice" joinVoiceButton?.title = joined ? "Leave Voice" : "Join Voice"
joinVoiceButton?.image = NSImage(systemSymbolName: joined ? "mic.fill" : "mic", joinVoiceButton?.image = NSImage(systemSymbolName: joined ? "mic.fill" : "mic",
accessibilityDescription: joined ? "Leave Voice" : "Join Voice") accessibilityDescription: joined ? "Leave Voice" : "Join Voice")
// The text shown beneath a custom-view toolbar item comes from the NSToolbarItem's
// label, not the inner button's title update it too or the label stays "Join Voice".
joinVoiceItem?.label = joined ? "Leave Voice" : "Join Voice"
joinVoiceItem?.paletteLabel = joined ? "Leave Voice" : "Join Voice"
joinVoiceButton?.setAccessibilityLabel(joined ? "Leave Voice — stop sending microphone audio" joinVoiceButton?.setAccessibilityLabel(joined ? "Leave Voice — stop sending microphone audio"
: "Join Voice — start sending microphone audio") : "Join Voice — start sending microphone audio")
muteButton?.isEnabled = joined muteButton?.isEnabled = joined
@@ -739,6 +745,10 @@ final class MainWindowController: NSWindowController, NSWindowDelegate {
shareScreenButton?.image = NSImage( shareScreenButton?.image = NSImage(
systemSymbolName: active ? "rectangle.on.rectangle.angled.fill" : "rectangle.on.rectangle.angled", systemSymbolName: active ? "rectangle.on.rectangle.angled.fill" : "rectangle.on.rectangle.angled",
accessibilityDescription: active ? "Stop Screen Audio" : "Share Screen Audio") accessibilityDescription: active ? "Stop Screen Audio" : "Share Screen Audio")
// Update the toolbar item's label too (see setVoiceJoinedState) the inner button's
// title alone doesn't change the text shown beneath a custom-view toolbar item.
shareScreenItem?.label = active ? "Stop Screen Audio" : "Share Screen Audio"
shareScreenItem?.paletteLabel = active ? "Stop Screen Audio" : "Share Screen Audio"
} }
/// Start ScreenCaptureKit capture for our own SCREEN_AUDIO stream. Called from the /// Start ScreenCaptureKit capture for our own SCREEN_AUDIO stream. Called from the
@@ -1314,6 +1324,7 @@ extension MainWindowController: NSToolbarDelegate {
item.paletteLabel = "Join Voice" item.paletteLabel = "Join Voice"
item.toolTip = "Join or leave voice (⌘⇧V)" item.toolTip = "Join or leave voice (⌘⇧V)"
joinVoiceButton = btn joinVoiceButton = btn
joinVoiceItem = item
case ToolbarID.shareScreen: case ToolbarID.shareScreen:
let btn = makeToolbarButton(symbol: "rectangle.on.rectangle.angled", label: "Share Screen Audio", let btn = makeToolbarButton(symbol: "rectangle.on.rectangle.angled", label: "Share Screen Audio",
@@ -1324,6 +1335,7 @@ extension MainWindowController: NSToolbarDelegate {
item.paletteLabel = "Share Screen Audio" item.paletteLabel = "Share Screen Audio"
item.toolTip = "Share screen audio (⌘⇧S)" item.toolTip = "Share screen audio (⌘⇧S)"
shareScreenButton = btn shareScreenButton = btn
shareScreenItem = item
case ToolbarID.mute: case ToolbarID.mute:
let btn = makeToolbarButton(symbol: "mic.fill", label: "Mute", let btn = makeToolbarButton(symbol: "mic.fill", label: "Mute",