Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions apps/desktop-tauri/src-tauri/src/commands/bridge.rs
Original file line number Diff line number Diff line change
Expand Up @@ -661,6 +661,8 @@ pub struct SettingsSnapshot {
predictive_pace_warning_enabled: bool,
show_pace: bool,
tray_icon_mode: &'static str,
stacked_tray_top_provider: Option<String>,
stacked_tray_bottom_provider: Option<String>,
switcher_shows_icons: bool,
menu_bar_shows_highest_usage: bool,
menu_bar_shows_percent: bool,
Expand Down Expand Up @@ -783,6 +785,8 @@ impl From<Settings> for SettingsSnapshot {
predictive_pace_warning_enabled: settings.predictive_pace_warning_enabled,
show_pace: settings.show_pace,
tray_icon_mode: tray_icon_mode_label(settings.tray_icon_mode),
stacked_tray_top_provider: settings.stacked_tray_top_provider,
stacked_tray_bottom_provider: settings.stacked_tray_bottom_provider,
switcher_shows_icons: settings.switcher_shows_icons,
menu_bar_shows_highest_usage: settings.menu_bar_shows_highest_usage,
menu_bar_shows_percent: settings.menu_bar_shows_percent,
Expand Down Expand Up @@ -876,6 +880,7 @@ fn tray_icon_mode_label(mode: TrayIconMode) -> &'static str {
match mode {
TrayIconMode::Single => "single",
TrayIconMode::PerProvider => "perProvider",
TrayIconMode::Stacked => "stacked",
}
}

Expand Down
46 changes: 46 additions & 0 deletions apps/desktop-tauri/src-tauri/src/commands/settings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ pub struct SettingsUpdate {
pub predictive_pace_warning_enabled: Option<bool>,
pub show_pace: Option<bool>,
pub tray_icon_mode: Option<String>,
pub stacked_tray_top_provider: Option<String>,
pub stacked_tray_bottom_provider: Option<String>,
pub switcher_shows_icons: Option<bool>,
pub menu_bar_shows_highest_usage: Option<bool>,
pub menu_bar_shows_percent: Option<bool>,
Expand Down Expand Up @@ -121,6 +123,8 @@ impl SettingsUpdate {

fn refreshes_tray_presentation(&self) -> bool {
self.tray_icon_mode.is_some()
|| self.stacked_tray_top_provider.is_some()
|| self.stacked_tray_bottom_provider.is_some()
|| self.switcher_shows_icons.is_some()
|| self.menu_bar_shows_highest_usage.is_some()
|| self.menu_bar_shows_percent.is_some()
Expand Down Expand Up @@ -190,6 +194,12 @@ impl SettingsUpdate {
{
settings.tray_icon_mode = mode;
}
if let Some(provider) = self.stacked_tray_top_provider.clone() {
settings.stacked_tray_top_provider = normalize_optional_provider_id(provider);
}
if let Some(provider) = self.stacked_tray_bottom_provider.clone() {
settings.stacked_tray_bottom_provider = normalize_optional_provider_id(provider);
}
if let Some(v) = self.provider_metrics.clone() {
apply_provider_metrics(settings, v);
}
Expand Down Expand Up @@ -482,10 +492,16 @@ fn parse_tray_icon_mode(s: &str) -> Option<TrayIconMode> {
match s {
"single" => Some(TrayIconMode::Single),
"perProvider" => Some(TrayIconMode::PerProvider),
"stacked" => Some(TrayIconMode::Stacked),
_ => None,
}
}

fn normalize_optional_provider_id(value: String) -> Option<String> {
let value = value.trim();
(!value.is_empty()).then(|| value.to_string())
}

fn parse_update_channel(s: &str) -> Option<UpdateChannel> {
match s {
"stable" => Some(UpdateChannel::Stable),
Expand Down Expand Up @@ -700,6 +716,36 @@ mod tests {
}
.refreshes_tray_presentation()
);
assert!(
SettingsUpdate {
stacked_tray_top_provider: Some("claude".to_string()),
..Default::default()
}
.refreshes_tray_presentation()
);
}

#[test]
fn stacked_tray_update_accepts_mode_and_clears_automatic_provider() {
let mut settings = Settings {
stacked_tray_top_provider: Some("codex".to_string()),
..Settings::default()
};

SettingsUpdate {
tray_icon_mode: Some("stacked".to_string()),
stacked_tray_top_provider: Some(String::new()),
stacked_tray_bottom_provider: Some("claude".to_string()),
..Default::default()
}
.apply_provider_settings(&mut settings);

assert_eq!(settings.tray_icon_mode, TrayIconMode::Stacked);
assert_eq!(settings.stacked_tray_top_provider, None);
assert_eq!(
settings.stacked_tray_bottom_provider.as_deref(),
Some("claude")
);
}

#[test]
Expand Down
1 change: 1 addition & 0 deletions apps/desktop-tauri/src-tauri/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ mod surface_target;
mod tray_accounts;
mod tray_bridge;
mod tray_menu;
mod tray_presentation;
mod tray_visibility;
mod usage_metric;
mod window_positioner;
Expand Down
Loading