feat(app): enhance engine initialization with EngineHandle and update run function signature
This commit is contained in:
13
Cargo.toml
13
Cargo.toml
@@ -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]
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user