Skip to content
Merged
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
143 changes: 142 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ tokio = { version = "1", features = ["rt", "rt-multi-thread", "macros"] }
time = { version = "0.3", features = ["formatting"] }
uuid = { version = "1", features = ["v7"] }
tauri = { version = "2", features = ["macos-private-api", "tray-icon"] }
tauri-plugin-dialog = "2"
tauri-plugin-notification = "2"
tauri-plugin-log = "2"
log = "0.4"
Expand Down
1 change: 1 addition & 0 deletions src-tauri/src/app/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ pub fn run() {
let mut builder = tauri::Builder::default()
.plugin(tauri_plugin_log::Builder::new().build())
.plugin(tauri_plugin_notification::init())
.plugin(tauri_plugin_dialog::init())
.invoke_handler(tauri::generate_handler![
ui_bridge::health,
ui_bridge::list_focuses,
Expand Down
57 changes: 49 additions & 8 deletions src-tauri/src/app/tray.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@ use std::sync::Arc;
use adhd_ranch_domain::{cap_state, Focus, Settings};
use adhd_ranch_storage::FocusStore;
use tauri::image::Image;
use tauri::menu::{IsMenuItem, Menu, MenuItemBuilder, PredefinedMenuItem};
use tauri::menu::{IsMenuItem, Menu, MenuItemBuilder, PredefinedMenuItem, SubmenuBuilder};
use tauri::tray::{TrayIcon, TrayIconBuilder};
use tauri::{AppHandle, Runtime};
use tauri::{AppHandle, Manager, Runtime};

const QUIT_ID: &str = "tray-quit";
const NO_FOCUSES_ID: &str = "tray-no-focuses";
const DELETE_PREFIX: &str = "tray-delete-";

pub fn setup<R: Runtime>(
app: &AppHandle<R>,
Expand All @@ -29,8 +30,13 @@ pub fn setup<R: Runtime>(
.menu(&menu)
.show_menu_on_left_click(true)
.on_menu_event(|app, event| {
if event.id().0 == QUIT_ID {
let id = event.id().0.as_str();
if id == QUIT_ID {
app.exit(0);
} else if let Some(focus_id) = id.strip_prefix(DELETE_PREFIX) {
let focus_id = focus_id.to_string();
let app_handle = app.clone();
std::thread::spawn(move || handle_delete(app_handle, focus_id));
}
});

Expand Down Expand Up @@ -86,11 +92,16 @@ fn build_menu<R: Runtime>(handle: &AppHandle<R>, focuses: &[Focus]) -> tauri::Re
.build(handle)?;
items.push(Box::new(item));
} else {
for (i, focus) in focuses.iter().enumerate() {
let item = MenuItemBuilder::with_id(format!("tray-focus-{i}"), &focus.title)
.enabled(false)
.build(handle)?;
items.push(Box::new(item));
for focus in focuses.iter() {
let delete_item = MenuItemBuilder::with_id(
format!("{DELETE_PREFIX}{}", focus.id.0),
format!("Delete \"{}\"…", focus.title),
)
.build(handle)?;
let submenu = SubmenuBuilder::new(handle, &focus.title)
.item(&delete_item)
.build()?;
items.push(Box::new(submenu));
}
}

Expand All @@ -103,6 +114,36 @@ fn build_menu<R: Runtime>(handle: &AppHandle<R>, focuses: &[Focus]) -> tauri::Re
Menu::with_items(handle, &item_refs)
}

fn handle_delete<R: Runtime>(app: AppHandle<R>, focus_id: String) {
use tauri_plugin_dialog::{DialogExt, MessageDialogButtons};

let title = {
app.try_state::<crate::ui_bridge::CommandsState>()
.and_then(|state| state.0.list_focuses().ok())
.and_then(|focuses| focuses.into_iter().find(|f| f.id.0 == focus_id))
.map(|f| f.title)
.unwrap_or_else(|| focus_id.clone())
};

let confirmed = app
.dialog()
.message(format!("\"{}\" will be permanently removed.", title))
.title("Delete Focus?")
.buttons(MessageDialogButtons::OkCancelCustom(
"Delete".to_string(),
"Cancel".to_string(),
))
.blocking_show();

if confirmed {
if let Some(state) = app.try_state::<crate::ui_bridge::CommandsState>() {
if let Err(e) = state.0.delete_focus(&focus_id) {
log::error!("tray delete_focus({focus_id:?}): {e}");
}
}
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.
}

fn red_icon() -> Image<'static> {
const SIZE: u32 = 16;
let rgba: Vec<u8> = (0..SIZE * SIZE)
Expand Down
Loading