structure
This commit is contained in:
		| @@ -7,4 +7,5 @@ edition = "2021" | |||||||
|  |  | ||||||
| [dependencies] | [dependencies] | ||||||
| gtk = { version = "0.8.1", package = "gtk4", features = ["v4_12"] } | gtk = { version = "0.8.1", package = "gtk4", features = ["v4_12"] } | ||||||
|  |  | ||||||
| rand = "0.8.5" | rand = "0.8.5" | ||||||
|   | |||||||
| @@ -33,14 +33,10 @@ pub struct Hieroglyph { | |||||||
| } | } | ||||||
|  |  | ||||||
| pub trait Useful { | pub trait Useful { | ||||||
|     // fn get_syllable (&self) -> String; |  | ||||||
|     fn get_kana(&self) -> Kanas; |     fn get_kana(&self) -> Kanas; | ||||||
| } | } | ||||||
|  |  | ||||||
| impl Useful for Hieroglyph { | impl Useful for Hieroglyph { | ||||||
|     // fn get_syllable (&self) -> String { |  | ||||||
|     //     self.syllable.to_string() |  | ||||||
|     // } |  | ||||||
|     fn get_kana(&self) -> Kanas { |     fn get_kana(&self) -> Kanas { | ||||||
|         for row in ROMAJI { |         for row in ROMAJI { | ||||||
|             if row.contains(&(self.syllable).as_str()) { |             if row.contains(&(self.syllable).as_str()) { | ||||||
|   | |||||||
							
								
								
									
										243
									
								
								src/main.rs
									
									
									
									
									
								
							
							
						
						
									
										243
									
								
								src/main.rs
									
									
									
									
									
								
							| @@ -1,13 +1,11 @@ | |||||||
| mod game; | mod game; | ||||||
| mod labled_switch; | mod labled_switch; | ||||||
|  | mod ui; | ||||||
|  |  | ||||||
| use crate::game::*; | use crate::ui::build_ui; | ||||||
| use gio::Settings; |  | ||||||
| use gtk::{gio, prelude::*, Button, Entry, Label}; | use gtk::prelude::*; | ||||||
| use gtk::{glib, glib::clone, Application, ApplicationWindow, Box}; | use gtk::{glib, Application}; | ||||||
| use rand::prelude::*; |  | ||||||
| use std::cell::{Cell, RefCell}; |  | ||||||
| use std::ops::Deref; |  | ||||||
|  |  | ||||||
| const APP_ID: &str = "org.foxarmy.learn-hieroglyph"; | const APP_ID: &str = "org.foxarmy.learn-hieroglyph"; | ||||||
|  |  | ||||||
| @@ -18,234 +16,3 @@ fn main() -> glib::ExitCode { | |||||||
|  |  | ||||||
|     app.run() |     app.run() | ||||||
| } | } | ||||||
|  |  | ||||||
| fn build_menu(w: &RefCell<ApplicationWindow>) -> Box { |  | ||||||
|     let menu: Box = Box::builder() |  | ||||||
|         .orientation(gtk::Orientation::Vertical) |  | ||||||
|         .halign(gtk::Align::Center) |  | ||||||
|         .build(); |  | ||||||
|  |  | ||||||
|     let settings_container: Box = Box::builder() |  | ||||||
|         .orientation(gtk::Orientation::Vertical) |  | ||||||
|         .valign(gtk::Align::Start) |  | ||||||
|         .halign(gtk::Align::Start) |  | ||||||
|         .build(); |  | ||||||
|  |  | ||||||
|     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_container: Box = Box::builder() |  | ||||||
|         .orientation(gtk::Orientation::Horizontal) |  | ||||||
|         .valign(gtk::Align::Center) |  | ||||||
|         .halign(gtk::Align::Center) |  | ||||||
|         .build(); |  | ||||||
|  |  | ||||||
|     let start_button: Button = Button::builder().label("Start!").build(); |  | ||||||
|  |  | ||||||
|     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); |  | ||||||
|  |  | ||||||
|     ////////////////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<ApplicationWindow>) -> Box { |  | ||||||
|     let game: Box = Box::builder() |  | ||||||
|         .orientation(gtk::Orientation::Vertical) |  | ||||||
|         .build(); |  | ||||||
|     let mut question_label: RefCell<Label> = |  | ||||||
|         RefCell::new(Label::builder().label("placeholder").build()); |  | ||||||
|     let entry: Entry = Entry::builder().placeholder_text("Answer").build(); |  | ||||||
|     let mut counter_label: RefCell<Label> = |  | ||||||
|         RefCell::new(Label::builder().label("Correct|incorrect: 0|0").build()); |  | ||||||
|     let stats: RefCell<(u32, u32)> = RefCell::new((0, 0)); |  | ||||||
|     let settings: Settings = Settings::new(APP_ID); |  | ||||||
|  |  | ||||||
|     let ktr: bool = settings.boolean("is-ktr-enabled"); |  | ||||||
|     let rtk: bool = settings.boolean("is-rtk-enabled"); |  | ||||||
|     let hiragana: bool = settings.boolean("is-hiragana-enabled"); |  | ||||||
|     let katakana: bool = settings.boolean("is-katakana-enabled"); |  | ||||||
|  |  | ||||||
|     let question: RefCell<Hieroglyph> = RefCell::new(ask(ktr, rtk, hiragana, katakana)); |  | ||||||
|     let exact_kana: RefCell<Kanas> = RefCell::new(if hiragana && katakana { |  | ||||||
|         if rand::thread_rng().gen_bool(0.5) { |  | ||||||
|             Kanas::Hiragana |  | ||||||
|         } else { |  | ||||||
|             Kanas::Katakana |  | ||||||
|         } |  | ||||||
|     } else if hiragana { |  | ||||||
|         Kanas::Hiragana |  | ||||||
|     } else { |  | ||||||
|         Kanas::Katakana |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     let correct_answer: RefCell<Hieroglyph> = RefCell::new(get_kana_pair_for_hieroglyph( |  | ||||||
|         match question.borrow().get_kana() { |  | ||||||
|             Kanas::Romaji => match exact_kana.borrow().deref() { |  | ||||||
|                 Kanas::Hiragana => &Kanas::Hiragana, |  | ||||||
|                 Kanas::Katakana => &Kanas::Katakana, |  | ||||||
|                 _ => panic!("HOW DID YOU GET HERE?!"), |  | ||||||
|             }, |  | ||||||
|             _ => &Kanas::Romaji, |  | ||||||
|         }, |  | ||||||
|         &question.borrow(), |  | ||||||
|     )); |  | ||||||
|  |  | ||||||
|     let binding = generate_question_text(&question.borrow(), exact_kana.borrow().deref()); |  | ||||||
|     let text: &str = &(binding.as_str()); |  | ||||||
|     question_label.borrow_mut().set_label(text); |  | ||||||
|  |  | ||||||
|     let iteration = clone!( @strong question_label, @strong counter_label, @strong stats, @strong exact_kana => move |entry: &Entry| { |  | ||||||
|         let answer: &String = &entry.text().to_string(); |  | ||||||
|         println!("{} <-> {}? = {}", answer, correct_answer.borrow().to_string(), *answer == correct_answer.borrow().to_string()); |  | ||||||
|         *stats.borrow_mut() = if *answer == correct_answer.borrow().to_string() { (stats.borrow().0 + 1, stats.borrow().1) } else {(stats.borrow().0, stats.borrow().1 + 1)}; |  | ||||||
|         counter_label.borrow_mut().set_label(format!("Correct|Incorrect: {}|{}", stats.borrow().0, stats.borrow().1).as_str()); |  | ||||||
|         *question.borrow_mut() = ask(ktr, rtk, hiragana, katakana); |  | ||||||
|         *exact_kana.borrow_mut() = |  | ||||||
|             if hiragana && katakana { |  | ||||||
|                 if rand::thread_rng().gen_bool(0.5) {Kanas::Hiragana} else {Kanas::Katakana} |  | ||||||
|             } else if hiragana { |  | ||||||
|                 Kanas::Hiragana |  | ||||||
|             } else { |  | ||||||
|                 Kanas::Katakana |  | ||||||
|             }; |  | ||||||
|         *correct_answer.borrow_mut() = get_kana_pair_for_hieroglyph( |  | ||||||
|             match question.borrow().get_kana() { |  | ||||||
|                 Kanas::Romaji => match exact_kana.borrow().deref() { |  | ||||||
|                     Kanas::Hiragana => &Kanas::Hiragana, |  | ||||||
|                     Kanas::Katakana => &Kanas::Katakana, |  | ||||||
|                     _ => panic!("HOW DID YOU GET HERE?!") |  | ||||||
|                 }, |  | ||||||
|                 _ => &Kanas::Romaji |  | ||||||
|             }, |  | ||||||
|             &question.borrow() |  | ||||||
|         ); |  | ||||||
|         let binding = generate_question_text(&question.borrow(), exact_kana.borrow().deref()); |  | ||||||
|         let text: &str = &(binding.as_str()); |  | ||||||
|         question_label.borrow_mut().set_label(text); |  | ||||||
|         entry.set_text(""); |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     entry.connect_activate(iteration); |  | ||||||
|  |  | ||||||
|     game.append(question_label.get_mut()); |  | ||||||
|     game.append(&entry); |  | ||||||
|     game.append(counter_label.get_mut()); |  | ||||||
|  |  | ||||||
|     game |  | ||||||
| } |  | ||||||
|  |  | ||||||
| fn build_ui(app: &Application) { |  | ||||||
|     let mut window: RefCell<ApplicationWindow> = RefCell::new( |  | ||||||
|         ApplicationWindow::builder() |  | ||||||
|             .application(app) |  | ||||||
|             .title("Test") |  | ||||||
|             .default_height(920) |  | ||||||
|             .default_width(480) |  | ||||||
|             .build(), |  | ||||||
|     ); |  | ||||||
|  |  | ||||||
|     let menu = build_menu(&window); |  | ||||||
|  |  | ||||||
|     window.get_mut().set_child(Some(&menu)); |  | ||||||
|  |  | ||||||
|     window.get_mut().present(); |  | ||||||
| } |  | ||||||
|   | |||||||
							
								
								
									
										154
									
								
								src/ui/guessing/mod.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								src/ui/guessing/mod.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,154 @@ | |||||||
|  | use crate::game::*; | ||||||
|  |  | ||||||
|  | use crate::APP_ID; | ||||||
|  |  | ||||||
|  | use gio::Settings; | ||||||
|  | use gtk::{gio, prelude::*, Entry, Label}; | ||||||
|  | use gtk::{glib::clone, ApplicationWindow, Box}; | ||||||
|  | use rand::prelude::*; | ||||||
|  | use std::cell::RefCell; | ||||||
|  | use std::ops::Deref; | ||||||
|  |  | ||||||
|  | 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() | ||||||
|  |             ) | ||||||
|  |         } | ||||||
|  |     }); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | pub fn build_game(_w: &RefCell<ApplicationWindow>) -> Box { | ||||||
|  |     let game: Box = Box::builder() | ||||||
|  |         .orientation(gtk::Orientation::Vertical) | ||||||
|  |         .build(); | ||||||
|  |     let mut question_label: RefCell<Label> = | ||||||
|  |         RefCell::new(Label::builder().label("placeholder").build()); | ||||||
|  |     let entry: Entry = Entry::builder().placeholder_text("Answer").build(); | ||||||
|  |     let mut counter_label: RefCell<Label> = | ||||||
|  |         RefCell::new(Label::builder().label("Correct|incorrect: 0|0").build()); | ||||||
|  |     let stats: RefCell<(u32, u32)> = RefCell::new((0, 0)); | ||||||
|  |     let settings: Settings = Settings::new(APP_ID); | ||||||
|  |  | ||||||
|  |     let ktr: bool = settings.boolean("is-ktr-enabled"); | ||||||
|  |     let rtk: bool = settings.boolean("is-rtk-enabled"); | ||||||
|  |     let hiragana: bool = settings.boolean("is-hiragana-enabled"); | ||||||
|  |     let katakana: bool = settings.boolean("is-katakana-enabled"); | ||||||
|  |  | ||||||
|  |     let question: RefCell<Hieroglyph> = RefCell::new(ask(ktr, rtk, hiragana, katakana)); | ||||||
|  |     let exact_kana: RefCell<Kanas> = RefCell::new(if hiragana && katakana { | ||||||
|  |         if rand::thread_rng().gen_bool(0.5) { | ||||||
|  |             Kanas::Hiragana | ||||||
|  |         } else { | ||||||
|  |             Kanas::Katakana | ||||||
|  |         } | ||||||
|  |     } else if hiragana { | ||||||
|  |         Kanas::Hiragana | ||||||
|  |     } else { | ||||||
|  |         Kanas::Katakana | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     let correct_answer: RefCell<Hieroglyph> = RefCell::new(get_kana_pair_for_hieroglyph( | ||||||
|  |         match question.borrow().get_kana() { | ||||||
|  |             Kanas::Romaji => match exact_kana.borrow().deref() { | ||||||
|  |                 Kanas::Hiragana => &Kanas::Hiragana, | ||||||
|  |                 Kanas::Katakana => &Kanas::Katakana, | ||||||
|  |                 _ => panic!("HOW DID YOU GET HERE?!"), | ||||||
|  |             }, | ||||||
|  |             _ => &Kanas::Romaji, | ||||||
|  |         }, | ||||||
|  |         &question.borrow(), | ||||||
|  |     )); | ||||||
|  |  | ||||||
|  |     let binding = generate_question_text(&question.borrow(), exact_kana.borrow().deref()); | ||||||
|  |     let text: &str = &(binding.as_str()); | ||||||
|  |     question_label.borrow_mut().set_label(text); | ||||||
|  |  | ||||||
|  |     let iteration = clone!( @strong question_label, @strong counter_label, @strong stats, @strong exact_kana => move |entry: &Entry| { | ||||||
|  |         let answer: &String = &entry.text().to_string(); | ||||||
|  |         println!("{} <-> {}? = {}", answer, correct_answer.borrow().to_string(), *answer == correct_answer.borrow().to_string()); | ||||||
|  |         *stats.borrow_mut() = if *answer == correct_answer.borrow().to_string() { (stats.borrow().0 + 1, stats.borrow().1) } else {(stats.borrow().0, stats.borrow().1 + 1)}; | ||||||
|  |         counter_label.borrow_mut().set_label(format!("Correct|Incorrect: {}|{}", stats.borrow().0, stats.borrow().1).as_str()); | ||||||
|  |         *question.borrow_mut() = ask(ktr, rtk, hiragana, katakana); | ||||||
|  |         *exact_kana.borrow_mut() = | ||||||
|  |             if hiragana && katakana { | ||||||
|  |                 if rand::thread_rng().gen_bool(0.5) {Kanas::Hiragana} else {Kanas::Katakana} | ||||||
|  |             } else if hiragana { | ||||||
|  |                 Kanas::Hiragana | ||||||
|  |             } else { | ||||||
|  |                 Kanas::Katakana | ||||||
|  |             }; | ||||||
|  |         *correct_answer.borrow_mut() = get_kana_pair_for_hieroglyph( | ||||||
|  |             match question.borrow().get_kana() { | ||||||
|  |                 Kanas::Romaji => match exact_kana.borrow().deref() { | ||||||
|  |                     Kanas::Hiragana => &Kanas::Hiragana, | ||||||
|  |                     Kanas::Katakana => &Kanas::Katakana, | ||||||
|  |                     _ => panic!("HOW DID YOU GET HERE?!") | ||||||
|  |                 }, | ||||||
|  |                 _ => &Kanas::Romaji | ||||||
|  |             }, | ||||||
|  |             &question.borrow() | ||||||
|  |         ); | ||||||
|  |         let binding = generate_question_text(&question.borrow(), exact_kana.borrow().deref()); | ||||||
|  |         let text: &str = &(binding.as_str()); | ||||||
|  |         question_label.borrow_mut().set_label(text); | ||||||
|  |         entry.set_text(""); | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     entry.connect_activate(iteration); | ||||||
|  |  | ||||||
|  |     game.append(question_label.get_mut()); | ||||||
|  |     game.append(&entry); | ||||||
|  |     game.append(counter_label.get_mut()); | ||||||
|  |  | ||||||
|  |     game | ||||||
|  | } | ||||||
							
								
								
									
										80
									
								
								src/ui/menu/mod.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								src/ui/menu/mod.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | |||||||
|  | use crate::ui::guessing::build_game; | ||||||
|  |  | ||||||
|  | use crate::APP_ID; | ||||||
|  |  | ||||||
|  | use gio::Settings; | ||||||
|  | use gtk::{gio, prelude::*, Button}; | ||||||
|  | use gtk::{glib::clone, ApplicationWindow, Box}; | ||||||
|  | use std::cell::{Cell, RefCell}; | ||||||
|  |  | ||||||
|  | use crate::labled_switch; | ||||||
|  |  | ||||||
|  | pub fn build_menu(w: &RefCell<ApplicationWindow>) -> Box { | ||||||
|  |     let menu: Box = Box::builder() | ||||||
|  |         .orientation(gtk::Orientation::Vertical) | ||||||
|  |         .halign(gtk::Align::Center) | ||||||
|  |         .build(); | ||||||
|  |  | ||||||
|  |     let settings_container: Box = Box::builder() | ||||||
|  |         .orientation(gtk::Orientation::Vertical) | ||||||
|  |         .valign(gtk::Align::Start) | ||||||
|  |         .halign(gtk::Align::Start) | ||||||
|  |         .build(); | ||||||
|  |  | ||||||
|  |     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_container: Box = Box::builder() | ||||||
|  |         .orientation(gtk::Orientation::Horizontal) | ||||||
|  |         .valign(gtk::Align::Center) | ||||||
|  |         .halign(gtk::Align::Center) | ||||||
|  |         .build(); | ||||||
|  |  | ||||||
|  |     let start_button: Button = Button::builder().label("Start!").build(); | ||||||
|  |  | ||||||
|  |     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); | ||||||
|  |  | ||||||
|  |     ////////////////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 | ||||||
|  | } | ||||||
							
								
								
									
										23
									
								
								src/ui/mod.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/ui/mod.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | mod guessing; | ||||||
|  | mod menu; | ||||||
|  |  | ||||||
|  | use crate::ui::menu::build_menu; | ||||||
|  |  | ||||||
|  | use gtk::prelude::*; | ||||||
|  | use gtk::{Application, ApplicationWindow}; | ||||||
|  | use std::cell::RefCell; | ||||||
|  |  | ||||||
|  | pub fn build_ui(app: &Application) { | ||||||
|  |     let mut window: RefCell<ApplicationWindow> = RefCell::new( | ||||||
|  |         ApplicationWindow::builder() | ||||||
|  |             .application(app) | ||||||
|  |             .title("Test") | ||||||
|  |             .build(), | ||||||
|  |     ); | ||||||
|  |  | ||||||
|  |     let menu = build_menu(&window); | ||||||
|  |  | ||||||
|  |     window.get_mut().set_child(Some(&menu)); | ||||||
|  |  | ||||||
|  |     window.get_mut().present(); | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user