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