wire TOML export/import to desktop browse UI
This commit is contained in:
parent
c0a0904a44
commit
311fb8ecc7
|
|
@ -13,6 +13,7 @@ serde = { version = "1", features = ["derive"] }
|
||||||
serde_json = "1"
|
serde_json = "1"
|
||||||
toml = { version = "0.8", features = ["preserve_order"] }
|
toml = { version = "0.8", features = ["preserve_order"] }
|
||||||
dirs-next = "2"
|
dirs-next = "2"
|
||||||
|
rfd = "0.15"
|
||||||
|
|
||||||
[target.'cfg(windows)'.build-dependencies]
|
[target.'cfg(windows)'.build-dependencies]
|
||||||
winres = "0.1"
|
winres = "0.1"
|
||||||
|
|
|
||||||
|
|
@ -131,6 +131,8 @@ pub enum Message {
|
||||||
BrowseLoadAsReference(i64),
|
BrowseLoadAsReference(i64),
|
||||||
BrowseDeleteMeasurement(i64),
|
BrowseDeleteMeasurement(i64),
|
||||||
BrowseBack,
|
BrowseBack,
|
||||||
|
ExportSession(i64),
|
||||||
|
ImportSession,
|
||||||
/* LSV analysis */
|
/* LSV analysis */
|
||||||
LsvToggleManual,
|
LsvToggleManual,
|
||||||
/* Misc */
|
/* Misc */
|
||||||
|
|
@ -1176,6 +1178,53 @@ impl App {
|
||||||
self.browse_measurements.clear();
|
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 => {
|
Message::Reconnect => {
|
||||||
self.conn_gen += 1;
|
self.conn_gen += 1;
|
||||||
self.cmd_tx = None;
|
self.cmd_tx = None;
|
||||||
|
|
@ -1910,7 +1959,14 @@ impl App {
|
||||||
|
|
||||||
fn view_browse_sessions(&self) -> Element<'_, Message> {
|
fn view_browse_sessions(&self) -> Element<'_, Message> {
|
||||||
let mut items = column![
|
let mut items = column![
|
||||||
text("Sessions").size(16),
|
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),
|
iced::widget::horizontal_rule(1),
|
||||||
].spacing(4);
|
].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);
|
let mut mlist = column![].spacing(2);
|
||||||
|
|
||||||
if self.browse_measurements.is_empty() {
|
if self.browse_measurements.is_empty() {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue