From 8d61d2f638f0b7b20a751bbf7937e396298f92eb Mon Sep 17 00:00:00 2001 From: Chris Cochrun Date: Tue, 24 May 2022 10:05:08 -0500 Subject: [PATCH] adding some files --- src/assets/black.jpg | Bin 0 -> 2097 bytes src/imagesqlmodel.cpp | 184 +++++++++++++++++++++++ src/imagesqlmodel.h | 49 ++++++ src/qml/presenter/PresentationWindow.qml | 33 ++++ 4 files changed, 266 insertions(+) create mode 100644 src/assets/black.jpg create mode 100644 src/imagesqlmodel.cpp create mode 100644 src/imagesqlmodel.h create mode 100644 src/qml/presenter/PresentationWindow.qml diff --git a/src/assets/black.jpg b/src/assets/black.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c5796d1d72bb7ff507b978288abd8e02185644ac GIT binary patch literal 2097 zcmex=vmlS~5GZ+{cM3OTSQy3T+*Dx?J=oCdnMlmoj z-T;XwLD+9V>~t`j31qcMQAm(80|S!?0|SFXIubhxiJhELl*_=tWWvC}ppufCm%_ln z6aitUfY>!4c5Y5-GRQy%2Cxr#Qu9KCLE;Py3^EMv44w?W3;_%Z3`q>744Di$3?&S@ z44Djh3C!tn9|Z17(Oj$VBn2pU=Y5* zz`zv^2{#4?29P|%;_D0yAvFvPK4%#iX3k<@P)lcE;E%!KZw|1(q2Y#C4K)1z-)3-T z_zwcVKm?iiHiI)GnOYIr4lxLFFx+AEWM&j(U=n0x7G(T?gh3RXhrpo)BbfdlVGsf3 zESLa<{(p;shnbOqNq|{^fq`)XL~xWGY9SyGid_M4X@}(W1^;g`a4<45FtRcUgH;G( zSHaB4XwQgO1rtIAPFvXQp|;>u!Dz22EDuX@;Cw28 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static const char *imagesTableName = "images"; + +static void createImageTable() +{ + if(QSqlDatabase::database().tables().contains(imagesTableName)) { + return; + } + + QSqlQuery query; + if (!query.exec("CREATE TABLE IF NOT EXISTS 'images' (" + " 'id' INTEGER NOT NULL," + " 'title' TEXT NOT NULL," + " 'filePath' TEXT NOT NULL," + " PRIMARY KEY(id))")) { + qFatal("Failed to query database: %s", + qPrintable(query.lastError().text())); + } + qDebug() << query.lastQuery(); + qDebug() << "inserting into images"; + + query.exec("INSERT INTO images (title, filePath) VALUES ('Dec 180', 'file:///home/chris/nextcloud/tfc/openlp/180-dec.png')"); + qDebug() << query.lastQuery(); + query.exec("INSERT INTO images (title, filePath) VALUES ('No TFC', " + "'file:///home/chris/nextcloud/tfc/openlp/No TFC.png')"); + + query.exec("select * from images"); + qDebug() << query.lastQuery(); +} + +ImageSqlModel::ImageSqlModel(QObject *parent) : QSqlTableModel(parent) { + qDebug() << "creating image table"; + createImageTable(); + setTable(imagesTableName); + setEditStrategy(QSqlTableModel::OnManualSubmit); + // make sure to call select else the model won't fill + select(); +} + +QVariant ImageSqlModel::data(const QModelIndex &index, int role) const { + if (role < Qt::UserRole) { + return QSqlTableModel::data(index, role); + } + + // qDebug() << role; + const QSqlRecord sqlRecord = record(index.row()); + return sqlRecord.value(role - Qt::UserRole); +} + +QHash ImageSqlModel::roleNames() const +{ + QHash names; + names[Qt::UserRole] = "id"; + names[Qt::UserRole + 1] = "title"; + names[Qt::UserRole + 2] = "filePath"; + return names; +} + +void ImageSqlModel::newImage(const QUrl &filePath) { + qDebug() << "adding new image"; + int rows = rowCount(); + + qDebug() << rows; + QSqlRecord recordData = record(); + QFileInfo fileInfo = filePath.toString(); + QString title = fileInfo.baseName(); + recordData.setValue("title", title); + recordData.setValue("filePath", filePath); + + if (insertRecord(rows, recordData)) { + submitAll(); + } else { + qDebug() << lastError(); + }; +} + +void ImageSqlModel::deleteImage(const int &row) { + QSqlRecord recordData = record(row); + if (recordData.isEmpty()) + return; + + removeRow(row); + submitAll(); +} + +int ImageSqlModel::id() const { + return m_id; +} + +QString ImageSqlModel::title() const { + return m_title; +} + +void ImageSqlModel::setTitle(const QString &title) { + if (title == m_title) + return; + + m_title = title; + + select(); + emit titleChanged(); +} + +// This function is for updating the title from outside the delegate +void ImageSqlModel::updateTitle(const int &row, const QString &title) { + qDebug() << "Row is " << row; + QSqlRecord rowdata = record(row); + qDebug() << rowdata; + rowdata.setValue("title", title); + setRecord(row, rowdata); + qDebug() << rowdata; + submitAll(); + emit titleChanged(); +} + +QUrl ImageSqlModel::filePath() const { + return m_filePath; +} + +void ImageSqlModel::setFilePath(const QUrl &filePath) { + if (filePath == m_filePath) + return; + + m_filePath = filePath; + + select(); + emit filePathChanged(); +} + +// This function is for updating the filepath from outside the delegate +void ImageSqlModel::updateFilePath(const int &row, const QUrl &filePath) { + qDebug() << "Row is " << row; + QSqlRecord rowdata = record(row); + qDebug() << rowdata; + rowdata.setValue("filePath", filePath); + setRecord(row, rowdata); + qDebug() << rowdata; + submitAll(); + emit filePathChanged(); +} + +QVariantMap ImageSqlModel::getImage(const int &row) { + // qDebug() << "Row we are getting is " << row; + // QUrl image; + // QSqlRecord rec = record(row); + // qDebug() << rec.value("filePath").toUrl(); + // // image.append(rec.value("title")); + // // image.append(rec.value("filePath")); + // image = rec.value("filePath").toUrl(); + // return image; + + QVariantMap data; + const QModelIndex idx = this->index(row,0); + // qDebug() << idx; + if( !idx.isValid() ) + return data; + const QHash rn = roleNames(); + // qDebug() << rn; + QHashIterator it(rn); + while (it.hasNext()) { + it.next(); + qDebug() << it.key() << ":" << it.value(); + data[it.value()] = idx.data(it.key()); + } + return data; +} diff --git a/src/imagesqlmodel.h b/src/imagesqlmodel.h new file mode 100644 index 0000000..2b9893a --- /dev/null +++ b/src/imagesqlmodel.h @@ -0,0 +1,49 @@ +#ifndef IMAGESQLMODEL_H +#define IMAGESQLMODEL_H + +#include +#include +#include +#include +#include +#include + +class ImageSqlModel : public QSqlTableModel +{ + Q_OBJECT + Q_PROPERTY(int id READ id) + Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged) + Q_PROPERTY(QUrl filePath READ filePath WRITE setFilePath NOTIFY filePathChanged) + QML_ELEMENT + +public: + ImageSqlModel(QObject *parent = 0); + + int id() const; + QString title() const; + QUrl filePath() const; + + void setTitle(const QString &title); + void setFilePath(const QUrl &filePath); + + Q_INVOKABLE void updateTitle(const int &row, const QString &title); + Q_INVOKABLE void updateFilePath(const int &row, const QUrl &filePath); + + Q_INVOKABLE void newImage(const QUrl &filePath); + Q_INVOKABLE void deleteImage(const int &row); + Q_INVOKABLE QVariantMap getImage(const int &row); + + QVariant data(const QModelIndex &index, int role) const override; + QHash roleNames() const override; + +signals: + void titleChanged(); + void filePathChanged(); + +private: + int m_id; + QString m_title; + QUrl m_filePath; +}; + +#endif //IMAGESQLMODEL_H diff --git a/src/qml/presenter/PresentationWindow.qml b/src/qml/presenter/PresentationWindow.qml new file mode 100644 index 0000000..3794d51 --- /dev/null +++ b/src/qml/presenter/PresentationWindow.qml @@ -0,0 +1,33 @@ +import QtQuick 2.13 +import QtQuick.Dialogs 1.0 +import QtQuick.Controls 2.15 as Controls +import QtQuick.Window 2.13 +import QtQuick.Layouts 1.2 +import org.kde.kirigami 2.13 as Kirigami +import "./" as Presenter +import org.presenter 1.0 + +Window { + id: presentationWindow + title: "presentation-window" + height: maximumHeight + width: maximumWidth + screen: presentationScreen + /* flags: Qt.X11BypassWindowManagerHint */ + onClosing: presenting = false + + Component.onCompleted: { + presentationWindow.showFullScreen(); + print(screen.name); + } + + Presenter.Slide { + id: presentationSlide + anchors.fill: parent + imageSource: imageBackground + videoSource: videoBackground + text: "" + + Component.onCompleted: slideItem = presentationSlide + } +}