wire TOML export/import to desktop browse UI

This commit is contained in:
jess 2026-04-02 21:15:18 -07:00
parent c0a0904a44
commit 311fb8ecc7
2 changed files with 66 additions and 1 deletions

View File

@ -13,6 +13,7 @@ serde = { version = "1", features = ["derive"] }
serde_json = "1"
toml = { version = "0.8", features = ["preserve_order"] }
dirs-next = "2"
rfd = "0.15"
[target.'cfg(windows)'.build-dependencies]
winres = "0.1"

View File

@ -131,6 +131,8 @@ pub enum Message {
BrowseLoadAsReference(i64),
BrowseDeleteMeasurement(i64),
BrowseBack,
ExportSession(i64),
ImportSession,
/* LSV analysis */
LsvToggleManual,
/* Misc */
@ -1176,6 +1178,53 @@ impl App {
self.browse_measurements.clear();
}
}
Message::ExportSession(sid) => {
match self.storage.export_session(sid) {
Ok(toml_str) => {
let name = self.browse_sessions.iter()
.find(|(s, _)| s.id == sid)
.map(|(s, _)| s.name.clone())
.unwrap_or_else(|| format!("session_{}", sid));
let filename = format!("{}.toml", name.replace(' ', "_"));
let dialog = rfd::FileDialog::new()
.set_file_name(&filename)
.add_filter("TOML", &["toml"]);
if let Some(path) = dialog.save_file() {
match std::fs::write(&path, &toml_str) {
Ok(_) => self.status = format!("Exported to {}", path.display()),
Err(e) => self.status = format!("Write failed: {}", e),
}
}
}
Err(e) => self.status = format!("Export failed: {}", e),
}
}
Message::ImportSession => {
let dialog = rfd::FileDialog::new()
.add_filter("TOML", &["toml"]);
if let Some(path) = dialog.pick_file() {
match std::fs::read_to_string(&path) {
Ok(toml_str) => {
match self.storage.import_session(&toml_str) {
Ok(_) => {
self.browse_sessions = self.storage.list_sessions()
.unwrap_or_default()
.into_iter()
.map(|s| {
let cnt = self.storage.measurement_count(s.id).unwrap_or(0);
(s, cnt)
})
.collect();
self.sessions = self.storage.list_sessions().unwrap_or_default();
self.status = format!("Imported from {}", path.display());
}
Err(e) => self.status = format!("Import failed: {}", e),
}
}
Err(e) => self.status = format!("Read failed: {}", e),
}
}
}
Message::Reconnect => {
self.conn_gen += 1;
self.cmd_tx = None;
@ -1910,7 +1959,14 @@ impl App {
fn view_browse_sessions(&self) -> Element<'_, Message> {
let mut items = column![
row![
text("Sessions").size(16),
iced::widget::horizontal_space(),
button(text("Import").size(11))
.style(style_apply())
.padding([4, 8])
.on_press(Message::ImportSession),
].align_y(iced::Alignment::Center),
iced::widget::horizontal_rule(1),
].spacing(4);
@ -1986,6 +2042,14 @@ impl App {
);
}
header = header.push(iced::widget::horizontal_space());
header = header.push(
button(text("Export").size(11))
.style(style_apply())
.padding([4, 12])
.on_press(Message::ExportSession(sid)),
);
let mut mlist = column![].spacing(2);
if self.browse_measurements.is_empty() {