DZJPNQSRCGZX6363CYC3HOL4CQML6X5NNMUUBRDDGDRSVBHNMJCQC 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"),// SubPage::Classrooms => write!(f, "Derslikler"),}}}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,}// impl School {// fn get_name(self) -> String {// self.name// }// fn get_hour(&self) -> i32 {// self.hour// }// }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();});}}
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // hide console window on Windows in releasepub mod fonts;pub mod tabs;use eframe::egui;use eframe::egui::ViewportBuilder;use eframe::NativeOptions;use egui_dock::{DockArea, DockState, Style};fn main() -> eframe::Result<()> {let size = ViewportBuilder::default().with_maximized(true);let options = NativeOptions {viewport: size,..Default::default()};eframe::run_native("Lapis Ders Dağıtım",options,Box::new(|_cc| Ok(Box::<MyApp>::default())),)}static DAYS: &[&str] = &["Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi","Pazar",];#[derive(Default, Debug)]enum Page {#[default]Home,Signin,_Login,}#[derive(Default, Debug)]enum HomeTab {#[default]Home,Classes,Teachers,Classrooms,Lectures,Limitations,Activities,Generate,}impl egui_dock::TabViewer for HomeTab {type Tab = HomeTab;fn title(&mut self, tab: &mut Self::Tab) -> egui_dock::egui::WidgetText {format!("{:?}", &*tab).into()}fn ui(&mut self, ui: &mut egui::Ui, tab: &mut Self::Tab) {match tab {HomeTab::Home => {tabs::school_page(ui);}HomeTab::Classes => {tabs::classes::classes_page(ui);}HomeTab::Teachers => {tabs::teachers::teachers_page(ui);}HomeTab::Classrooms => {tabs::classrooms::classrooms_page(ui);}HomeTab::Lectures => {tabs::lectures::lectures_page(ui);}HomeTab::Limitations => {tabs::limitations::limitations(ui);}HomeTab::Activities => {tabs::activities::activities_ui(ui);}HomeTab::Generate => {tabs::generate::generate_ui(ui);}};}}struct MyApp {tree: DockState<HomeTab>,page: Page,}impl Default for MyApp {fn default() -> Self {let tree = DockState::new(vec![HomeTab::Home,HomeTab::Classes,HomeTab::Teachers,HomeTab::Lectures,HomeTab::Classrooms,HomeTab::Limitations,HomeTab::Activities,HomeTab::Generate,]);let page = Page::Home;// You can modify the tree before constructing the dock// let [a, b] =// tree.main_surface_mut()// .split_left(NodeIndex::root(), 0.3, vec!["tab3".to_owned()]);// let [_, _] = tree// .main_surface_mut()// .split_below(a, 0.7, vec!["tab4".to_owned()]);// let [_, _] = tree// .main_surface_mut()// .split_below(b, 0.5, vec!["tab5".to_owned()]);Self { tree, page }}}impl eframe::App for MyApp {fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {// ctx.set_theme(ThemePreference::Light);// let mut fonts = FontDefinitions::default();// // Install my own font (maybe supporting non-latin characters):// fonts.font_data.insert(// "my_font".to_owned(),// std::sync::Arc::new(// // .ttf and .otf supported// FontData::from_static(include_bytes!("./fonts/FreeSansBold.otf")),// ),// );// fonts// .families// .get_mut(&egui::FontFamily::Proportional)// .unwrap()// .insert(0, "my_font".to_owned());// ctx.set_fonts(fonts);match self.page {Page::Home => {DockArea::new(&mut self.tree).show_leaf_close_all_buttons(false).style(Style::from_egui(ctx.style().as_ref())).show_close_buttons(false).show_add_popup(true).show(ctx, &mut HomeTab::Home);}_ => {}}}}// pub struct TemplateApp {// run_once: bool,// my_theme: StateMachine,// }// impl Default for TemplateApp {// fn default() -> Self {// Self {// run_once: false,// my_theme: egui_themes::StateMachine::new(),// }// }// }
use std::{fs::write, path::PathBuf};use eframe::egui::{Color32, Frame, Stroke};pub fn a(f: &dyn AsRef<[u8]>, path: PathBuf) {write(path, f).expect("");}pub fn frame(active: bool) -> eframe::egui::Frame {let s_width = if active { 2. } else { 1. };let color = if active {Color32::BLUE} else {Color32::BLACK};let stroke = Stroke::new(s_width, color);Frame::none().stroke(stroke).inner_margin(10.).outer_margin(10.).rounding(1.0)}
pub fn font_family() -> genpdf::fonts::FontFamily<genpdf::fonts::FontData> {let font_bold = include_bytes!("./fonts/FreeSansBold.ttf");let font_bold_data = genpdf::fonts::FontData::new(font_bold.to_vec(), None).expect("font data should be correct");let font_bold_italic = include_bytes!("./fonts/FreeSansBoldOblique.ttf");let font_bold_italic_data = genpdf::fonts::FontData::new(font_bold_italic.to_vec(), None).expect("font data should be correct");let font_regular = include_bytes!("./fonts/FreeSans.ttf");let font_regular_data = genpdf::fonts::FontData::new(font_regular.to_vec(), None).expect("font data should be correct");let font_regular_italic = include_bytes!("./fonts/FreeSansOblique.ttf");let font_regular_italic_data = genpdf::fonts::FontData::new(font_regular_italic.to_vec(), None).expect("font data should be correct");let font_family = genpdf::fonts::FontFamily {regular: font_regular_data,bold: font_bold_data,italic: font_regular_italic_data,bold_italic: font_bold_italic_data,};font_family}
[package]name = "Lapis"version = "0.1.0"edition = "2021"[lib]name = "mylib"path = "src/lib.rs"[[bin]]name = "lapis"path = "src/main.rs"[dependencies]eframe = { version = "0.30", features = ["default","__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO] }env_logger = { version = "0.10", default-features = false, features = ["auto-color","humantime",] }egui_extras ={ version ="*"}egui_dock = {git = "https://github.com/bryceberger/egui_dock", branch ="egui-0.30"}egui_flex ="*"rfd = "*"serde = {version ="*", features=["derive"]}serde_json = "*"rand = "*"egui = "0.30"# egui = {git="https://github.com/emilk/egui", branch="master"}# egui-themes = "0.1.0"genpdf = "*"opener = "*"chrono = "*"