From 1ad28db03c82a65bd94778bde4c31b9271afe147 Mon Sep 17 00:00:00 2001 From: leca Date: Mon, 25 Mar 2024 05:20:18 +0300 Subject: [PATCH] update ui and some small changes --- org.foxarmy.learn-hieroglyph.gschema.xml | 21 +++ src/game.rs | 25 +++ src/labled_switch/mod.rs | 23 +++ src/main.rs | 203 +++++++++++++++-------- 4 files changed, 206 insertions(+), 66 deletions(-) create mode 100644 org.foxarmy.learn-hieroglyph.gschema.xml create mode 100644 src/labled_switch/mod.rs diff --git a/org.foxarmy.learn-hieroglyph.gschema.xml b/org.foxarmy.learn-hieroglyph.gschema.xml new file mode 100644 index 0000000..cc56617 --- /dev/null +++ b/org.foxarmy.learn-hieroglyph.gschema.xml @@ -0,0 +1,21 @@ + + + + + false + Enable romaji to kana + + + true + Enable kana to romaji + + + true + Enable hiragana + + + false + Enable katakana + + + diff --git a/src/game.rs b/src/game.rs index 68f82c0..020b504 100644 --- a/src/game.rs +++ b/src/game.rs @@ -18,6 +18,31 @@ pub struct Hieroglyph { column: usize, } +pub trait Useful { + // fn get_syllable (&self) -> String; + fn get_kana (&self) -> Kanas; +} + +impl Useful for Hieroglyph { + // fn get_syllable (&self) -> String { + // self.syllable.to_string() + // } + fn get_kana (&self) -> Kanas { + for row in ROMAJI { + if row.contains(&(self.syllable).as_str()) { return Kanas::Romaji; } + } + for row in HIRAGANA { + if row.contains(&(self.syllable).as_str()) { return Kanas::Hiragana; } + } + for row in KATAKANA { + if row.contains(&(self.syllable).as_str()) { return Kanas::Katakana; } + } + Kanas::Romaji // /shrug + } + + +} + impl std::fmt::Display for Hieroglyph { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.syllable) diff --git a/src/labled_switch/mod.rs b/src/labled_switch/mod.rs new file mode 100644 index 0000000..b838ec9 --- /dev/null +++ b/src/labled_switch/mod.rs @@ -0,0 +1,23 @@ +use gtk::{prelude::*, Box, Label, Switch}; + +pub fn build(text: &str) -> (Box, Switch, Label) { + let switch: Switch = Switch::builder() + .valign(gtk::Align::Start) + .halign(gtk::Align::Center) + .build(); + + let label: Label = Label::builder() + .valign(gtk::Align::End) + .halign(gtk::Align::BaselineCenter) + .label(text) + .build(); + + let container = Box::builder() + .orientation(gtk::Orientation::Horizontal) + .build(); + + container.append(&switch); + container.append(&label); + + (container, switch, label) +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index c83d288..b2877dc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,13 +1,15 @@ mod game; +mod labled_switch; -use std::cell::RefCell; - -use gtk::glib::clone; -use gtk::{prelude::*, EditableLabel, Label, Switch}; -use gtk::{glib, Application, ApplicationWindow, Button, Box}; +use gio::Settings; +use std::cell::{Cell, RefCell}; +use gtk::glib::{clone, closure_local}; +use gtk::{gio, prelude::*, Button, Entry, Label}; +use gtk::{glib, Application, ApplicationWindow, Box}; use crate::game::*; +use rand::prelude::*; -const APP_ID: &str = "org.foxarmy.learn-hieroglyphs"; +const APP_ID: &str = "org.foxarmy.learn-hieroglyph"; fn main() -> glib::ExitCode { let app = Application::builder().application_id(APP_ID).build(); @@ -24,97 +26,166 @@ fn main() -> glib::ExitCode { } fn build_menu(w: &RefCell) -> Box { - let romaji_to_kana = Button::builder() - .label("a->あ") - .margin_top(12) - .margin_end(48) - .build(); - let kana_to_romaji = Button::builder() - .label("あ->a") - .margin_top(12) - .margin_end(12) - .margin_start(48) - .build(); - - let hiragana_switch: Switch = Switch::builder() - .name("enable hiragana") - .valign(gtk::Align::End) - .build(); - let hiragana_label: Label = Label::builder() - .label("Enable hiragana") - .margin_start(12) - .build(); - - let katakana_switch: Switch = Switch::builder() - .name("enable katakana") - .build(); - let katakana_label: Label = Label::builder() - .label("Enable katakana") - .margin_start(12) - .build(); - let menu: Box = Box::builder() .orientation(gtk::Orientation::Vertical) .halign(gtk::Align::Center) .build(); - let kanas_buttons: Box = Box::builder() - .orientation(gtk::Orientation::Horizontal) - .build(); - - let kanas_settings: Box = Box::builder() + let settings_container: Box = Box::builder() .orientation(gtk::Orientation::Vertical) - .valign(gtk::Align::Center) - .halign(gtk::Align::Center) + .valign(gtk::Align::Start) + .halign(gtk::Align::Start) .build(); - let hiragana_setting: Box = Box::builder() + let gamemode_settings_container: Box = Box::builder() + .orientation(gtk::Orientation::Vertical) + .valign(gtk::Align::Start) + .halign(gtk::Align::Start) + .build(); + + let hiragana_setting_container: Box = Box::builder() .orientation(gtk::Orientation::Horizontal) .valign(gtk::Align::Center) .halign(gtk::Align::Center) .build(); - let katakana_setting: Box = Box::builder() + let katakana_setting_container: Box = Box::builder() .orientation(gtk::Orientation::Horizontal) .valign(gtk::Align::Center) .halign(gtk::Align::Center) .build(); - - kanas_buttons.append(&romaji_to_kana); - kanas_buttons.append(&kana_to_romaji); - hiragana_setting.append(&hiragana_switch); - hiragana_setting.append(&hiragana_label); - katakana_setting.append(&katakana_switch); - katakana_setting.append(&katakana_label); + let start_button: Button = Button::builder() + .label("Start!") + .build(); - kanas_settings.append(&hiragana_setting); - kanas_settings.append(&katakana_setting); + let mut settings = Cell::new(Settings::new(APP_ID)); + + start_button.connect_clicked(clone!( @strong w => move |_| { + w.borrow_mut().set_child(Some(&build_game(&w))) + })); + //////////////////kana to romaji setting//////////////////////////// + let ktr_switch = labled_switch::build("enable あ->a"); + gamemode_settings_container.append(&ktr_switch.0); - menu.append(&kanas_buttons); - menu.append(&kanas_settings); - kana_to_romaji.connect_clicked(clone!( @strong w => move |_button: &Button| { - w.borrow_mut().set_child(Some(&build_game(&w))); - })); - romaji_to_kana.connect_clicked(clone!( @strong w => move |_button: &Button| { - w.borrow_mut().set_child(Some(&build_game(&w))); - })); + ////////////////romaji to kana setting/////////////////////////////// + let rtk_switch = labled_switch::build("enable a->あ"); + gamemode_settings_container.append(&rtk_switch.0); + ////////////////hiragana enable setting///////////////////////////// + let hiragana_switch = labled_switch::build("enable hiragana"); + hiragana_setting_container.append(&hiragana_switch.0); + ////////////////katakana enable setting///////////////////////////// + let katakana_switch = labled_switch::build("enable katakana"); + katakana_setting_container.append(&katakana_switch.0); + + let s = settings.get_mut(); + s.bind("is-ktr-enabled", &ktr_switch.1, "active").build(); + s.bind("is-rtk-enabled", &rtk_switch.1, "active").build(); + s.bind("is-hiragana-enabled", &hiragana_switch.1, "active").build(); + s.bind("is-katakana-enabled", &katakana_switch.1, "active").build(); + + settings_container.append(&gamemode_settings_container); + settings_container.append(&hiragana_setting_container); + settings_container.append(&katakana_setting_container); + + menu.append(&settings_container); + + menu.append(&start_button); menu } +fn random_kana(hiragana: bool, katakana: bool) -> Hieroglyph{ + if hiragana && katakana { + generate_random_hieroglyph( + if rand::thread_rng().gen_bool(0.5) { + Kanas::Katakana + } else { + Kanas::Hiragana + } + ) + } else { + generate_random_hieroglyph( + if hiragana { + Kanas::Hiragana + } else { + Kanas::Katakana + } + ) + } +} + +fn ask(ktr: bool, rtk: bool, hiragana: bool, katakana: bool) -> Hieroglyph { + if ktr && rtk { + return if rand::thread_rng().gen_bool(0.5) { random_kana(hiragana, katakana) } else { generate_random_hieroglyph(Kanas::Romaji) }; + } else if ktr { + return random_kana(hiragana, katakana); + } else { + return generate_random_hieroglyph(Kanas::Romaji); + } +} + +fn generate_question_text(question: & Hieroglyph, exact_kana: &Kanas) -> String { + return String::from(match question.get_kana() { + Kanas::Romaji => { + match exact_kana { + Kanas::Hiragana => { + format!("Name corresponding hiragana for {}", question.to_string()) + }, + Kanas::Katakana => { + format!("Name corresponding katakana for {}", question.to_string()) + }, + _ => { + panic!("HOW DID YOU GET HERE!?"); + } + } + }, + Kanas::Hiragana => { + format!("Name corresponding romaji for hiragana {}", question.to_string()) + }, + Kanas::Katakana => { + format!("Name corresponding romaji for katakana {}", question.to_string()) + } + }); +} + + fn build_game(w: &RefCell) -> Box { let game: Box = Box::builder() .orientation(gtk::Orientation::Vertical) .build(); - let question_label: Label = Label::builder() + let mut question_label: RefCell