some ux improvements
This commit is contained in:
parent
33f81be159
commit
8207a76a2f
|
@ -125,7 +125,7 @@ fn build_ui(app: &Application) {
|
||||||
@strong app, @strong memory_cards_edit => move |_b: &Button| {
|
@strong app, @strong memory_cards_edit => move |_b: &Button| {
|
||||||
switch_to(&app, AppWindow::MemoryCardsEditScene);
|
switch_to(&app, AppWindow::MemoryCardsEditScene);
|
||||||
memory_cards_edit.imp().query_cards(None);
|
memory_cards_edit.imp().query_cards(None);
|
||||||
memory_cards_edit.imp().update_state();
|
// memory_cards_edit.imp().update_state();
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -147,6 +147,7 @@ fn build_ui(app: &Application) {
|
||||||
@strong app, @strong memory_cards_game => move |_b: &Button| {
|
@strong app, @strong memory_cards_game => move |_b: &Button| {
|
||||||
switch_to(&app, AppWindow::MemoryCardsGameScene);
|
switch_to(&app, AppWindow::MemoryCardsGameScene);
|
||||||
memory_cards_game.imp().update_card();
|
memory_cards_game.imp().update_card();
|
||||||
|
// memory_cards_game.imp().u
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
|
@ -72,7 +72,7 @@ impl ObjectImpl for MemoryCardsEditScene {
|
||||||
}));
|
}));
|
||||||
new_win.get_done_button().connect_closure("clicked", true, closure_local!(@strong binding => move |_w: &Button| {
|
new_win.get_done_button().connect_closure("clicked", true, closure_local!(@strong binding => move |_w: &Button| {
|
||||||
binding.imp().query_cards(None);
|
binding.imp().query_cards(None);
|
||||||
binding.imp().update_state();
|
binding.imp().build_factory();
|
||||||
}));
|
}));
|
||||||
new_win.present();
|
new_win.present();
|
||||||
}));
|
}));
|
||||||
|
@ -88,14 +88,15 @@ impl ObjectImpl for MemoryCardsEditScene {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
binding.imp().update_state();
|
// binding.imp().update_state();
|
||||||
}));
|
}));
|
||||||
self.update_state();
|
self.query_cards(None);
|
||||||
|
self.build_factory();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MemoryCardsEditScene {
|
impl MemoryCardsEditScene {
|
||||||
pub fn update_state(&self) {
|
pub fn build_factory(&self) {
|
||||||
let model = ListStore::new::<CardGObject>();
|
let model = ListStore::new::<CardGObject>();
|
||||||
model.extend_from_slice(&self.displaying_cards.borrow());
|
model.extend_from_slice(&self.displaying_cards.borrow());
|
||||||
|
|
||||||
|
@ -137,7 +138,7 @@ impl MemoryCardsEditScene {
|
||||||
b.set_visible(false);
|
b.set_visible(false);
|
||||||
gtk::glib::MainContext::default().spawn_local(new_card_setup(Rc::clone(&new_win)));
|
gtk::glib::MainContext::default().spawn_local(new_card_setup(Rc::clone(&new_win)));
|
||||||
}));
|
}));
|
||||||
new_win.get_done_button().connect_closure("clicked", true, closure_local!(@strong binding, @strong new_win as w, @strong card => move |_w: &Button| {
|
new_win.get_done_button().connect_closure("clicked", true, closure_local!(@strong new_win as w, @strong card => move |_w: &Button| {
|
||||||
let conn = Connection::open(get_db_path()).unwrap();
|
let conn = Connection::open(get_db_path()).unwrap();
|
||||||
|
|
||||||
let hieroglyph = w.get_hieroglyph_input();
|
let hieroglyph = w.get_hieroglyph_input();
|
||||||
|
@ -166,7 +167,6 @@ impl MemoryCardsEditScene {
|
||||||
card.set_reading(reading);
|
card.set_reading(reading);
|
||||||
card.set_translation(translation);
|
card.set_translation(translation);
|
||||||
|
|
||||||
binding.imp().update_state();
|
|
||||||
w.close();
|
w.close();
|
||||||
}));
|
}));
|
||||||
new_win.present();
|
new_win.present();
|
||||||
|
@ -191,7 +191,7 @@ impl MemoryCardsEditScene {
|
||||||
connection.execute("DELETE FROM cards WHERE hieroglyph = ?1", [&card.hieroglyph()]).unwrap();
|
connection.execute("DELETE FROM cards WHERE hieroglyph = ?1", [&card.hieroglyph()]).unwrap();
|
||||||
let position = self_binding.imp().displaying_cards.borrow().iter().position(|c| *c == card).unwrap();
|
let position = self_binding.imp().displaying_cards.borrow().iter().position(|c| *c == card).unwrap();
|
||||||
self_binding.imp().displaying_cards.borrow_mut().remove(position);
|
self_binding.imp().displaying_cards.borrow_mut().remove(position);
|
||||||
self_binding.imp().update_state();
|
// self_binding.imp().update_state();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
card_gobject.bind_property("imagepath", card_object_to_display.get_image_widget(), "file").sync_create().build();
|
card_gobject.bind_property("imagepath", card_object_to_display.get_image_widget(), "file").sync_create().build();
|
||||||
|
@ -222,16 +222,12 @@ impl MemoryCardsEditScene {
|
||||||
|
|
||||||
let cards_iter = stmt
|
let cards_iter = stmt
|
||||||
.query_map([], |row| {
|
.query_map([], |row| {
|
||||||
let image_path: String = match row.get(0) {
|
|
||||||
Ok(path) => path,
|
|
||||||
Err(_) => String::from(""),
|
|
||||||
};
|
|
||||||
let c = Card::new(
|
let c = Card::new(
|
||||||
Some(get_images_store_path() + &image_path),
|
Some(get_images_store_path() + &row.get(0).unwrap_or(String::from(""))),
|
||||||
Some(row.get(1).unwrap()),
|
Some(row.get(1).unwrap_or(String::from(""))),
|
||||||
Some(row.get(2).unwrap()),
|
Some(row.get(2).unwrap_or(String::from(""))),
|
||||||
Some(row.get(3).unwrap()),
|
Some(row.get(3).unwrap_or(String::from(""))),
|
||||||
Some(row.get(4).unwrap()),
|
Some(row.get(4).unwrap_or(false)),
|
||||||
);
|
);
|
||||||
let entry = CardGObject::new(Some(c));
|
let entry = CardGObject::new(Some(c));
|
||||||
Ok(entry)
|
Ok(entry)
|
||||||
|
@ -261,47 +257,66 @@ async fn new_card_setup<W: IsA<gtk::Window>>(window: Rc<W>) {
|
||||||
);
|
);
|
||||||
|
|
||||||
let path = RefCell::new(String::from(""));
|
let path = RefCell::new(String::from(""));
|
||||||
dialog.run_async(clone!( @strong path, @strong w, @strong picture_widget => move |a, _b| {
|
dialog.run_async(
|
||||||
let c = a.file().unwrap()
|
clone!( @strong path, @strong w, @strong picture_widget => move |a, _b| {
|
||||||
.path().unwrap()
|
let c = a.file().unwrap()
|
||||||
.as_os_str().to_owned()
|
.path().unwrap()
|
||||||
.to_str().unwrap()
|
.as_os_str().to_owned()
|
||||||
.to_string(); // 0_0
|
.to_str().unwrap()
|
||||||
*path.borrow_mut() = c;
|
.to_string(); // 0_0
|
||||||
a.close();
|
*path.borrow_mut() = c;
|
||||||
|
a.close();
|
||||||
|
|
||||||
picture_widget.set_file(Some(&gio::File::for_path(Path::new(path.borrow().as_str()))));
|
picture_widget.set_file(Some(&gio::File::for_path(Path::new(path.borrow().as_str()))));
|
||||||
|
|
||||||
let images_store_path = get_program_home_path() + "/images";
|
let images_store_path = get_program_home_path() + "/images";
|
||||||
|
|
||||||
match fs::create_dir_all(&images_store_path) {
|
match fs::create_dir_all(&images_store_path) {
|
||||||
Ok(_) => {}
|
Ok(_) => {}
|
||||||
Err(error) => match error.kind() {
|
Err(error) => match error.kind() {
|
||||||
ErrorKind::AlreadyExists => {}
|
ErrorKind::AlreadyExists => {}
|
||||||
_ => panic!("Could not create directory for storing images!"),
|
_ => panic!("Could not create directory for storing images!"),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
w.get_done_button().connect_closure(
|
w.get_done_button().connect_closure(
|
||||||
"clicked",
|
"clicked",
|
||||||
false,
|
false,
|
||||||
closure_local!(@strong w, @strong path => move |_b: &Button| {
|
closure_local!(@strong w, @strong path => move |_b: &Button| {
|
||||||
let p = path.borrow();
|
let p = path.borrow();
|
||||||
let p = p.as_str();
|
let p = p.as_str();
|
||||||
let hash = try_digest(path.borrow().as_str()).unwrap();
|
let hash = try_digest(path.borrow().as_str()).unwrap();
|
||||||
let extenstion = Path::new(p).extension().unwrap().to_str().unwrap();
|
let extenstion = Path::new(p).extension().unwrap().to_str().unwrap();
|
||||||
let new_filename: String = hash.as_str().to_owned() + "." + extenstion;
|
let new_filename: String = hash.as_str().to_owned() + "." + extenstion;
|
||||||
let stored_image_path = Path::new(&images_store_path).join(&new_filename);
|
let stored_image_path = Path::new(&images_store_path).join(&new_filename);
|
||||||
fs::copy(&p, stored_image_path).expect("Error copying image to store");
|
fs::copy(&p, stored_image_path).expect("Error copying image to store");
|
||||||
|
|
||||||
let hieroglyph = w.get_hieroglyph_input();
|
let hieroglyph = w.get_hieroglyph_input();
|
||||||
let conn = Connection::open(get_db_path()).unwrap();
|
let reading = w.get_reading_input();
|
||||||
|
let translation = w.get_translation_input();
|
||||||
|
let conn = Connection::open(get_db_path()).unwrap();
|
||||||
|
|
||||||
conn.execute("UPDATE cards SET imagename = ?1 WHERE hieroglyph = ?2", (&new_filename, &hieroglyph)).unwrap();
|
conn.execute("INSERT OR REPLACE INTO cards ( id,
|
||||||
conn.execute("UPDATE cards SET is_learning = TRUE WHERE hieroglyph = ?1", [&hieroglyph]).unwrap();
|
imagename,
|
||||||
}),
|
hieroglyph,
|
||||||
);
|
reading,
|
||||||
}));
|
translation,
|
||||||
|
is_learning
|
||||||
|
) VALUES (
|
||||||
|
(SELECT id FROM cards WHERE hieroglyph = ?2),
|
||||||
|
?1,
|
||||||
|
?2,
|
||||||
|
?3,
|
||||||
|
?4,
|
||||||
|
(SELECT is_learning FROM cards WHERE hieroglyph = ?2 OR TRUE
|
||||||
|
)
|
||||||
|
)", (&new_filename, &hieroglyph, &reading, &translation)).unwrap();
|
||||||
|
w.close();
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
|
}),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WidgetImpl for MemoryCardsEditScene {}
|
impl WidgetImpl for MemoryCardsEditScene {}
|
||||||
|
|
|
@ -81,6 +81,7 @@ impl MemoryCardsGameScene {
|
||||||
self.card_display.set_reading(card.reading());
|
self.card_display.set_reading(card.reading());
|
||||||
self.card_display.set_translation(card.translation());
|
self.card_display.set_translation(card.translation());
|
||||||
self.card_display.update_file_for_image();
|
self.card_display.update_file_for_image();
|
||||||
|
self.obj().hide_no_cards_msg();
|
||||||
}
|
}
|
||||||
None => self.obj().show_no_cards_msg(),
|
None => self.obj().show_no_cards_msg(),
|
||||||
}
|
}
|
||||||
|
@ -98,7 +99,7 @@ fn generate_card() -> Option<CardDisplay> {
|
||||||
row.get(1).unwrap(),
|
row.get(1).unwrap(),
|
||||||
row.get(2).unwrap(),
|
row.get(2).unwrap(),
|
||||||
row.get(3).unwrap(),
|
row.get(3).unwrap(),
|
||||||
None,
|
Some(true),
|
||||||
))
|
))
|
||||||
})
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
@ -111,17 +112,19 @@ fn generate_card() -> Option<CardDisplay> {
|
||||||
Some(card) => card,
|
Some(card) => card,
|
||||||
None => return None,
|
None => return None,
|
||||||
};
|
};
|
||||||
|
|
||||||
let generated_card = CardDisplay::new(
|
let generated_card = CardDisplay::new(
|
||||||
&(get_images_store_path()
|
&(get_images_store_path()
|
||||||
+ "/"
|
+ "/"
|
||||||
+ match &random_card.image_path() {
|
+ match &random_card.image_path() {
|
||||||
Some(path) => &path[..],
|
Some(path) => path,
|
||||||
None => return None,
|
None => return None,
|
||||||
}),
|
}),
|
||||||
&random_card.hieroglyph().unwrap(),
|
&random_card.hieroglyph().unwrap(),
|
||||||
Some(&random_card.reading().unwrap()),
|
Some(&random_card.reading().unwrap()),
|
||||||
&random_card.translation().unwrap(),
|
&random_card.translation().unwrap(),
|
||||||
);
|
);
|
||||||
|
|
||||||
Some(generated_card)
|
Some(generated_card)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,4 +37,9 @@ impl MemoryCardsGameScene {
|
||||||
self.imp().stats_label.set_visible(false);
|
self.imp().stats_label.set_visible(false);
|
||||||
self.imp().no_cards_label.set_visible(true);
|
self.imp().no_cards_label.set_visible(true);
|
||||||
}
|
}
|
||||||
|
pub fn hide_no_cards_msg(&self) {
|
||||||
|
self.imp().card_display.set_visible(true);
|
||||||
|
self.imp().stats_label.set_visible(true);
|
||||||
|
self.imp().no_cards_label.set_visible(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue