При раскопках в Тбилиси рабочие наткнулись на телефонный кабель. Грузины говорят армянам:

- Ну, вы видите, как давно у нас телефон был изобретен.
Армяне в ответ:
- Это что. Вот мы на днях под Ереваном копали и не нашли никакого кабеля. Представляете, как давно в Армении пользуются сотовой связью.
master
Алексей Алексей 2026-05-21 19:55:25 +10:00
parent 7ccb55cb43
commit fe0c9ff86c
2 changed files with 42 additions and 80 deletions

View File

@ -26,6 +26,7 @@ struct Tab{
} }
pub struct App{ pub struct App{
pub tree: egui_dock::DockState<Tab>, pub tree: egui_dock::DockState<Tab>,
pub main_viewer: MainTabViewer
} }
impl Default for App{ impl Default for App{
@ -61,7 +62,8 @@ impl Default for App{
} }
]); ]);
Self{tree} let main_viewer = MainTabViewer::default();
Self{tree, main_viewer}
} }
} }
impl App{ impl App{
@ -76,7 +78,7 @@ impl eframe::App for App{
fn ui(&mut self, ui: &mut egui::Ui, _frame: &mut eframe::Frame){ fn ui(&mut self, ui: &mut egui::Ui, _frame: &mut eframe::Frame){
DockArea::new(&mut self.tree) DockArea::new(&mut self.tree)
.style(Style::from_egui(ui.style().as_ref())) .style(Style::from_egui(ui.style().as_ref()))
.show_inside(ui, &mut MainTabViewer::default()); .show_inside(ui, &mut self.main_viewer);
} }
} }
@ -87,6 +89,7 @@ struct MainTabViewer {
db_oper: DBOperator, db_oper: DBOperator,
worker_tabs: WorkerTabViewer, worker_tabs: WorkerTabViewer,
worker_tree: egui_dock::DockState<Tab>, worker_tree: egui_dock::DockState<Tab>,
rt: tokio::runtime::Runtime,
} }
impl Default for MainTabViewer{ impl Default for MainTabViewer{
@ -98,7 +101,7 @@ impl Default for MainTabViewer{
workers: Arc::new(RwLock::new(Option::Some(rt.block_on(async{db_oper.get_workers().await.unwrap()})))), workers: Arc::new(RwLock::new(Option::Some(rt.block_on(async{db_oper.get_workers().await.unwrap()})))),
equipment: vec![models::Equipment::default()], equipment: vec![models::Equipment::default()],
db_oper, db_oper,
worker_tabs: WorkerTabViewer{}, worker_tabs: WorkerTabViewer::default(),
worker_tree: egui_dock::DockState::new(vec![ worker_tree: egui_dock::DockState::new(vec![
Tab{ Tab{
title:"ГойдаЗов".to_owned(), title:"ГойдаЗов".to_owned(),
@ -109,6 +112,7 @@ impl Default for MainTabViewer{
tab_type:TabTypes::WorkerPosition, tab_type:TabTypes::WorkerPosition,
} }
]), ]),
rt
} }
} }
} }
@ -136,7 +140,7 @@ impl MainTabViewer{
//Это таблицы, с ними надо разобраться! //Это таблицы, с ними надо разобраться!
for eq in self.equipment.clone() { for eq in self.equipment.clone() {
ui.push_id("shit".to_owned(), |ui|{ ui.push_id(&eq.name, |ui|{
egui::CollapsingHeader::new(&eq.name) egui::CollapsingHeader::new(&eq.name)
.default_open(false) .default_open(false)
.show(ui, |ui|{ .show(ui, |ui|{
@ -150,7 +154,6 @@ impl MainTabViewer{
} }
fn show_worker(&mut self, ui: &mut egui::Ui){ fn show_worker(&mut self, ui: &mut egui::Ui){
let rt = tokio::runtime::Runtime::new().unwrap();
ui.horizontal(|ui|{ ui.horizontal(|ui|{
if ui.button("Добавить").clicked() { if ui.button("Добавить").clicked() {
@ -159,37 +162,35 @@ impl MainTabViewer{
} }
}); });
rt.block_on(async{ for wk in self.workers.read().clone().unwrap().iter(){
for wk in self.workers.read().clone().unwrap().iter(){ ui.push_id(format!("{}:{}",&wk.full_name,&wk.id),|ui| {
ui.push_id(format!("{}:{}",&wk.full_name,&wk.id),|ui| { egui::CollapsingHeader::new(format!("#{:08} | {}",&wk.id,&wk.full_name))
egui::CollapsingHeader::new(format!("#{:08} | {}",&wk.id,&wk.full_name)) .default_open(false)
.default_open(false) .show(ui, |ui|{
.show(ui, |ui|{ ui.horizontal(|ui|{
ui.horizontal(|ui|{ ui.label("Нанят: ");
ui.label("Нанят: "); ui.label(format!("{}",wk.hire_date.date_naive().format("%d-%m-%Y").to_string()));
ui.label(format!("{}",wk.hire_date.date_naive().format("%d-%m-%Y").to_string())); });
}); ui.horizontal(|ui|{
ui.horizontal(|ui|{ ui.label("Должность: ");
ui.label("Должность: "); ui.label(&wk.position.name);
ui.label(&wk.position.name); });
}); ui.horizontal(|ui|{
ui.horizontal(|ui|{ ui.label("Уволен: ");
ui.label("Уволен: "); ui.label(if wk.is_fired {
ui.label(if wk.is_fired { "Да"
"Да" }else{
}else{ "Нет"
"Нет"
})
}) })
}) })
}); })
} });
}) }
}
}
fn show_position(&mut self, ui: &mut egui::Ui){ fn show_position(&mut self, ui: &mut egui::Ui){
let rt = tokio::runtime::Runtime::new().unwrap();
rt.block_on(async{
for eq in self.positions.read().clone().unwrap().iter(){ for eq in self.positions.read().clone().unwrap().iter(){
ui.push_id(&eq.name, |ui|{ ui.push_id(&eq.name, |ui|{
egui::CollapsingHeader::new(&eq.name) egui::CollapsingHeader::new(&eq.name)
@ -200,12 +201,13 @@ impl MainTabViewer{
}); });
} }
})
} }
fn show_salary(&mut self, ui: &mut egui::Ui){ fn show_salary(&mut self, ui: &mut egui::Ui){
let id = ui.make_persistent_id("BotMenu");
DockArea::new(&mut self.worker_tree) DockArea::new(&mut self.worker_tree)
.style(Style::from_egui(ui.style().as_ref())) .style(Style::from_egui(ui.style().as_ref()))
.show_inside(ui, &mut WorkerTabViewer::default()); .id(id)
.show_inside(ui, &mut self.worker_tabs);
} }
fn show_material(&mut self, ui: &mut egui::Ui){ fn show_material(&mut self, ui: &mut egui::Ui){
ui.label("Сырьё короче да"); ui.label("Сырьё короче да");
@ -247,6 +249,9 @@ impl egui_dock::TabViewer for MainTabViewer{
fn is_closeable(&self, _tab: &Self::Tab) -> bool { fn is_closeable(&self, _tab: &Self::Tab) -> bool {
false false
} }
fn id(&mut self, tab: &mut Self::Tab) -> egui::Id {
egui::Id::new(&tab.title)
}
} }
#[derive(Default)] #[derive(Default)]
@ -262,4 +267,7 @@ impl egui_dock::TabViewer for WorkerTabViewer{
fn ui(&mut self, ui: &mut egui::Ui, tab: &mut Self::Tab) { fn ui(&mut self, ui: &mut egui::Ui, tab: &mut Self::Tab) {
} }
fn id(&mut self, tab: &mut Self::Tab) -> egui::Id {
egui::Id::new(&tab.title)
}
} }

View File

@ -1,46 +0,0 @@
use diesel::*;
table!{
equipment(id){
id -> Integer,
inv_number -> VarChar,
maintenance_date -> Datetime,
worker_id -> Integer,
name -> VarChar,
}
}
table! {
salary(id){
id -> Integer,
worker_id -> Integer,
salary_size -> Decimal,
salary_date -> Datetime
}
}
table! {
position(id){
id -> Integer,
name -> VarChar,
wage -> Decimal
}
}
table! {
worker(id){
id -> Integer,
position_id -> Integer,
hire_date -> Datetime,
is_fired -> Bool,
full_name -> VarChar
}
}
joinable!(equipment -> worker(worker_id));
joinable!(worker -> position(position_id));
joinable!(salary -> worker(worker_id));
allow_tables_to_appear_in_same_query!(
equipment,
salary,
position,
worker,
);