diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..f280d87 Binary files /dev/null and b/.DS_Store differ diff --git a/Cargo.lock b/Cargo.lock index 31cd63d..565d2bc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1055,36 +1055,6 @@ dependencies = [ "error-code", ] -[[package]] -name = "cocoa" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6140449f97a6e97f9511815c5632d84c8aacf8ac271ad77c559218161a1373c" -dependencies = [ - "bitflags 1.3.2", - "block", - "cocoa-foundation", - "core-foundation 0.9.4", - "core-graphics", - "foreign-types 0.5.0", - "libc", - "objc", -] - -[[package]] -name = "cocoa-foundation" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" -dependencies = [ - "bitflags 1.3.2", - "block", - "core-foundation 0.9.4", - "core-graphics-types", - "libc", - "objc", -] - [[package]] name = "codespan-reporting" version = "0.11.1" @@ -2708,7 +2678,6 @@ dependencies = [ "base64 0.21.7", "chrono", "clap", - "cocoa", "dirs 5.0.1", "eframe", "egui", @@ -2718,7 +2687,6 @@ dependencies = [ "log", "notify", "notify-debouncer-mini", - "objc", "regex", "reqwest", "rust-embed", diff --git a/Cargo.toml b/Cargo.toml index e136730..6554452 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,6 +30,3 @@ egui = "0.29" winit = "0.30" env_logger = "0.11" -[target.'cfg(target_os = "macos")'.dependencies] -cocoa = "0.25" -objc = "0.2.7" diff --git a/src/gui/icons.rs.bak b/src/gui/icons.rs.bak new file mode 100644 index 0000000..0b29c1f --- /dev/null +++ b/src/gui/icons.rs.bak @@ -0,0 +1 @@ +// No icon loading functions needed - using programmatically generated icons diff --git a/src/gui/mod.rs b/src/gui/mod.rs index 9f675f8..ddd5dc9 100644 --- a/src/gui/mod.rs +++ b/src/gui/mod.rs @@ -1,3 +1,4 @@ +use eframe::egui; use log::{debug, error, info}; use notify::RecursiveMode; use notify_debouncer_mini::{new_debouncer, DebounceEventResult}; diff --git a/src/gui/settings/cross.rs b/src/gui/settings/cross.rs.bak similarity index 100% rename from src/gui/settings/cross.rs rename to src/gui/settings/cross.rs.bak diff --git a/src/gui/settings/macos.rs b/src/gui/settings/macos.rs.bak similarity index 100% rename from src/gui/settings/macos.rs rename to src/gui/settings/macos.rs.bak diff --git a/src/gui/settings/mod.rs b/src/gui/settings/mod.rs index 8da6b4e..70666ec 100644 --- a/src/gui/settings/mod.rs +++ b/src/gui/settings/mod.rs @@ -1,4 +1,5 @@ use dirs::home_dir; +use eframe::egui; use log::{debug, error, info}; use serde::{Deserialize, Serialize}; use std::fs; @@ -21,8 +22,8 @@ impl Default for KhmSettings { flow: String::new(), known_hosts: "~/.ssh/known_hosts".to_string(), basic_auth: String::new(), - in_place: false, - auto_sync_interval_minutes: 60, // Default to 1 hour + in_place: true, + auto_sync_interval_minutes: 60, } } } @@ -57,17 +58,6 @@ pub fn save_settings(settings: &KhmSettings) -> Result<(), std::io::Error> { Ok(()) } -#[cfg(target_os = "macos")] -mod macos; -#[cfg(target_os = "macos")] -pub use macos::run_settings_window; - -#[cfg(not(target_os = "macos"))] -mod cross; -#[cfg(not(target_os = "macos"))] -pub use cross::run_settings_window; - -// Helper function to expand tilde in path pub fn expand_path(path: &str) -> String { if path.starts_with("~/") { if let Some(home) = home_dir() { @@ -76,3 +66,86 @@ pub fn expand_path(path: &str) -> String { } path.to_string() } + +struct KhmSettingsWindow { + settings: KhmSettings, + auto_sync_interval_str: String, +} + +impl eframe::App for KhmSettingsWindow { + fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { + egui::CentralPanel::default().show(ctx, |ui| { + ui.heading("KHM Settings"); + ui.separator(); + + ui.horizontal(|ui| { + ui.label("Host URL:"); + ui.text_edit_singleline(&mut self.settings.host); + }); + + ui.horizontal(|ui| { + ui.label("Flow Name:"); + ui.text_edit_singleline(&mut self.settings.flow); + }); + + ui.horizontal(|ui| { + ui.label("Known Hosts:"); + ui.text_edit_singleline(&mut self.settings.known_hosts); + }); + + ui.horizontal(|ui| { + ui.label("Basic Auth:"); + ui.text_edit_singleline(&mut self.settings.basic_auth); + }); + + ui.horizontal(|ui| { + ui.label("Auto sync interval (min):"); + ui.text_edit_singleline(&mut self.auto_sync_interval_str); + // Parse the string and update settings + if let Ok(value) = self.auto_sync_interval_str.parse::() { + self.settings.auto_sync_interval_minutes = value; + } + }); + + ui.checkbox(&mut self.settings.in_place, "Update known_hosts file in-place after sync"); + + ui.separator(); + + ui.horizontal(|ui| { + if ui.button("Save").clicked() { + if let Err(e) = save_settings(&self.settings) { + error!("Failed to save KHM settings: {}", e); + } else { + info!("KHM settings saved successfully"); + } + ctx.send_viewport_cmd(egui::ViewportCommand::Close); + } + + if ui.button("Cancel").clicked() { + ctx.send_viewport_cmd(egui::ViewportCommand::Close); + } + }); + }); + } +} + +pub fn run_settings_window() { + let settings = load_settings(); + let auto_sync_interval_str = settings.auto_sync_interval_minutes.to_string(); + + let options = eframe::NativeOptions { + viewport: egui::ViewportBuilder::default() + .with_title("KHM Settings") + .with_inner_size([450.0, 385.0]), + ..Default::default() + }; + + let _ = eframe::run_native( + "KHM Settings", + options, + Box::new(|_cc| Ok(Box::new(KhmSettingsWindow { + settings, + auto_sync_interval_str, + }))), + ); +} diff --git a/static/.DS_Store b/static/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/static/.DS_Store differ diff --git a/static/icon-settings.png b/static/icon-settings.png new file mode 100644 index 0000000..b151bc0 Binary files /dev/null and b/static/icon-settings.png differ diff --git a/static/icon-tray.png b/static/icon-tray.png new file mode 100644 index 0000000..0d7acfb Binary files /dev/null and b/static/icon-tray.png differ