cards/new, cards/edit and some improvements

This commit is contained in:
2024-04-05 12:42:02 +03:00
parent 005da0d8c9
commit 5d65c0b93a
22 changed files with 470 additions and 38 deletions

View File

@@ -1 +1,80 @@
use std::rc::Rc;
use glib::subclass::InitializingObject;
use gtk::glib::object::ObjectExt;
use gtk::glib::{clone, closure_local};
use gtk::subclass::prelude::*;
use gtk::{glib, Button, CompositeTemplate, ScrolledWindow, SearchEntry, Window};
use gtk::{prelude::*, FileDialog};
use crate::ui::cards::new::*;
use crate::widgets::card_entry::CardEntry;
#[derive(CompositeTemplate, Default)]
#[template(resource = "/org/foxarmy/learn-hieroglyph/cards/edit/ui.xml")]
pub struct MemoryCardsEditScene {
#[template_child]
pub search_entry: TemplateChild<SearchEntry>,
#[template_child]
pub add_button: TemplateChild<Button>,
#[template_child]
pub first: TemplateChild<CardEntry>,
#[template_child]
pub cards: TemplateChild<ScrolledWindow>,
}
#[glib::object_subclass]
impl ObjectSubclass for MemoryCardsEditScene {
const NAME: &'static str = "MemoryCardsEditScene";
type Type = super::MemoryCardsEditScene;
type ParentType = gtk::ApplicationWindow;
fn class_init(klass: &mut Self::Class) {
klass.bind_template();
}
fn instance_init(obj: &InitializingObject<Self>) {
obj.init_template();
}
}
impl ObjectImpl for MemoryCardsEditScene {
fn constructed(&self) {
self.parent_constructed();
let binding = self.obj();
self.add_button.connect_closure("clicked",
false,
closure_local!(@strong binding => move |_b: &Button| {
let new_win = Rc::new(MemoryCardsNewScene::new(&binding.application().unwrap()));
new_win.get_file_choose_button().connect_clicked(clone!(@strong new_win => move |_| {
let path = Rc::new(String::from(""));
gtk::glib::MainContext::default().spawn_local(file_choose_dialog(Rc::clone(&new_win), Rc::clone(&path)));
println!("{}", path); // this is empty cuz it's not waiting for user
}));
new_win.present();
}));
let c: &ScrolledWindow = self.cards.as_ref();
c.set_child(glib::bitflags::__private::core::option::Option::Some(
&CardEntry::new(&"a".to_string(), &"a".to_string()),
));
}
}
async fn file_choose_dialog<W: IsA<gtk::Window>>(window: Rc<W>, mut _p: Rc<String>) {
let dialog: FileDialog = gtk::FileDialog::builder().build();
let answer = dialog.open_future(Some(&*window)).await;
let path = answer.unwrap().path().unwrap();
let path = path.as_path().to_str();
// _p = Rc::new(path.into_os_string().into_string().unwrap());
let w: &MemoryCardsNewScene = Into::<&Window>::into(window.upcast_ref()).downcast_ref().unwrap(); // Weird casting from &Window as passed in func to &MemoryCardsNewScene
w.get_image_widget().set_file(path);
}
impl WidgetImpl for MemoryCardsEditScene {}
impl WindowImpl for MemoryCardsEditScene {}
impl ApplicationWindowImpl for MemoryCardsEditScene {}

View File

@@ -1 +1,16 @@
mod imp;
use glib::Object;
use gtk::{gio, glib, Application};
glib::wrapper! {
pub struct MemoryCardsEditScene(ObjectSubclass<imp::MemoryCardsEditScene>)
@extends gtk::ApplicationWindow, gtk::Window, gtk::Widget,
@implements gio::ActionGroup, gio::ActionMap, gtk::Accessible, gtk::Buildable,
gtk::ConstraintTarget, gtk::Native, gtk::Root, gtk::ShortcutManager;
}
impl MemoryCardsEditScene {
pub fn new(app: &Application) -> Self {
Object::builder().property("application", app).build()
}
}

View File

