diff --git a/code/src/order_tab.rs b/code/src/order_tab.rs new file mode 100644 index 0000000..b08b3fd --- /dev/null +++ b/code/src/order_tab.rs @@ -0,0 +1,112 @@ +use std::sync::Arc; + +use egui::mutex::RwLock; +use egui_extras::Column; + +use crate::{ + database::DBOperator, + misc, + models::Order, + tab::{TABS_CAN_BE_WINDOWS, Tab, TabTypes}, +}; + +pub struct OrderTabViewer { + db_oper: DBOperator, + rt: tokio::runtime::Runtime, + + incoming_orders: Arc>>, + outcoming_orders: Arc>>, + incoming_order_page: i32, + outcoming_order_page: i32, +} + +impl OrderTabViewer { + pub fn show_orders(&mut self, ui: &mut egui::Ui, incoming_orders: bool) { + let orders = if incoming_orders { + &self.incoming_orders + } else { + &self.outcoming_orders + }; + ui.horizontal(|ui| { + if ui.button("Добавить").clicked() {} + if ui.button("<-").clicked() {} + ui.monospace(if incoming_orders { + self.incoming_order_page.to_string() + } else { + self.outcoming_order_page.to_string() + }); + if ui.button("->").clicked() {} + }); + + egui_extras::TableBuilder::new(ui) + .columns(Column::auto(), 5) + .striped(true) + .vscroll(true) + .header(25.0, |mut heading| { + heading.col(|ui| { + ui.heading(if incoming_orders { + "Заказчик" + } else { + "Клиент" + }); + }); + heading.col(|ui| { + ui.heading("Состав"); + }); + heading.col(|ui| { + ui.heading("Стоимость"); + }); + heading.col(|ui| { + ui.heading("Дата создания"); + }); + }); + } +} + +impl egui_dock::TabViewer for OrderTabViewer { + type Tab = Tab; + + fn title(&mut self, tab: &mut Self::Tab) -> egui::WidgetText { + tab.title.clone().into() + } + + fn ui(&mut self, ui: &mut egui::Ui, tab: &mut Self::Tab) { + match tab.tab_type { + TabTypes::IncomingOrderList => { + self.show_orders(ui, true); + } + TabTypes::OutcomingOrderList => { + self.show_orders(ui, false); + } + _ => { + ui.label("Nope"); + } + } + } + fn allowed_in_windows(&self, _tab: &mut Self::Tab) -> bool { + TABS_CAN_BE_WINDOWS + } + fn is_closeable(&self, _tab: &Self::Tab) -> bool { + false + } +} +impl Default for OrderTabViewer { + fn default() -> Self { + let rt = tokio::runtime::Runtime::new().unwrap(); + let db_oper = rt.block_on(async { DBOperator::new().await }); + + Self { + incoming_orders: Arc::new(RwLock::new( + rt.block_on(async { db_oper.get_orders(0, misc::ELEMENTS_PER_PAGE, true).await }), + )), + outcoming_orders: Arc::new(RwLock::new( + rt.block_on(async { db_oper.get_orders(0, misc::ELEMENTS_PER_PAGE, false).await }), + )), + + incoming_order_page: 0, + outcoming_order_page: 0, + db_oper, + rt, + } + } +}