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
7 changes: 4 additions & 3 deletions src-tauri/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,7 @@ fn initialize_core_logic(app_handle: &AppHandle) {
app_handle.manage(model_manager.clone());
app_handle.manage(transcription_manager.clone());
app_handle.manage(history_manager.clone());
app_handle.manage(tray::CurrentTrayIconState::new());

// Note: Shortcuts are NOT initialized here.
// The frontend is responsible for calling the `initialize_shortcuts` command
Expand Down Expand Up @@ -253,7 +254,7 @@ fn initialize_core_logic(app_handle: &AppHandle) {
log::error!("Failed to switch model via tray: {}", e);
}
}
tray::update_tray_menu(&app_clone, &tray::TrayIconState::Idle, None);
tray::update_tray_menu(&app_clone, None);
});
}
_ => {}
Expand All @@ -263,7 +264,7 @@ fn initialize_core_logic(app_handle: &AppHandle) {
app_handle.manage(tray);

// Initialize tray menu with idle state
utils::update_tray_menu(app_handle, &utils::TrayIconState::Idle, None);
utils::update_tray_menu(app_handle, None);

// Apply show_tray_icon setting
let settings = settings::get_settings(app_handle);
Expand All @@ -274,7 +275,7 @@ fn initialize_core_logic(app_handle: &AppHandle) {
// Refresh tray menu when model state changes
let app_handle_for_listener = app_handle.clone();
app_handle.listen("model-state-changed", move |_| {
tray::update_tray_menu(&app_handle_for_listener, &tray::TrayIconState::Idle, None);
tray::update_tray_menu(&app_handle_for_listener, None);
});

// Get the autostart manager and configure based on user setting
Expand Down
2 changes: 1 addition & 1 deletion src-tauri/src/shortcut/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1077,7 +1077,7 @@ pub fn change_app_language_setting(app: AppHandle, language: String) -> Result<(
settings::write_settings(&app, settings);

// Refresh the tray menu with the new language
tray::update_tray_menu(&app, &tray::TrayIconState::Idle, Some(&language));
tray::update_tray_menu(&app, Some(&language));

Ok(())
}
Expand Down
31 changes: 26 additions & 5 deletions src-tauri/src/tray.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,37 @@ use crate::managers::transcription::TranscriptionManager;
use crate::settings;
use crate::tray_i18n::get_tray_translations;
use log::{error, info, warn};
use std::sync::Arc;
use std::sync::{Arc, Mutex};
use tauri::image::Image;
use tauri::menu::{CheckMenuItem, Menu, MenuItem, PredefinedMenuItem, Submenu};
use tauri::tray::TrayIcon;
use tauri::{AppHandle, Manager, Theme};
use tauri_plugin_clipboard_manager::ClipboardExt;

#[derive(Clone, Debug, PartialEq)]
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum TrayIconState {
Idle,
Recording,
Transcribing,
}

/// Tauri managed state holding the last icon state set via `change_tray_icon`.
pub struct CurrentTrayIconState(pub Mutex<TrayIconState>);

impl CurrentTrayIconState {
pub fn new() -> Self {
Self(Mutex::new(TrayIconState::Idle))
}

pub fn get(&self) -> TrayIconState {
*self.0.lock().unwrap()
}

fn set(&self, state: TrayIconState) {
*self.0.lock().unwrap() = state;
}
}

#[derive(Clone, Debug, PartialEq)]
pub enum AppTheme {
Dark,
Expand Down Expand Up @@ -66,7 +83,10 @@ pub fn change_tray_icon(app: &AppHandle, icon: TrayIconState) {
let tray = app.state::<TrayIcon>();
let theme = get_current_theme(app);

let icon_path = get_icon_path(theme, icon.clone());
// Store current state
app.state::<CurrentTrayIconState>().set(icon);

let icon_path = get_icon_path(theme, icon);

let _ = tray.set_icon(Some(
Image::from_path(
Expand All @@ -78,10 +98,11 @@ pub fn change_tray_icon(app: &AppHandle, icon: TrayIconState) {
));

// Update menu based on state
update_tray_menu(app, &icon, None);
update_tray_menu(app, None);
}

pub fn update_tray_menu(app: &AppHandle, state: &TrayIconState, locale: Option<&str>) {
pub fn update_tray_menu(app: &AppHandle, locale: Option<&str>) {
let state = app.state::<CurrentTrayIconState>().get();
let settings = settings::get_settings(app);

let locale = locale.unwrap_or(&settings.app_language);
Expand Down
Loading