diff --git a/build/CMakeCache.txt b/build/CMakeCache.txt index 11492b8..dbb62fa 100644 --- a/build/CMakeCache.txt +++ b/build/CMakeCache.txt @@ -54,11 +54,11 @@ CMAKE_CXX_COMPILER_AR:FILEPATH=/usr/bin/gcc-ar // for the GCC compiler CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/usr/bin/gcc-ranlib -//Flags used by the CXX compiler during all build types. -CMAKE_CXX_FLAGS:STRING= +//No help, variable specified on the command line. +CMAKE_CXX_FLAGS:STRING=-DQT_QML_DEBUG -//Flags used by the CXX compiler during DEBUG builds. -CMAKE_CXX_FLAGS_DEBUG:STRING=-g +//No help, variable specified on the command line. +CMAKE_CXX_FLAGS_DEBUG:STRING=-g -DQT_QML_DEBUG //Flags used by the CXX compiler during MINSIZEREL builds. CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG @@ -66,8 +66,8 @@ CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG //Flags used by the CXX compiler during RELEASE builds. CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG -//Flags used by the CXX compiler during RELWITHDEBINFO builds. -CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG +//No help, variable specified on the command line. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG -DQT_QML_DEBUG //C compiler CMAKE_C_COMPILER:FILEPATH=/usr/bin/cc @@ -113,8 +113,8 @@ CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= //Flags used by the linker during RELWITHDEBINFO builds. CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= -//Enable/Disable output of compile commands during generation. -CMAKE_EXPORT_COMPILE_COMMANDS:BOOL= +//No help, variable specified on the command line. +CMAKE_EXPORT_COMPILE_COMMANDS:UNINITIALIZED=1 //Install path prefix CMAKE_INSTALL_PREFIX:PATH=/usr @@ -457,6 +457,9 @@ Qt5Test_DIR:PATH=/usr/lib64/cmake/Qt5Test //The directory containing a CMake configuration file for Qt5Widgets. Qt5Widgets_DIR:PATH=/usr/lib64/cmake/Qt5Widgets +//The directory containing a CMake configuration file for Qt5X11Extras. +Qt5X11Extras_DIR:PATH=/usr/lib64/cmake/Qt5X11Extras + //The directory containing a CMake configuration file for Qt5. Qt5_DIR:PATH=/usr/lib64/cmake/Qt5 @@ -630,7 +633,7 @@ CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 //Details about finding Gettext FIND_PACKAGE_MESSAGE_DETAILS_Gettext:INTERNAL=[/usr/bin/msgmerge][/usr/bin/msgfmt][v0.21()] //Details about finding KF5 -FIND_PACKAGE_MESSAGE_DETAILS_KF5:INTERNAL=[success][cfound components: Kirigami2 I18n CoreAddons ][v5.90.0(5.68.0)] +FIND_PACKAGE_MESSAGE_DETAILS_KF5:INTERNAL=[success][cfound components: Kirigami2 I18n CoreAddons ][v5.90.0()] //Details about finding KF5CoreAddons FIND_PACKAGE_MESSAGE_DETAILS_KF5CoreAddons:INTERNAL=[/usr/lib64/cmake/KF5CoreAddons/KF5CoreAddonsConfig.cmake][v5.90.0()] //Details about finding KF5I18n diff --git a/build/CMakeFiles/Makefile.cmake b/build/CMakeFiles/Makefile.cmake index 7ff2720..45669fb 100644 --- a/build/CMakeFiles/Makefile.cmake +++ b/build/CMakeFiles/Makefile.cmake @@ -54,7 +54,6 @@ set(CMAKE_MAKEFILE_DEPENDS "/usr/lib64/cmake/Qt5Gui/Qt5Gui_QEvdevTabletPlugin.cmake" "/usr/lib64/cmake/Qt5Gui/Qt5Gui_QEvdevTouchScreenPlugin.cmake" "/usr/lib64/cmake/Qt5Gui/Qt5Gui_QGifPlugin.cmake" - "/usr/lib64/cmake/Qt5Gui/Qt5Gui_QGtk2ThemePlugin.cmake" "/usr/lib64/cmake/Qt5Gui/Qt5Gui_QGtk3ThemePlugin.cmake" "/usr/lib64/cmake/Qt5Gui/Qt5Gui_QICNSPlugin.cmake" "/usr/lib64/cmake/Qt5Gui/Qt5Gui_QICOPlugin.cmake" @@ -74,7 +73,6 @@ set(CMAKE_MAKEFILE_DEPENDS "/usr/lib64/cmake/Qt5Gui/Qt5Gui_QTiffPlugin.cmake" "/usr/lib64/cmake/Qt5Gui/Qt5Gui_QTsLibPlugin.cmake" "/usr/lib64/cmake/Qt5Gui/Qt5Gui_QTuioTouchPlugin.cmake" - "/usr/lib64/cmake/Qt5Gui/Qt5Gui_QVirtualKeyboardPlugin.cmake" "/usr/lib64/cmake/Qt5Gui/Qt5Gui_QVncIntegrationPlugin.cmake" "/usr/lib64/cmake/Qt5Gui/Qt5Gui_QWaylandEglPlatformIntegrationPlugin.cmake" "/usr/lib64/cmake/Qt5Gui/Qt5Gui_QWaylandIntegrationPlugin.cmake" @@ -127,11 +125,8 @@ set(CMAKE_MAKEFILE_DEPENDS "/usr/lib64/cmake/Qt5Widgets/Qt5WidgetsConfigExtras.cmake" "/usr/lib64/cmake/Qt5Widgets/Qt5WidgetsConfigVersion.cmake" "/usr/lib64/cmake/Qt5Widgets/Qt5WidgetsMacros.cmake" - "/usr/lib64/cmake/Qt5Widgets/Qt5Widgets_QBB10StylePlugin.cmake" - "/usr/lib64/cmake/Qt5Widgets/Qt5Widgets_QCleanlooksStylePlugin.cmake" - "/usr/lib64/cmake/Qt5Widgets/Qt5Widgets_QGtk2StylePlugin.cmake" - "/usr/lib64/cmake/Qt5Widgets/Qt5Widgets_QMotifStylePlugin.cmake" - "/usr/lib64/cmake/Qt5Widgets/Qt5Widgets_QPlastiqueStylePlugin.cmake" + "/usr/lib64/cmake/Qt5X11Extras/Qt5X11ExtrasConfig.cmake" + "/usr/lib64/cmake/Qt5X11Extras/Qt5X11ExtrasConfigVersion.cmake" "/usr/share/ECM/cmake/ECMConfig.cmake" "/usr/share/ECM/cmake/ECMConfigVersion.cmake" "/usr/share/ECM/find-modules/ECMFindModuleHelpersStub.cmake" @@ -147,7 +142,10 @@ set(CMAKE_MAKEFILE_DEPENDS "/usr/share/ECM/modules/ECMCoverageOption.cmake" "/usr/share/ECM/modules/ECMEnableSanitizers.cmake" "/usr/share/ECM/modules/ECMFindModuleHelpers.cmake" + "/usr/share/ECM/modules/ECMGenerateHeaders.cmake" + "/usr/share/ECM/modules/ECMPoQmTools.cmake" "/usr/share/ECM/modules/ECMQueryQmake.cmake" + "/usr/share/ECM/modules/ECMSetupVersion.cmake" "/usr/share/ECM/modules/ECMSourceVersionControl.cmake" "/usr/share/ECM/modules/ECMUninstallTarget.cmake" "/usr/share/ECM/modules/ECMUseFindModules.cmake" @@ -161,6 +159,7 @@ set(CMAKE_MAKEFILE_DEPENDS "/usr/share/cmake/Modules/CMakeGenericSystem.cmake" "/usr/share/cmake/Modules/CMakeInitializeConfigs.cmake" "/usr/share/cmake/Modules/CMakeLanguageInformation.cmake" + "/usr/share/cmake/Modules/CMakePackageConfigHelpers.cmake" "/usr/share/cmake/Modules/CMakeParseArguments.cmake" "/usr/share/cmake/Modules/CMakeSystemSpecificInformation.cmake" "/usr/share/cmake/Modules/CMakeSystemSpecificInitialize.cmake" @@ -183,6 +182,7 @@ set(CMAKE_MAKEFILE_DEPENDS "/usr/share/cmake/Modules/Platform/Linux-GNU.cmake" "/usr/share/cmake/Modules/Platform/Linux.cmake" "/usr/share/cmake/Modules/Platform/UnixPaths.cmake" + "/usr/share/cmake/Modules/WriteBasicConfigVersionFile.cmake" ) # The corresponding makefile is: diff --git a/build/CMakeFiles/Makefile2 b/build/CMakeFiles/Makefile2 index c1a87f1..3b04a74 100644 --- a/build/CMakeFiles/Makefile2 +++ b/build/CMakeFiles/Makefile2 @@ -205,12 +205,12 @@ CMakeFiles/KF5CoreAddons_QCH.dir/clean: src/CMakeFiles/presenter.dir/all: src/CMakeFiles/presenter_autogen.dir/all $(MAKE) $(MAKESILENT) -f src/CMakeFiles/presenter.dir/build.make src/CMakeFiles/presenter.dir/depend $(MAKE) $(MAKESILENT) -f src/CMakeFiles/presenter.dir/build.make src/CMakeFiles/presenter.dir/build - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/chris/dev/church-presenter/build/CMakeFiles --progress-num=3,4,5,6,7,8 "Built target presenter" + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/chris/dev/church-presenter/build/CMakeFiles --progress-num=3,4,5,6,7,8,9,10 "Built target presenter" .PHONY : src/CMakeFiles/presenter.dir/all # Build rule for subdir invocation for target. src/CMakeFiles/presenter.dir/rule: cmake_check_build_system - $(CMAKE_COMMAND) -E cmake_progress_start /home/chris/dev/church-presenter/build/CMakeFiles 7 + $(CMAKE_COMMAND) -E cmake_progress_start /home/chris/dev/church-presenter/build/CMakeFiles 9 $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 src/CMakeFiles/presenter.dir/all $(CMAKE_COMMAND) -E cmake_progress_start /home/chris/dev/church-presenter/build/CMakeFiles 0 .PHONY : src/CMakeFiles/presenter.dir/rule @@ -231,7 +231,7 @@ src/CMakeFiles/presenter.dir/clean: src/CMakeFiles/presenter_autogen.dir/all: $(MAKE) $(MAKESILENT) -f src/CMakeFiles/presenter_autogen.dir/build.make src/CMakeFiles/presenter_autogen.dir/depend $(MAKE) $(MAKESILENT) -f src/CMakeFiles/presenter_autogen.dir/build.make src/CMakeFiles/presenter_autogen.dir/build - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/chris/dev/church-presenter/build/CMakeFiles --progress-num=9 "Built target presenter_autogen" + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/chris/dev/church-presenter/build/CMakeFiles --progress-num=11 "Built target presenter_autogen" .PHONY : src/CMakeFiles/presenter_autogen.dir/all # Build rule for subdir invocation for target. diff --git a/build/CMakeFiles/progress.marks b/build/CMakeFiles/progress.marks index 7f8f011..ec63514 100644 --- a/build/CMakeFiles/progress.marks +++ b/build/CMakeFiles/progress.marks @@ -1 +1 @@ -7 +9 diff --git a/build/CTestTestfile.cmake b/build/CTestTestfile.cmake index 8eb7229..3046f3c 100644 --- a/build/CTestTestfile.cmake +++ b/build/CTestTestfile.cmake @@ -5,5 +5,5 @@ # This file includes the relevant testing commands required for # testing this directory and lists subdirectories to be tested as well. add_test(appstreamtest "/usr/bin/cmake" "-DAPPSTREAMCLI=/usr/bin/appstreamcli" "-DINSTALL_FILES=/home/chris/dev/church-presenter/build/install_manifest.txt" "-P" "/usr/share/ECM/kde-modules/appstreamtest.cmake") -set_tests_properties(appstreamtest PROPERTIES _BACKTRACE_TRIPLES "/usr/share/ECM/kde-modules/KDECMakeSettings.cmake;161;add_test;/usr/share/ECM/kde-modules/KDECMakeSettings.cmake;179;appstreamtest;/usr/share/ECM/kde-modules/KDECMakeSettings.cmake;0;;/home/chris/dev/church-presenter/CMakeLists.txt;17;include;/home/chris/dev/church-presenter/CMakeLists.txt;0;") +set_tests_properties(appstreamtest PROPERTIES _BACKTRACE_TRIPLES "/usr/share/ECM/kde-modules/KDECMakeSettings.cmake;161;add_test;/usr/share/ECM/kde-modules/KDECMakeSettings.cmake;179;appstreamtest;/usr/share/ECM/kde-modules/KDECMakeSettings.cmake;0;;/home/chris/dev/church-presenter/CMakeLists.txt;19;include;/home/chris/dev/church-presenter/CMakeLists.txt;0;") subdirs("src") diff --git a/build/src/CMakeFiles/progress.marks b/build/src/CMakeFiles/progress.marks index 7f8f011..ec63514 100644 --- a/build/src/CMakeFiles/progress.marks +++ b/build/src/CMakeFiles/progress.marks @@ -1 +1 @@ -7 +9 diff --git a/build/src/Makefile b/build/src/Makefile index 4b4b302..c69df4d 100644 --- a/build/src/Makefile +++ b/build/src/Makefile @@ -178,6 +178,30 @@ main.cpp.s: cd /home/chris/dev/church-presenter/build && $(MAKE) $(MAKESILENT) -f src/CMakeFiles/presenter.dir/build.make src/CMakeFiles/presenter.dir/main.cpp.s .PHONY : main.cpp.s +mpv/mpvobject.o: mpv/mpvobject.cpp.o +.PHONY : mpv/mpvobject.o + +# target to build an object file +mpv/mpvobject.cpp.o: + cd /home/chris/dev/church-presenter/build && $(MAKE) $(MAKESILENT) -f src/CMakeFiles/presenter.dir/build.make src/CMakeFiles/presenter.dir/mpv/mpvobject.cpp.o +.PHONY : mpv/mpvobject.cpp.o + +mpv/mpvobject.i: mpv/mpvobject.cpp.i +.PHONY : mpv/mpvobject.i + +# target to preprocess a source file +mpv/mpvobject.cpp.i: + cd /home/chris/dev/church-presenter/build && $(MAKE) $(MAKESILENT) -f src/CMakeFiles/presenter.dir/build.make src/CMakeFiles/presenter.dir/mpv/mpvobject.cpp.i +.PHONY : mpv/mpvobject.cpp.i + +mpv/mpvobject.s: mpv/mpvobject.cpp.s +.PHONY : mpv/mpvobject.s + +# target to generate assembly for a file +mpv/mpvobject.cpp.s: + cd /home/chris/dev/church-presenter/build && $(MAKE) $(MAKESILENT) -f src/CMakeFiles/presenter.dir/build.make src/CMakeFiles/presenter.dir/mpv/mpvobject.cpp.s +.PHONY : mpv/mpvobject.cpp.s + presenter_autogen/EWIEGA46WW/qrc_resources.o: presenter_autogen/EWIEGA46WW/qrc_resources.cpp.o .PHONY : presenter_autogen/EWIEGA46WW/qrc_resources.o @@ -250,6 +274,30 @@ songlistmodel.cpp.s: cd /home/chris/dev/church-presenter/build && $(MAKE) $(MAKESILENT) -f src/CMakeFiles/presenter.dir/build.make src/CMakeFiles/presenter.dir/songlistmodel.cpp.s .PHONY : songlistmodel.cpp.s +songsqlmodel.o: songsqlmodel.cpp.o +.PHONY : songsqlmodel.o + +# target to build an object file +songsqlmodel.cpp.o: + cd /home/chris/dev/church-presenter/build && $(MAKE) $(MAKESILENT) -f src/CMakeFiles/presenter.dir/build.make src/CMakeFiles/presenter.dir/songsqlmodel.cpp.o +.PHONY : songsqlmodel.cpp.o + +songsqlmodel.i: songsqlmodel.cpp.i +.PHONY : songsqlmodel.i + +# target to preprocess a source file +songsqlmodel.cpp.i: + cd /home/chris/dev/church-presenter/build && $(MAKE) $(MAKESILENT) -f src/CMakeFiles/presenter.dir/build.make src/CMakeFiles/presenter.dir/songsqlmodel.cpp.i +.PHONY : songsqlmodel.cpp.i + +songsqlmodel.s: songsqlmodel.cpp.s +.PHONY : songsqlmodel.s + +# target to generate assembly for a file +songsqlmodel.cpp.s: + cd /home/chris/dev/church-presenter/build && $(MAKE) $(MAKESILENT) -f src/CMakeFiles/presenter.dir/build.make src/CMakeFiles/presenter.dir/songsqlmodel.cpp.s +.PHONY : songsqlmodel.cpp.s + # Help Target help: @echo "The following are some of the valid targets for this Makefile:" @@ -264,6 +312,9 @@ help: @echo "... main.o" @echo "... main.i" @echo "... main.s" + @echo "... mpv/mpvobject.o" + @echo "... mpv/mpvobject.i" + @echo "... mpv/mpvobject.s" @echo "... presenter_autogen/EWIEGA46WW/qrc_resources.o" @echo "... presenter_autogen/EWIEGA46WW/qrc_resources.i" @echo "... presenter_autogen/EWIEGA46WW/qrc_resources.s" @@ -273,6 +324,9 @@ help: @echo "... songlistmodel.o" @echo "... songlistmodel.i" @echo "... songlistmodel.s" + @echo "... songsqlmodel.o" + @echo "... songsqlmodel.i" + @echo "... songsqlmodel.s" .PHONY : help diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5260e0d..0048af4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -4,6 +4,7 @@ target_sources(presenter PRIVATE main.cpp resources.qrc songlistmodel.cpp songlistmodel.h + songsqlmodel.cpp songsqlmodel.h mpv/mpvobject.h mpv/mpvobject.cpp mpv/qthelper.hpp mpv/mpvhelpers.h ) diff --git a/src/main.cpp b/src/main.cpp index 010d11f..c04453f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,6 +8,9 @@ #include #include #include +#include +#include +#include #include #include @@ -18,16 +21,50 @@ #include #include +#include +#include +#include +#include +#include #include "songlistmodel.h" #include "mpv/mpvobject.h" +#include "songsqlmodel.h" + +static void connectToDatabase() { + // let's setup our sql database + QSqlDatabase db = QSqlDatabase::database(); + if (!db.isValid()){ + db = QSqlDatabase::addDatabase("QSQLITE"); + if (!db.isValid()) + qFatal("Cannot add database: %s", qPrintable(db.lastError().text())); + } + + const QDir writeDir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); + + if (!writeDir.mkpath(".")) { + qFatal("Failed to create writable location at %s", qPrintable(writeDir.absolutePath())); + } + + const QString dbName = writeDir.absolutePath() + "/library-db.sqlite3"; + + db.setHostName("localhost"); + db.setDatabaseName(dbName); + db.setUserName("presenter"); + db.setPassword("i393jkf782djyr98302j"); + if (!db.open()) { + qFatal("Cannot open database: %s", qPrintable(db.lastError().text())); + QFile::remove(dbName); + } + +} int main(int argc, char *argv[]) { QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QApplication app(argc, argv); KLocalizedString::setApplicationDomain("presenter"); - QCoreApplication::setOrganizationName(QStringLiteral("TFC")); + QCoreApplication::setOrganizationName(QStringLiteral("presenter")); QCoreApplication::setOrganizationDomain(QStringLiteral("tfcconnection.org")); QCoreApplication::setApplicationName(QStringLiteral("Church Presenter")); @@ -35,18 +72,22 @@ int main(int argc, char *argv[]) std::setlocale(LC_NUMERIC, "C"); qmlRegisterType("mpv", 1, 0, "MpvObject"); + //register our song model from sql + qmlRegisterType("org.presenter", 1, 0, "SongSqlModel"); + SongListModel songListModel; - // path = QQmlEngine::importPathList() - qDebug() << "Hello World!"; + connectToDatabase(); QQmlApplicationEngine engine; - engine.rootContext()->setContextObject(new KLocalizedContext(&engine)); engine.rootContext()->setContextProperty("_songListModel", &songListModel); engine.load(QUrl(QStringLiteral("qrc:qml/main.qml"))); + // QQuickView *view = new QQuickView; + // view->setSource(QUrl(QStringLiteral("qrc:qml/main.qml"))); + // view->show(); #ifdef STATIC_KIRIGAMI KirigamiPlugin::getInstance().registerTypes(); diff --git a/src/qml/main.qml b/src/qml/main.qml index 764dc69..35c601f 100644 --- a/src/qml/main.qml +++ b/src/qml/main.qml @@ -14,7 +14,7 @@ Kirigami.ApplicationWindow { property bool libraryOpen: true property bool presenting: false property bool presentMode: true - property var secondScreen: null + property var screens pageStack.initialPage: mainPage header: Presenter.Header {} @@ -30,10 +30,16 @@ Kirigami.ApplicationWindow { } Component.onCompleted: { - print("checking screens") - print("Present Mode is " + presentMode) - secondScreen = Qt.application.screens[1] - print(secondScreen) + print("checking screens"); + print("Present Mode is " + presentMode); + screens = Qt.application.screens; + for (let i = 0; i < screens.length; i++) { + print(screens[i].name); + print("width of screen: " + (screens[i].width * screens[i].devicePixelRatio)); + print("height of screen: " + (screens[i].height * screens[i].devicePixelRatio)); + print("pixeldensity of screen: " + screens[i].pixelDensity); + print("pixelratio of screen: " + screens[i].devicePixelRatio); + } } } diff --git a/src/qml/presenter/Library.qml b/src/qml/presenter/Library.qml index bf37f53..0993c88 100644 --- a/src/qml/presenter/Library.qml +++ b/src/qml/presenter/Library.qml @@ -4,6 +4,7 @@ import QtQuick.Controls 2.0 as Controls import QtQuick.Layouts 1.2 import org.kde.kirigami 2.13 as Kirigami import "./" as Presenter +import org.presenter 1.0 Item { id: root @@ -25,10 +26,20 @@ Item { color: Kirigami.Theme.backgroundColor Controls.Label { + id: songlable anchors.centerIn: parent text: "Songs" } + Controls.Label { + anchors {left: songlable.right + verticalCenter: songlable.verticalCenter + leftMargin: 15} + text: songsqlmodel.rowCount() + font.pixelSize: 15 + color: Kirigami.Theme.disabledTextColor + } + MouseArea { anchors.fill: parent onClicked: { @@ -41,15 +52,19 @@ Item { } } + SongSqlModel { + id: songsqlmodel + } + ListView { Layout.fillHeight: true Layout.fillWidth: true id: songLibraryList - model: _songListModel + model: songsqlmodel delegate: itemDelegate state: "selected" - Component.onCompleted: print(selectedLibrary) + /* Component.onCompleted: print(selectedLibrary) */ states: [ State { diff --git a/src/songsqlmodel.cpp b/src/songsqlmodel.cpp new file mode 100644 index 0000000..51efae9 --- /dev/null +++ b/src/songsqlmodel.cpp @@ -0,0 +1,139 @@ +#include "songsqlmodel.h" + +#include +#include +#include +#include +#include +#include +#include + +static const char *songsTableName = "songs"; + +static void createTable() +{ + if(QSqlDatabase::database().tables().contains(songsTableName)) { + return; + } + + QSqlQuery query; + if (!query.exec( + "CREATE TABLE IF NOT EXISTS 'songs' (" + " 'title' TEXT NOT NULL," + " 'lyrics' TEXT," + " 'author' TEXT," + " 'ccli' TEXT," + " 'audio' TEXT," + " PRIMARY KEY(title))" + )) { + qFatal("Failed to query database: %s", qPrintable(query.lastError().text())); + } + + query.exec("INSERT INTO songs VALUES ('10,000 Reasons', '10,000 reasons for my heart to sing', 'Matt Redman', '13470183', '')"); + query.exec("INSERT INTO songs VALUES ('River', 'Im going down to the river', 'Jordan Feliz', '13470183', '')"); + query.exec("INSERT INTO songs VALUES ('Marvelous Light', 'Into marvelous light Im running', 'Chris Tomlin', '13470183', '')"); + + query.exec("select * from songs"); + qDebug() << query.lastQuery(); +} + +SongSqlModel::SongSqlModel(QObject *parent) + : QSqlTableModel(parent) +{ + createTable(); + setTable(songsTableName); + setEditStrategy(QSqlTableModel::OnFieldChange); + select(); +} + +QVariant SongSqlModel::data(const QModelIndex &index, int role) const { + if (role < Qt::UserRole) { + qDebug() << role; + return QSqlTableModel::data(index, role); + } + + qDebug() << role; + const QSqlRecord sqlRecord = record(index.row()); + return sqlRecord.value(role - Qt::UserRole); +} + +QHash SongSqlModel::roleNames() const +{ + QHash names; + names[Qt::UserRole] = "title"; + names[Qt::UserRole + 1] = "lyrics"; + names[Qt::UserRole + 2] = "author"; + names[Qt::UserRole + 3] = "ccli"; + names[Qt::UserRole + 4] = "audio"; + return names; +} + +QString SongSqlModel::title() const { + return m_title; +} + +void SongSqlModel::setTitle(const QString &title) { + if (title == m_title) + return; + + m_title = title; + + select(); + emit titleChanged(); +} + +QString SongSqlModel::author() const { + return m_author; +} + +void SongSqlModel::setAuthor(const QString &author) { + if (author == m_author) + return; + + m_author = author; + + select(); + emit authorChanged(); +} + +QString SongSqlModel::lyrics() const { + return m_lyrics; +} + +void SongSqlModel::setLyrics(const QString &lyrics) { + if (lyrics == m_lyrics) + return; + + m_lyrics = lyrics; + + select(); + emit lyricsChanged(); +} + +QString SongSqlModel::ccli() const { + return m_ccli; +} + +void SongSqlModel::setCcli(const QString &ccli) { + if (ccli == m_ccli) + return; + + m_ccli = ccli; + + select(); + emit ccliChanged(); +} + +QString SongSqlModel::audio() const { + return m_audio; +} + +void SongSqlModel::setAudio(const QString &audio) { + if (audio == m_audio) + return; + + m_audio = audio; + + select(); + emit audioChanged(); +} diff --git a/src/songsqlmodel.h b/src/songsqlmodel.h new file mode 100644 index 0000000..0af3ba7 --- /dev/null +++ b/src/songsqlmodel.h @@ -0,0 +1,50 @@ +#ifndef SONGSQLMODEL_H +#define SONGSQLMODEL_H + +#include +#include + +class SongSqlModel : public QSqlTableModel +{ + Q_OBJECT + Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged) + Q_PROPERTY(QString lyrics READ lyrics WRITE setLyrics NOTIFY lyricsChanged) + Q_PROPERTY(QString author READ author WRITE setAuthor NOTIFY authorChanged) + Q_PROPERTY(QString ccli READ ccli WRITE setCcli NOTIFY ccliChanged) + Q_PROPERTY(QString audio READ audio WRITE setAudio NOTIFY audioChanged) + QML_ELEMENT + +public: + SongSqlModel(QObject *parent = 0); + + QString title() const; + QString lyrics() const; + QString author() const; + QString ccli() const; + QString audio() const; + + void setTitle(const QString &title); + void setLyrics(const QString &lyrics); + void setAuthor(const QString &author); + void setCcli(const QString &ccli); + void setAudio(const QString &audio); + + QVariant data(const QModelIndex &index, int role) const override; + QHash roleNames() const override; + +signals: + void titleChanged(); + void lyricsChanged(); + void authorChanged(); + void ccliChanged(); + void audioChanged(); + +private: + QString m_title; + QString m_lyrics; + QString m_author; + QString m_ccli; + QString m_audio; +}; + +#endif //SONGSQLMODEL_H