implement phase 5~7

This commit is contained in:
ms2k 2026-03-31 22:28:07 +09:00
commit 6140548774

View file

@ -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);
}
});
}
}