From 9644631f7cbde552cb4870a35e748d882d779103 Mon Sep 17 00:00:00 2001 From: Chris Cochrun Date: Fri, 9 Dec 2022 16:55:54 -0600 Subject: [PATCH] adding a basic other struct in rust... well trying... --- CMakeLists.txt | 2 +- default.nix | 14 ++---- flake.nix | 8 ++- src/CMakeLists.txt | 2 +- src/{cpp => }/main.cpp | 18 ++++--- src/qml/presenter/Presentation.qml | 12 ++--- src/rust/Cargo.toml | 4 +- src/rust/build.rs | 1 + src/rust/src/cxxqt_object.rs | 18 ++++++- src/rust/src/lib.rs | 1 + src/rust/src/service_thing.rs | 80 ++++++++++++++++++++++++++++++ 11 files changed, 124 insertions(+), 36 deletions(-) rename src/{cpp => }/main.cpp (93%) create mode 100644 src/rust/src/service_thing.rs diff --git a/CMakeLists.txt b/CMakeLists.txt index 686a388..153a945 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -72,7 +72,7 @@ if(NOT Corrosion_FOUND) endif() add_subdirectory(src) -set(CRATE qml-minimal) +set(CRATE libre-presenter) # Corrosion creates a CMake target with the same name as the crate. corrosion_import_crate(MANIFEST_PATH src/rust/Cargo.toml CRATES ${CRATE}) diff --git a/default.nix b/default.nix index 113f8cc..53e5735 100644 --- a/default.nix +++ b/default.nix @@ -85,16 +85,7 @@ stdenv.mkDerivation rec { RUST_BACKTRACE = 1; # preConfigure = '' - # # local modulepath=$(kf5-config --install module) - # # local datapath=$(kf5-config --install data) - # # local servicespath=$(kf5-config --install services) - # # substituteInPlace CMakeLists.txt \ - # # --replace "\''${MODULEPATH}" "$out/''${modulepath#/nix/store/*/}" \ - # # --replace "\''${DATAPATH}" "$out/''${datapath#/nix/store/*/}" - - # # substituteInPlace CMakeLists.txt \ - # # --replace "\''${MODULEPATH}" "$out/qt-5.15.3/plugins" \ - # # --replace "\''${DATAPATH}" "$out/share" + # "${cargo-download} # ''; # postConfigure = '' @@ -104,7 +95,8 @@ stdenv.mkDerivation rec { # ''; # buildPhase = '' - # rm -rf ~/.cache/librepresenter/Libre\ Presenter/qmlcache/ + # cmake -B build/ -DCMAKE_BUILD_TYPE=Debug + # make -j8 --dir build/ # ''; installPhase = '' diff --git a/flake.nix b/flake.nix index 5ee355b..b7d764b 100644 --- a/flake.nix +++ b/flake.nix @@ -18,15 +18,13 @@ src = ./.; rustPkgs = pkgs.rustBuilder.makePackageSet { rustVersion = "1.61.0"; - packageFun = import ./Cargo.nix; + packageFun = import ./cargo.nix; }; in rec { - libre-presenter = (rustPkgs.workspace.libre-presenter {}).bin; - - devShell = import ./shell.nix { inherit pkgs; }; - defaultPackage = pkgs.libsForQt5.callPackage ./default.nix {}; + devShell = import ./shell.nix { inherit pkgs; }; + defaultPackage = pkgs.libsForQt5.callPackage ./default.nix {}; } ); } diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f931e3a..4936149 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -3,7 +3,7 @@ add_executable(presenter main.cpp resources.qrc) target_sources(presenter PRIVATE - cpp/main.cpp resources.qrc + main.cpp resources.qrc cpp/songsqlmodel.cpp cpp/songsqlmodel.h cpp/serviceitemmodel.cpp cpp/serviceitemmodel.h cpp/serviceitem.cpp cpp/serviceitem.h diff --git a/src/cpp/main.cpp b/src/main.cpp similarity index 93% rename from src/cpp/main.cpp rename to src/main.cpp index a2a5bd5..ddaf219 100644 --- a/src/cpp/main.cpp +++ b/src/main.cpp @@ -34,17 +34,18 @@ #include #include -#include "mpv/mpvobject.h" -#include "serviceitemmodel.h" -#include "songsqlmodel.h" -#include "videosqlmodel.h" -#include "imagesqlmodel.h" -#include "presentationsqlmodel.h" -#include "filemanager.h" -#include "slide.h" +#include "cpp/mpv/mpvobject.h" +#include "cpp/serviceitemmodel.h" +#include "cpp/songsqlmodel.h" +#include "cpp/videosqlmodel.h" +#include "cpp/imagesqlmodel.h" +#include "cpp/presentationsqlmodel.h" +#include "cpp/filemanager.h" +#include "cpp/slide.h" // RUST #include "cxx-qt-gen/my_object.cxxqt.h" +#include "cxx-qt-gen/service_thing.cxxqt.h" static void connectToDatabase() { // let's setup our sql database @@ -132,6 +133,7 @@ int main(int argc, char *argv[]) qmlRegisterType("org.presenter", 1, 0, "PresentationSqlModel"); qmlRegisterType("org.presenter", 1, 0, "ServiceItemModel"); qmlRegisterType("org.presenter", 1, 0, "MyObject"); + qmlRegisterType("org.presenter", 1, 0, "ServiceThing"); qmlRegisterSingletonInstance("org.presenter", 1, 0, "SlideObject", slide.get()); qmlRegisterSingletonInstance("org.presenter", 1, 0, "FileManager", filemanager.get()); diff --git a/src/qml/presenter/Presentation.qml b/src/qml/presenter/Presentation.qml index 7be9c74..ee6a4f2 100644 --- a/src/qml/presenter/Presentation.qml +++ b/src/qml/presenter/Presentation.qml @@ -45,6 +45,7 @@ FocusScope { text: "Solo" icon.name: "viewimage" hoverEnabled: true + onClicked: myObject.slapVariantAround(imagesqlmodel.getImage(1).title); } Controls.ToolButton { text: "Grid" @@ -130,15 +131,12 @@ FocusScope { anchors.horizontalCenter: previewSlide.horizontalCenter /* Layout.columnSpan: 3 */ visible: itemType === "video"; - Kirigami.Icon { - source: previewSlide.mpvIsPlaying ? "media-pause" : "media-play" + Controls.ToolButton { Layout.preferredWidth: 25 Layout.preferredHeight: 25 - MouseArea { - anchors.fill: parent - onPressed: SlideObject.playPause(); - cursorShape: Qt.PointingHandCursor - } + icon.name: previewSlide.mpvIsPlaying ? "media-pause" : "media-play" + hoverEnabled: true + onClicked: SlideObject.playPause(); } Controls.Slider { id: videoSlider diff --git a/src/rust/Cargo.toml b/src/rust/Cargo.toml index d2a6800..4c80df4 100644 --- a/src/rust/Cargo.toml +++ b/src/rust/Cargo.toml @@ -1,11 +1,11 @@ [package] -name = "qml-minimal" +name = "libre-presenter" version = "0.1.0" edition = "2021" authors = [ "Chris Cochrun " ] -license = "MIT OR Apache-2.0" +license = "GPL-3.0" # This will instruct Cargo to create a static # library which CMake can link against diff --git a/src/rust/build.rs b/src/rust/build.rs index f8241a5..6d2b652 100644 --- a/src/rust/build.rs +++ b/src/rust/build.rs @@ -2,4 +2,5 @@ use cxx_qt_build::CxxQtBuilder; fn main() { CxxQtBuilder::new().file("src/cxxqt_object.rs").build(); + CxxQtBuilder::new().file("src/service_thing.rs").build(); } diff --git a/src/rust/src/cxxqt_object.rs b/src/rust/src/cxxqt_object.rs index 012635b..0062145 100644 --- a/src/rust/src/cxxqt_object.rs +++ b/src/rust/src/cxxqt_object.rs @@ -1,9 +1,12 @@ #[cxx_qt::bridge] mod my_object { + use cxx_qt_lib::QVariantValue; unsafe extern "C++" { include!("cxx-qt-lib/qstring.h"); type QString = cxx_qt_lib::QString; + include!("cxx-qt-lib/qvariant.h"); + type QVariant = cxx_qt_lib::QVariant; } #[cxx_qt::qobject] @@ -31,11 +34,24 @@ mod my_object { } #[qinvokable] - pub fn say_hi(&self, string: &QString, number: i32) { + pub fn say_hi(self: Pin<&mut Self>, string: &QString, number: i32) { println!( "Hi from Rust! String is '{}' and number is {}", string, number ); + println!("length is: {}", string.to_string().len()); + let mut nstr: String = string.to_string(); + nstr.push_str(" hi"); + self.set_string(QString::from(nstr.as_str())); + } + + #[qinvokable] + pub fn slap_variant_around(self: Pin<&mut Self>, variant: &QVariant) { + println!("wow!"); + match variant.value() { + QVariantValue::QString(string) => self.set_string(string), + _ => println!("Unknown QVariant type"), + } } } } diff --git a/src/rust/src/lib.rs b/src/rust/src/lib.rs index a03e1e7..380ac19 100644 --- a/src/rust/src/lib.rs +++ b/src/rust/src/lib.rs @@ -14,3 +14,4 @@ mod tests { } mod cxxqt_object; +mod service_thing; diff --git a/src/rust/src/service_thing.rs b/src/rust/src/service_thing.rs new file mode 100644 index 0000000..a7b2d6f --- /dev/null +++ b/src/rust/src/service_thing.rs @@ -0,0 +1,80 @@ +#[cxx_qt::bridge] +mod service_thing { + use cxx_qt_lib::QVariantValue; + + unsafe extern "C++" { + include!("cxx-qt-lib/qstring.h"); + type QString = cxx_qt_lib::QString; + include!("cxx-qt-lib/qvariant.h"); + type QVariant = cxx_qt_lib::QVariant; + } + + #[cxx_qt::qobject] + pub struct ServiceThing { + #[qproperty] + name: QString, + #[qproperty] + kind: QString, + #[qproperty] + background: QString, + #[qproperty] + background_type: QString, + #[qproperty] + text: QString, + #[qproperty] + audio: QString, + #[qproperty] + font: QString, + #[qproperty] + font_size: QString, + #[qproperty] + active: bool, + #[qproperty] + selected: bool, + } + + impl Default for ServiceThing { + fn default() -> Self { + Self { + name: QString::from(""), + kind: QString::from(""), + background: QString::from(""), + background_type: QString::from(""), + text: QString::from(""), + audio: QString::from(""), + font: QString::from(""), + font_size: QString::from(""), + active: false, + selected: false, + } + } + } + + impl qobject::ServiceThing { + #[qinvokable] + pub fn activate(self: Pin<&mut Self>) { + self.set_active(true); + } + + #[qinvokable] + pub fn say_hi(self: Pin<&mut Self>, string: &QString, number: i32) { + println!( + "Hi from Rust! String is '{}' and number is {}", + string, number + ); + println!("length is: {}", string.to_string().len()); + let mut nstr: String = string.to_string(); + nstr.push_str(" hi"); + self.set_name(QString::from(nstr.as_str())); + } + + #[qinvokable] + pub fn slap_variant_around(self: Pin<&mut Self>, variant: &QVariant) { + println!("wow!"); + match variant.value() { + QVariantValue::QString(string) => self.set_name(string), + _ => println!("Unknown QVariant type"), + } + } + } +}