/
arch_linux
/
rcm
Обзор
Документация
Войти
/
arch_linux
/
rcm
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/gui.rs
208 строк
7 KB
БАЛИЦКИЙ АЛЕКСАНДР НИКОЛАЕВИЧ
upload files
26 ноя 2025, 10:22
26 ноя 2025, 10:22
35fe12c
Код
Авторство
О чём код?
use eframe::egui; #[derive(Default)] pub struct CargoGui { current_tab: usize, command_output: String, project_path: String, } impl eframe::App for CargoGui { fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { egui::TopBottomPanel::top("menu_bar").show(ctx, |ui| { ui.horizontal(|ui| { ui.label("📁 Проект:"); ui.text_edit_singleline(&mut self.project_path); if ui.button("Обзор").clicked() { // TODO: диалог выбора папки } }); }); egui::SidePanel::left("side_panel").show(ctx, |ui| { ui.vertical(|ui| { ui.heading("🗂️ Команды Cargo"); ui.separator(); let tabs = ["📦 Сборка", "🔧 Зависимости", "🧪 Тестирование", "📚 Документация", "🚀 Публикация", "⚙️ Инструменты"]; for (i, tab) in tabs.iter().enumerate() { if ui.selectable_label(self.current_tab == i, *tab).clicked() { self.current_tab = i; } } }); }); egui::CentralPanel::default().show(ctx, |ui| { match self.current_tab { 0 => self.render_build_tab(ui), 1 => self.render_dependencies_tab(ui), 2 => self.render_testing_tab(ui), 3 => self.render_documentation_tab(ui), 4 => self.render_publish_tab(ui), 5 => self.render_tools_tab(ui), _ => {} } }); egui::TopBottomPanel::bottom("output_panel").show(ctx, |ui| { ui.heading("📋 Вывод команды:"); ui.separator(); ui.add_sized( [ui.available_width(), 200.0], egui::TextEdit::multiline(&mut self.command_output) ); }); } } impl CargoGui { fn render_build_tab(&mut self, ui: &mut egui::Ui) { ui.heading("🛠️ Команды сборки"); ui.separator(); ui.horizontal(|ui| { if ui.button("🛠️ Build").clicked() { self.execute_command("cargo build"); } if ui.button("🚀 Build Release").clicked() { self.execute_command("cargo build --release"); } if ui.button("▶️ Run").clicked() { self.execute_command("cargo run"); } }); ui.horizontal(|ui| { if ui.button("✅ Check").clicked() { self.execute_command("cargo check"); } if ui.button("🧹 Clean").clicked() { self.execute_command("cargo clean"); } }); } fn render_dependencies_tab(&mut self, ui: &mut egui::Ui) { ui.heading("🔧 Управление зависимостями"); ui.separator(); ui.horizontal(|ui| { if ui.button("📥 Add").clicked() { self.execute_command("cargo add --help"); } if ui.button("📤 Remove").clicked() { self.execute_command("cargo remove --help"); } if ui.button("🔄 Update").clicked() { self.execute_command("cargo update"); } }); } fn render_testing_tab(&mut self, ui: &mut egui::Ui) { ui.heading("🧪 Тестирование"); ui.separator(); ui.horizontal(|ui| { if ui.button("✅ Test").clicked() { self.execute_command("cargo test"); } if ui.button("📊 Bench").clicked() { self.execute_command("cargo bench"); } }); } fn render_documentation_tab(&mut self, ui: &mut egui::Ui) { ui.heading("📚 Документация"); ui.separator(); ui.horizontal(|ui| { if ui.button("📖 Generate Docs").clicked() { self.execute_command("cargo doc"); } if ui.button("🔗 Open Docs").clicked() { self.execute_command("cargo doc --open"); } }); } fn render_publish_tab(&mut self, ui: &mut egui::Ui) { ui.heading("🚀 Публикация"); ui.separator(); ui.horizontal(|ui| { if ui.button("📦 Package").clicked() { self.execute_command("cargo package"); } if ui.button("🚀 Publish").clicked() { self.execute_command("cargo publish --dry-run"); } }); } fn render_tools_tab(&mut self, ui: &mut egui::Ui) { ui.heading("⚙️ Инструменты"); ui.separator(); ui.horizontal(|ui| { if ui.button("🎨 Fmt").clicked() { self.execute_command("cargo fmt"); } if ui.button("🔍 Clippy").clicked() { self.execute_command("cargo clippy"); } if ui.button("🛡️ Audit").clicked() { self.execute_command("cargo audit"); } }); } fn execute_command(&mut self, cmd: &str) { let output = std::process::Command::new("sh") .arg("-c") .arg(cmd) .output(); match output { Ok(output) => { let mut result = format!("Команда: {}\n\n", cmd); if !output.stdout.is_empty() { result.push_str(&format!("STDOUT:\n{}\n", String::from_utf8_lossy(&output.stdout))); } if !output.stderr.is_empty() { result.push_str(&format!("STDERR:\n{}", String::from_utf8_lossy(&output.stderr))); } self.command_output = result; }, Err(e) => { self.command_output = format!("Ошибка выполнения команды: {}", e); } } } } pub fn run_gui() { let options = eframe::NativeOptions { viewport: egui::ViewportBuilder::default() .with_inner_size([1000.0, 700.0]) .with_title("Cargo UI Manager"), ..Default::default() }; eframe::run_native( "Cargo UI Manager", options, Box::new(|_cc| Box::new(CargoGui::default())), ).unwrap(); }