Create a swappable UI component #160
|
@ -1031,6 +1031,7 @@ dependencies = [
|
|||
"glib-build-tools 0.18.0",
|
||||
"gtk4",
|
||||
"libadwaita",
|
||||
"thiserror",
|
||||
"tokio",
|
||||
]
|
||||
|
||||
|
|
|
@ -16,6 +16,7 @@ ft-core = { path = "../core" }
|
|||
gio = { version = "0.18" }
|
||||
glib = { version = "0.18" }
|
||||
gtk = { version = "0.7", package = "gtk4", features = [ "v4_10" ] }
|
||||
thiserror = { version = "1.0" }
|
||||
tokio = { version = "1.34", features = [ "full" ] }
|
||||
|
||||
[build-dependencies]
|
||||
|
|
|
@ -22,11 +22,16 @@ use std::{
|
|||
path::PathBuf,
|
||||
sync::{Arc, RwLock},
|
||||
};
|
||||
use thiserror::Error;
|
||||
use tokio::runtime::Runtime;
|
||||
|
||||
#[derive(Debug, Error)]
|
||||
pub enum AppError {
|
||||
#[error("no database loaded")]
|
||||
NoDatabase,
|
||||
#[error("failed to open the database")]
|
||||
FailedToOpenDatabase,
|
||||
#[error("unhandled error")]
|
||||
Unhandled,
|
||||
}
|
||||
|
||||
|
|
|
@ -281,7 +281,6 @@ impl DayEdit {
|
|||
let s = s.clone();
|
||||
let records = records.clone();
|
||||
move || {
|
||||
println!("saving to database");
|
||||
let weight_record = records.iter().find_map(|record| match record {
|
||||
Record {
|
||||
id,
|
||||
|
|
|
@ -73,7 +73,6 @@ impl<T: Clone + std::fmt::Debug + 'static> TextEntry<T> {
|
|||
}
|
||||
match (self.parser)(buffer.text().as_str()) {
|
||||
Ok(v) => {
|
||||
println!("setting the value: {}", (self.renderer)(&v));
|
||||
*self.value.borrow_mut() = Some(v);
|
||||
self.widget.remove_css_class("error");
|
||||
}
|
||||
|
@ -86,7 +85,6 @@ impl<T: Clone + std::fmt::Debug + 'static> TextEntry<T> {
|
|||
|
||||
pub fn value(&self) -> Option<T> {
|
||||
let v = self.value.borrow().clone();
|
||||
println!("retrieving the value: {:?}", v.map(|v| (self.renderer)(&v)));
|
||||
self.value.borrow().clone()
|
||||
}
|
||||
|
||||
|
|
|
@ -109,40 +109,56 @@ impl DayDetailView {
|
|||
let s = self.clone();
|
||||
let app = self.imp().app.clone();
|
||||
Box::new(move |record| {
|
||||
let s = s.clone();
|
||||
let app = app.clone();
|
||||
glib::spawn_future_local({
|
||||
async move {
|
||||
match &*app.borrow() {
|
||||
Some(app) => {
|
||||
let _ = app.put_record(record).await;
|
||||
let id = app
|
||||
.put_record(record.clone())
|
||||
.await
|
||||
.expect("successful write");
|
||||
s.imp()
|
||||
.records
|
||||
.borrow_mut()
|
||||
.push(Record { id, data: record });
|
||||
}
|
||||
None => {}
|
||||
}
|
||||
s.view();
|
||||
}
|
||||
});
|
||||
s.view();
|
||||
})
|
||||
}
|
||||
|
||||
fn on_update_record(&self) -> Box<dyn Fn(Record<ft_core::TraxRecord>)> {
|
||||
let s = self.clone();
|
||||
let app = self.imp().app.clone();
|
||||
Box::new(move |record| {
|
||||
Box::new(move |updated_record| {
|
||||
let app = app.clone();
|
||||
|
||||
let mut records = s.imp().records.borrow_mut();
|
||||
let idx = records.iter().position(|r| r.id == updated_record.id);
|
||||
match idx {
|
||||
Some(i) => records[i] = updated_record.clone(),
|
||||
None => records.push(updated_record.clone()),
|
||||
}
|
||||
|
||||
glib::spawn_future_local({
|
||||
let s = s.clone();
|
||||
async move {
|
||||
println!("record: {:?}", record);
|
||||
match &*app.borrow() {
|
||||
Some(app) => {
|
||||
let _ = app.update_record(record).await;
|
||||
let _ = app.update_record(updated_record).await;
|
||||
}
|
||||
None => {
|
||||
println!("no app!");
|
||||
}
|
||||
}
|
||||
s.view();
|
||||
}
|
||||
});
|
||||
s.view();
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue