use eframe::egui;
use std::{
fmt,
fs::File,
io::{Read, Write},
sync::{Arc, OnceLock},
};
use eframe::egui::{mutex::RwLock, Align2, Button, Color32, TextEdit, Vec2};
use egui_flex::{item, Flex, FlexInstance};
use serde::{Deserialize, Serialize};
pub mod activities;
pub mod classes;
pub mod classrooms;
pub mod generate;
pub mod generating;
pub mod lectures;
pub mod limitations;
pub mod print_pdf;
pub mod teachers;
#[derive(Default, Debug, Eq, PartialEq, Clone)]
pub enum SubPage {
Teachers,
#[default]
Classes,
}
impl fmt::Display for SubPage {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
SubPage::Teachers => write!(f, "Öğretmenler"),
SubPage::Classes => write!(f, "Sınıflar"),
}
}
}
pub fn get_page() -> &'static Arc<RwLock<SubPage>> {
static PAGE: OnceLock<Arc<RwLock<SubPage>>> = OnceLock::new();
PAGE.get_or_init(|| Arc::new(RwLock::new(SubPage::Classes)))
}
#[derive(Default, Debug, Serialize, Deserialize)]
pub struct School {
name: String,
hour: usize,
}
pub fn school_page(ui: &mut eframe::egui::Ui) {
ui.vertical_centered(|ui| {
let name = &mut *school_name().write();
let name_text = TextEdit::singleline(name).hint_text("Okulunuzun Adı");
ui.add(name_text);
let hour = &mut *school_hour().write();
let hour_text = TextEdit::singleline(hour).hint_text("Günlük Ders Saati Sayısı");
ui.add(hour_text);
let button = Button::new("Kaydet");
if ui
.add_enabled(hour.parse::<usize>().is_ok(), button)
.clicked()
{
save_school();
};
});
}
fn save_school() {
std::thread::spawn(|| {
let school = School {
name: school_name().read().clone(),
hour: school_hour().read().parse::<usize>().unwrap(),
};
let js = serde_json::to_string(&school);
match js {
Ok(j) => {
let mut f = File::create("./db/school.json").unwrap();
f.write_all(j.as_bytes()).unwrap();
}
Err(_) => {}
}
});
}
fn read_school() -> School {
let f = File::open("./db/school.json");
if let Ok(mut f) = f {
let mut content: String = String::new();
f.read_to_string(&mut content).unwrap();
let cls: School = serde_json::from_str(content.as_str()).unwrap();
return cls;
}
School::default()
}
fn get_school() -> &'static Arc<RwLock<School>> {
static SCHOOL: OnceLock<Arc<RwLock<School>>> = OnceLock::new();
SCHOOL.get_or_init(|| Arc::new(RwLock::new(read_school())))
}
fn school_name() -> &'static Arc<RwLock<String>> {
let name = &*get_school().read().name;
static SCHOOL: OnceLock<Arc<RwLock<String>>> = OnceLock::new();
SCHOOL.get_or_init(|| Arc::new(RwLock::new(name.to_string())))
}
pub fn school_hour() -> &'static Arc<RwLock<String>> {
let hour = get_school().read().hour;
static SCHOOL: OnceLock<Arc<RwLock<String>>> = OnceLock::new();
SCHOOL.get_or_init(|| Arc::new(RwLock::new(hour.to_string())))
}
pub fn panel_buttons(ui: &mut egui::Ui) {
ui.layout().horizontal_justify();
let panels = vec![SubPage::Classes, SubPage::Teachers];
Flex::horizontal()
.wrap(true)
.justify(egui_flex::FlexJustify::Center)
.width_percent(1.)
.align_items_content(Align2::CENTER_TOP)
.show(ui, |flex| panels.iter().for_each(|p| panel_frame(flex, p)));
}
fn panel_frame(flex: &mut FlexInstance, p: &SubPage) {
let page = &*get_page().read();
let f_color = if page == p {
Color32::DARK_BLUE
} else {
Color32::default()
};
let resp = flex.add(
item().grow(1.),
Button::new(format!("{p}"))
.min_size(Vec2::new(150., 40.))
.fill(f_color),
);
if resp.clicked() {
let p = p.clone();
std::thread::spawn(move || {
*get_page().write() = p.clone();
});
}
}