use std::sync::{Arc, OnceLock};
use eframe::egui::{self, mutex::RwLock, Align2, Button, Vec2};
use egui_flex::item;
use crate::tabs::{
classes::{classes_acts, create_classes_acts, get_classes, selected_class, Class},
classrooms::{get_classrooms, ClassRoom},
get_page,
lectures::{get_lectures, Lecture},
teachers::{create_teacher_acts, get_teachers, selected_teacher, teachers_acts, Teacher},
SubPage,
};
use super::{
activities, classes_acts_hours, create_classes_hours, create_teachers_hours, del_states,
save_activities, teachers_acts_hours, Activity,
};
pub mod classes_ui;
pub mod classrooms_ui;
pub mod lectures_ui;
pub mod teachers_ui;
pub fn filtered_classes() -> &'static Arc<RwLock<Vec<Class>>> {
static LECTURES: OnceLock<Arc<RwLock<Vec<Class>>>> = OnceLock::new();
LECTURES.get_or_init(|| Arc::new(RwLock::new(filtering_classes())))
}
pub fn show_form() -> &'static Arc<RwLock<bool>> {
static LECTURES: OnceLock<Arc<RwLock<bool>>> = OnceLock::new();
LECTURES.get_or_init(|| Arc::new(RwLock::new(false)))
}
pub fn filtering_classes() -> Vec<Class> {
let lecs = get_classes().read().clone();
let mut lecs = lecs.values().map(|v| v.clone()).collect::<Vec<Class>>();
lecs.sort_by(|a, b| a.name.cmp(&b.name));
lecs
}
pub fn filtered_lectures() -> &'static Arc<RwLock<Vec<Lecture>>> {
static LECTURES: OnceLock<Arc<RwLock<Vec<Lecture>>>> = OnceLock::new();
LECTURES.get_or_init(|| Arc::new(RwLock::new(filtering_lectures())))
}
pub fn filtering_lectures() -> Vec<Lecture> {
let lecs = get_lectures().read().clone();
let mut lecs = lecs.values().map(|v| v.clone()).collect::<Vec<Lecture>>();
lecs.sort_by(|a, b| a.name.to_uppercase().cmp(&b.name.to_uppercase()));
lecs
}
pub fn filtered_teachers() -> &'static Arc<RwLock<Vec<Teacher>>> {
static LECTURES: OnceLock<Arc<RwLock<Vec<Teacher>>>> = OnceLock::new();
LECTURES.get_or_init(|| Arc::new(RwLock::new(filtering_teachers().clone())))
}
pub fn filtering_teachers() -> Vec<Teacher> {
let teachers = get_teachers().read().clone();
let mut teachers = teachers
.values()
.map(|v| v.clone())
.collect::<Vec<Teacher>>();
teachers.sort_by(|a, b| a.name.to_uppercase().cmp(&b.name.to_uppercase()));
teachers
}
pub fn filtered_classrooms() -> &'static Arc<RwLock<Vec<ClassRoom>>> {
static LECTURES: OnceLock<Arc<RwLock<Vec<ClassRoom>>>> = OnceLock::new();
LECTURES.get_or_init(|| Arc::new(RwLock::new(filtering_classrooms().clone())))
}
pub fn filtering_classrooms() -> Vec<ClassRoom> {
let classrooms = get_classrooms().read().clone();
let mut classrooms = classrooms
.values()
.map(|v| v.clone())
.collect::<Vec<ClassRoom>>();
classrooms.sort_by(|a, b| a.name.to_uppercase().cmp(&b.name.to_uppercase()));
classrooms
}
pub fn act_lec() -> &'static Arc<RwLock<Option<Lecture>>> {
static ACT_LEC: OnceLock<Arc<RwLock<Option<Lecture>>>> = OnceLock::new();
ACT_LEC.get_or_init(|| Arc::new(RwLock::new(None)))
}
pub fn act_classes() -> &'static Arc<RwLock<Vec<Class>>> {
static ACT_CLASSES: OnceLock<Arc<RwLock<Vec<Class>>>> = OnceLock::new();
ACT_CLASSES.get_or_init(|| Arc::new(RwLock::new(vec![])))
}
pub fn act_hours() -> &'static Arc<RwLock<String>> {
static ACT_HOURS: OnceLock<Arc<RwLock<String>>> = OnceLock::new();
ACT_HOURS.get_or_init(|| Arc::new(RwLock::new("".to_string())))
}
pub fn act_teachers() -> &'static Arc<RwLock<Vec<Teacher>>> {
static ACT_TEACHER: OnceLock<Arc<RwLock<Vec<Teacher>>>> = OnceLock::new();
ACT_TEACHER.get_or_init(|| Arc::new(RwLock::new(vec![])))
}
pub fn act_classrooms() -> &'static Arc<RwLock<Vec<ClassRoom>>> {
static ACT_TEACHER: OnceLock<Arc<RwLock<Vec<ClassRoom>>>> = OnceLock::new();
ACT_TEACHER.get_or_init(|| Arc::new(RwLock::new(vec![])))
}
pub fn add_act() {
let lec = &*act_lec().read();
if let Some(lec) = lec {
let hours = act_hours().read().clone();
let tchr = if let SubPage::Teachers = *get_page().read() {
if let Some(t) = *selected_teacher().read() {
vec![t]
} else {
vec![]
}
} else {
vec![]
};
let cls = if let SubPage::Classes = *get_page().read() {
if let Some(c) = *selected_class().read() {
vec![c]
} else {
vec![]
}
} else {
vec![]
};
hours.split(" ").for_each(|h| {
let Ok(h) = h.parse::<usize>() else {
return ();
};
let lec = lec.clone();
let act = Activity {
id: find_new_act_id(),
lecture: lec.id,
classes: cls.clone(),
teachers: tchr.clone(),
hour: h,
classroom: vec![],
no_limit: false,
partners: vec![],
};
add_activity(act);
});
}
}
pub fn add_activity(act: Activity) {
std::thread::spawn(move || {
let acts = activities();
acts.write().insert(act.id, act.clone());
update_activity_data();
save_activities();
})
.join()
.unwrap();
}
pub fn update_activity_data() {
std::thread::spawn(move || {
*teachers_acts().write() = create_teacher_acts();
*classes_acts().write() = create_classes_acts();
*teachers_acts_hours().write() = create_teachers_hours();
*classes_acts_hours().write() = create_classes_hours();
let len = activities().read().len();
*del_states().write() = vec![false; len];
});
}
pub fn find_new_act_id() -> i32 {
let len = activities().read().len() as i32;
for i in 1..len + 1 {
if !activities().read().contains_key(&i) {
return i;
}
}
len + 1
}
pub fn act_form(ui: &mut egui::Ui) {
egui::Window::new("My Window")
.open(&mut *show_form().write())
.show(ui.ctx(), |ui| {
ui.vertical_centered(|ui| {
egui_flex::Flex::horizontal()
.grow_items(1.0)
.align_content(egui_flex::FlexAlignContent::SpaceBetween)
.align_items_content(Align2::CENTER_TOP)
.gap(Vec2::new(1., 1.))
.show(ui, |flex| {
flex.add_ui(item().basis(500.), |ui| {
lectures_ui::select_lecture_ui(ui);
});
flex.add_ui(item().basis(500.), |ui| {
classes_ui::select_classes_ui(ui);
});
flex.add_ui(item().basis(500.), |_ui| {
});
});
if ui
.add_sized(Vec2::new(500., 30.), Button::new("Dosyaya Kaydet"))
.clicked()
{
save_activities();
};
});
});
}