feat(main): Connected Main to ui

This commit is contained in:
Black_Raven committed 2026-03-27 15:41:53 +03:00
1 parent 91b56f9319
commit eab77dd0b0
1 file changed
+75 -11
+75 -11
View File
@@ -1,17 +1,81 @@
//! Rclone UI Manager — графический интерфейс для rclone.
//!
//! Приложение предоставляет кроссплатформенную GUI для управления удалёнными
//! хранилищами rclone, просмотра файлов и выполнения операций копирования,
//! синхронизации, перемещения.
mod rclone_install; mod rclone_install;
mod operations;
mod ui;
use tokio::runtime::Runtime; use eframe::egui;
use egui::{FontData, FontDefinitions, FontFamily};
fn main() -> Result<(), Box<dyn std::error::Error>> { /// Точка входа в приложение.
let rt = Runtime::new()?; ///
/// Загружает иконку окна, подключает пользовательские шрифты (Sans.otf и NotoColorEmoji.ttf)
/// и запускает нативное окно eframe с приложением RcloneUI.
fn main() -> Result<(), eframe::Error> {
// Попытка загрузить иконку окна из assets/icon.png
let icon = std::fs::read("assets/icon.png")
.ok()
.and_then(|bytes| eframe::icon_data::from_png_bytes(&bytes).ok())
.map(std::sync::Arc::new);
let rclone = rt.block_on(async { let mut viewport = egui::ViewportBuilder::default()
let rclone = rclone_install::RcloneApp::new().await?; .with_inner_size([1200.0, 800.0])
println!("rclone готов к использованию"); .with_min_inner_size([800.0, 600.0])
Ok::<_, Box<dyn std::error::Error>>(rclone) .with_title("Rclone UI Manager");
})?;
let v = rclone.version().unwrap().to_string(); if let Some(icon) = icon {
println!("Rclone: {}", v); viewport = viewport.with_icon(icon);
Ok::<_, Box<dyn std::error::Error>>(()) }
let options = eframe::NativeOptions {
viewport,
..Default::default()
};
eframe::run_native(
"Rclone UI Manager",
options,
Box::new(|cc| {
// Настройка пользовательских шрифтов
let mut fonts = FontDefinitions::default();
// 1. Основной шрифт без засечек (Sans.otf) делаем шрифтом по умолчанию для пропорционального текста.
if let Ok(font_data) = std::fs::read("assets/fonts/Sans.otf") {
fonts.font_data.insert(
"sans".to_owned(),
FontData::from_owned(font_data),
);
if let Some(proportional) = fonts.families.get_mut(&FontFamily::Proportional) {
proportional.insert(0, "sans".to_owned());
} else {
fonts.families.insert(
FontFamily::Proportional,
vec!["sans".to_owned()],
);
}
}
// 2. Шрифт с эмодзи (NotoColorEmoji.ttf) подключаем как запасной.
if let Ok(emoji_data) = std::fs::read("assets/fonts/NotoColorEmoji.ttf") {
fonts.font_data.insert(
"emoji".to_owned(),
FontData::from_owned(emoji_data),
);
if let Some(proportional) = fonts.families.get_mut(&FontFamily::Proportional) {
if !proportional.contains(&"emoji".to_owned()) {
proportional.push("emoji".to_owned());
}
}
}
// Применяем настройки шрифтов к egui-контексту.
cc.egui_ctx.set_fonts(fonts);
Box::new(ui::RcloneUI::new(cc))
}),
)
} }