summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2026-08-03 20:11:48 +0800
committerlittleblack111 <littleblack11111@gmail.com>2026-08-04 23:07:51 +0800
commitf36d416853696b103934b56ee57118c733191dfa (patch)
tree29c824be162d51dffcbbb35137dcd4596d7a15bd
parent029ff8999a5d3c1613302b805228cd6927b4dddb (diff)
feat: make use of ExclusiveExecutor
mathcalc: use to_string_big() // to display scientific notation properly // other ones show both version without e or shows *10^_ // and have a = prefix unwrap_print queueing to qt main thread
-rw-r--r--qml_plugin/Cargo.lock17
-rw-r--r--qml_plugin/Cargo.toml2
-rw-r--r--qml_plugin/src/launcher/duckduckgo.rs69
-rw-r--r--qml_plugin/src/launcher/mathcalc.rs105
-rw-r--r--qml_plugin/src/launcher/smartcalc.rs88
5 files changed, 170 insertions, 111 deletions
diff --git a/qml_plugin/Cargo.lock b/qml_plugin/Cargo.lock
index e84ee50..71b21f0 100644
--- a/qml_plugin/Cargo.lock
+++ b/qml_plugin/Cargo.lock
@@ -1810,6 +1810,8 @@ dependencies = [
"serde_json",
"smart-calculator",
"tokio",
+ "unwrap-print",
+ "unwrap-retry",
]
[[package]]
@@ -2747,6 +2749,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
[[package]]
+name = "unwrap-print"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a5d0aeaa22516bc62ce84e47f3b72de84acc2120ce6cb38dbfc19825470b207e"
+
+[[package]]
+name = "unwrap-retry"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9300c005780a019c417e87e4adae3fdb1653be75b384f1fec16f7452fa724372"
+dependencies = [
+ "tokio",
+]
+
+[[package]]
name = "url"
version = "2.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/qml_plugin/Cargo.toml b/qml_plugin/Cargo.toml
index d749887..51e78ee 100644
--- a/qml_plugin/Cargo.toml
+++ b/qml_plugin/Cargo.toml
@@ -18,6 +18,8 @@ serde = { version = "1.0.229", features = ["derive"] }
serde_json = "1.0.151"
smart-calculator = "1.0.3"
tokio = { version = "1.53.1", features = ["rt-multi-thread", "macros"] }
+unwrap-print = "0.1.1"
+unwrap-retry = "0.5.0"
[build-dependencies]
cxx-qt-build = "0.9.1"
diff --git a/qml_plugin/src/launcher/duckduckgo.rs b/qml_plugin/src/launcher/duckduckgo.rs
index aa1ce2d..bb0f806 100644
--- a/qml_plugin/src/launcher/duckduckgo.rs
+++ b/qml_plugin/src/launcher/duckduckgo.rs
@@ -1,8 +1,9 @@
-use cxx_qt::Threading;
+use cxx_qt::{CxxQtType, Threading};
use cxx_qt_lib::QString;
use std::pin::Pin;
+use unwrap_print::PrintableResult;
-use crate::{RUNTIME, web::duckduckgo};
+use crate::{ExclusiveExecutor, web::duckduckgo};
#[cxx_qt::bridge]
mod qobject {
@@ -16,7 +17,7 @@ mod qobject {
#[qml_element]
#[qml_singleton]
#[qproperty(
- bool, valid
+ bool, ok
)]
#[qproperty(
QString, title
@@ -50,43 +51,53 @@ pub struct QmlDuckDuckGo {
#[derive(Default)]
pub struct DuckDuckGoRs {
- valid: bool,
+ ok: bool,
title: QString,
description_html: QString,
preview_image: QString,
+
+ executor: ExclusiveExecutor,
}
impl qobject::DuckDuckGo {
- fn query(self: Pin<&mut Self>, input: QString) {
+ fn query(mut self: Pin<&mut Self>, input: QString) {
let qt_thread = self.qt_thread();
- RUNTIME.spawn(
- async move {
- let input = input.to_string();
- let result: Result<QmlDuckDuckGo, _> = duckduckgo::query(&input)
- .await
- .map(|r| r.into());
- qt_thread.queue(
- |mut qo| match result {
- Ok(r) => {
- qo.as_mut()
- .set_valid(true);
- qo.as_mut()
- .set_title(r.title);
- qo.as_mut()
- .set_description_html(r.description_html);
- qo.as_mut()
- .set_preview_image(r.preview_image);
- }
- Err(_) => qo.set_valid(false),
- },
- )
- },
- );
+ // self.as_mut()
+ // .reset();
+ self.rust_mut()
+ .executor
+ .spawn(
+ async move {
+ let input = input.to_string();
+ let result: Result<QmlDuckDuckGo, _> = duckduckgo::query(&input)
+ .await
+ .map(|r| r.into());
+ // consider just unwrapping since this is in a separate thread and is already
+ // end of life anw
+ _ = qt_thread
+ .queue(
+ |mut qo| match result {
+ Ok(r) => {
+ qo.as_mut()
+ .set_ok(true);
+ qo.as_mut()
+ .set_title(r.title);
+ qo.as_mut()
+ .set_description_html(r.description_html);
+ qo.as_mut()
+ .set_preview_image(r.preview_image);
+ }
+ Err(_) => qo.set_ok(false),
+ },
+ )
+ .unwrap_print();
+ },
+ );
}
fn reset(mut self: Pin<&mut Self>) {
self.as_mut()
- .set_valid(false);
+ .set_ok(false);
self.as_mut()
.set_title("".into());
self.as_mut()
diff --git a/qml_plugin/src/launcher/mathcalc.rs b/qml_plugin/src/launcher/mathcalc.rs
index 4ac625d..8c24a92 100644
--- a/qml_plugin/src/launcher/mathcalc.rs
+++ b/qml_plugin/src/launcher/mathcalc.rs
@@ -1,10 +1,11 @@
use cxx_qt::{CxxQtType, Threading};
use cxx_qt_lib::{QString, QVariant};
-use kalk::parser;
+use kalk::{calculation_result::CalculationResult, parser};
use std::{pin::Pin, sync::Arc};
use tokio::sync::Mutex;
+use unwrap_print::PrintableResult;
-use crate::RUNTIME;
+use crate::ExclusiveExecutor;
const DEFAULT_ANGLE_UNIT: &str = "deg";
@@ -42,58 +43,75 @@ mod qobject {
impl cxx_qt::Threading for MathCalc {}
}
-#[derive(Default)]
pub struct MathCalcRs {
result: QVariant,
-
ctx: Arc<Mutex<parser::Context>>,
+
+ executor: ExclusiveExecutor,
+}
+
+impl Default for MathCalcRs {
+ fn default() -> Self {
+ Self {
+ result: QVariant::default(),
+ ctx: Arc::new(Mutex::new(qobject::MathCalc::new_ctx())),
+ executor: ExclusiveExecutor::default(),
+ }
+ }
}
impl qobject::MathCalc {
- fn query(self: Pin<&mut Self>, input: QString) {
+ fn query(mut self: Pin<&mut Self>, input: QString) {
let qt_thread = self.qt_thread();
let ctx = Arc::clone(
&self
+ .as_mut()
.rust_mut()
.ctx,
);
// TODO: consider moving to spawn_blocking
- RUNTIME.spawn(
- async move {
- let input = input.to_string();
- let result = parser::eval(
- &mut *ctx
- .lock()
- .await,
- &input,
- // TODO: move to const/config
- 53,
- );
- qt_thread.queue(
- |mut qo| {
- qo.as_mut()
- .set_result(
- result.map_or_default(
- |r| {
- r.map_or_default(
- |r| {
- let result: QString = r
- .to_string()
- .into();
- if result != input.into() {
- QVariant::from(&result)
- } else {
- QVariant::default()
- }
- },
- )
- },
- ),
+ self.rust_mut()
+ .executor
+ .spawn(
+ async move {
+ let input = input.to_string();
+ let result = parser::eval(
+ &mut *ctx
+ .lock()
+ .await,
+ &input,
+ // TODO: move to const/config
+ 53,
+ )
+ .map_or_default(
+ |r| {
+ r.map_or_default(
+ |r| {
+ let r: QString = r
+ // to display scientific notation properly
+ // other ones show both version without e or shows *10^_
+ // and have a = prefix
+ .to_string_big()
+ .into();
+ if r != input.into() {
+ QVariant::from(&r)
+ } else {
+ QVariant::default()
+ }
+ },
)
- },
- )
- },
- );
+ },
+ );
+ qt_thread
+ .queue(
+ |mut qo| {
+ qo.as_mut()
+ .set_result(result)
+ },
+ )
+ .unwrap_print();
+ },
+ );
}
fn reset(mut self: Pin<&mut Self>) {
@@ -102,11 +120,14 @@ impl qobject::MathCalc {
self.reset_ctx();
}
+ fn new_ctx() -> parser::Context {
+ parser::Context::default().set_angle_unit(DEFAULT_ANGLE_UNIT)
+ }
+
fn reset_ctx(mut self: Pin<&mut Self>) {
self.as_mut()
.rust_mut()
- .ctx =
- Arc::new(Mutex::new(parser::Context::default().set_angle_unit(DEFAULT_ANGLE_UNIT)));
+ .ctx = Arc::new(Mutex::new(Self::new_ctx()))
}
fn reset_result(mut self: Pin<&mut Self>) {
diff --git a/qml_plugin/src/launcher/smartcalc.rs b/qml_plugin/src/launcher/smartcalc.rs
index 9e94f77..98cb037 100644
--- a/qml_plugin/src/launcher/smartcalc.rs
+++ b/qml_plugin/src/launcher/smartcalc.rs
@@ -1,8 +1,9 @@
-use cxx_qt::Threading;
+use cxx_qt::{CxxQtType, Threading};
use cxx_qt_lib::{QString, QVariant};
use std::pin::Pin;
+use unwrap_print::PrintableResult;
-use crate::RUNTIME;
+use crate::{ExclusiveExecutor, RUNTIME};
#[cxx_qt::bridge]
mod qobject {
@@ -79,6 +80,8 @@ pub struct SmartCalcRs {
result_type: qobject::ResultType,
cached_query: QVariant,
+
+ executor: ExclusiveExecutor,
}
impl qobject::SmartCalc {
@@ -89,44 +92,49 @@ impl qobject::SmartCalc {
self.as_mut()
.set_cached_query((&input.clone()).into());
let qt_thread = self.qt_thread();
- RUNTIME.spawn(
- async move {
- let result = smart_calculator::calculate(
- &input.to_string(),
- None,
- )
- .await;
- qt_thread.queue(
- |mut qo| {
- qo.as_mut()
- .set_result_type(
- match &result {
- Ok(value) => (&value.res_type).into(),
- Err(_) => qobject::ResultType::Unset,
- },
- );
- qo.as_mut()
- .set_result(
- // TODO: do the calc outside of ts main qt ui render thread.(all
- // *.rs)
- match result {
- Ok(value) => {
- if value.formatted == value.input {
- QVariant::default()
- } else {
- let result: QString = value
- .formatted
- .into();
- QVariant::from(&result)
- }
- }
- Err(_) => QVariant::default(),
- },
- )
- },
- )
- },
- );
+ self.as_mut()
+ .rust_mut()
+ .executor
+ .spawn(
+ async move {
+ let result = smart_calculator::calculate(
+ &input.to_string(),
+ None,
+ )
+ .await;
+ qt_thread
+ .queue(
+ |mut qo| {
+ qo.as_mut()
+ .set_result_type(
+ match &result {
+ Ok(value) => (&value.res_type).into(),
+ Err(_) => qobject::ResultType::Unset,
+ },
+ );
+ qo.as_mut()
+ .set_result(
+ // TODO: do the calc outside of ts main qt ui render
+ // thread.(all *.rs)
+ match result {
+ Ok(value) => {
+ if value.formatted == value.input {
+ QVariant::default()
+ } else {
+ let result: QString = value
+ .formatted
+ .into();
+ QVariant::from(&result)
+ }
+ }
+ Err(_) => QVariant::default(),
+ },
+ )
+ },
+ )
+ .unwrap_print();
+ },
+ );
}
fn reset(mut self: Pin<&mut Self>) {