diff --git a/src/cpp/presentationsqlmodel.cpp b/src/cpp/presentationsqlmodel.cpp index 3d66fbf..e5e71ed 100644 --- a/src/cpp/presentationsqlmodel.cpp +++ b/src/cpp/presentationsqlmodel.cpp @@ -243,14 +243,15 @@ QVariantMap PresentationSqlModel::getPresentation(const int &row) { PresentationProxyModel::PresentationProxyModel(QObject *parent) :QSortFilterProxyModel(parent) { - m_presentationModel = new PresentationSqlModel; + m_presentationModel = new PresentationModel; + m_presentationModel->testDatabase(); setSourceModel(m_presentationModel); setDynamicSortFilter(true); setFilterRole(Qt::UserRole + 1); setFilterCaseSensitivity(Qt::CaseInsensitive); } -PresentationSqlModel *PresentationProxyModel::presentationModel() { +PresentationModel *PresentationProxyModel::presentationModel() { return m_presentationModel; } @@ -261,21 +262,21 @@ QModelIndex PresentationProxyModel::idx(int row) { } QVariantMap PresentationProxyModel::getPresentation(const int &row) { - auto model = qobject_cast(sourceModel()); - QVariantMap presentation = model->getPresentation(mapToSource(index(row, 0)).row()); + auto model = qobject_cast(sourceModel()); + QVariantMap presentation = model->getItem(mapToSource(index(row, 0)).row()); return presentation; } void PresentationProxyModel::deletePresentation(const int &row) { - auto model = qobject_cast(sourceModel()); - model->deletePresentation(row); + auto model = qobject_cast(sourceModel()); + model->removeItem(row); } void PresentationProxyModel::deletePresentations(const QVector &rows) { - auto model = qobject_cast(sourceModel()); + auto model = qobject_cast(sourceModel()); qDebug() << "DELETING!!!!!!!!!!!!!!!!!!!!!!!" << rows; for (int i = rows.size() - 1; i >= 0; i--) { qDebug() << "deleting" << rows.at(i); - model->deletePresentation(rows.at(i)); + model->removeItem(rows.at(i)); } } diff --git a/src/cpp/presentationsqlmodel.h b/src/cpp/presentationsqlmodel.h index 3f3b329..86f5b43 100644 --- a/src/cpp/presentationsqlmodel.h +++ b/src/cpp/presentationsqlmodel.h @@ -8,6 +8,8 @@ #include #include #include +#include "cxx-qt-gen/presentation_model.cxxqt.h" + class PresentationSqlModel : public QSqlTableModel { @@ -57,13 +59,13 @@ private: class PresentationProxyModel : public QSortFilterProxyModel { Q_OBJECT - Q_PROPERTY(PresentationSqlModel *presentationModel READ presentationModel) + Q_PROPERTY(PresentationModel *presentationModel READ presentationModel) public: explicit PresentationProxyModel(QObject *parent = nullptr); ~PresentationProxyModel() = default; - PresentationSqlModel *presentationModel(); + PresentationModel *presentationModel(); Q_INVOKABLE QModelIndex idx(int row); public slots: @@ -72,7 +74,7 @@ public slots: Q_INVOKABLE void deletePresentations(const QVector &row); private: - PresentationSqlModel *m_presentationModel; + PresentationModel *m_presentationModel; }; #endif //PRESENTATIONSQLMODEL_H diff --git a/src/cpp/videosqlmodel.cpp b/src/cpp/videosqlmodel.cpp index a4972a2..c810b76 100644 --- a/src/cpp/videosqlmodel.cpp +++ b/src/cpp/videosqlmodel.cpp @@ -324,14 +324,15 @@ QVariantMap VideoSqlModel::getVideo(const int &row) { VideoProxyModel::VideoProxyModel(QObject *parent) :QSortFilterProxyModel(parent) { - m_videoModel = new VideoSqlModel(); + m_videoModel = new VideoModel(); + m_videoModel->testDatabase(); setSourceModel(m_videoModel); setDynamicSortFilter(true); setFilterRole(Qt::UserRole + 1); setFilterCaseSensitivity(Qt::CaseInsensitive); } -VideoSqlModel *VideoProxyModel::videoModel() { +VideoModel *VideoProxyModel::videoModel() { return m_videoModel; } @@ -342,21 +343,21 @@ QModelIndex VideoProxyModel::idx(int row) { } QVariantMap VideoProxyModel::getVideo(const int &row) { - auto model = qobject_cast(sourceModel()); - QVariantMap video = model->getVideo(mapToSource(index(row, 0)).row()); + auto model = qobject_cast(sourceModel()); + QVariantMap video = model->getItem(mapToSource(index(row, 0)).row()); return video; } void VideoProxyModel::deleteVideo(const int &row) { - auto model = qobject_cast(sourceModel()); - model->deleteVideo(mapToSource(index(row,0)).row()); + auto model = qobject_cast(sourceModel()); + model->removeItem(mapToSource(index(row,0)).row()); } void VideoProxyModel::deleteVideos(const QVector &rows) { - auto model = qobject_cast(sourceModel()); + auto model = qobject_cast(sourceModel()); qDebug() << "DELETING!!!!!!!!!!!!!!!!!!!!!!!" << rows; for (int i = rows.size() - 1; i >= 0; i--) { qDebug() << "deleting" << rows.at(i); - model->deleteVideo(rows.at(i)); + model->removeItem(rows.at(i)); } } diff --git a/src/cpp/videosqlmodel.h b/src/cpp/videosqlmodel.h index 2742891..bb81e2e 100644 --- a/src/cpp/videosqlmodel.h +++ b/src/cpp/videosqlmodel.h @@ -8,6 +8,7 @@ #include #include #include +#include "cxx-qt-gen/video_model.cxxqt.h" class VideoSqlModel : public QSqlTableModel { @@ -68,13 +69,13 @@ private: class VideoProxyModel : public QSortFilterProxyModel { Q_OBJECT - Q_PROPERTY(VideoSqlModel *videoModel READ videoModel) + Q_PROPERTY(VideoModel *videoModel READ videoModel) public: explicit VideoProxyModel(QObject *parent = nullptr); ~VideoProxyModel() = default; - VideoSqlModel *videoModel(); + VideoModel *videoModel(); Q_INVOKABLE QModelIndex idx(int row); public slots: @@ -83,7 +84,7 @@ public slots: Q_INVOKABLE void deleteVideos(const QVector &row); private: - VideoSqlModel *m_videoModel; + VideoModel *m_videoModel; }; #endif //VIDEOSQLMODEL_H diff --git a/src/qml/presenter/Library.qml b/src/qml/presenter/Library.qml index f329ce0..3ed70e7 100644 --- a/src/qml/presenter/Library.qml +++ b/src/qml/presenter/Library.qml @@ -65,7 +65,7 @@ Item { itemIcon: "folder-videos-symbolic" itemSubtitle: { if (fileValidation) - model.filePath; + model.path; else "file is missing" } diff --git a/src/qml/presenter/LibraryItem.qml b/src/qml/presenter/LibraryItem.qml index 5650807..3d97c4f 100644 --- a/src/qml/presenter/LibraryItem.qml +++ b/src/qml/presenter/LibraryItem.qml @@ -70,7 +70,7 @@ ColumnLayout { anchors {left: libraryLabel.right verticalCenter: libraryLabel.verticalCenter leftMargin: 15} - text: innerModel.rowCount() + text: libraryType == "song" ? innerModel.rowCount() : innerModel.count() color: Kirigami.Theme.disabledTextColor } diff --git a/src/qml/presenter/VideoEditor.qml b/src/qml/presenter/VideoEditor.qml index d04a57d..f157fb2 100644 --- a/src/qml/presenter/VideoEditor.qml +++ b/src/qml/presenter/VideoEditor.qml @@ -266,7 +266,7 @@ Item { function updateLoop(value) { /* changeStartTime(value, false); */ videosqlmodel.updateLoop(video.id, value); - video.loop = value; + /* video.loop = value; */ showPassiveNotification("Loop changed to: " + video.loop); } diff --git a/src/rust/video_model.rs b/src/rust/video_model.rs index 96f6225..9cd9da9 100644 --- a/src/rust/video_model.rs +++ b/src/rust/video_model.rs @@ -4,7 +4,7 @@ mod video_model { use crate::schema::videos::dsl::*; use crate::video_model::video_model::Video; use diesel::sqlite::SqliteConnection; - use diesel::{delete, insert_into, prelude::*}; + use diesel::{delete, insert_into, prelude::*, update}; use std::path::{Path, PathBuf}; unsafe extern "C++" { @@ -65,8 +65,6 @@ mod video_model { LoopingRole, } - // use crate::entities::{videos, prelude::Videos}; - // use sea_orm::{ConnectionTrait, Database, DbBackend, DbErr, Statement, ActiveValue}; impl qobject::VideoModel { #[qinvokable] pub fn clear(mut self: Pin<&mut Self>) { @@ -256,6 +254,50 @@ mod video_model { _ => 0, } } + + #[qinvokable] + pub fn update_loop(mut self: Pin<&mut Self>, index: i32, loop_value: bool) -> bool { + let mut vector_roles = QVector_i32::default(); + vector_roles.append(self.as_ref().get_role(Role::LoopingRole)); + let model_index = &self.as_ref().index(index, 0, &QModelIndex::default()); + + let db = &mut self.as_mut().get_db(); + let result = update(videos.filter(id.eq(index))) + .set(looping.eq(loop_value)) + .execute(db); + match result { + Ok(_i) => { + let video = self.as_mut().videos_mut().get_mut(index as usize).unwrap(); + video.looping = loop_value; + self.as_mut() + .emit_data_changed(model_index, model_index, &vector_roles); + true + } + Err(_e) => false, + } + } + + #[qinvokable] + pub fn update_title(mut self: Pin<&mut Self>, index: i32, updated_title: QString) -> bool { + let mut vector_roles = QVector_i32::default(); + vector_roles.append(self.as_ref().get_role(Role::TitleRole)); + let model_index = &self.as_ref().index(index, 0, &QModelIndex::default()); + + let db = &mut self.as_mut().get_db(); + let result = update(videos.filter(id.eq(index))) + .set(title.eq(updated_title.to_string())) + .execute(db); + match result { + Ok(_i) => { + let video = self.as_mut().videos_mut().get_mut(index as usize).unwrap(); + video.title = updated_title; + self.as_mut() + .emit_data_changed(model_index, model_index, &vector_roles); + true + } + Err(_e) => false, + } + } } // Create Rust bindings for C++ functions of the base class (QAbstractItemModel)