feat(app): enhance engine initialization with EngineHandle and update run function signature

This commit is contained in:
2026-03-18 13:05:14 +01:00
parent bd356f27d1
commit 248094f442
3 changed files with 46 additions and 6 deletions

View File

@@ -13,6 +13,19 @@ members = [
"crates/k-launcher-ui-egui", "crates/k-launcher-ui-egui",
"crates/plugins/plugin-url", "crates/plugins/plugin-url",
] ]
default-members = [
"crates/k-launcher",
"crates/k-launcher-config",
"crates/k-launcher-kernel",
"crates/k-launcher-os-bridge",
"crates/k-launcher-plugin-host",
"crates/k-launcher-ui",
"crates/plugins/plugin-apps",
"crates/plugins/plugin-calc",
"crates/plugins/plugin-cmd",
"crates/plugins/plugin-files",
"crates/plugins/plugin-url",
]
resolver = "2" resolver = "2"
[workspace.dependencies] [workspace.dependencies]

View File

@@ -8,12 +8,21 @@ use iced::{
}; };
use k_launcher_config::AppearanceCfg; use k_launcher_config::AppearanceCfg;
use k_launcher_kernel::{AppLauncher, SearchEngine, SearchResult}; use k_launcher_kernel::{AppLauncher, NullSearchEngine, SearchEngine, SearchResult};
use k_launcher_os_bridge::WindowConfig; use k_launcher_os_bridge::WindowConfig;
static INPUT_ID: std::sync::LazyLock<iced::widget::Id> = static INPUT_ID: std::sync::LazyLock<iced::widget::Id> =
std::sync::LazyLock::new(|| iced::widget::Id::new("search")); std::sync::LazyLock::new(|| iced::widget::Id::new("search"));
#[derive(Clone)]
pub(crate) struct EngineHandle(Arc<dyn SearchEngine>);
impl std::fmt::Debug for EngineHandle {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str("EngineHandle")
}
}
fn rgba(c: &[f32; 4]) -> Color { fn rgba(c: &[f32; 4]) -> Color {
Color::from_rgba8(c[0] as u8, c[1] as u8, c[2] as u8, c[3]) Color::from_rgba8(c[0] as u8, c[1] as u8, c[2] as u8, c[3])
} }
@@ -53,6 +62,7 @@ pub enum Message {
QueryChanged(String), QueryChanged(String),
ResultsReady(u64, Arc<Vec<SearchResult>>), ResultsReady(u64, Arc<Vec<SearchResult>>),
KeyPressed(KeyEvent), KeyPressed(KeyEvent),
EngineReady(EngineHandle),
} }
fn update(state: &mut KLauncherApp, message: Message) -> Task<Message> { fn update(state: &mut KLauncherApp, message: Message) -> Task<Message> {
@@ -78,6 +88,14 @@ fn update(state: &mut KLauncherApp, message: Message) -> Task<Message> {
} }
Task::none() Task::none()
} }
Message::EngineReady(handle) => {
state.engine = handle.0;
if !state.query.is_empty() {
let q = state.query.clone();
return Task::done(Message::QueryChanged(q));
}
Task::none()
}
Message::KeyPressed(event) => { Message::KeyPressed(event) => {
let key = match event { let key = match event {
KeyEvent::KeyPressed { key, .. } => key, KeyEvent::KeyPressed { key, .. } => key,
@@ -254,7 +272,7 @@ fn subscription(_state: &KLauncherApp) -> Subscription<Message> {
} }
pub fn run( pub fn run(
engine: Arc<dyn SearchEngine>, engine_factory: Arc<dyn Fn() -> Arc<dyn SearchEngine> + Send + Sync>,
launcher: Arc<dyn AppLauncher>, launcher: Arc<dyn AppLauncher>,
window_cfg: &k_launcher_config::WindowCfg, window_cfg: &k_launcher_config::WindowCfg,
appearance_cfg: AppearanceCfg, appearance_cfg: AppearanceCfg,
@@ -262,9 +280,18 @@ pub fn run(
let wc = WindowConfig::from_cfg(window_cfg); let wc = WindowConfig::from_cfg(window_cfg);
iced::application( iced::application(
move || { move || {
let app = KLauncherApp::new(engine.clone(), launcher.clone(), appearance_cfg.clone()); let app = KLauncherApp::new(
Arc::new(NullSearchEngine),
launcher.clone(),
appearance_cfg.clone(),
);
let focus = iced::widget::operation::focus(INPUT_ID.clone()); let focus = iced::widget::operation::focus(INPUT_ID.clone());
(app, focus) let ef = engine_factory.clone();
let init = Task::perform(
async move { tokio::task::spawn_blocking(move || ef()).await.unwrap() },
|e| Message::EngineReady(EngineHandle(e)),
);
(app, Task::batch([focus, init]))
}, },
update, update,
view, view,

View File

@@ -6,10 +6,10 @@ use k_launcher_config::{AppearanceCfg, WindowCfg};
use k_launcher_kernel::{AppLauncher, SearchEngine}; use k_launcher_kernel::{AppLauncher, SearchEngine};
pub fn run( pub fn run(
engine: Arc<dyn SearchEngine>, engine_factory: Arc<dyn Fn() -> Arc<dyn SearchEngine> + Send + Sync>,
launcher: Arc<dyn AppLauncher>, launcher: Arc<dyn AppLauncher>,
window_cfg: &WindowCfg, window_cfg: &WindowCfg,
appearance_cfg: AppearanceCfg, appearance_cfg: AppearanceCfg,
) -> iced::Result { ) -> iced::Result {
app::run(engine, launcher, window_cfg, appearance_cfg) app::run(engine_factory, launcher, window_cfg, appearance_cfg)
} }