mirror of
https://github.com/iDescriptor/iDescriptor.git
synced 2026-06-21 19:35:49 +08:00
feat(apps): impl search
This commit is contained in:
+41
-4
@@ -5,15 +5,18 @@ use macros::QtThreading;
|
||||
use qmetaobject::prelude::*;
|
||||
use qttypes::{QStringList, QVariantMap};
|
||||
use std::pin::Pin;
|
||||
use std::sync::Arc;
|
||||
|
||||
#[derive(QObject, Default, QtThreading)]
|
||||
pub struct Apps {
|
||||
base: qt_base_class!(trait QObject),
|
||||
state: qt_property!(QVariantMap; NOTIFY state_changed),
|
||||
state_changed: qt_signal!(),
|
||||
|
||||
ipa_tool: Option<Arc<IpaTool>>,
|
||||
init: qt_method!(fn(&mut self)),
|
||||
sign_in: qt_method!(fn(&mut self, email: QString, password: QString)),
|
||||
search: qt_method!(fn(&mut self, term: QString)),
|
||||
search_ready: qt_signal!(search_term : QString, success: bool, res: QString),
|
||||
}
|
||||
|
||||
impl Apps {
|
||||
@@ -31,14 +34,14 @@ impl Apps {
|
||||
fn init(&mut self) {
|
||||
let q_thread = self.qt_thread();
|
||||
RUNTIME.spawn(async move {
|
||||
let res: anyhow::Result<Option<ipatool::Account>> = async {
|
||||
let res: anyhow::Result<(Option<ipatool::Account>, IpaTool)> = async {
|
||||
let tool = IpaTool::new_default().await?;
|
||||
Ok(tool.account_info().await?)
|
||||
Ok((tool.account_info().await?, tool))
|
||||
}
|
||||
.await;
|
||||
|
||||
match res {
|
||||
Ok(maybe_acc) => {
|
||||
Ok((maybe_acc, tool)) => {
|
||||
let acc = maybe_acc.unwrap_or_default();
|
||||
println!("email :{}", acc.email);
|
||||
|
||||
@@ -49,6 +52,7 @@ impl Apps {
|
||||
|
||||
q_thread.queue(|t| {
|
||||
t.state = state;
|
||||
t.ipa_tool = Some(Arc::new(tool));
|
||||
t.state_changed();
|
||||
})
|
||||
}
|
||||
@@ -91,4 +95,37 @@ impl Apps {
|
||||
// Ok(())
|
||||
// });
|
||||
}
|
||||
|
||||
// DOES NOTHING IF CALLED BEFORE CALLING `init`
|
||||
fn search(&mut self, term: QString) {
|
||||
let Some(tool) = &self.ipa_tool else {
|
||||
eprintln!("IpaTool not initialized");
|
||||
return;
|
||||
};
|
||||
let tool = tool.clone();
|
||||
let q_thread = self.qt_thread();
|
||||
|
||||
RUNTIME.spawn(async move {
|
||||
let serialized: anyhow::Result<String> = async {
|
||||
let apps = tool.search(&term.to_string(), 20).await?;
|
||||
Ok(serde_json::to_string(&apps)?)
|
||||
}
|
||||
.await;
|
||||
|
||||
match serialized {
|
||||
Ok(serialized) => {
|
||||
println!(
|
||||
"Search successful for term '{}', result: {}",
|
||||
term, serialized
|
||||
);
|
||||
q_thread.queue(|s| s.search_ready(term, true, QString::from(serialized)));
|
||||
}
|
||||
// FIXME: also return the error
|
||||
Err(err) => {
|
||||
println!("Error in ipatool search {}", err.to_string());
|
||||
q_thread.queue(|s| s.search_ready(term, false, QString::default()));
|
||||
}
|
||||
};
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user