@@ -1,3 +1,4 @@
pub mod edit;
pub mod game;
pub mod setup;
pub mod new;

46
src/ui/cards/new/imp.rs Normal file
View File

@@ -0,0 +1,46 @@
use glib::subclass::InitializingObject;
use gtk::subclass::prelude::*;
use gtk::{glib, Button, CompositeTemplate, Entry, Image};
#[derive(CompositeTemplate, Default)]
#[template(resource = "/org/foxarmy/learn-hieroglyph/cards/new/ui.xml")]
pub struct MemoryCardsNewScene {
#[template_child]
pub image: TemplateChild<Image>,
#[template_child]
pub file_choose_button: TemplateChild<Button>,
#[template_child]
pub heiroglyph_entry: TemplateChild<Entry>,
#[template_child]
pub translation_entry: TemplateChild<Entry>,
#[template_child]
pub done_button: TemplateChild<Button>,
}
#[glib::object_subclass]
impl ObjectSubclass for MemoryCardsNewScene {
const NAME: &'static str = "MemoryCardsNewScene";
type Type = super::MemoryCardsNewScene;
type ParentType = gtk::ApplicationWindow;
fn class_init(klass: &mut Self::Class) {
klass.bind_template();
}
fn instance_init(obj: &InitializingObject<Self>) {
obj.init_template();
}
}
impl ObjectImpl for MemoryCardsNewScene {
fn constructed(&self) {
self.parent_constructed();
}
}
impl WidgetImpl for MemoryCardsNewScene {}
impl WindowImpl for MemoryCardsNewScene {}
impl ApplicationWindowImpl for MemoryCardsNewScene {}

27
src/ui/cards/new/mod.rs Normal file
View File

@@ -0,0 +1,27 @@
mod imp;
use glib::Object;
use gtk::{
gio, glib::{self, subclass::types::ObjectSubclassIsExt}, Application, Button, Image
};
glib::wrapper! {
pub struct MemoryCardsNewScene(ObjectSubclass<imp::MemoryCardsNewScene>)
@extends gtk::ApplicationWindow, gtk::Window, gtk::Widget,
@implements gio::ActionGroup, gio::ActionMap, gtk::Accessible, gtk::Buildable,
gtk::ConstraintTarget, gtk::Native, gtk::Root, gtk::ShortcutManager;
}
impl MemoryCardsNewScene {
pub fn new(app: &Application) -> Self {
Object::builder().property("application", app).build()
}
pub fn get_file_choose_button(&self) -> &Button {
self.imp().file_choose_button.as_ref()
}
pub fn get_image_widget(&self) -> &Image {
self.imp().image.as_ref()
}
}

View File

@@ -1,9 +1,12 @@
use crate::ui::cards::edit::*;
use glib::subclass::InitializingObject;
use gtk::glib::closure_local;
use gtk::subclass::prelude::*;
use gtk::{glib, Button, CompositeTemplate};
use gtk::{glib, prelude::*, Button, CompositeTemplate};
#[derive(CompositeTemplate, Default)]
#[template(resource = "/org/foxarmy/learn-hieroglyph/cards/settings/ui.xml")]
#[template(resource = "/org/foxarmy/learn-hieroglyph/cards/setup/ui.xml")]
pub struct MemoryCardsSetupScene {
#[template_child]
pub edit_button: TemplateChild<Button>,
@@ -29,6 +32,16 @@ impl ObjectSubclass for MemoryCardsSetupScene {
impl ObjectImpl for MemoryCardsSetupScene {
fn constructed(&self) {
self.parent_constructed();
let binding = self.obj();
self.edit_button.connect_closure("clicked",
false,
closure_local!(@strong binding => move |_b: &Button| {
let new_win: MemoryCardsEditScene = MemoryCardsEditScene::new(&binding.application().unwrap());
new_win.present();
})
);
}
}

View File

@@ -1,4 +1,4 @@
use crate::labled_switch::LabledSwitch;
use crate::widgets::labled_switch::LabledSwitch;
use crate::ui::guessing::game::GuessingScene;
use crate::APP_ID;