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.
This commit is contained in:
Chris Cochrun 2024-09-26 14:11:30 -05:00
parent 4c403d9f3c
commit 8c7f2d794f
4 changed files with 84 additions and 56 deletions

View file

@ -102,7 +102,7 @@ int main(int argc, char *argv[])
QScopedPointer<ObsModel> 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();

View file

@ -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() {

View file

@ -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<i32>;
// 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<QString>;
// #[cxx_name = "Slidey"]
// type CxxSlidey = super::qobject::Slidey;
// include!("cxx-qt-lib/qvector.h");
// type QVector_Slidey = cxx_qt_lib::QVector<Slidey>;
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<Slide>,
obs: Option<Obs>,
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(

View file

@ -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<cxx_qt_lib::QMapPair_QString_QVariant>;
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);
}
}