From 8a7d6da991cba992224df46f936982e3c7b03fc6 Mon Sep 17 00:00:00 2001 From: Chris Cochrun Date: Thu, 8 Dec 2022 15:19:53 -0600 Subject: [PATCH] adding rust to the project --- src/rust/Cargo.toml | 24 +++++++++++++++++++++ src/rust/build.rs | 5 +++++ src/rust/src/cxxqt_object.rs | 41 ++++++++++++++++++++++++++++++++++++ src/rust/src/lib.rs | 16 ++++++++++++++ 4 files changed, 86 insertions(+) create mode 100644 src/rust/Cargo.toml create mode 100644 src/rust/build.rs create mode 100644 src/rust/src/cxxqt_object.rs create mode 100644 src/rust/src/lib.rs diff --git a/src/rust/Cargo.toml b/src/rust/Cargo.toml new file mode 100644 index 0000000..d2a6800 --- /dev/null +++ b/src/rust/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "qml-minimal" +version = "0.1.0" +edition = "2021" +authors = [ + "Chris Cochrun " +] +license = "MIT OR Apache-2.0" + +# This will instruct Cargo to create a static +# library which CMake can link against +[lib] +crate-type = ["staticlib"] + +[dependencies] +cxx = "1.0.83" +cxx-qt = "0.4.1" +cxx-qt-lib = "0.4.1" + +# cxx-qt-build generates C++ code from the `#[cxx_qt::bridge]` module +# and compiles it together with the Rust static library +[build-dependencies] +cxx-qt-build = "0.4.1" + diff --git a/src/rust/build.rs b/src/rust/build.rs new file mode 100644 index 0000000..f8241a5 --- /dev/null +++ b/src/rust/build.rs @@ -0,0 +1,5 @@ +use cxx_qt_build::CxxQtBuilder; + +fn main() { + CxxQtBuilder::new().file("src/cxxqt_object.rs").build(); +} diff --git a/src/rust/src/cxxqt_object.rs b/src/rust/src/cxxqt_object.rs new file mode 100644 index 0000000..012635b --- /dev/null +++ b/src/rust/src/cxxqt_object.rs @@ -0,0 +1,41 @@ +#[cxx_qt::bridge] +mod my_object { + + unsafe extern "C++" { + include!("cxx-qt-lib/qstring.h"); + type QString = cxx_qt_lib::QString; + } + + #[cxx_qt::qobject] + pub struct MyObject { + #[qproperty] + number: i32, + #[qproperty] + string: QString, + } + + impl Default for MyObject { + fn default() -> Self { + Self { + number: 0, + string: QString::from(""), + } + } + } + + impl qobject::MyObject { + #[qinvokable] + pub fn increment_number(self: Pin<&mut Self>) { + let previous = *self.as_ref().number(); + self.set_number(previous + 1); + } + + #[qinvokable] + pub fn say_hi(&self, string: &QString, number: i32) { + println!( + "Hi from Rust! String is '{}' and number is {}", + string, number + ); + } + } +} diff --git a/src/rust/src/lib.rs b/src/rust/src/lib.rs new file mode 100644 index 0000000..a03e1e7 --- /dev/null +++ b/src/rust/src/lib.rs @@ -0,0 +1,16 @@ +pub fn add(left: usize, right: usize) -> usize { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} + +mod cxxqt_object;