From 4b489d4e45bb6d77e900f78066b12502d89c7087 Mon Sep 17 00:00:00 2001 From: Chris Cochrun Date: Fri, 17 Nov 2023 11:02:45 -0600 Subject: [PATCH] linking obs up to as a stringlist model --- build.rs | 1 + src/main.cpp | 3 +++ src/qml/presenter/ServiceList.qml | 18 +++++++++++++++ src/rust/obs.rs | 38 +++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+) diff --git a/build.rs b/build.rs index bbe4b1b..b618731 100644 --- a/build.rs +++ b/build.rs @@ -15,5 +15,6 @@ fn main() { .file("src/rust/songs/song_editor.rs") .file("src/rust/ytdl.rs") .file("src/rust/utils.rs") + .file("src/rust/obs.rs") .build(); } diff --git a/src/main.cpp b/src/main.cpp index 4217541..0e4028c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -61,6 +61,7 @@ #include "cxx-qt-gen/image_model.cxxqt.h" #include "cxx-qt-gen/utilities.cxxqt.h" #include "cxx-qt-gen/song_editor.cxxqt.h" +#include "cxx-qt-gen/obs_model.cxxqt.h" static QWindow *windowFromEngine(QQmlApplicationEngine *engine) { @@ -153,6 +154,7 @@ int main(int argc, char *argv[]) QScopedPointer serviceItemModel(new ServiceItemMod); QScopedPointer serviceItemC(new ServiceItemModel); QScopedPointer slideobject(new SlideObject); + QScopedPointer obsModel(new ObsModel); Settings *settings = new Settings; settings->setup(); @@ -243,6 +245,7 @@ int main(int argc, char *argv[]) qmlRegisterSingletonInstance("org.presenter", 1, 0, "FileManager", filemanager.get()); qmlRegisterSingletonInstance("org.presenter", 1, 0, "PresWindow", PresWindow); qmlRegisterSingletonInstance("org.presenter", 1, 0, "RSettings", settings); + qmlRegisterSingletonInstance("org.presenter", 1, 0, "ObsModel", obsModel.get()); // qmlRegisterSingletonInstance("org.presenter", 1, 0, "PresWindow", preswin.get()); // This is the same slideobject, however to enusre that the PresWindow can have it diff --git a/src/qml/presenter/ServiceList.qml b/src/qml/presenter/ServiceList.qml index fa1228e..9b66fbf 100644 --- a/src/qml/presenter/ServiceList.qml +++ b/src/qml/presenter/ServiceList.qml @@ -291,6 +291,24 @@ Item { text: "delete" onTriggered: removeItem(index) } + Kirigami.Action { + text: "Obs Scenes" + onTriggered: { + ObsModel.updateScenes(); + console.log("udated") + obsList.model = ObsModel.scenes + obsMenu.open(); + } + } + } + Controls.Menu { + id: obsMenu + x: rightClickMenu.x + rightClickMenu.width + y: mouse.mouseY + ListView { + id: obsList + delegate: Kirigami.Action { text: modelData } + } } } } diff --git a/src/rust/obs.rs b/src/rust/obs.rs index 8064031..60e4e12 100644 --- a/src/rust/obs.rs +++ b/src/rust/obs.rs @@ -95,3 +95,41 @@ fn make_client() -> Client { let client = runtime.block_on(future).unwrap(); client } + +#[cxx_qt::bridge] +mod obs_model { + use tracing::debug; + + unsafe extern "C++" { + include!("cxx-qt-lib/qstring.h"); + type QString = cxx_qt_lib::QString; + 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_qt::qobject] + #[derive(Debug, Default)] + pub struct ObsModel { + #[qproperty] + scenes: QStringList, + obs: Option, + } + + + impl qobject::ObsModel { + #[qinvokable] + pub fn update_scenes(mut self: Pin<&mut Self>) -> QStringList { + debug!("updating scenes"); + let mut scenes_list = QList_QString::default(); + if let Some(obs) = self.obs() { + obs.scenes.scenes.iter().map(|x| { + debug!(?x); + scenes_list.append(QString::from(&x.name)) + }); + } + QStringList::from(&scenes_list) + } + } +}