implement phase 5~7
This commit is contained in:
parent
8664a80f1e
commit
6140548774
1 changed files with 591 additions and 6 deletions
36
src/app.rs
36
src/app.rs
|
|
@ -9,7 +9,9 @@ use crate::config::Config;
|
|||
use crate::countries::{get_countries, Country};
|
||||
use crate::flags;
|
||||
use crate::nordvpn::{self, CmdResult, Poller};
|
||||
use crate::ui::config_dialog::{ConfigDialog, DialogResult};
|
||||
use crate::ui::country_selector::CountrySelector;
|
||||
use crate::world_map::WorldMap;
|
||||
|
||||
pub struct App {
|
||||
config: Config,
|
||||
|
|
@ -22,6 +24,8 @@ pub struct App {
|
|||
/// Fully loaded flag textures, keyed by nordvpn_key.
|
||||
flag_textures: HashMap<String, egui::TextureHandle>,
|
||||
selector: CountrySelector,
|
||||
world_map: WorldMap,
|
||||
config_dialog: Option<ConfigDialog>,
|
||||
/// Last connect/disconnect result shown inline below the status bar.
|
||||
notification: Option<String>,
|
||||
}
|
||||
|
|
@ -46,6 +50,8 @@ impl App {
|
|||
flag_rx,
|
||||
flag_textures: HashMap::new(),
|
||||
selector: CountrySelector::default(),
|
||||
world_map: WorldMap::new(),
|
||||
config_dialog: None,
|
||||
notification: None,
|
||||
}
|
||||
}
|
||||
|
|
@ -130,12 +136,31 @@ impl eframe::App for App {
|
|||
}
|
||||
ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {
|
||||
if ui.button("Configure").clicked() {
|
||||
// Phase 7
|
||||
self.config_dialog = Some(ConfigDialog::new(&self.config));
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// ── Config dialog ────────────────────────────────────────────────────
|
||||
if let Some(dialog) = &mut self.config_dialog {
|
||||
match dialog.show(ctx, &self.countries) {
|
||||
DialogResult::Apply(new_cfg) => {
|
||||
self.poller.update_config(
|
||||
new_cfg.external_app.clone(),
|
||||
new_cfg.refresh_rate,
|
||||
);
|
||||
self.config = new_cfg;
|
||||
if let Err(e) = self.config.save() {
|
||||
self.notification = Some(format!("Failed to save config: {e}"));
|
||||
}
|
||||
self.config_dialog = None;
|
||||
}
|
||||
DialogResult::Cancel => self.config_dialog = None,
|
||||
DialogResult::Open => {}
|
||||
}
|
||||
}
|
||||
|
||||
// ── Left panel — country selector ───────────────────────────────────
|
||||
let panel_width = ctx.screen_rect().width() * 0.3;
|
||||
let connect_key =
|
||||
|
|
@ -158,11 +183,12 @@ impl eframe::App for App {
|
|||
self.spawn_connect(key);
|
||||
}
|
||||
|
||||
// ── Central panel — world map placeholder ───────────────────────────
|
||||
// ── Central panel — world map ────────────────────────────────────────
|
||||
egui::CentralPanel::default().show(ctx, |ui| {
|
||||
ui.centered_and_justified(|ui| {
|
||||
ui.weak("World map — Phase 5");
|
||||
});
|
||||
if let Some(key) = self.world_map.show(ui, &self.countries, status.country.as_deref()) {
|
||||
self.notification = None;
|
||||
self.spawn_connect(key);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue