From 92f2b18a2018230bf009b79a7e2f6c86b6ba5aac Mon Sep 17 00:00:00 2001 From: Chris Cochrun Date: Wed, 12 Mar 2025 09:35:36 -0500 Subject: [PATCH] rust side builds but having trouble linking in main.cpp --- Cargo.lock | 125 ++++++++++++++++++++------------- Cargo.toml | 8 +-- build.rs | 88 ++++++++++++++++++++++- flake.nix | 6 +- src/main.cpp | 26 +++---- src/rust/image_model.rs | 19 ++++- src/rust/main.rs | 12 ++++ src/rust/presentation_model.rs | 17 ++++- src/rust/service_item_model.rs | 27 +++++-- src/rust/slide_model.rs | 60 +++++++++++----- src/rust/slide_object.rs | 52 +++++++------- src/rust/songs/song_editor.rs | 2 +- src/rust/songs/song_model.rs | 56 +++++++++++---- src/rust/video_model.rs | 19 ++++- 14 files changed, 377 insertions(+), 140 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7c6439a..251eb75 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -372,12 +372,24 @@ version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +[[package]] +name = "bytemuck" +version = "1.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" + [[package]] name = "byteorder" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "bytes" version = "1.7.1" @@ -409,8 +421,10 @@ checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", + "js-sys", "num-traits", "serde", + "wasm-bindgen", "windows-targets 0.52.6", ] @@ -460,6 +474,12 @@ dependencies = [ "tracing-error", ] +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -567,21 +587,6 @@ dependencies = [ "link-cplusplus", ] -[[package]] -name = "cxx-build" -version = "1.0.128" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77953e99f01508f89f55c494bfa867171ef3a6c8cea03d26975368f2121a5c1" -dependencies = [ - "cc", - "codespan-reporting", - "once_cell", - "proc-macro2", - "quote", - "scratch", - "syn 2.0.77", -] - [[package]] name = "cxx-gen" version = "0.7.128" @@ -596,38 +601,41 @@ dependencies = [ [[package]] name = "cxx-qt" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08aa6cda7588b6d17c563b0d2fadc060d4204d04908c0f359ae288857091218d" +checksum = "208ad6c4feac92f221fde00796f317b049ba1892b97be0d60ca177d0d3469fc5" dependencies = [ "cxx", + "cxx-qt-build", "cxx-qt-macro", + "qt-build-utils", "static_assertions", + "thiserror", ] [[package]] name = "cxx-qt-build" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e097b99f49792922a72a8ca35d9391762e48e63363d6998255be1f2ca1edf69" +checksum = "15f80e109aa68795486c70c302f6c2d921f00028b3b62038a4601efb5c585c1c" dependencies = [ "cc", "codespan-reporting", - "convert_case", "cxx-gen", "cxx-qt-gen", - "cxx-qt-lib-headers", "proc-macro2", "qt-build-utils", "quote", + "serde", + "serde_json", "version_check", ] [[package]] name = "cxx-qt-gen" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c73dbfbcc234d8826919e257830c1789db2cac586546a87d2a82e3cbe5d5" +checksum = "dc17d95ca9cc60c2f91f804a4e0ba6a3e1b8ed338c207a1bd8d176133e2fd05d" dependencies = [ "clang-format", "convert_case", @@ -639,27 +647,30 @@ dependencies = [ [[package]] name = "cxx-qt-lib" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "002f1a6119bcb7dfec67eb7c0803a7b1d595dc54610559faeac35133f22a5880" +checksum = "f116c5d982bbf3be707acf97f566802c30454d52ca319c745ed39a04834e8bc6" dependencies = [ + "bytes", + "chrono", "cxx", - "cxx-build", - "cxx-qt-lib-headers", + "cxx-qt", + "cxx-qt-build", + "http 1.1.0", + "image 0.24.9", + "image 0.25.5", "qt-build-utils", + "rgb", + "serde", + "time", + "url", ] -[[package]] -name = "cxx-qt-lib-headers" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9abdeab6b77cfc5a53b724f3f62a37bcb5ac1423cccc2dba4c134f4273440b8c" - [[package]] name = "cxx-qt-macro" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "699e8a668c03b03419b084960d72eed253632bb16349b33fd0a0c893b61b664c" +checksum = "58a4fe02c0604eda28c605792f5ba0d0251b4947f8f0fc43e55b61c06b2b8ec6" dependencies = [ "cxx-qt-gen", "proc-macro2", @@ -1344,6 +1355,29 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "image" +version = "0.24.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "num-traits", +] + +[[package]] +name = "image" +version = "0.25.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" +dependencies = [ + "bytemuck", + "byteorder-lite", + "num-traits", +] + [[package]] name = "indenter" version = "0.3.3" @@ -1406,9 +1440,9 @@ checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" [[package]] name = "itertools" -version = "0.11.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ "either", ] @@ -2093,9 +2127,9 @@ dependencies = [ [[package]] name = "qt-build-utils" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59c828fe2434dad34dd0c30a4ba037509b61dad92a55baf0dc42699e6aa2f10" +checksum = "efb239fdd8c036fabb95364320041ef68197cd4ab971bb3b4ca3ea0b7b93d12c" dependencies = [ "cc", "thiserror", @@ -2281,6 +2315,9 @@ name = "rgb" version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" +dependencies = [ + "bytemuck", +] [[package]] name = "rsa" @@ -2365,12 +2402,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "scratch" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3cf7c11c38cb994f3d40e8a8cde3bbd1f72a435e4c49e85d6553d8312306152" - [[package]] name = "security-framework" version = "2.11.1" @@ -3305,9 +3336,9 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "versions" -version = "5.0.1" +version = "6.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c73a36bc44e3039f51fbee93e39f41225f6b17b380eb70cc2aab942df06b34dd" +checksum = "f25d498b63d1fdb376b4250f39ab3a5ee8d103957346abacd911e2d8b612c139" dependencies = [ "itertools", "nom", diff --git a/Cargo.toml b/Cargo.toml index c82317b..7c2581f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,8 +27,8 @@ serde = "1.0.152" serde_derive = "1.0.152" quote = "1.0.27" cxx = "1.0.83" -cxx-qt = "0.6.1" -cxx-qt-lib = "0.6.1" +cxx-qt = "0.7.1" +cxx-qt-lib = { version = "0.7.1", features = [ "full" ] } # home = "0.5.4" dirs = "5.0.0" # libsqlite3-sys = { version = ">=0.17.2", features = ["bundled"] } @@ -51,8 +51,8 @@ color-eyre = "0.6.3" # 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 = { version = "0.6.1", features = [ "link_qt_object_files" ] } -qt-build-utils = "0.6.1" +cxx-qt-build = { version = "0.7.1", features = [ "link_qt_object_files" ] } +qt-build-utils = "0.7.1" # [dependencies.confy] # features = ["yaml_conf"] diff --git a/build.rs b/build.rs index 8d4b0d6..84c1284 100644 --- a/build.rs +++ b/build.rs @@ -1,3 +1,5 @@ +use std::{env, path::PathBuf}; + use cxx_qt_build::{CxxQtBuilder, QmlModule}; fn main() { @@ -17,6 +19,37 @@ fn main() { .file("src/rust/obs.rs") .build(); + // let mut kde_include_dir = String::from("/usr/include/"); + // let mut kde_lib_dir = String::from("/usr/lib/x86_64-linux-gnu/"); + + // if let Ok(mut include_dir) = env::var("CMAKE_INCLUDE_PATH") { + // println!("{}", include_dir); + // if let Some(include_dir) = + // include_dir.split(":").find(|s| s.contains("ki18n")) + // { + // kde_include_dir = include_dir.to_owned(); + // } + // } else { + // println!( + // "cargo:warning=KDE_INCLUDEDIR is not defined, used default value: {}", + // kde_include_dir + // ); + // } + // if let Ok(lib_dir) = env::var("KDE_LIBDIR") { + // kde_lib_dir = lib_dir; + // } else { + // println!( + // "cargo:warning=KDE_LIBDIR is not defined, used default value: {}", + // kde_lib_dir + // ); + // } + + // let ki18n_include_path = PathBuf::from(kde_include_dir) + // .canonicalize() + // .expect("Cannot get canonical path of KDE_INCLUDEDIR") + // .join("KF6") + // .join("KI18n"); + // CxxQtBuilder::new() // // Link Qt's Network library // // - Qt Core is always linked @@ -27,13 +60,64 @@ fn main() { // // .qt_module("Kirigami") // // .qt_module("WebEngineQuick") // .qt_module("Network") + // // .qt_module("Quick") + // // .qt_module("Test") + // // .qt_module("WebEngineQuick") // // .qt_module("I18n") // // .qt_module("CoreAddons") // .qml_module(QmlModule { // uri: "com.cochrun.xyz", - // rust_files: &["src/rust/settings.rs"], - // qml_files: &["src/qml/main.qml"], + // rust_files: &[ + // "src/rust/settings.rs", + // "src/rust/service_item_model.rs", + // "src/rust/file_helper.rs", + // "src/rust/slide_model.rs", + // "src/rust/slide_object.rs", + // "src/rust/ytdl.rs", + // "src/rust/utils.rs", + // "src/rust/obs.rs", + // "src/rust/video_model.rs", + // "src/rust/image_model.rs", + // "src/rust/presentation_model.rs", + // // "src/rust/songs/song_model.rs", + // // "src/rust/songs/song_editor.rs", + // ], + // qrc_files: &["src/resources.qrc"], + // qml_files: &[ + // "src/qml/main.qml", + // "src/qml/presenter/LeftDock.qml", + // "src/qml/presenter/ServiceList.qml", + // "src/qml/presenter/MainWindow.qml", + // "src/qml/presenter/Library.qml", + // "src/qml/presenter/LibraryItem.qml", + // "src/qml/presenter/Header.qml", + // "src/qml/presenter/Actions.qml", + // "src/qml/presenter/PanelItem.qml", + // "src/qml/presenter/SongEditor.qml", + // "src/qml/presenter/VideoEditor.qml", + // "src/qml/presenter/ImageEditor.qml", + // "src/qml/presenter/PresentationEditor.qml", + // "src/qml/presenter/SlideEditor.qml", + // "src/qml/presenter/Slide.qml", + // "src/qml/presenter/SlidesListView.qml", + // "src/qml/presenter/SongEditorSlideList.qml", + // "src/qml/presenter/DragHandle.qml", + // "src/qml/presenter/Presentation.qml", + // "src/qml/presenter/PresentationWindow.qml", + // "src/qml/presenter/PreviewSlideListDelegate.qml", + // "src/qml/presenter/PreviewSlide.qml", + // "src/qml/presenter/Settings.qml", + // "src/qml/presenter/RangedSlider.qml", + // "src/qml/presenter/NewVideo.qml", + // "src/qml/presenter/TextBackground.qml", + // "src/qml/presenter/TextBox.qml", + // "src/qml/presenter/LoadingSpinner.qml", + // ], // ..Default::default() // }) + // .cc_builder(|cc| { + // cc.include("cpp"); + // cc.include(format!("{}", ki18n_include_path.display())); + // }) // .build(); } diff --git a/flake.nix b/flake.nix index 7f8125e..ae1f66a 100644 --- a/flake.nix +++ b/flake.nix @@ -54,8 +54,9 @@ libclang # libwebp # clang-format - qt6.qtbase + qt6.full qt6.qttools + qt6.qtbase # qt6.qtquickcontrols2 # qt6.qtx11extras qt6.qtmultimedia @@ -63,7 +64,6 @@ qt6.qtwebengine qt6.qtimageformats kdePackages.kirigami - kdePackages.mpvqt # kdePackages.kfilemetadata # libsForQt5.breeze-icons # libsForQt5.breeze-qt5 @@ -106,6 +106,8 @@ CMAKE_C_COMPILER = "${pkgs.gcc}/bin/gcc"; CMAKE_CXX_COMPILER = "${pkgs.gcc}/bin/g++"; CARGO_PROFILE_RELEASE_BUILD_OVERRIDE_DEBUG = true; + # KDE_INCLUDEDIR = "${pkgs.kdePackages.kirigami.dev}/include"; + # KDE_QMLDIR = "${pkgs.kdePackages.kirigami.dev}/lib/qt-6/qml/org/kde/kirigami/"; # This creates the proper qt env so that plugins are found right. shellHook = '' diff --git a/src/main.cpp b/src/main.cpp index 656ad12..f289707 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -31,19 +31,19 @@ // #include "cpp/mpv/mpvproperties.h" // RUST -#include "cxx-qt-gen/file_helper.cxxqt.h" -#include "cxx-qt-gen/slide_object.cxxqt.h" -#include "cxx-qt-gen/slide_model.cxxqt.h" -#include "cxx-qt-gen/service_item_model.cxxqt.h" -#include "cxx-qt-gen/settings.cxxqt.h" -#include "cxx-qt-gen/ytdl.cxxqt.h" -#include "cxx-qt-gen/presentation_model.cxxqt.h" -#include "cxx-qt-gen/song_model.cxxqt.h" -#include "cxx-qt-gen/video_model.cxxqt.h" -#include "cxx-qt-gen/image_model.cxxqt.h" -#include "cxx-qt-gen/utils.cxxqt.h" -#include "cxx-qt-gen/song_editor.cxxqt.h" -#include "cxx-qt-gen/obs.cxxqt.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include static QWindow *windowFromEngine(QQmlApplicationEngine *engine) { diff --git a/src/rust/image_model.rs b/src/rust/image_model.rs index 8ffad59..d951149 100644 --- a/src/rust/image_model.rs +++ b/src/rust/image_model.rs @@ -2,6 +2,7 @@ pub mod image_model { unsafe extern "C++" { include!(< QAbstractListModel >); + type QAbstractListModel; include!("cxx-qt-lib/qhash.h"); type QHash_i32_QByteArray = cxx_qt_lib::QHash; @@ -33,13 +34,14 @@ pub mod image_model { unsafe extern "RustQt" { #[qobject] - #[base = "QAbstractListModel"] + #[base = QAbstractListModel] #[qml_element] #[qproperty(i32, count)] type ImageModel = super::ImageModelRust; #[inherit] #[qsignal] + #[cxx_name = "dataChanged"] fn data_changed( self: Pin<&mut ImageModel>, top_left: &QModelIndex, @@ -83,6 +85,7 @@ pub mod image_model { unsafe extern "RustQt" { #[inherit] + #[cxx_name = "beginInsertRows"] unsafe fn begin_insert_rows( self: Pin<&mut ImageModel>, parent: &QModelIndex, @@ -91,9 +94,11 @@ pub mod image_model { ); #[inherit] + #[cxx_name = "endInsertRows"] unsafe fn end_insert_rows(self: Pin<&mut ImageModel>); #[inherit] + #[cxx_name = "beginRemoveRows"] unsafe fn begin_remove_rows( self: Pin<&mut ImageModel>, parent: &QModelIndex, @@ -102,6 +107,7 @@ pub mod image_model { ); #[inherit] + #[cxx_name = "beginMoveRows"] unsafe fn begin_move_rows( self: Pin<&mut ImageModel>, source_parent: &QModelIndex, @@ -112,18 +118,23 @@ pub mod image_model { ) -> bool; #[inherit] + #[cxx_name = "endMoveRows"] unsafe fn end_move_rows(self: Pin<&mut ImageModel>); #[inherit] + #[cxx_name = "endRemoveRows"] unsafe fn end_remove_rows(self: Pin<&mut ImageModel>); #[inherit] + #[cxx_name = "beginResetModel"] unsafe fn begin_reset_model(self: Pin<&mut ImageModel>); #[inherit] + #[cxx_name = "endResetModel"] unsafe fn end_reset_model(self: Pin<&mut ImageModel>); #[inherit] + #[cxx_name = "canFetchMore"] fn can_fetch_more( self: &ImageModel, parent: &QModelIndex, @@ -147,18 +158,20 @@ pub mod image_model { #[qinvokable] #[cxx_override] + #[cxx_name = "roleNames"] fn role_names(self: &ImageModel) -> QHash_i32_QByteArray; #[qinvokable] #[cxx_override] + #[cxx_name = "rowCount"] fn row_count(self: &ImageModel, _parent: &QModelIndex) - -> i32; + -> i32; } } use cxx_qt::CxxQtType; use cxx_qt_lib::{QModelIndex, QString, QUrl, QVariant}; -use sqlx::{query, query_as, Connection, SqliteConnection}; +use sqlx::{Connection, SqliteConnection, query, query_as}; use std::path::PathBuf; use std::pin::Pin; use tracing::{debug, error}; diff --git a/src/rust/main.rs b/src/rust/main.rs index 3ee8ace..eb04dd5 100644 --- a/src/rust/main.rs +++ b/src/rust/main.rs @@ -4,8 +4,20 @@ pub mod settings; fn main() { let mut app = QGuiApplication::new(); let mut engine = QQmlApplicationEngine::new(); + let mut kde_qml_dir = + String::from("/usr/lib/x86_64-linux-gnu/qt6/qml/"); + + if let Ok(qml_dir) = env::var("NIXPKGS_QT6_QML_IMPORT_PATH") { + kde_qml_dir = qml_dir; + } else { + println!( + "cargo:warning=KDE_QMLDIR is not defined, used default value: {}", + kde_qml_dir + ); + } if let Some(engine) = engine.as_mut() { + engine.add_import_path(&QString::from(kde_qml_dir.as_str())); engine.load(&QUrl::from( "qrc:/qt/qml/com/cochrun/xyz/qml/main.qml", )); diff --git a/src/rust/presentation_model.rs b/src/rust/presentation_model.rs index d06cd3c..4717b9f 100644 --- a/src/rust/presentation_model.rs +++ b/src/rust/presentation_model.rs @@ -2,6 +2,7 @@ pub mod presentation_model { unsafe extern "C++" { include!(< QAbstractListModel >); + type QAbstractListModel; include!("cxx-qt-lib/qhash.h"); type QHash_i32_QByteArray = cxx_qt_lib::QHash; @@ -35,13 +36,14 @@ pub mod presentation_model { unsafe extern "RustQt" { #[qobject] - #[base = "QAbstractListModel"] + #[base = QAbstractListModel] #[qml_element] #[qproperty(i32, count)] type PresentationModel = super::PresentationModelRust; #[inherit] #[qsignal] + #[cxx_name = "dataChanged"] fn data_changed( self: Pin<&mut PresentationModel>, top_left: &QModelIndex, @@ -101,6 +103,7 @@ pub mod presentation_model { unsafe extern "RustQt" { #[inherit] + #[cxx_name = "beginInsertRows"] unsafe fn begin_insert_rows( self: Pin<&mut PresentationModel>, parent: &QModelIndex, @@ -109,9 +112,11 @@ pub mod presentation_model { ); #[inherit] + #[cxx_name = "endInsertRows"] unsafe fn end_insert_rows(self: Pin<&mut PresentationModel>); #[inherit] + #[cxx_name = "beginRemoveRows"] unsafe fn begin_remove_rows( self: Pin<&mut PresentationModel>, parent: &QModelIndex, @@ -120,6 +125,7 @@ pub mod presentation_model { ); #[inherit] + #[cxx_name = "beginMoveRows"] unsafe fn begin_move_rows( self: Pin<&mut PresentationModel>, source_parent: &QModelIndex, @@ -130,20 +136,25 @@ pub mod presentation_model { ) -> bool; #[inherit] + #[cxx_name = "endMoveRows"] unsafe fn end_move_rows(self: Pin<&mut PresentationModel>); #[inherit] + #[cxx_name = "endRemoveRows"] unsafe fn end_remove_rows(self: Pin<&mut PresentationModel>); #[inherit] + #[cxx_name = "beginResetModel"] unsafe fn begin_reset_model( self: Pin<&mut PresentationModel>, ); #[inherit] + #[cxx_name = "endResetModel"] unsafe fn end_reset_model(self: Pin<&mut PresentationModel>); #[inherit] + #[cxx_name = "canFetchMore"] fn can_fetch_more( self: &PresentationModel, parent: &QModelIndex, @@ -167,12 +178,14 @@ pub mod presentation_model { #[qinvokable] #[cxx_override] + #[cxx_name = "roleNames"] fn role_names( self: &PresentationModel, ) -> QHash_i32_QByteArray; #[qinvokable] #[cxx_override] + #[cxx_name = "rowCount"] fn row_count( self: &PresentationModel, _parent: &QModelIndex, @@ -184,7 +197,7 @@ use crate::presentation_model::presentation_model::QMap_QString_QVariant; use crate::reveal_js; use cxx_qt::CxxQtType; use cxx_qt_lib::{QModelIndex, QString, QUrl, QVariant}; -use sqlx::{query, query_as, Connection, SqliteConnection}; +use sqlx::{Connection, SqliteConnection, query, query_as}; use std::path::PathBuf; use std::pin::Pin; use tracing::{debug, error}; diff --git a/src/rust/service_item_model.rs b/src/rust/service_item_model.rs index 03158e2..b4051f1 100644 --- a/src/rust/service_item_model.rs +++ b/src/rust/service_item_model.rs @@ -2,6 +2,7 @@ mod service_item_model { unsafe extern "C++" { include!(< QAbstractListModel >); + type QAbstractListModel; include!("cxx-qt-lib/qhash.h"); type QHash_i32_QByteArray = cxx_qt_lib::QHash; @@ -45,7 +46,7 @@ mod service_item_model { unsafe extern "RustQt" { #[qobject] - #[base = "QAbstractListModel"] + #[base = QAbstractListModel] #[qml_element] #[qproperty(i32, count)] #[qproperty(f32, save_progress)] @@ -54,6 +55,7 @@ mod service_item_model { #[inherit] #[qsignal] + #[cxx_name = "dataChanged"] fn data_changed( self: Pin<&mut ServiceItemModel>, top_left: &QModelIndex, @@ -182,17 +184,18 @@ mod service_item_model { #[qinvokable] fn save(self: Pin<&mut ServiceItemModel>, file: QUrl) - -> bool; + -> bool; #[qinvokable] fn load(self: Pin<&mut ServiceItemModel>, file: QUrl) - -> bool; + -> bool; } impl cxx_qt::Threading for ServiceItemModel {} unsafe extern "RustQt" { #[inherit] + #[cxx_name = "beginInsertRows"] unsafe fn begin_insert_rows( self: Pin<&mut ServiceItemModel>, parent: &QModelIndex, @@ -201,9 +204,11 @@ mod service_item_model { ); #[inherit] + #[cxx_name = "endInsertRows"] unsafe fn end_insert_rows(self: Pin<&mut ServiceItemModel>); #[inherit] + #[cxx_name = "beginRemoveRows"] unsafe fn begin_remove_rows( self: Pin<&mut ServiceItemModel>, parent: &QModelIndex, @@ -212,6 +217,7 @@ mod service_item_model { ); #[inherit] + #[cxx_name = "beginMoveRows"] unsafe fn begin_move_rows( self: Pin<&mut ServiceItemModel>, source_parent: &QModelIndex, @@ -222,18 +228,23 @@ mod service_item_model { ) -> bool; #[inherit] + #[cxx_name = "endMoveRows"] unsafe fn end_move_rows(self: Pin<&mut ServiceItemModel>); #[inherit] + #[cxx_name = "endRemoveRows"] unsafe fn end_remove_rows(self: Pin<&mut ServiceItemModel>); #[inherit] + #[cxx_name = "beginResetModel"] unsafe fn begin_reset_model(self: Pin<&mut ServiceItemModel>); #[inherit] + #[cxx_name = "endResetModel"] unsafe fn end_reset_model(self: Pin<&mut ServiceItemModel>); #[inherit] + #[cxx_name = "canFetchMore"] fn can_fetch_more( self: &ServiceItemModel, parent: &QModelIndex, @@ -257,12 +268,14 @@ mod service_item_model { #[qinvokable] #[cxx_override] + #[cxx_name = "roleNames"] fn role_names( self: &ServiceItemModel, ) -> QHash_i32_QByteArray; #[qinvokable] #[cxx_override] + #[cxx_name = "rowCount"] fn row_count( self: &ServiceItemModel, _parent: &QModelIndex, @@ -277,7 +290,7 @@ use self::service_item_model::{ }; use crate::service_item_model::service_item_model::QList_QString; use crate::slide_types::SlideType; -use crate::songs::song_model::{get_song, Song}; +use crate::songs::song_model::{Song, get_song}; use crate::{image_model, presentation_model, video_model}; use cxx_qt::{CxxQtType, Threading}; use cxx_qt_lib::{ @@ -285,7 +298,7 @@ use cxx_qt_lib::{ }; use dirs; // use lumina_core::service_items::ServiceItem as SI; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use std::iter; use std::path::{Path, PathBuf}; use std::pin::Pin; @@ -1295,7 +1308,9 @@ impl service_item_model::ServiceItemModel { ..Default::default() }; self.as_mut().add_service_item(&service_item); - error!("Loaded service item with generic type since it was an unknown type."); + error!( + "Loaded service item with generic type since it was an unknown type." + ); // // files implement the Read trait } } diff --git a/src/rust/slide_model.rs b/src/rust/slide_model.rs index 97ee9e3..bfbe459 100644 --- a/src/rust/slide_model.rs +++ b/src/rust/slide_model.rs @@ -2,6 +2,7 @@ pub mod slide_model { unsafe extern "C++" { include!(< QAbstractListModel >); + type QAbstractListModel; include!("cxx-qt-lib/qhash.h"); type QHash_i32_QByteArray = cxx_qt_lib::QHash; @@ -18,20 +19,23 @@ pub mod slide_model { type QVector_i32 = cxx_qt_lib::QVector; include!("cxx-qt-lib/qlist.h"); type QList_QString = cxx_qt_lib::QList; - include!("cxx-qt-gen/slide_object.cxxqt.h"); - type SlideObject = - crate::slide_object::slide_object::SlideObject; - include!("cxx-qt-gen/song_model.cxxqt.h"); + include!("src/rust/slide_object.cxxqt.h"); + type SlideObject = crate::slide_object::qobject::SlideObject; + include!("src/rust/songs/song_model.cxxqt.h"); type SongModel = crate::songs::song_model::song_model::SongModel; - include!("cxx-qt-gen/video_model.cxxqt.h"); + include!("src/rust/video_model.cxxqt.h"); type VideoModel = crate::video_model::video_model::VideoModel; - include!("cxx-qt-gen/image_model.cxxqt.h"); + include!("src/rust/image_model.cxxqt.h"); type ImageModel = crate::image_model::image_model::ImageModel; - include!("cxx-qt-gen/presentation_model.cxxqt.h"); + include!("src/rust/presentation_model.cxxqt.h"); type PresentationModel = crate::presentation_model::presentation_model::PresentationModel; } + // extern "C++" { + // type SlideObject = crate::slide_object::qobject::SlideObject; + // } + #[qenum(SlideModel)] enum SlideRoles { Ty, @@ -58,7 +62,7 @@ pub mod slide_model { unsafe extern "RustQt" { #[qobject] - #[base = "QAbstractListModel"] + #[base = QAbstractListModel] #[qml_element] #[qproperty(i32, count)] #[qproperty(*mut SlideObject, slide_object)] @@ -70,6 +74,7 @@ pub mod slide_model { #[inherit] #[qsignal] + #[cxx_name = "dataChanged"] fn data_changed( self: Pin<&mut SlideModel>, top_left: &QModelIndex, @@ -155,6 +160,7 @@ pub mod slide_model { unsafe extern "RustQt" { #[inherit] + #[cxx_name = "beginInsertRows"] unsafe fn begin_insert_rows( self: Pin<&mut SlideModel>, parent: &QModelIndex, @@ -163,9 +169,11 @@ pub mod slide_model { ); #[inherit] + #[cxx_name = "endInsertRows"] unsafe fn end_insert_rows(self: Pin<&mut SlideModel>); #[inherit] + #[cxx_name = "beginRemoveRows"] unsafe fn begin_remove_rows( self: Pin<&mut SlideModel>, parent: &QModelIndex, @@ -174,15 +182,19 @@ pub mod slide_model { ); #[inherit] + #[cxx_name = "endRemoveRows"] unsafe fn end_remove_rows(self: Pin<&mut SlideModel>); #[inherit] + #[cxx_name = "beginResetModel"] unsafe fn begin_reset_model(self: Pin<&mut SlideModel>); #[inherit] + #[cxx_name = "endResetModel"] unsafe fn end_reset_model(self: Pin<&mut SlideModel>); #[inherit] + #[cxx_name = "beginMoveRows"] unsafe fn begin_move_rows( self: Pin<&mut SlideModel>, source_parent: &QModelIndex, @@ -193,9 +205,11 @@ pub mod slide_model { ) -> bool; #[inherit] + #[cxx_name = "endMoveRows"] unsafe fn end_move_rows(self: Pin<&mut SlideModel>); #[inherit] + #[cxx_name = "canFetchMore"] fn can_fetch_more( self: &SlideModel, parent: &QModelIndex, @@ -219,12 +233,14 @@ pub mod slide_model { #[qinvokable] #[cxx_override] + #[cxx_name = "roleNames"] fn role_names(self: &SlideModel) -> QHash_i32_QByteArray; #[qinvokable] #[cxx_override] + #[cxx_name = "rowCount"] fn row_count(self: &SlideModel, _parent: &QModelIndex) - -> i32; + -> i32; } } @@ -238,12 +254,12 @@ use crate::presentation_model::{ }; use crate::slide_model::slide_model::QList_QString; use crate::songs::song_model::song_model::{self, SongModel}; -use crate::songs::song_model::{get_song, Song, SongModelRust}; +use crate::songs::song_model::{Song, SongModelRust, get_song}; use crate::video_model::video_model::VideoModel; use crate::video_model::{self, Video, VideoModelRust}; use crate::{ffmpeg, slide_types::SlideType}; -use color_eyre::eyre::Result; use color_eyre::Section; +use color_eyre::eyre::Result; use cxx_qt::{CxxQtType, Threading}; use cxx_qt_lib::{ CaseSensitivity, QByteArray, QList, QModelIndex, QString, @@ -324,7 +340,9 @@ impl Display for ParseSlideError { f: &mut std::fmt::Formatter<'_>, ) -> std::fmt::Result { let message = match self { - Self::UnknownType => "The type does not exist. It needs to be one of 'song', 'video', 'image', 'presentation', or 'content'", + Self::UnknownType => { + "The type does not exist. It needs to be one of 'song', 'video', 'image', 'presentation', or 'content'" + } }; write!(f, "Error: {message}") } @@ -798,7 +816,9 @@ impl slide_model::SlideModel { // Change the service_item_id of the moved slide if count > 1 { if move_down { - debug!("While moving down, change service items id of moved slide"); + debug!( + "While moving down, change service items id of moved slide" + ); for (i, _slide) in slides_iter .clone() .enumerate() @@ -816,13 +836,16 @@ impl slide_model::SlideModel { debug!( ?slide, "rust: these ones right here officer. from {:?} to {:?}", - slide.service_item_id, destination_index + slide.service_item_id, + destination_index ); slide.service_item_id = destination_index; } } } else { - debug!("While moving up, change service items id of moved slide"); + debug!( + "While moving up, change service items id of moved slide" + ); for (i, _slide) in slides_iter .clone() .enumerate() @@ -835,7 +858,8 @@ impl slide_model::SlideModel { debug!( ?slide, "rust: these ones right here officer. from {:?} to {:?}", - slide.service_item_id, destination_index + slide.service_item_id, + destination_index ); slide.service_item_id = destination_index; } @@ -907,7 +931,9 @@ impl slide_model::SlideModel { // self.as_mut().end_reset_model(); // } - debug!("rust-move: {first_slide} to {dest_slide} with {count} slides"); + debug!( + "rust-move: {first_slide} to {dest_slide} with {count} slides" + ); } fn move_items( diff --git a/src/rust/slide_object.rs b/src/rust/slide_object.rs index 3ac2b1c..60f8b20 100644 --- a/src/rust/slide_object.rs +++ b/src/rust/slide_object.rs @@ -1,5 +1,5 @@ #[cxx_qt::bridge] -pub mod slide_object { +pub mod qobject { unsafe extern "C++" { include!("cxx-qt-lib/qstring.h"); type QString = cxx_qt_lib::QString; @@ -11,6 +11,28 @@ pub mod slide_object { } unsafe extern "RustQt" { + #[qobject] + #[qml_element] + #[qproperty(i32, slide_index)] + #[qproperty(i32, slide_size)] + #[qproperty(i32, inner_slide_index)] + #[qproperty(bool, is_playing)] + #[qproperty(bool, looping)] + #[qproperty(QString, text)] + #[qproperty(QString, ty)] + #[qproperty(QString, audio)] + #[qproperty(QString, image_background)] + #[qproperty(QString, video_background)] + #[qproperty(bool, html)] + #[qproperty(QString, vtext_alignment)] + #[qproperty(QString, htext_alignment)] + #[qproperty(QString, font)] + #[qproperty(i32, font_size)] + #[qproperty(f32, video_start_time)] + #[qproperty(f32, video_end_time)] + // #[qproperty(*mut SlideModel, slide_model)] + type SlideObject = super::SlideObjectRust; + #[qsignal] fn playing_changed( self: Pin<&mut SlideObject>, @@ -35,28 +57,6 @@ pub mod slide_object { #[qsignal] fn reveal_prev(self: Pin<&mut SlideObject>); - #[qobject] - #[qml_element] - #[qproperty(i32, slide_index)] - #[qproperty(i32, slide_size)] - #[qproperty(i32, inner_slide_index)] - #[qproperty(bool, is_playing)] - #[qproperty(bool, looping)] - #[qproperty(QString, text)] - #[qproperty(QString, ty)] - #[qproperty(QString, audio)] - #[qproperty(QString, image_background)] - #[qproperty(QString, video_background)] - #[qproperty(bool, html)] - #[qproperty(QString, vtext_alignment)] - #[qproperty(QString, htext_alignment)] - #[qproperty(QString, font)] - #[qproperty(i32, font_size)] - #[qproperty(f32, video_start_time)] - #[qproperty(f32, video_end_time)] - // #[qproperty(*mut SlideModel, slide_model)] - type SlideObject = super::SlideObjectRust; - #[qinvokable] fn change_slide( self: Pin<&mut SlideObject>, @@ -89,11 +89,11 @@ use cxx_qt_lib::{CaseSensitivity, QString, QVariant}; use tracing::{debug, error}; use crate::{ - slide_model::{slide_model, Slide}, + slide_model::{Slide, slide_model}, slide_types::SlideType, }; -use self::slide_object::QMap_QString_QVariant; +use self::qobject::QMap_QString_QVariant; #[derive(Clone, Debug)] pub struct SlideObjectRust { @@ -142,7 +142,7 @@ impl Default for SlideObjectRust { } } -impl slide_object::SlideObject { +impl qobject::SlideObject { pub fn change_slide( mut self: Pin<&mut Self>, item: QMap_QString_QVariant, diff --git a/src/rust/songs/song_editor.rs b/src/rust/songs/song_editor.rs index 8930995..61bb9ea 100644 --- a/src/rust/songs/song_editor.rs +++ b/src/rust/songs/song_editor.rs @@ -15,7 +15,7 @@ pub mod song_editor { include!("cxx-qt-lib/qlist.h"); type QList_QString = cxx_qt_lib::QList; - include!("cxx-qt-gen/song_model.cxxqt.h"); + include!("src/rust/songs/song_model.cxxqt.h"); type SongModel = crate::songs::song_model::song_model::SongModel; } diff --git a/src/rust/songs/song_model.rs b/src/rust/songs/song_model.rs index 49140aa..4c284f5 100644 --- a/src/rust/songs/song_model.rs +++ b/src/rust/songs/song_model.rs @@ -2,6 +2,7 @@ pub mod song_model { unsafe extern "C++" { include!(< QAbstractListModel >); + type QAbstractListModel; include!("cxx-qt-lib/qhash.h"); type QHash_i32_QByteArray = cxx_qt_lib::QHash; @@ -41,13 +42,14 @@ pub mod song_model { unsafe extern "RustQt" { #[qobject] - #[base = "QAbstractListModel"] + #[base = QAbstractListModel] #[qml_element] #[qproperty(i32, count)] type SongModel = super::SongModelRust; #[inherit] #[qsignal] + #[cxx_name = "dataChanged"] fn data_changed( self: Pin<&mut SongModel>, top_left: &QModelIndex, @@ -75,7 +77,7 @@ pub mod song_model { fn setup(self: Pin<&mut SongModel>); #[qinvokable] fn remove_item(self: Pin<&mut SongModel>, index: i32) - -> bool; + -> bool; #[qinvokable] fn new_song(self: Pin<&mut SongModel>) -> bool; #[qinvokable] @@ -168,6 +170,7 @@ pub mod song_model { unsafe extern "RustQt" { #[inherit] + #[cxx_name = "beginInsertRows"] unsafe fn begin_insert_rows( self: Pin<&mut SongModel>, parent: &QModelIndex, @@ -176,9 +179,11 @@ pub mod song_model { ); #[inherit] + #[cxx_name = "endInsertRows"] unsafe fn end_insert_rows(self: Pin<&mut SongModel>); #[inherit] + #[cxx_name = "beginRemoveRows"] unsafe fn begin_remove_rows( self: Pin<&mut SongModel>, parent: &QModelIndex, @@ -187,6 +192,7 @@ pub mod song_model { ); #[inherit] + #[cxx_name = "beginMoveRows"] unsafe fn begin_move_rows( self: Pin<&mut SongModel>, source_parent: &QModelIndex, @@ -197,18 +203,23 @@ pub mod song_model { ) -> bool; #[inherit] + #[cxx_name = "endMoveRows"] unsafe fn end_move_rows(self: Pin<&mut SongModel>); #[inherit] + #[cxx_name = "endRemoveRows"] unsafe fn end_remove_rows(self: Pin<&mut SongModel>); #[inherit] + #[cxx_name = "beginResetModel"] unsafe fn begin_reset_model(self: Pin<&mut SongModel>); #[inherit] + #[cxx_name = "endResetModel"] unsafe fn end_reset_model(self: Pin<&mut SongModel>); #[inherit] + #[cxx_name = "canFetchMore"] fn can_fetch_more( self: &SongModel, parent: &QModelIndex, @@ -232,10 +243,12 @@ pub mod song_model { #[qinvokable] #[cxx_override] + #[cxx_name = "roleNames"] fn role_names(self: &SongModel) -> QHash_i32_QByteArray; #[qinvokable] #[cxx_override] + #[cxx_name = "rowCount"] fn row_count(self: &SongModel, _parent: &QModelIndex) -> i32; } } @@ -246,7 +259,7 @@ use cxx_qt::{CxxQtType, Threading}; use cxx_qt_lib::{ QByteArray, QModelIndex, QString, QStringList, QVariant, }; -use sqlx::{query, query_as, Connection, SqliteConnection}; +use sqlx::{Connection, SqliteConnection, query, query_as}; use std::collections::HashMap; use std::pin::Pin; use tracing::{debug, error}; @@ -592,16 +605,23 @@ impl song_model::SongModel { let rt = tokio::runtime::Runtime::new().unwrap(); let db_string = updated_title.clone().to_string(); rt.block_on(async { - let result = query!("UPDATE songs SET title = ? where id = ?", db_string, song_id) - .execute(&mut self.as_mut().rust_mut().db) - .await; + let result = query!( + "UPDATE songs SET title = ? where id = ?", + db_string, + song_id + ) + .execute(&mut self.as_mut().rust_mut().db) + .await; match result { Ok(_i) => { if let Some(song) = self.as_mut().rust_mut().songs.get_mut(index) { - debug!(?song, title = updated_title.to_string()); + debug!( + ?song, + title = updated_title.to_string() + ); song.title = updated_title.to_string(); self.as_mut().data_changed( &model_index, @@ -614,9 +634,11 @@ impl song_model::SongModel { } } Err(e) => { - error!("There was an error updating title in db: {e}"); + error!( + "There was an error updating title in db: {e}" + ); false - }, + } } }); true @@ -720,9 +742,13 @@ impl song_model::SongModel { let db_string = updated_audio.clone().to_string(); let rt = tokio::runtime::Runtime::new().unwrap(); rt.block_on(async { - let result = query!("UPDATE songs SET audio = ? where id = ?", db_string, song_id) - .execute(&mut self.as_mut().rust_mut().db) - .await; + let result = query!( + "UPDATE songs SET audio = ? where id = ?", + db_string, + song_id + ) + .execute(&mut self.as_mut().rust_mut().db) + .await; match result { Ok(_i) => { @@ -745,9 +771,11 @@ impl song_model::SongModel { } } Err(e) => { - error!("There was an error updating audio in db: {e}"); + error!( + "There was an error updating audio in db: {e}" + ); false - }, + } } }); true diff --git a/src/rust/video_model.rs b/src/rust/video_model.rs index c2a312f..9d3b807 100644 --- a/src/rust/video_model.rs +++ b/src/rust/video_model.rs @@ -2,6 +2,7 @@ pub mod video_model { unsafe extern "C++" { include!(< QAbstractListModel >); + type QAbstractListModel; include!("cxx-qt-lib/qhash.h"); type QHash_i32_QByteArray = cxx_qt_lib::QHash; @@ -36,13 +37,14 @@ pub mod video_model { unsafe extern "RustQt" { #[qobject] - #[base = "QAbstractListModel"] + #[base = QAbstractListModel] #[qml_element] #[qproperty(i32, count)] type VideoModel = super::VideoModelRust; #[inherit] #[qsignal] + #[cxx_name = "dataChanged"] fn data_changed( self: Pin<&mut VideoModel>, top_left: &QModelIndex, @@ -104,6 +106,7 @@ pub mod video_model { unsafe extern "RustQt" { #[inherit] + #[cxx_name = "beginInsertRows"] unsafe fn begin_insert_rows( self: Pin<&mut VideoModel>, parent: &QModelIndex, @@ -112,9 +115,11 @@ pub mod video_model { ); #[inherit] + #[cxx_name = "endInsertRows"] unsafe fn end_insert_rows(self: Pin<&mut VideoModel>); #[inherit] + #[cxx_name = "beginRemoveRows"] unsafe fn begin_remove_rows( self: Pin<&mut VideoModel>, parent: &QModelIndex, @@ -123,6 +128,7 @@ pub mod video_model { ); #[inherit] + #[cxx_name = "beginMoveRows"] unsafe fn begin_move_rows( self: Pin<&mut VideoModel>, source_parent: &QModelIndex, @@ -133,18 +139,23 @@ pub mod video_model { ) -> bool; #[inherit] + #[cxx_name = "endMoveRows"] unsafe fn end_move_rows(self: Pin<&mut VideoModel>); #[inherit] + #[cxx_name = "endRemoveRows"] unsafe fn end_remove_rows(self: Pin<&mut VideoModel>); #[inherit] + #[cxx_name = "beginResetModel"] unsafe fn begin_reset_model(self: Pin<&mut VideoModel>); #[inherit] + #[cxx_name = "endResetModel"] unsafe fn end_reset_model(self: Pin<&mut VideoModel>); #[inherit] + #[cxx_name = "canFetchMore"] fn can_fetch_more( self: &VideoModel, parent: &QModelIndex, @@ -168,12 +179,14 @@ pub mod video_model { #[qinvokable] #[cxx_override] + #[cxx_name = "roleNames"] fn role_names(self: &VideoModel) -> QHash_i32_QByteArray; #[qinvokable] #[cxx_override] + #[cxx_name = "rowCount"] fn row_count(self: &VideoModel, _parent: &QModelIndex) - -> i32; + -> i32; } } @@ -181,7 +194,7 @@ pub mod video_model { use color_eyre::eyre::Error; use cxx_qt::{CxxQtType, Threading}; use cxx_qt_lib::{QByteArray, QModelIndex, QString, QUrl, QVariant}; -use sqlx::{query, query_as, Connection, SqliteConnection}; +use sqlx::{Connection, SqliteConnection, query, query_as}; use std::path::PathBuf; use std::pin::Pin; use tracing::{debug, error};