/
Sevlagor
/
MGT_Utils
Обзор
Документация
Войти
/
Sevlagor
/
MGT_Utils
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
tmp
src/proc.rs
139 строк
3 KB
Sevlagor
+enum GuiElement
09 янв 2026, 21:47
09 янв 2026, 21:47
f18aba1
Код
Авторство
О чём код?
use std::{ cell::RefCell, sync::OnceLock, rc::Rc, }; use crate::{ data::{self, Data}, view::{View, components::Work, }, }; static IS_PROC_CREATED: OnceLock<bool> = OnceLock::new(); pub struct Proc { data: Data, view: View, } pub fn create() -> Option<Proc> { if IS_PROC_CREATED.get().is_none() { if let Some(data) = data::new() { _ = IS_PROC_CREATED.set(true); Some(Proc { data, view: View::new("Test View") .expect("Ошибка: попытка повторного создания view, он уже создан"), }) } else {None} } else { None } } impl Proc { pub fn init(&mut self) { self.data.init(); self.view.init(); } pub fn data(&self) -> &Data { &self.data } pub fn do_work(&mut self) { use Command as Cmd; (&self.view as &dyn Work).show(); loop { #[allow(unreachable_patterns)] match self.get_command() { Cmd::Err(msg) => { eprintln!("{msg}"); } Cmd::Unknown(txt) => { eprintln!("Неизвестна команда: '{txt}'.") } Cmd::NewCamp => { let name_camp = self.view .input_str("Введите название новой кампании :> ".to_string()); self.data.new_camp(name_camp); self.view.update(/* &self.data */); self.view.show(); } Cmd::Load => { } Cmd::Save => { } Cmd::Exit => { break; } Cmd::None => { } _ => { } } } //TODO Prog__do_work() } fn get_command(&mut self) -> Command { self.view.input_cmd_loop() } pub fn finalize(&mut self) { //TODO Prog__finalize() } } pub enum Command { Err(String), Unknown(String), None, NewCamp, Load, Save, Exit, } //################################################################################################ //################################################################################################ pub trait Plus { fn plus(&mut self, v: i32); } pub trait Minus { fn minus(&mut self, v: i32); } #[derive(Debug)] pub struct Num { pub num: i32, } impl Plus for Num { fn plus(&mut self, v: i32) { self.num += v; } } impl Minus for Num { fn minus(&mut self, v: i32) { self.num -= v; } } pub type RRCdP = Rc<RefCell<dyn Plus>>; pub fn func() { let mut v_nums: Vec<Rc<RefCell<dyn Plus>>> = vec![]; let nn = Num { num: 10, }; let rrc_nn = Rc::new(RefCell::new(nn)); v_nums.push(rrc_nn.clone()); let arg = v_nums.pop().unwrap(); // &rrc_nn.borrow_mut(); // arg.borrow_mut().plus(10); let dst = fn_impl(arg); let _d = dst.borrow_mut().plus(10); // dbg!(dst); } pub fn fn_impl(rrc_num: Rc<RefCell<impl Plus + ?Sized>>) -> Rc<RefCell<impl Plus + ?Sized>> { rrc_num }