From 6f185e6f6e0f4b2d93a2ae76ad42b215edfc8be2 Mon Sep 17 00:00:00 2001 From: Chris Cochrun Date: Thu, 30 Mar 2023 09:33:51 -0500 Subject: [PATCH] slide_model.rs functions like get_item and activate These functions aren't perfect, but this code all makes them essentially work so that we can call from QML --- src/cpp/slidemodel.cpp | 7 +++ src/cpp/slidemodel.h | 2 + src/qml/presenter/MainWindow.qml | 6 +-- src/qml/presenter/Presentation.qml | 2 +- src/rust/slide_model.rs | 70 ++++++++++++++++++++++-------- 5 files changed, 64 insertions(+), 23 deletions(-) diff --git a/src/cpp/slidemodel.cpp b/src/cpp/slidemodel.cpp index f81273c..c9a60eb 100644 --- a/src/cpp/slidemodel.cpp +++ b/src/cpp/slidemodel.cpp @@ -24,6 +24,7 @@ #include + const QDir writeDir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); SlideModel::SlideModel(QObject *parent) @@ -452,6 +453,12 @@ QVariantMap SlideModel::getItem(int index) const { return data; } +QVariantMap SlideModel::getItemRust(int index, SlideyMod *slidemodel) const { + QVariantMap data = slidemodel->getItem(index); + qDebug() << data; + return data; +} + QVariantList SlideModel::getItems() { QVariantList data; Slide * item; diff --git a/src/cpp/slidemodel.h b/src/cpp/slidemodel.h index 5914a81..00e3283 100644 --- a/src/cpp/slidemodel.h +++ b/src/cpp/slidemodel.h @@ -8,6 +8,7 @@ #include #include #include +#include "cxx-qt-gen/slide_model.cxxqt.h" class SlideModel : public QAbstractListModel { Q_OBJECT @@ -81,6 +82,7 @@ public: Q_INVOKABLE bool moveDown(int index); Q_INVOKABLE bool moveUp(int index); Q_INVOKABLE QVariantMap getItem(int index) const; + Q_INVOKABLE QVariantMap getItemRust(int index, SlideyMod *slidemodel) const; Q_INVOKABLE QVariantList getItems(); Q_INVOKABLE int findSlideIdFromServItm(int index); Q_INVOKABLE QString thumbnailVideo(QString video, int serviceItemId, int index); diff --git a/src/qml/presenter/MainWindow.qml b/src/qml/presenter/MainWindow.qml index 29d85ac..d06f633 100644 --- a/src/qml/presenter/MainWindow.qml +++ b/src/qml/presenter/MainWindow.qml @@ -145,7 +145,7 @@ Controls.Page { currentServiceItem = index; const slideId = SlideModel.findSlideIdFromServItm(index); currentSlide = slideId; - const slide = SlideModel.getItem(slideId); + const slide = SlideModel.getItemRust(slideId, SlideMod); console.log("index grabbed: " + index); console.log(slideId); console.log("Time to start changing"); @@ -176,7 +176,7 @@ Controls.Page { function changeSlide(index) { console.log("index grabbed: " + index); - const item = SlideModel.getItem(index); + const item = SlideModel.getItemRust(index, SlideMod); currentSlide = index; currentServiceItem = item.serviceItemId; console.log("index grabbed: " + index); @@ -190,7 +190,7 @@ Controls.Page { ServiceItemModel.activate(currentServiceItem); /* SlideObject.changeSlide(slide, slideId); */ slideHelper.chngSlide(item, index, SlideObject); - SlideModel.activate(index); + SlideMod.activate(index); presentation.textIndex = 0; console.log("Slide changed to: " + index); } diff --git a/src/qml/presenter/Presentation.qml b/src/qml/presenter/Presentation.qml index ab9156f..1755e1f 100644 --- a/src/qml/presenter/Presentation.qml +++ b/src/qml/presenter/Presentation.qml @@ -196,7 +196,7 @@ FocusScope { spacing: Kirigami.Units.smallSpacing * 2 cacheBuffer: 900 reuseItems: true - model: SlideModel + model: SlideMod delegate: Presenter.PreviewSlideListDelegate {} highlight: highlightBar highlightFollowsCurrentItem: false diff --git a/src/rust/slide_model.rs b/src/rust/slide_model.rs index 9da06e3..baf9ab8 100644 --- a/src/rust/slide_model.rs +++ b/src/rust/slide_model.rs @@ -43,25 +43,6 @@ mod slide_model { video_thumbnail: QString, } - // pub enum Roles { - // TypeRole = 0, - // TextRole, - // AudioRole, - // ImageBackgroundRole, - // VideoBackgroundRole, - // HorizontalTextAlignmentRole, - // VerticalTextAlignmentRole, - // FontRole, - // FontSizeRole, - // ServiceItemIdRole, - // SlideyIndexRole, - // SlidecountRole, - // ActiveRole, - // SelectedRole, - // LoopRole, - // VidThumbnailRole, - // } - #[cxx_qt::qobject( base = "QAbstractListModel", // qml_uri = "com.kdab.cxx_qt.demo", @@ -406,6 +387,57 @@ mod slide_model { println!("Item added in rust model!"); } + + #[qinvokable] + pub fn get_item(self: Pin<&mut Self>, index: i32) -> QMap_QString_QVariant { + println!("{index}"); + let mut qvariantmap = QMap_QString_QVariant::default(); + let idx = self.index(index, 0, &QModelIndex::default()); + if !idx.is_valid() { + return qvariantmap; + } + if let Some(slide) = self.rust().slides.get(index as usize) { + qvariantmap.insert(QString::from("text"), QVariant::from(&slide.text)); + qvariantmap.insert(QString::from("type"), QVariant::from(&slide.ty)); + qvariantmap.insert(QString::from("audio"), QVariant::from(&slide.audio)); + qvariantmap.insert( + QString::from("imageBackground"), + QVariant::from(&slide.image_background), + ); + qvariantmap.insert( + QString::from("videoBackground"), + QVariant::from(&slide.video_background), + ); + qvariantmap.insert(QString::from("font"), QVariant::from(&slide.font)); + qvariantmap.insert(QString::from("fontSize"), QVariant::from(&slide.font_size)); + qvariantmap.insert( + QString::from("horizontalTextAlignment"), + QVariant::from(&slide.htext_alignment), + ); + qvariantmap.insert( + QString::from("verticalTextAlignment"), + QVariant::from(&slide.vtext_alignment), + ); + qvariantmap.insert( + QString::from("serviceItemId"), + QVariant::from(&slide.service_item_id), + ); + qvariantmap.insert(QString::from("loop"), QVariant::from(&slide.looping)); + qvariantmap.insert(QString::from("active"), QVariant::from(&slide.active)); + qvariantmap.insert(QString::from("selected"), QVariant::from(&slide.selected)); + }; + qvariantmap + } + + #[qinvokable] + pub fn activate(mut self: Pin<&mut Self>, index: i32) -> bool { + if let Some(slide) = self.as_mut().slides_mut().get_mut(index as usize) { + slide.active = true; + true + } else { + false + } + } } // Create Rust bindings for C++ functions of the base class (QAbstractItemModel)