feat: impl design header

This commit is contained in:
2026-05-07 19:49:45 +05:00
parent 7cc2b8542d
commit f425145e81
13 changed files with 978 additions and 304 deletions
+72 -19
View File
@@ -1,43 +1,92 @@
use std::rc::Rc;
// use slint::BackendSelector;
// use crate::winit::center_window;
// mod winit;
slint::include_modules!();
fn init() -> State {
let browser_model = Rc::new(slint::VecModel::<BrowserConfig>::from(vec![
BrowserConfig {
icon: "chrome".into(),
path: "chrome.exe".into(),
flags: "profile 1".into(),
icon: "🦊".into(),
name: "Work browser".into(),
path: "firefox.exe".into(),
flags: "--profile work".into(),
is_default: true,
},
BrowserConfig {
icon: "chrome".into(),
icon: "🔥".into(),
name: "Ku6epXBOCTuK".into(),
path: "chrome.exe".into(),
flags: "profile 2".into(),
flags: "--profile personal".into(),
is_default: false,
},
BrowserConfig {
icon: "chrome".into(),
icon: "🌐".into(),
name: "Chrome".into(),
path: "chrome.exe".into(),
flags: "".into(),
is_default: false,
},
BrowserConfig {
icon: "🧘".into(),
name: "Zen Browser".into(),
path: "zen.exe".into(),
flags: "".into(),
},
BrowserConfig {
icon: "chrome".into(),
path: "edge.exe".into(),
flags: "".into(),
is_default: false,
},
]));
let main_window = MainWindow::new().unwrap();
{
main_window.window().on_close_requested(move || {
todo!();
});
}
main_window.set_current_url("ku6epxboctuk.github.io".into());
main_window.set_remember_choice(true);
main_window.set_always_ask(true);
main_window.on_browser_selected({
move |browser: BrowserConfig| {
println!("Selected browser: {:?} {:?}", browser.path, browser.flags);
}
});
main_window.on_toggle_remember(move |checked| {
println!("Remember choice: {}", checked);
});
main_window.on_toggle_always_ask(move |checked| {
println!("Always ask: {}", checked);
});
main_window.on_settings_clicked(move || {
println!("Settings clicked");
});
main_window.on_feedback_clicked(move || {
println!("Feedback clicked");
});
main_window.on_open_clicked(move || {
println!("Open clicked");
});
// main_window.on_request_drag(move || {
// main_window.window().with_winit_window(|winit_window| {
// winit_window.drag_window().ok();
// });
// });
// center_window(main_window.window());
main_window
.window()
.on_close_requested(move || slint::CloseRequestResponse::HideWindow);
main_window.set_browser_model(browser_model.clone().into());
State {
main_window,
browser_model: browser_model,
browser_model,
}
}
@@ -47,9 +96,13 @@ pub struct State {
}
pub fn main() {
// TODO: how to enable skia? not panics
// let _selector = BackendSelector::new()
// .backend_name("renderer_skia".into())
// .select()
// .unwrap();
let state = init();
let main_window = state.main_window.clone_strong();
#[cfg(target_os = "android")]
STATE.with(|ui| *ui.borrow_mut() = Some(state));
main_window.run().unwrap();
}
+39
View File
@@ -0,0 +1,39 @@
use i_slint_backend_winit::WinitWindowAccessor;
use i_slint_backend_winit::winit::dpi::PhysicalPosition;
use i_slint_backend_winit::winit::monitor::MonitorHandle;
use i_slint_backend_winit::winit::window::Window;
pub fn center_window(window: &slint::Window) {
println!("Centering window");
if window.has_winit_window() {
println!("Has winit");
window.with_winit_window(|window: &Window| {
match window.current_monitor() {
Some(monitor) => set_centered(window, &monitor),
None => (),
};
None as Option<()>
});
}
}
fn set_centered(window: &Window, monitor: &MonitorHandle) {
let window_size = window.outer_size();
let monitor_size = monitor.size();
let monitor_position = monitor.position();
println!("Monitor size: {:?}", monitor_size);
println!("Window size: {:?}", window_size);
let mut monitor_window_position = PhysicalPosition { x: 0, y: 0 };
monitor_window_position.x = (monitor_position.x as f32 + (monitor_size.width as f32 * 0.5)
- (window_size.width as f32 * 0.5)) as i32;
monitor_window_position.y = (monitor_position.y as f32 + (monitor_size.height as f32 * 0.5)
- (window_size.height as f32 * 0.5)) as i32;
window.set_outer_position(monitor_window_position);
}