From 8c7f2d794ffe89883d4ae79f2633553bca03f5bc Mon Sep 17 00:00:00 2001 From: Chris Cochrun Date: Thu, 26 Sep 2024 14:11:30 -0500 Subject: [PATCH] starting to change slide_model to have the logic of changing slides In order to make slide_object dumber and and not need to keep track of slide info, we are moving the business logic to slide_model so that the model can keep track of whether presentations are ready to switch and don't need to run reveal_next or something. --- src/main.cpp | 2 +- src/qml/presenter/Presentation.qml | 31 +++++++------ src/rust/slide_model.rs | 74 ++++++++++++++++-------------- src/rust/slide_object.rs | 33 ++++++++++--- 4 files changed, 84 insertions(+), 56 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 554ef83..f5a834e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -102,7 +102,7 @@ int main(int argc, char *argv[]) QScopedPointer obsModel(new ObsModel); obsModel.get()->getObs(); obsModel.get()->updateScenes(); - slideobject.get()->setSlideModel(slideModel.get()); + slideModel.get()->setSlideObject(slideobject.get()); Settings *settings = new Settings; settings->setup(); diff --git a/src/qml/presenter/Presentation.qml b/src/qml/presenter/Presentation.qml index 59c8a43..d9ee7bf 100644 --- a/src/qml/presenter/Presentation.qml +++ b/src/qml/presenter/Presentation.qml @@ -481,21 +481,24 @@ FocusScope { function nextSlideAction() { keyHandler.forceActiveFocus(); - const nextSlideIdx = SlideObject.html && (SlideObject.innerSlideIndex + 1 < SlideObject.slideSize) ? currentSlide : currentSlide + 1; - const nextSlide = SlideModel.getItem(nextSlideIdx); - if (nextSlideIdx > totalSlides || nextSlideIdx < 0) - return; - console.log("currentServiceItem " + currentServiceItem); - console.log("totalSlides " + totalSlides); - console.log("currentSlide " + currentSlide); - console.log("nextSlideIdx " + nextSlideIdx); - for (var prop in nextSlide) - console.log(prop += " (" + typeof(nextSlide[prop]) + ") = " + nextSlide[prop]); - /* changeSlide(nextSlideIdx); */ - if (SlideObject.next(nextSlide)) { - currentSlide = nextSlideIdx; - currentServiceItem = nextSlide.serviceItemId; + if (SlideModel.next()) { + console.log("VICTORY") } + /* const nextSlideIdx = SlideObject.html && (SlideObject.innerSlideIndex + 1 < SlideObject.slideSize) ? currentSlide : currentSlide + 1; */ + /* const nextSlide = SlideModel.getItem(nextSlideIdx); */ + /* if (nextSlideIdx > totalSlides || nextSlideIdx < 0) */ + /* return; */ + /* console.log("currentServiceItem " + currentServiceItem); */ + /* console.log("totalSlides " + totalSlides); */ + /* console.log("currentSlide " + currentSlide); */ + /* console.log("nextSlideIdx " + nextSlideIdx); */ + /* for (var prop in nextSlide) */ + /* console.log(prop += " (" + typeof(nextSlide[prop]) + ") = " + nextSlide[prop]); */ + /* /\* changeSlide(nextSlideIdx); *\/ */ + /* if (SlideObject.next(nextSlide)) { */ + /* currentSlide = nextSlideIdx; */ + /* currentServiceItem = nextSlide.serviceItemId; */ + /* } */ } function nextSlide() { diff --git a/src/rust/slide_model.rs b/src/rust/slide_model.rs index 76c92ca..e546fec 100644 --- a/src/rust/slide_model.rs +++ b/src/rust/slide_model.rs @@ -16,14 +16,10 @@ pub mod slide_model { type QModelIndex = cxx_qt_lib::QModelIndex; include!("cxx-qt-lib/qvector.h"); type QVector_i32 = cxx_qt_lib::QVector; - // include!("cxx-qt-lib/qstringlist.h"); - // type QStringList = cxx_qt_lib::QStringList; include!("cxx-qt-lib/qlist.h"); type QList_QString = cxx_qt_lib::QList; - // #[cxx_name = "Slidey"] - // type CxxSlidey = super::qobject::Slidey; - // include!("cxx-qt-lib/qvector.h"); - // type QVector_Slidey = cxx_qt_lib::QVector; + include!("cxx-qt-gen/slide_object.cxxqt.h"); + type SlideObject = crate::slide_object::slide_object::SlideObject; } #[qenum(SlideModel)] @@ -55,6 +51,7 @@ pub mod slide_model { #[base = "QAbstractListModel"] #[qml_element] #[qproperty(i32, count)] + #[qproperty(*mut SlideObject, slide_object)] type SlideModel = super::SlideModelRust; #[inherit] @@ -117,7 +114,7 @@ pub mod slide_model { ) -> QMap_QString_QVariant; #[qinvokable] - fn next(self: Pin<&mut SlideModel>) -> QMap_QString_QVariant; + fn next(self: Pin<&mut SlideModel>) -> bool; #[qinvokable] fn get_slide_from_service( @@ -221,6 +218,7 @@ use cxx_qt::{CxxQtType, Threading}; use cxx_qt_lib::{ CaseSensitivity, QByteArray, QModelIndex, QString, QStringList, QVariant }; +use slide_model::SlideObject; use std::thread; use std::{path::PathBuf, pin::Pin}; use tracing::{debug, error}; @@ -232,26 +230,26 @@ use self::slide_model::{ #[derive(Clone, Debug)] pub struct Slide { - text: String, - ty: String, - audio: String, - image_background: String, - video_background: String, - htext_alignment: String, - vtext_alignment: String, - font: String, - font_size: i32, - slide_count: i32, - slide_index: i32, - service_item_id: i32, - active: bool, - selected: bool, - looping: bool, - video_thumbnail: String, - video_start_time: f32, - video_end_time: f32, - html: bool, - obs_scene: String, + pub text: String, + pub ty: String, + pub audio: String, + pub image_background: String, + pub video_background: String, + pub htext_alignment: String, + pub vtext_alignment: String, + pub font: String, + pub font_size: i32, + pub slide_count: i32, + pub slide_index: i32, + pub service_item_id: i32, + pub active: bool, + pub selected: bool, + pub looping: bool, + pub video_thumbnail: String, + pub video_start_time: f32, + pub video_end_time: f32, + pub html: bool, + pub obs_scene: String, } impl Default for Slide { @@ -287,6 +285,7 @@ pub struct SlideModelRust { slides: Vec, obs: Option, count: i32, + slide_object: *mut SlideObject, } impl Default for SlideModelRust { @@ -306,6 +305,7 @@ impl Default for SlideModelRust { slides: Vec::new(), obs, count: 0, + slide_object: std::ptr::null_mut(), } } } @@ -1119,15 +1119,21 @@ impl slide_model::SlideModel { qvariantmap } - pub fn next(self: Pin<&mut Self>) -> QMap_QString_QVariant { - let id = self.id.clone(); - if let Some(slide) = self.rust().slides.get(self.id as usize) { - if slide.html { - // conditional logic for html slides + pub fn next(mut self: Pin<&mut Self>) -> bool { + if let Some(object) = unsafe { self.slide_object.as_mut() } { + let object = unsafe { Pin::new_unchecked(object) }; + if let Some(slide) = self.rust().slides.get(self.id as usize + 1) { + object.set_slide(slide); + let id = self.as_ref().id + 1; + self.as_mut().activate(id); + self.as_mut().rust_mut().id = id; + true + } else { + false } - return self.get_item(id + 1); + } else { + false } - self.get_item(id + 1) } pub fn get_slide_from_service( diff --git a/src/rust/slide_object.rs b/src/rust/slide_object.rs index 9035ff8..9c9fc9d 100644 --- a/src/rust/slide_object.rs +++ b/src/rust/slide_object.rs @@ -1,13 +1,13 @@ #[cxx_qt::bridge] -mod slide_object { +pub mod slide_object { unsafe extern "C++" { include!("cxx-qt-lib/qstring.h"); type QString = cxx_qt_lib::QString; include!("cxx-qt-lib/qmap.h"); type QMap_QString_QVariant = cxx_qt_lib::QMap; - include!("cxx-qt-gen/slide_model.cxxqt.h"); - type SlideModel = crate::slide_model::slide_model::SlideModel; + // include!("cxx-qt-gen/slide_model.cxxqt.h"); + // type SlideModel = crate::slide_model::slide_model::SlideModel; } unsafe extern "RustQt" { @@ -54,7 +54,7 @@ mod slide_object { #[qproperty(i32, font_size)] #[qproperty(f32, video_start_time)] #[qproperty(f32, video_end_time)] - #[qproperty(*mut SlideModel, slide_model)] + // #[qproperty(*mut SlideModel, slide_model)] type SlideObject = super::SlideObjectRust; #[qinvokable] @@ -89,7 +89,7 @@ use cxx_qt_lib::{CaseSensitivity, QString, QVariant}; use tracing::{debug, error}; use crate::{ - slide_model::slide_model, slide_types::{PresType, SlideType}, songs::song_model::{song_model::SongModel, SongModelRust} + slide_model::{slide_model, Slide}, slide_types::SlideType }; use self::slide_object::QMap_QString_QVariant; @@ -113,7 +113,7 @@ pub struct SlideObjectRust { font_size: i32, video_start_time: f32, video_end_time: f32, - slide_model: *mut slide_model::SlideModel, + // slide_model: *mut slide_model::SlideModel, } impl Default for SlideObjectRust { @@ -136,7 +136,7 @@ impl Default for SlideObjectRust { inner_slide_index: 0, video_start_time: 0.0, video_end_time: 0.0, - slide_model: std::ptr::null_mut(), + // slide_model: std::ptr::null_mut(), } } } @@ -477,4 +477,23 @@ impl slide_object::SlideObject { self.as_mut().playing_changed(!playing); !playing } + pub fn set_slide(mut self: Pin<&mut Self>, slide: &Slide) { + self.as_mut().set_slide_index(slide.service_item_id); + self.as_mut().set_slide_size(slide.slide_count); + self.as_mut().set_looping(slide.looping); + self.as_mut().set_text(QString::from(&slide.text)); + self.as_mut().set_ty(QString::from(&slide.ty)); + self.as_mut().set_audio(QString::from(&slide.audio)); + self.as_mut().set_image_background(QString::from(&slide.image_background)); + self.as_mut().set_video_background(QString::from(&slide.video_background)); + self.as_mut().set_vtext_alignment(QString::from(&slide.vtext_alignment)); + self.as_mut().set_htext_alignment(QString::from(&slide.htext_alignment)); + self.as_mut().set_font(QString::from(&slide.font)); + self.as_mut().set_font_size(slide.font_size); + self.as_mut().set_video_start_time(slide.video_start_time); + self.as_mut().set_video_end_time(slide.video_end_time); + self.as_mut().set_html(slide.html); + self.as_mut().set_inner_slide_index(slide.slide_index); + self.as_mut().set_is_playing(true); + } }