diff --git a/resources/cards/edit/ui.xml b/resources/cards/edit/ui.xml index 0483b1e..691c80b 100644 --- a/resources/cards/edit/ui.xml +++ b/resources/cards/edit/ui.xml @@ -37,7 +37,7 @@ GTK_ALIGN_FILL true - + GTK_ALIGN_FILL GTK_ALIGN_FILL diff --git a/src/card/mod.rs b/src/card/mod.rs index 9360083..9b6c991 100644 --- a/src/card/mod.rs +++ b/src/card/mod.rs @@ -1,3 +1,4 @@ +#[derive(Debug)] pub struct Card { image_path: Option, hieroglyph: Option, diff --git a/src/main.rs b/src/main.rs index b342c03..360d412 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,6 +9,7 @@ mod ui; mod widgets; mod dictionary; mod card; +// mod card_object; use crate::ui::menu::MenuScene; diff --git a/src/ui/cards/edit/imp.rs b/src/ui/cards/edit/imp.rs index ffb8f26..0f7bee2 100644 --- a/src/ui/cards/edit/imp.rs +++ b/src/ui/cards/edit/imp.rs @@ -9,13 +9,19 @@ use crate::db::*; use crate::ui::cards::new::*; use crate::widgets::card_entry::CardEntry; use glib::subclass::InitializingObject; +use gtk::gio::ListStore; +// use gtk::glib::ffi::GString; +use gtk::glib::GString; use gtk::glib::object::ObjectExt; use gtk::glib::{clone, closure_local}; use gtk::prelude::WidgetExt; use gtk::subclass::prelude::*; -use gtk::ListBox; -use gtk::{gio, glib, Button, CompositeTemplate, ScrolledWindow, SearchEntry, Window}; +use gtk::{ + gio, glib, Button, CompositeTemplate, ListView, NoSelection, ScrolledWindow, SearchEntry, + Window, +}; use gtk::{prelude::*, FileDialog}; +use gtk::{ListBox, ListItem, SignalListItemFactory}; use rusqlite::Connection; use sha256::try_digest; @@ -27,7 +33,7 @@ pub struct MemoryCardsEditScene { #[template_child] pub add_button: TemplateChild, #[template_child] - pub cards_container: TemplateChild, + pub cards_container: TemplateChild, #[template_child] pub cards_scrolled_window: TemplateChild, #[template_child] @@ -55,8 +61,8 @@ impl ObjectImpl for MemoryCardsEditScene { fn constructed(&self) { self.parent_constructed(); - self.query_cards(None); - self.update_card_list(); + // self.query_cards(None); + // self.update_card_list(); let binding = self.obj(); @@ -70,7 +76,7 @@ impl ObjectImpl for MemoryCardsEditScene { })); new_win.get_done_button().connect_closure("clicked", true, closure_local!(@strong binding => move |_w: &Button| { binding.imp().query_cards(None); - binding.imp().update_card_list(); + // binding.imp().update_card_list(); })); new_win.present(); })); @@ -86,20 +92,21 @@ impl ObjectImpl for MemoryCardsEditScene { } } ); - binding.imp().update_card_list(); + // binding.imp().update_card_list(); })); + self.query_cards(None); // self.update_card_list(); } } impl MemoryCardsEditScene { - pub fn clear_displaying_card(&self) { - let c: &ListBox = self.cards_container.as_ref(); + // pub fn clear_displaying_card(&self) { + // let c: &ListBox = self.cards_container.as_ref(); - while c.first_child() != None { - c.remove(&c.first_child().unwrap()); - } - } + // while c.first_child() != None { + // c.remove(&c.first_child().unwrap()); + // } + // } pub fn query_cards(&self, options: Option) { let conn = Connection::open(get_db_path()).unwrap(); @@ -126,59 +133,108 @@ impl MemoryCardsEditScene { Some(row.get(3).unwrap()), Some(row.get(4).unwrap()), ); - let entry = CardEntry::new(&c); + // println!("{c:?} "); + + let entry = CardEntry::new(Some(&c)); entry.update_state(); Ok(entry) }) .unwrap(); self.displaying_cards.borrow_mut().clear(); - for card in cards_iter { - let card_binding = card.unwrap(); - self.displaying_cards.borrow_mut().push(card_binding); + + for c in cards_iter { + self.displaying_cards.borrow_mut().push(c.unwrap()); } + + let model = ListStore::new::(); + model.extend_from_slice(&*self.displaying_cards.borrow()); + + let factory = SignalListItemFactory::new(); + factory.connect_setup(move |_, list_item| { + let card_entry = CardEntry::new(None); + list_item + .downcast_ref::() + .unwrap() + .set_child(Some(&card_entry)); + }); + + factory.connect_bind(move |_, list_item| { + let card_object = &list_item + .downcast_ref::() + .unwrap() + .item() + .and_downcast::() + .unwrap(); + + let card_object_to_display = list_item + .downcast_ref::() + .unwrap() + .child() + .and_downcast::() + .unwrap(); + // card_object_to_display.get_image_widget().set_file(Some( + // // &card_object.get_image_widget().file().unwrap() + // match card_object.get_image_widget().file() { + // None => "", + // Some(t) => { + // t.to_string().to_owned().as_str() + // } + // } + // )); + card_object_to_display.set_hieroglyph(card_object.hieroglyph()); + card_object_to_display.set_reading(card_object.reading()); + card_object_to_display.set_translation(card_object.translation()); + card_object_to_display.set_islearning(card_object.islearning()); + }); + + println!("test"); + + let no_selection_model = NoSelection::new(Some(model)); + let list_view = ListView::new(Some(no_selection_model), Some(factory)); + self.cards_scrolled_window.set_child(Some(&list_view)); } - pub fn update_card_list(&self) { - let c: &ListBox = self.cards_container.as_ref(); + // pub fn update_card_list(&self) { + // let c: &ListBox = self.cards_container.as_ref(); - self.clear_displaying_card(); + // self.clear_displaying_card(); - for card in self.displaying_cards.borrow().iter() { - let self_binding = self.obj(); - c.append(card); + // for card in self.displaying_cards.borrow().iter() { + // let self_binding = self.obj(); + // c.append(card); - card.get_delete_button_widget().connect_closure("clicked", false, closure_local!(@strong card, @strong self_binding => move |_b: &Button| { - let connection = Connection::open(get_db_path()).unwrap(); - let imagepath = &card.imagepath(); - let imagename = &Path::new(&imagepath).file_name().unwrap().to_str().unwrap(); - fs::remove_file(get_images_store_path() + "/" + &imagename).expect("Could not remove file!"); - connection.execute("DELETE FROM cards WHERE imagename = ?1", [&imagename]).unwrap(); - self_binding.imp().query_cards(None); - self_binding.imp().update_card_list(); - })); + // card.get_delete_button_widget().connect_closure("clicked", false, closure_local!(@strong card, @strong self_binding => move |_b: &Button| { + // let connection = Connection::open(get_db_path()).unwrap(); + // let imagepath = &card.imagepath(); + // let imagename = &Path::new(&imagepath).file_name().unwrap().to_str().unwrap(); + // fs::remove_file(get_images_store_path() + "/" + &imagename).expect("Could not remove file!"); + // connection.execute("DELETE FROM cards WHERE imagename = ?1", [&imagename]).unwrap(); + // self_binding.imp().query_cards(None); + // self_binding.imp().update_card_list(); + // })); - card.get_edit_button_widget().connect_closure("clicked", false, closure_local!(@strong self_binding as binding, @strong card => move |_b: &Button| { - let new_win = Rc::new(MemoryCardsNewScene::new(&binding.application().unwrap())); + // card.get_edit_button_widget().connect_closure("clicked", false, closure_local!(@strong self_binding as binding, @strong card => move |_b: &Button| { + // let new_win = Rc::new(MemoryCardsNewScene::new(&binding.application().unwrap())); - //setting corresponding properties - new_win.get_picture_widget().set_file(Some(&gio::File::for_path(card.imagepath()))); - new_win.get_hieroglyph_entry().set_text(&card.hieroglyph()); - new_win.get_reading_entry().set_text(&card.reading()); - new_win.get_translation_entry().set_text(&card.translation()); + // //setting corresponding properties + // new_win.get_picture_widget().set_file(Some(&gio::File::for_path(card.imagepath()))); + // new_win.get_hieroglyph_entry().set_text(&card.hieroglyph()); + // new_win.get_reading_entry().set_text(&card.reading()); + // new_win.get_translation_entry().set_text(&card.translation()); - new_win.get_file_choose_button().connect_clicked(clone!(@strong new_win, @strong card => move |b: &Button| { - b.set_visible(false); - 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 => move |_w: &Button| { - binding.imp().query_cards(None); - binding.imp().update_card_list(); - })); - new_win.present(); - })); - card.update_file_for_image(); - } - } + // new_win.get_file_choose_button().connect_clicked(clone!(@strong new_win, @strong card => move |b: &Button| { + // b.set_visible(false); + // 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 => move |_w: &Button| { + // binding.imp().query_cards(None); + // binding.imp().update_card_list(); + // })); + // new_win.present(); + // })); + // card.update_file_for_image(); + // } + // } } async fn new_card_setup>(window: Rc) { diff --git a/src/widgets/card_entry/mod.rs b/src/widgets/card_entry/mod.rs index 858dbf6..ab2812b 100644 --- a/src/widgets/card_entry/mod.rs +++ b/src/widgets/card_entry/mod.rs @@ -18,14 +18,23 @@ glib::wrapper! { } impl CardEntry { - pub fn new(card: &Card) -> Self { - Object::builder() - .property("imagepath", card.image_path().unwrap()) - .property("hieroglyph", card.hieroglyph().unwrap()) - .property("reading", card.reading().unwrap()) - .property("translation", card.translation().unwrap()) - .property("islearning", card.is_learning().unwrap()) - .build() + pub fn new(card: Option<&Card>) -> Self { + match card { + Some(card) => Object::builder() + .property("imagepath", card.image_path().unwrap()) + .property("hieroglyph", card.hieroglyph().unwrap()) + .property("reading", card.reading().unwrap()) + .property("translation", card.translation().unwrap()) + .property("islearning", card.is_learning().unwrap()) + .build(), + None => Object::builder() + .property("imagepath", "") + .property("hieroglyph", "") + .property("reading", "") + .property("translation", "") + .property("islearning", false) + .build(), + } } pub fn get_image_widget(&self) -> &Image { @@ -46,20 +55,38 @@ impl CardEntry { image_binding.set_file(Some(&path)); } - pub fn get_hieroglyph(&self) -> String { - self.imp().hieroglyph.borrow().clone() - } + // pub fn get_hieroglyph(&self) -> String { + // self.imp().hieroglyph.borrow().clone() + // } + + // pub fn set_hieroglyph(&self, h: &String) { + // self.imp().hieroglyph.borrow_mut() = h; + // } + + // pub fn get_reading(&self) -> String { + // self.imp().reading.borrow().clone() + // } + + // pub fn set_reading(&self, r: &String) { + // self.imp().reading.borrow_mut() = r; + // } + + // pub fn get_translation(&self) -> String { + // self.imp().translation.borrow().clone() + // } + + // pub fn set_translation(&self, t: &String) { + // self.imp().translation.borrow_mut() = t; + // } pub fn update_state(&self) { let conn = Connection::open(get_db_path()).unwrap(); let is_learning_switch_binding: &Switch = self.imp().is_learning_switch.as_ref(); - let h = &self.get_hieroglyph(); + let h = &self.hieroglyph(); let sql = "SELECT is_learning FROM cards WHERE hieroglyph=:h;"; let mut stmt = conn.prepare(sql).unwrap(); let iter = stmt - .query_map(&[(":h", h.as_str())], |row| { - Ok(row.get(0).unwrap()) - }) + .query_map(&[(":h", h.as_str())], |row| Ok(row.get(0).unwrap())) .unwrap(); for res in iter {