use activity_form::{
act_form, add_activity, filtered_teachers, find_new_act_id, lectures_ui,
teachers_ui::filter_teacher_text, update_activity_data,
};
use eframe::egui::{
self, mutex::RwLock, vec2, Align2, Button, Color32, ComboBox, Frame, Label, RichText, Rounding,
Stroke, TextEdit,
};
use egui::{CornerRadius, Id};
use egui_extras::{Column, TableBody, TableBuilder};
use egui_flex::{item, Flex};
use serde::{Deserialize, Serialize};
use std::{
collections::{BTreeMap, HashMap},
fmt::Debug,
fs::File,
io::{Read, Write},
iter::zip,
sync::{Arc, OnceLock},
};
use super::{
classes::{classes_acts, classes_lists_ui, create_classes_acts, get_classes, selected_class},
classrooms::get_classrooms,
generating::{act_total_classes, act_total_teachers, data},
get_page, get_school,
lectures::get_lectures,
limitations::limitations_ui::{classes_limitations, teachers_limitations},
panel_buttons,
teachers::{
create_teacher_acts, get_teachers, selected_teacher, teachers_acts, teachers_list_ui,
},
SubPage,
};
pub mod activity_form;
#[derive(Hash, Clone, Default, Serialize, PartialEq, Eq, PartialOrd, Ord, Deserialize)]
pub struct Activity {
pub id: i32,
pub lecture: i32,
pub classes: Vec<i32>,
pub teachers: Vec<i32>,
pub hour: usize,
pub classroom: Vec<i32>,
pub no_limit: bool,
pub partners: Vec<i32>,
}
impl Activity {
pub fn lectures_name(&self) -> String {
let mut activity = "".to_string();
activity.push_str(&get_lec_short_name(self.lecture));
activity.push_str(" ");
for p_id in &self.partners {
let p_act = activities().read().clone();
let p_act = p_act.get(&p_id).unwrap();
activity.push_str(&get_lec_short_name(p_act.lecture));
}
activity.trim().to_string()
}
pub fn classes_name(&self) -> String {
let mut activity = "".to_string();
for c in &self.classes {
activity.push_str(&get_class_name(*c));
}
activity.push_str(" ");
for p_id in &self.partners {
let p_act = activities().read().clone();
let p_act = p_act.get(&p_id).unwrap();
for c in &p_act.classes {
activity.push_str(&get_class_name(*c));
}
}
activity.trim().to_string()
}
pub fn teachers_short_name(&self) -> String {
let mut activity = "".to_string();
for t in &self.teachers {
activity.push_str(&get_teacher_name(*t));
}
activity.push_str(" ");
for p_id in &self.partners {
let p_act = activities().read().clone();
let p_act = p_act.get(&p_id).unwrap();
for t in &p_act.teachers {
activity.push_str(&get_teacher_name(*t));
}
}
activity.trim().to_string()
}
pub fn teachers_name(&self) -> String {
let mut activity = "".to_string();
for t in &self.teachers {
activity.push_str(&get_teacher_name(*t));
}
activity.push_str(" ");
for p_id in &self.partners {
let p_act = activities().read().clone();
let p_act = p_act.get(&p_id).unwrap();
for t in &p_act.teachers {
activity.push_str(&get_teacher_name(*t));
}
}
activity.trim().to_string()
}
fn classes_lims(&self) -> Option<Vec<Vec<Vec<bool>>>> {
let mut c_availables = vec![];
let act_classes = act_total_classes().read();
let Some(classes) = act_classes.get(&self.id) else {
return None;
};
for class in classes {
let c = &*classes_limitations().read();
if let Some(c) = c.get(class) {
c_availables.push(c.limitations.clone());
}
}
Some(c_availables)
}
pub fn classes_available(&self, hour: usize, day: usize) -> bool {
let Some(lims) = self.classes_lims() else {
return false;
};
hour + self.hour <= get_school().read().hour
&& (hour..hour + self.hour as usize).all(|h| lims.iter().all(|ta| ta[day][h]))
}
fn teachers_lims(&self) -> Option<Vec<Vec<Vec<bool>>>> {
let mut t_availables = vec![];
let act_teachers = act_total_teachers().read();
let Some(teachers) = act_teachers.get(&self.id) else {
return None;
};
for teacher in teachers {
let t = &*teachers_limitations().read();
if let Some(t) = t.get(teacher) {
t_availables.push(t.limitations.clone());
}
}
Some(t_availables)
}
pub fn teachers_available(&self, hour: usize, day: usize) -> bool {
let Some(lims) = self.teachers_lims() else {
return false;
};
hour + self.hour <= get_school().read().hour
&& (hour..hour + self.hour as usize).all(|h| lims.iter().all(|ta| ta[day][h]))
}
}
impl Debug for Activity {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let name = format!(
"{}, {} {} {} - {}",
self.id,
self.lectures_name(),
self.teachers_short_name(),
self.classes_name(),
self.hour
);
write!(f, "{}", name)
}
}
pub fn save_activities() {
std::thread::spawn(move || {
let acts = &*activities().read();
let mut f = File::create("./db/activities.json").unwrap();
f.write_all(serde_json::to_string(&acts).unwrap().as_bytes())
.expect("Aktiviteler yazılamadı");
});
}
fn read_activities() -> BTreeMap<i32, Activity> {
let f = File::open("./db/activities.json");
if let Ok(mut f) = f {
let mut content: String = String::new();
f.read_to_string(&mut content).unwrap();
let cls: BTreeMap<i32, Activity> = serde_json::from_str(content.as_str()).unwrap();
return cls;
}
BTreeMap::new()
}
pub fn activities() -> &'static Arc<RwLock<BTreeMap<i32, Activity>>> {
static PAGE: OnceLock<Arc<RwLock<BTreeMap<i32, Activity>>>> = OnceLock::new();
PAGE.get_or_init(|| Arc::new(RwLock::new(read_activities())))
}
pub fn classes_acts_hours() -> &'static Arc<RwLock<BTreeMap<i32, usize>>> {
static PAGE: OnceLock<Arc<RwLock<BTreeMap<i32, usize>>>> = OnceLock::new();
PAGE.get_or_init(|| Arc::new(RwLock::new(create_classes_hours())))
}
pub fn teachers_acts_hours() -> &'static Arc<RwLock<BTreeMap<i32, usize>>> {
static PAGE: OnceLock<Arc<RwLock<BTreeMap<i32, usize>>>> = OnceLock::new();
PAGE.get_or_init(|| Arc::new(RwLock::new(create_teachers_hours())))
}
pub fn selected_act() -> &'static Arc<RwLock<i32>> {
static LECTURES: OnceLock<Arc<RwLock<i32>>> = OnceLock::new();
LECTURES.get_or_init(|| Arc::new(RwLock::new(-1)))
}
pub fn partnered_act() -> &'static Arc<RwLock<HashMap<i32, i32>>> {
static LECTURES: OnceLock<Arc<RwLock<HashMap<i32, i32>>>> = OnceLock::new();
LECTURES.get_or_init(|| Arc::new(RwLock::new(create_partnered_act())))
}
pub fn create_partnered_act() -> HashMap<i32, i32> {
let acts = &*activities().read();
let mut map = HashMap::new();
for a in acts {
for id in &a.1.partners {
map.insert(id.clone(), a.1.id);
}
}
map
}
pub fn show_add_class_form() -> &'static Arc<RwLock<bool>> {
static LECTURES: OnceLock<Arc<RwLock<bool>>> = OnceLock::new();
LECTURES.get_or_init(|| Arc::new(RwLock::new(false)))
}
pub fn set_show_class_form() {
let stat = *show_add_class_form().read();
std::thread::spawn(move || {
*show_add_class_form().write() = !stat;
});
}
pub fn show_add_classroom_form() -> &'static Arc<RwLock<bool>> {
static LECTURES: OnceLock<Arc<RwLock<bool>>> = OnceLock::new();
LECTURES.get_or_init(|| Arc::new(RwLock::new(false)))
}
pub fn set_show_classroom_form() {
let stat = *show_add_classroom_form().read();
std::thread::spawn(move || {
*show_add_classroom_form().write() = !stat;
});
}
pub fn show_add_teacher_form() -> &'static Arc<RwLock<bool>> {
static LECTURES: OnceLock<Arc<RwLock<bool>>> = OnceLock::new();
LECTURES.get_or_init(|| Arc::new(RwLock::new(false)))
}
pub fn select_class_for_move() -> &'static Arc<RwLock<Option<i32>>> {
static LECTURES: OnceLock<Arc<RwLock<Option<i32>>>> = OnceLock::new();
LECTURES.get_or_init(|| Arc::new(RwLock::new(None)))
}
pub fn class_name_for_move() -> &'static Arc<RwLock<String>> {
static LECTURES: OnceLock<Arc<RwLock<String>>> = OnceLock::new();
LECTURES.get_or_init(|| Arc::new(RwLock::new("".to_string())))
}
pub fn set_show_teacher_form() {
let stat = show_add_teacher_form().read().clone();
std::thread::spawn(move || {
*show_add_teacher_form().write() = !stat;
});
}
pub fn show_add_partner_form() -> &'static Arc<RwLock<bool>> {
static LECTURES: OnceLock<Arc<RwLock<bool>>> = OnceLock::new();
LECTURES.get_or_init(|| Arc::new(RwLock::new(false)))
}
pub fn set_partner_form() {
let stat = show_add_partner_form().read().clone();
std::thread::spawn(move || {
*show_add_partner_form().write() = !stat;
});
}
fn create_classes_hours() -> BTreeMap<i32, usize> {
let acts = &*activities().read();
let mut cah = BTreeMap::new();
for c in &*get_classes().read() {
let c_acts = acts
.iter()
.filter(|a| a.1.classes.iter().any(|ca| ca == &c.1.id))
.fold(0, |acc, a| acc + a.1.hour);
cah.insert(c.1.id, c_acts);
}
cah
}
fn create_teachers_hours() -> BTreeMap<i32, usize> {
let acts = &*activities().read();
let mut cah = BTreeMap::new();
for c in &*get_teachers().read() {
let c_acts = acts
.iter()
.filter(|a| a.1.teachers.iter().any(|ca| ca == &c.1.id))
.fold(0, |acc, a| acc + a.1.hour);
cah.insert(c.1.id, c_acts);
}
cah
}
pub fn del_states() -> &'static Arc<RwLock<Vec<bool>>> {
static SELECTED: OnceLock<Arc<RwLock<Vec<bool>>>> = OnceLock::new();
let len = activities().read().len();
SELECTED.get_or_init(|| Arc::new(RwLock::new(vec![false; len])))
}
pub fn get_lec_name(id: i32) -> String {
let lec = get_lectures()
.read()
.clone()
.into_iter()
.find(|l| l.1.id == id);
if let Some(lec) = lec {
return lec.1.name;
}
"".to_string()
}
pub fn get_lec_short_name(id: i32) -> String {
let lec = get_lectures()
.read()
.clone()
.into_iter()
.find(|l| l.1.id == id);
if let Some(lec) = lec {
return lec.1.short_name;
}
"".to_string()
}
pub fn get_classes_name(ids: &[i32]) -> String {
let mut name = "".to_string();
for i in ids {
if let Some(c) = get_classes().read().get(i) {
name.push_str(&c.name);
name.push_str(" ");
}
}
name.trim().to_string()
}
pub fn get_class_name(id: i32) -> String {
let mut name = "".to_string();
if let Some(c) = get_classes().read().get(&id) {
name.push_str(&c.name);
}
name.trim().to_string()
}
pub fn get_act_classrooms_name(id: i32) -> String {
let mut name = "".to_string();
if let Some(c) = get_classrooms().read().get(&id) {
name.push_str(&c.name);
}
name.trim().to_string()
}
pub fn get_teachers_name(ids: &[i32]) -> String {
let mut name = "".to_string();
for i in ids {
if let Some(c) = get_teachers().read().get(i) {
name.push_str(&c.short_name);
name.push_str("\n");
}
}
name.trim().to_string()
}
pub fn get_teacher_name(id: i32) -> String {
let mut name = "".to_string();
if let Some(c) = get_teachers().read().get(&id) {
name.push_str(&c.short_name);
}
name.trim().to_string()
}
pub fn get_teachers_short_name(ids: &[i32]) -> String {
let mut name = "".to_string();
for i in ids {
if let Some(c) = get_teachers().read().get(i) {
name.push_str(&c.short_name);
name.push_str(" ");
}
}
name.trim().to_string()
}
fn del_act(id: i32) {
std::thread::spawn(move || {
activities().write().remove(&id);
let len = activities().read().len();
*del_states().write() = vec![false; len];
*classes_acts().write() = create_classes_acts();
*classes_acts_hours().write() = create_classes_hours();
*teachers_acts().write() = create_teacher_acts();
*teachers_acts_hours().write() = create_teachers_hours();
save_activities();
});
}
pub fn activities_ui(ui: &mut egui::Ui) {
egui::TopBottomPanel::top("top_panel")
.resizable(true)
.default_height(60.)
.height_range(50.0..=350.0)
.show_inside(ui, |ui| {
panel_buttons(ui);
});
home_ui(ui);
}
pub fn home_ui(ui: &mut egui::Ui) {
egui::SidePanel::left("left_panel")
.resizable(true)
.default_width(250.0)
.width_range(200.0..=500.0)
.show_inside(ui, |ui| {
if let SubPage::Teachers = *get_page().read() {
teachers_list_ui(ui);
} else {
classes_lists_ui(ui);
}
});
egui::CentralPanel::default().show_inside(ui, |ui| {
act_form(ui);
ui.horizontal(|ui| {
ui.separator();
ui.vertical(|ui| {
list_activities_ui(ui);
});
});
});
}
pub fn list_activities_ui(ui: &mut egui::Ui) {
add_more_teachers_list(ui);
add_more_classes_list(ui);
add_more_classroom_list(ui);
add_partner_form(ui);
lectures_ui::select_lecture_ui(ui);
let w = ui.available_width();
if ui
.add_sized(vec2(w, 50.), Button::new("Ders Ata"))
.clicked()
{
*lectures_ui::show_lectures().write() = true;
};
match *get_page().read() {
SubPage::Teachers => {
if let Some(t) = *selected_teacher().read() {
let text = get_teachers_name(&[t]);
let hour = *teachers_acts_hours().read().get(&t).unwrap_or(&0);
if let Some(acts) = teachers_acts().write().get_mut(&t) {
list_acts_table(ui, acts);
}
ui.separator();
ui.add(Label::new(
RichText::new(format!(
"{} adlı öğretmene atanan toplam ders yükü: {} saat",
text, hour
))
.size(18.),
));
}
}
SubPage::Classes => {
if let Some(c) = *selected_class().read() {
let text = get_classes_name(&[c]);
let hour = *classes_acts_hours().read().get(&c).unwrap_or(&0);
if let Some(acts) = classes_acts().write().get(&c) {
list_acts_table(ui, acts);
}
ui.separator();
ui.horizontal_centered(|ui| {
ui.add(Label::new(
RichText::new(format!(
"{} sınıfına atanan toplam ders yükü: {} saat",
text, hour
))
.size(18.),
));
ui.add_space(50.);
ComboBox::new("move_classes", "")
.width(50.)
.selected_text(&*class_name_for_move().read())
.show_ui(ui, |ui| {
for c in &*get_classes().read() {
let cl = c.1.clone();
if ui.button(&c.1.name).clicked() {
std::thread::spawn(move || {
*class_name_for_move().write() = cl.name.clone();
*select_class_for_move().write() = Some(cl.id);
});
};
}
});
if ui
.add_sized(vec2(100., 30.), Button::new("Seçili Sınıfa Aktar"))
.clicked()
{
std::thread::spawn(move || {
if let Some(id) = *select_class_for_move().read() {
if let Some(acts) = classes_acts().read().get(&c) {
for a in acts {
let mut a = a.clone();
a.classes.iter_mut().for_each(|c2| {
if c == *c2 {
*c2 = id;
}
});
a.id = find_new_act_id();
add_activity(a);
}
}
}
});
}
});
}
}
};
ui.separator();
}
pub fn list_acts_table(ui: &mut egui::Ui, acts: &Vec<Activity>) {
TableBuilder::new(ui)
.column(Column::initial(50.).resizable(true))
.column(Column::initial(250.).resizable(true))
.column(Column::initial(230.).resizable(true))
.column(Column::initial(100.).resizable(true))
.column(Column::initial(50.).resizable(true))
.column(Column::initial(50.).resizable(true))
.column(Column::initial(120.).resizable(true))
.column(Column::initial(120.).resizable(true))
.column(Column::initial(50.).resizable(true))
.striped(true)
.min_scrolled_height(800.)
.auto_shrink(false)
.header(50., |mut header| {
header.col(|ui| {
ui.heading("İd");
});
header.col(|ui| {
ui.heading("Ders");
});
header.col(|ui| {
ui.heading("Öğretmenler");
});
header.col(|ui| {
ui.heading("Sınıflar");
});
header.col(|ui| {
ui.heading("Saat");
});
header.col(|ui| {
ui.heading("Limit");
});
header.col(|ui| {
ui.heading("Derslik");
});
header.col(|ui| {
ui.heading("Ortak Dersler");
});
})
.body(|body| table_body(body, acts));
}
fn table_body(mut body: TableBody, acts: &Vec<Activity>) {
let stats = &*del_states().read();
for (index, (act, stat)) in zip(acts, stats).enumerate() {
body.row(40., |mut row| {
row.col(|ui| {
ui.horizontal_centered(|ui| {
if !*stat {
if ui.button("Sil").clicked() {
std::thread::spawn(move || {
del_states().write()[index] = true;
});
};
if ui.button("Çoğalt").clicked() {
let mut a = act.clone();
a.id = find_new_act_id();
add_activity(a);
};
if ui.button("Böl").clicked() {
let id = act.id;
let hour = act.hour;
std::thread::spawn(move || {
let a = &mut *activities().write();
let a = a.get_mut(&id);
if let Some(a) = a {
a.hour = hour - a.hour / 2;
}
})
.join()
.unwrap();
let mut a = act.clone();
a.id = find_new_act_id();
a.hour = a.hour / 2;
add_activity(a);
save_activities();
};
if index > 0 && acts[index - 1].lecture == act.lecture {
if ui.button("↑").clicked() {
let id = act.id;
let id2 = acts[index - 1].clone();
let hour = id2.hour;
let id2 = id2.id;
std::thread::spawn(move || {
let a = &mut *activities().write();
a.remove(&id2);
let a = a.get_mut(&id);
if let Some(a) = a {
a.hour = a.hour + hour;
}
save_activities();
update_activity_data();
});
};
}
} else {
ui.horizontal_centered(|ui| {
if ui
.button(RichText::new("Sil").color(Color32::DARK_RED))
.clicked()
{
del_act(act.id);
};
if ui
.button(RichText::new("Vazgeç").color(Color32::DARK_RED))
.clicked()
{
std::thread::spawn(move || {
del_states().write()[index] = false;
});
};
});
}
});
});
row.col(|ui| {
ui.horizontal_centered(|ui| {
ui.label(RichText::new(get_lec_name(act.lecture)).size(
if act.id == *selected_act().read() {
24.
} else {
16.
},
));
});
});
row.col(|ui| {
act_teachers_row(ui, &act);
});
row.col(|ui| {
act_classes_row(ui, &act);
});
row.col(|ui| {
ui.horizontal_centered(|ui| {
ui.label(act.hour.to_string());
});
});
row.col(|ui| {
if ui.checkbox(&mut act.no_limit.clone(), "").changed() {
change_no_limit(act.id);
};
});
row.col(|ui| {
act_classrooms_row(ui, &act);
});
row.col(|ui| {
ui.horizontal_wrapped(|ui| {
act_partners_row(ui, &act);
});
});
});
}
}
fn act_partners_row(ui: &mut egui::Ui, act: &Activity) {
let ids = &act.partners;
ui.horizontal_centered(|ui| {
for id in ids {
let a = activities().read().clone();
let a = a.get(&id).unwrap();
let fmt = format!(
"{}-{}",
get_lec_name(a.lecture),
get_teachers_name(&a.teachers)
);
Frame::new()
.corner_radius(CornerRadius::same(5))
.stroke(Stroke::new(0.5, Color32::GRAY))
.inner_margin(2.)
.show(ui, |ui| {
ui.label(fmt);
let b = Button::new(" ✖")
.stroke(Stroke::NONE)
.fill(Color32::default());
if ui
.add(b)
.on_hover_cursor(egui::CursorIcon::PointingHand)
.clicked()
{
del_partner(act.id, a.id);
};
});
}
});
if partnered_act().read().get(&act.id).is_none()
&& ui
.button(RichText::new(" ➕").color(Color32::LIGHT_BLUE))
.clicked()
{
*selected_act().write() = act.id;
set_partner_form();
}
}
fn act_teachers_row(ui: &mut egui::Ui, act: &Activity) {
ui.horizontal_centered(|ui| {
ui.horizontal(|ui| {
for t in &act.teachers {
Frame::new()
.corner_radius(CornerRadius::same(5))
.stroke(Stroke::new(0.5, Color32::GRAY))
.show(ui, |ui| {
ui.label(get_teacher_name(*t));
let b = Button::new("✖")
.stroke(Stroke::NONE)
.fill(Color32::default());
if ui
.add(b)
.on_hover_cursor(egui::CursorIcon::PointingHand)
.clicked()
{
remove_teacher(*t, act.id);
};
});
}
});
if ui
.button(RichText::new(" ➕").color(Color32::LIGHT_BLUE))
.clicked()
{
*selected_act().write() = act.id;
set_show_teacher_form();
}
});
}
fn act_classes_row(ui: &mut egui::Ui, act: &Activity) {
ui.horizontal_centered(|ui| {
ui.horizontal(|ui| {
for c in &act.classes {
Frame::new()
.corner_radius(CornerRadius::same(5))
.stroke(Stroke::new(0.5, Color32::GRAY))
.show(ui, |ui| {
ui.label(get_class_name(*c));
let b = Button::new("✖")
.stroke(Stroke::NONE)
.fill(Color32::default());
if ui
.add(b)
.on_hover_cursor(egui::CursorIcon::PointingHand)
.clicked()
{
remove_class(*c, act.id);
};
});
}
});
if ui
.button(RichText::new(" ➕").color(Color32::LIGHT_BLUE))
.clicked()
{
*selected_act().write() = act.id;
*show_add_class_form().write() = true;
}
});
}
fn act_classrooms_row(ui: &mut egui::Ui, act: &Activity) {
ui.horizontal_centered(|ui| {
ui.horizontal(|ui| {
for c in &act.classroom {
Frame::new()
.corner_radius(CornerRadius::same(5))
.stroke(Stroke::new(0.5, Color32::GRAY))
.show(ui, |ui| {
ui.label(get_act_classrooms_name(*c));
let b = Button::new("✖")
.stroke(Stroke::NONE)
.fill(Color32::default());
if ui
.add(b)
.on_hover_cursor(egui::CursorIcon::PointingHand)
.clicked()
{
remove_classroom(*c, act.id);
};
});
}
});
if ui
.button(RichText::new(" ➕").color(Color32::LIGHT_BLUE))
.clicked()
{
*selected_act().write() = act.id;
set_show_classroom_form();
}
});
}
fn add_more_classes_list(ui: &mut egui::Ui) {
let id = *selected_act().read();
egui::Window::new("Select Class")
.open(&mut *show_add_class_form().write())
.show(ui.ctx(), |ui| {
Flex::horizontal()
.align_items(egui_flex::FlexAlign::Stretch)
.align_items_content(Align2::CENTER_CENTER)
.gap(vec2(1., 1.0))
.show(ui, |flex| {
for c in &*get_classes().read() {
flex.add_ui(item().grow(5.), |ui| {
if ui
.add_sized(vec2(50., 30.), Button::new(&c.1.name))
.clicked()
{
add_more_class(c.1.id, id);
}
});
}
});
});
}
fn add_more_classroom_list(ui: &mut egui::Ui) {
let id = *selected_act().read();
egui::Window::new("Select Classroom")
.open(&mut *show_add_classroom_form().write())
.show(ui.ctx(), |ui| {
Flex::horizontal()
.align_items(egui_flex::FlexAlign::Stretch)
.align_items_content(Align2::CENTER_CENTER)
.gap(vec2(1., 1.0))
.show(ui, |flex| {
for c in &*get_classrooms().read() {
flex.add_ui(item().grow(5.), |ui| {
if ui
.add_sized(vec2(50., 30.), Button::new(&c.1.name))
.clicked()
{
add_more_classroom(c.1.id, id);
}
});
}
});
});
}
fn add_more_teachers_list(ui: &mut egui::Ui) {
let id = *selected_act().read();
egui::Window::new("Select Teacher")
.open(&mut *show_add_teacher_form().write())
.show(ui.ctx(), |ui| {
filter_teacher_text(ui);
Flex::vertical()
.wrap(true)
.gap(vec2(1., 1.0))
.show(ui, |flex| {
for t in &*filtered_teachers().read() {
flex.add_ui(item().grow(1.), |ui| {
if ui
.add_sized(vec2(250., 30.), Button::new(&t.name))
.clicked()
{
add_more_teacher(t.id, id);
}
});
}
});
});
}
fn add_partner_form(ui: &mut egui::Ui) {
let act_id = *selected_act().read();
egui::Window::new("Ortak Ders Ekle")
.open(&mut *show_add_partner_form().write())
.show(ui.ctx(), |ui| {
Flex::vertical()
.gap(vec2(1., 1.0))
.show(ui, |flex| {
flex.add_ui(item(), |ui| {
if ui
.add(
TextEdit::singleline(&mut *filter_acts_string().write())
.hint_text("Ders adı Öğretmen Sınıf sıralamasıyla filtrele"),
)
.changed()
{
filtering_acts();
};
});
for a in &*filtered_acts().read() {
if a.id != act_id
&& a.partners.is_empty()
&& partnered_act().read().get(&a.id).is_none()
{
flex.add_ui(item().grow(1.), |ui| {
if ui
.add_sized(vec2(250., 30.), Button::new(format!("{:?}", a)))
.clicked()
{
change_partner(act_id, a.id);
}
});
}
}
});
});
}
pub fn acts_frames(ui: &mut egui::Ui, acts: &Vec<Activity>) {
let tt = data().read().timetables.clone();
let frame = Frame::none()
.stroke(Stroke::new(0.5, Color32::LIGHT_GRAY))
.inner_margin(vec2(10., 10.))
.rounding(5.);
Flex::horizontal()
.gap(vec2(10., 10.))
.wrap(true)
.show(ui, |flex| {
for a in acts {
if !tt.contains_key(&a.id) {
flex.add_ui(item().grow(1.).frame(frame), |ui| {
ui.dnd_drag_source(Id::new(a.id), a.clone(), |ui| {
ui.add(Label::new(format!("{:?}", a)));
});
});
}
}
});
}
pub fn filtered_acts() -> &'static Arc<RwLock<Vec<Activity>>> {
static TEACHERS: OnceLock<Arc<RwLock<Vec<Activity>>>> = OnceLock::new();
TEACHERS.get_or_init(|| Arc::new(RwLock::new(vec![])))
}
pub fn filter_acts_string() -> &'static Arc<RwLock<String>> {
static TEACHERS: OnceLock<Arc<RwLock<String>>> = OnceLock::new();
TEACHERS.get_or_init(|| Arc::new(RwLock::new("".to_string())))
}
pub fn filtering_acts() {
let flt = &*filter_acts_string().read().clone().to_uppercase();
*filtered_acts().write() = activities()
.read()
.iter()
.filter(|a| format!("{:?}", a.1).to_uppercase().contains(flt))
.map(|a| a.1.clone())
.collect();
}
fn change_no_limit(id: i32) {
let acts = &mut *activities().write();
let act = acts.get_mut(&id);
if let Some(a) = act {
a.no_limit = !a.no_limit;
std::thread::spawn(move || {
*classes_acts().write() = create_classes_acts();
*teachers_acts().write() = create_teacher_acts();
save_activities();
});
}
}
fn change_partner(act_id: i32, p_id: i32) {
let acts = &mut *activities().write();
let act = acts.get_mut(&act_id);
if let Some(a) = act {
a.partners.push(p_id);
std::thread::spawn(move || {
*partnered_act().write() = create_partnered_act();
*classes_acts().write() = create_classes_acts();
*teachers_acts().write() = create_teacher_acts();
save_activities();
});
}
}
fn add_more_teacher(teacher: i32, id: i32) {
let acts = &mut *activities().write();
let act = acts.get_mut(&id);
if let Some(a) = act {
if !a.teachers.iter().any(|i| i == &teacher) {
a.teachers.push(teacher);
}
std::thread::spawn(move || {
*classes_acts().write() = create_classes_acts();
*teachers_acts().write() = create_teacher_acts();
save_activities();
set_show_teacher_form();
});
}
}
fn del_partner(id: i32, p_id: i32) {
let acts = &mut *activities().write();
let act = acts.get_mut(&id);
if let Some(a) = act {
a.partners.retain(|a| a != &p_id);
std::thread::spawn(move || {
*classes_acts().write() = create_classes_acts();
*teachers_acts().write() = create_teacher_acts();
*partnered_act().write() = create_partnered_act();
save_activities();
});
}
}
fn remove_teacher(teacher: i32, id: i32) {
let acts = &mut *activities().write();
let act = acts.get_mut(&id);
if let Some(a) = act {
a.teachers.retain(|t| t != &teacher);
std::thread::spawn(move || {
*classes_acts().write() = create_classes_acts();
*teachers_acts().write() = create_teacher_acts();
save_activities();
});
}
}
fn add_more_class(class: i32, id: i32) {
let acts = &mut *activities().write();
let act = acts.get_mut(&id);
if let Some(a) = act {
if !a.classes.iter().any(|i| i == &class) {
a.classes.push(class);
}
std::thread::spawn(move || {
*classes_acts().write() = create_classes_acts();
*teachers_acts().write() = create_teacher_acts();
save_activities();
});
}
}
fn remove_class(class: i32, id: i32) {
let acts = &mut *activities().write();
let act = acts.get_mut(&id);
if let Some(a) = act {
a.classes.retain(|c| c != &class);
std::thread::spawn(move || {
*classes_acts().write() = create_classes_acts();
*teachers_acts().write() = create_teacher_acts();
save_activities();
});
}
}
fn add_more_classroom(class: i32, id: i32) {
let acts = &mut *activities().write();
let act = acts.get_mut(&id);
if let Some(a) = act {
if !a.classroom.iter().any(|i| i == &class) {
a.classroom.push(class);
}
std::thread::spawn(move || {
save_activities();
});
}
}
fn remove_classroom(cr: i32, id: i32) {
let acts = &mut *activities().write();
let act = acts.get_mut(&id);
if let Some(a) = act {
a.classroom.retain(|c| c != &cr);
std::thread::spawn(move || {
save_activities();
});
}
}