From e6db4cd3958a116ae174bd35bde6bb5b3717336e Mon Sep 17 00:00:00 2001 From: Chris Cochrun Date: Tue, 15 Feb 2022 11:13:28 -0600 Subject: [PATCH] Library system base --- CMakeLists.txt.user | 690 +++--------------------------- src/qml/presenter/Library.qml | 242 +++++++++-- src/qml/presenter/LibraryItem.qml | 99 +++++ src/qml/presenter/PanelItem.qml | 9 +- src/resources.qrc | 1 + src/songlistmodel.cpp | 11 + 6 files changed, 379 insertions(+), 673 deletions(-) create mode 100644 src/qml/presenter/LibraryItem.qml diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user index e51cb23..555980a 100644 --- a/CMakeLists.txt.user +++ b/CMakeLists.txt.user @@ -1,14 +1,14 @@ - + EnvironmentId - {96b0233c-0ac3-4a64-9b08-eb9c58898997} + {d6595ca1-5c4f-4487-b405-470a7201d856} ProjectExplorer.Project.ActiveTarget - 1 + 0 ProjectExplorer.Project.EditorSettings @@ -28,7 +28,7 @@ QmlJSGlobal - 2 + 2 UTF-8 false 4 @@ -37,6 +37,7 @@ true true 1 + false true false 0 @@ -45,710 +46,139 @@ 0 8 true + false 1 true true true + *.md, *.MD, Makefile false + true ProjectExplorer.Project.PluginSettings + + true + false + true + true + true + true + + + 0 + true true + Builtin.BuildSystem + + true + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + ProjectExplorer.Project.Target.0 - Desktop - Desktop - {96187c35-1a90-4f71-ac12-1cde906cba06} - 0 - 0 - 0 + Desktop + Qt 5.15.2 in PATH (System) + Qt 5.15.2 in PATH (System) + {055b3c2c-94ff-418e-b088-9847da1e7c71} + 0 + 0 + 0 - - CMAKE_BUILD_TYPE:STRING=Debug - CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} - CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} - QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} - - /home/chris/dev/build-church-presenter-Desktop-Debug - - - - - all - - true - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - - clean - - true - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Debug - CMakeProjectManager.CMakeBuildConfiguration - - - - CMAKE_BUILD_TYPE:STRING=Release - CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} - CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} - QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} - - /home/chris/dev/build-church-presenter-Desktop-Release - - - - - all - - true - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - - clean - - true - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Release - CMakeProjectManager.CMakeBuildConfiguration - - - - CMAKE_BUILD_TYPE:STRING=RelWithDebInfo - CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} - CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} - QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} - - /home/chris/dev/build-church-presenter-Desktop-RelWithDebInfo - - - - - all - - true - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - - clean - - true - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Release with Debug Information - CMakeProjectManager.CMakeBuildConfiguration - - - - CMAKE_BUILD_TYPE:STRING=MinSizeRel - CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} - CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} - QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} - - /home/chris/dev/build-church-presenter-Desktop-MinSizeRel - - - - - all - - true - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - - clean - - true - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Minimum Size Release - CMakeProjectManager.CMakeBuildConfiguration - - 4 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - ProjectExplorer.DefaultDeployConfiguration - - 1 - - - dwarf - - cpu-cycles - - - 250 - - -e - cpu-cycles - --call-graph - dwarf,4096 - -F - 250 - - -F - true - 4096 - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - kcachegrind - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - 2 - - presenter - CMakeProjectManager.CMakeRunConfiguration.presenter - presenter - - false - - false - true - true - false - false - true - - /home/chris/dev/build-church-presenter-Desktop-Debug/bin - - 1 - - - - ProjectExplorer.Project.Target.1 - - Felgo Desktop (Qt 5.15.2 GCC) - Felgo Desktop (Qt 5.15.2 GCC) - vplayengine.2.qt.gcc_64_kit - 0 - 0 - 0 - - - CMAKE_BUILD_TYPE:STRING=Debug - CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} - CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} - QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} - - /home/chris/dev/build-church-presenter-Felgo_Desktop_Qt_5_15_2_GCC-Debug - - - - - all - - true - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - - clean - - true - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Debug - CMakeProjectManager.CMakeBuildConfiguration - - - - CMAKE_BUILD_TYPE:STRING=Release - CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} - CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} - QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} - - /home/chris/dev/build-church-presenter-Felgo_Desktop_Qt_5_15_2_GCC-Release - - - - - all - - true - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - - clean - - true - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Release - CMakeProjectManager.CMakeBuildConfiguration - - - - CMAKE_BUILD_TYPE:STRING=RelWithDebInfo - CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} - CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} - QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} - - /home/chris/dev/build-church-presenter-Felgo_Desktop_Qt_5_15_2_GCC-RelWithDebInfo - - - - - all - - true - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - - clean - - true - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Release with Debug Information - CMakeProjectManager.CMakeBuildConfiguration - - - - CMAKE_BUILD_TYPE:STRING=MinSizeRel - CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} - CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} - QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} - - /home/chris/dev/build-church-presenter-Felgo_Desktop_Qt_5_15_2_GCC-MinSizeRel - - - - - all - - true - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - - clean - - true - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Minimum Size Release - CMakeProjectManager.CMakeBuildConfiguration - - 4 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - ProjectExplorer.DefaultDeployConfiguration - - 1 - - - dwarf - - cpu-cycles - - - 250 - - -e - cpu-cycles - --call-graph - dwarf,4096 - -F - 250 - - -F - true - 4096 - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - kcachegrind - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - 2 - - presenter - CMakeProjectManager.CMakeRunConfiguration.presenter - presenter - - false - - false - true - true - false - false - true - - /home/chris/dev/build-church-presenter-Felgo_Desktop_Qt_5_15_2_GCC-Debug/bin - - 1 - - - - ProjectExplorer.Project.Target.2 - - Local - Local - {ead1f619-db1e-418c-b0eb-2111d1bf7fd0} - 0 - 0 - 0 - - - CMAKE_BUILD_TYPE:STRING=Debug - CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} - CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} - CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} - QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} - + Debug + -GUnix Makefiles +-DCMAKE_BUILD_TYPE:STRING=Debug +-DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake +-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} +-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} +-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C} +-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx} + /home/chris/dev/church-presenter /home/chris/dev/church-presenter/build - all true + Build CMakeProjectManager.MakeStep - 1 + 1 Build Build ProjectExplorer.BuildSteps.Build - clean true + Build CMakeProjectManager.MakeStep - 1 + 1 Clean Clean ProjectExplorer.BuildSteps.Clean 2 false + + false Debug CMakeProjectManager.CMakeBuildConfiguration - 1 + 1 - 0 + 0 Deploy Deploy ProjectExplorer.BuildSteps.Deploy 1 + + false ProjectExplorer.DefaultDeployConfiguration - 1 - + 1 - dwarf - - cpu-cycles - - - 250 - - -e - cpu-cycles - --call-graph - dwarf,4096 - -F - 250 - - -F true - 4096 - false - false - 1000 - true - - false - false - false - false - true - 0.01 - 10 - true - kcachegrind - 1 - 25 - - 1 true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - + 2 presenter CMakeProjectManager.CMakeRunConfiguration.presenter presenter - - false - false true true - false false true - /home/chris/dev/church-presenter/build/bin - 1 + 1 ProjectExplorer.Project.TargetCount - 3 + 1 ProjectExplorer.Project.Updater.FileVersion diff --git a/src/qml/presenter/Library.qml b/src/qml/presenter/Library.qml index b92aa66..e0cd223 100644 --- a/src/qml/presenter/Library.qml +++ b/src/qml/presenter/Library.qml @@ -7,46 +7,208 @@ import "./" as Presenter Item { id: root - Presenter.PanelItem { - anchors.fill: parent + + /* ColumnLayout { */ + /* anchors.fill: parent */ + /* spacing: 0 */ + /* Rectangle { */ + /* id: songLibraryPanel */ + /* Layout.preferredHeight: 40 */ + /* Layout.fillWidth: true */ + /* color: Kirigami.Theme.backgroundColor */ + + /* Controls.Label { */ + /* anchors.centerIn: parent */ + /* text: "Songs" */ + /* } */ + + /* MouseArea { */ + /* anchors.fill: parent */ + /* onClicked: { */ + /* if (songLibraryList.state == "selected") */ + /* songLibraryList.state = "deselected" */ + /* else */ + /* songLibraryList.state = "selected" */ + /* } */ + /* } */ + /* } */ + + /* ListView { */ + /* Layout.fillHeight: true */ + /* Layout.fillWidth: true */ + /* id: songLibraryList */ + /* model: _songListModel */ + /* delegate: itemDelegate */ + + /* Component.onCompleted: songLibraryList.state = selected */ + + /* states: [ */ + /* State { */ + /* name: "deselected" */ + /* PropertyChanges { target: songLibraryList */ + /* height: 0 */ + /* Layout.fillHeight: false */ + /* visible: false */ + /* } */ + /* }, */ + /* State { */ + /* name: "selected" */ + /* PropertyChanges { target: songLibraryList } */ + /* } */ + /* ] */ + + /* transitions: Transition { */ + /* from: "selected" */ + /* to: "deselected" */ + /* NumberAnimation { */ + /* target: songLibraryList */ + /* properties: "height" */ + /* easing.type: Easing.OutCubic */ + /* duration: 300 */ + /* } */ + /* } */ + + /* Component { */ + /* id: itemDelegate */ + /* Kirigami.BasicListItem { */ + /* width: ListView.view.width */ + /* height:40 */ + /* label: title */ + /* subtitle: author */ + /* hoverEnabled: true */ + /* onClicked: { */ + /* ListView.view.currentIndex = index */ + /* songTitle = title */ + /* songLyrics = lyrics */ + /* songAuthor = author */ + /* showPassiveNotification(songLyrics, 3000) */ + /* } */ + /* } */ + /* } */ + + /* Kirigami.WheelHandler { */ + /* id: wheelHandler */ + /* target: songLibraryList */ + /* filterMouseEvents: true */ + /* keyNavigationEnabled: true */ + /* } */ + + /* Controls.ScrollBar.vertical: Controls.ScrollBar { */ + /* anchors.right: songLibraryList.right */ + /* anchors.leftMargin: 10 */ + /* active: hovered || pressed */ + /* } */ + /* } */ + + /* Rectangle { */ + /* id: videoLibraryPanel */ + /* Layout.preferredHeight: 40 */ + /* Layout.fillWidth: true */ + /* color: Kirigami.Theme.backgroundColor */ + /* opacity: 1.0 */ + + /* Controls.Label { */ + /* anchors.centerIn: parent */ + /* text: "Videos" */ + /* } */ + + /* MouseArea { */ + /* anchors.fill: parent */ + /* } */ + /* } */ + + /* ListView { */ + /* id: videoLibraryList */ + /* Layout.fillHeight: true */ + /* Layout.fillWidth: true */ + + /* } */ + /* Rectangle { */ + /* id: imageLibraryPanel */ + /* Layout.preferredHeight: 40 */ + /* Layout.fillWidth: true */ + /* color: Kirigami.Theme.backgroundColor */ + + /* Controls.Label { */ + /* anchors.centerIn: parent */ + /* text: "Images" */ + /* } */ + + /* MouseArea { */ + /* anchors.fill: parent */ + /* } */ + /* } */ + + /* ListView { */ + /* id: imageLibraryList */ + /* Layout.fillHeight: true */ + /* Layout.fillWidth: true */ + + /* } */ + /* Rectangle { */ + /* id: presentationLibraryPanel */ + /* Layout.preferredHeight: 40 */ + /* Layout.fillWidth: true */ + /* color: Kirigami.Theme.backgroundColor */ + + /* Controls.Label { */ + /* anchors.centerIn: parent */ + /* text: "Presentations" */ + /* } */ + + /* MouseArea { */ + /* anchors.fill: parent */ + /* } */ + /* } */ + + /* ListView { */ + /* id: presentationLibraryList */ + /* Layout.fillHeight: true */ + /* Layout.fillWidth: true */ + + /* } */ + /* Rectangle { */ + /* id: slideLibraryPanel */ + /* Layout.preferredHeight: 40 */ + /* Layout.fillWidth: true */ + /* color: Kirigami.Theme.backgroundColor */ + + /* Controls.Label { */ + /* anchors.centerIn: parent */ + /* text: "Slides" */ + /* } */ + + /* MouseArea { */ + /* anchors.fill: parent */ + /* } */ + /* } */ + + /* ListView { */ + /* id: slideLibraryList */ + /* Layout.fillHeight: true */ + /* Layout.fillWidth: true */ + + /* } */ + /* } */ + + Presenter.LibraryItem { + id: songLibrary title: "Songs" - - ListView { - anchors.fill: parent - id: libraryListView - model: _songListModel - delegate: itemDelegate - - Component { - id: itemDelegate - Kirigami.BasicListItem { - width: ListView.view.width - height:40 - label: title - subtitle: author - hoverEnabled: true - onClicked: { - ListView.view.currentIndex = index - songTitle = title - songLyrics = lyrics - songAuthor = author - showPassiveNotification(songLyrics, 3000) - } - } - } - - Kirigami.WheelHandler { - id: wheelHandler - target: libraryListView - filterMouseEvents: true - keyNavigationEnabled: true - } - - Controls.ScrollBar.vertical: Controls.ScrollBar { - anchors.right: libraryListView.right - anchors.leftMargin: 10 - active: hovered || pressed - } - } + model: _songListModel + open: true + /* type: "song" */ + /* Layout.fillHeight: true */ + Layout.fillWidth: true + /* Layout.preferredHeight: parent.height */ } + + Presenter.LibraryItem { + id: ssongLibrary + title: "Songs" + model: _songListModel + open: false + /* type: "song" */ + } + + } diff --git a/src/qml/presenter/LibraryItem.qml b/src/qml/presenter/LibraryItem.qml new file mode 100644 index 0000000..f87f574 --- /dev/null +++ b/src/qml/presenter/LibraryItem.qml @@ -0,0 +1,99 @@ + +import QtQuick 2.13 +import QtQuick.Dialogs 1.0 +import QtQuick.Controls 2.0 as Controls +import QtQuick.Layouts 1.2 +import org.kde.kirigami 2.13 as Kirigami +import "./" as Presenter + +Column { + id: root + + property string title: "" + required property var model + property bool open + + Rectangle { + id: panel + implicitHeight: 40 + implicitWidth: parent.width + color: Kirigami.Theme.backgroundColor + + Controls.Label { + id: titleLabel + anchors.centerIn: parent + text: title + } + + Controls.Label { + text: "^" + font.pointSize: 24 + anchors.right: parent.right + anchors.margins: 15 + anchors.baseline: open ? titleLabel.bottom : parent.bottom + rotation: open ? 180 : 0 + + Behavior on rotation { + NumberAnimation { easing.type: Easing.OutCubic; duration: 300 } + } + } + + MouseArea { + anchors.fill: parent + onClicked: open = !open + } + } + + ListView { + id: libraryList + + model: _songListModel + delegate: libraryDelegate + clip: true + implicitWidth: parent.width + height: { + if (open) + parent.height - panel.height + else + 0 + } + y: panel.height + + Behavior on height { + NumberAnimation { easing.type: Easing.OutCubic; duration: 300 } + } + + Kirigami.WheelHandler { + id: wheelHandler + target: libraryList + filterMouseEvents: true + keyNavigationEnabled: true + } + + Controls.ScrollBar.vertical: Controls.ScrollBar { + anchors.right: libraryList.right + anchors.leftMargin: 10 + active: hovered || pressed + } + } + + + Component { + id: libraryDelegate + Kirigami.BasicListItem { + width: ListView.view.width + height:40 + label: title + subtitle: author + hoverEnabled: true + onClicked: { + ListView.view.currentIndex = index + songTitle = title + songLyrics = lyrics + songAuthor = author + showPassiveNotification(songLyrics, 3000) + } + } + } + +} diff --git a/src/qml/presenter/PanelItem.qml b/src/qml/presenter/PanelItem.qml index 1134457..29cc7ae 100644 --- a/src/qml/presenter/PanelItem.qml +++ b/src/qml/presenter/PanelItem.qml @@ -4,20 +4,20 @@ import QtQuick.Layouts 1.2 import org.kde.kirigami 2.13 as Kirigami Item { + id: root default property var contentItem: null property string title: "panel" - id: root + property bool current: false Layout.fillWidth: true height: 30 Layout.fillHeight: current - property bool current: false ColumnLayout { anchors.fill: parent spacing: 0 Rectangle { id: bar Layout.fillWidth: true - height: 30 + height: 40 color: root.current ? Kirigami.Theme.highlightColor : Kirigami.Theme.backgroundColor Controls.Label { anchors.fill: parent @@ -37,6 +37,9 @@ Item { verticalAlignment: Text.AlignVCenter text: "^" rotation: root.current ? "180" : 0 + Behavior on rotation { + PropertyAnimation { duration: 100 } + } } MouseArea { anchors.fill: parent diff --git a/src/resources.qrc b/src/resources.qrc index ebdf96c..f645575 100644 --- a/src/resources.qrc +++ b/src/resources.qrc @@ -7,6 +7,7 @@ qml/presenter/Library.qml qml/presenter/LibraryModel.qml qml/presenter/LibraryDelegate.qml + qml/presenter/LibraryItem.qml qml/presenter/Header.qml qml/presenter/Actions.qml qml/presenter/PanelItem.qml diff --git a/src/songlistmodel.cpp b/src/songlistmodel.cpp index d7ab241..3c82608 100644 --- a/src/songlistmodel.cpp +++ b/src/songlistmodel.cpp @@ -4,6 +4,17 @@ SongListModel::SongListModel(QObject *parent) : QAbstractListModel(parent) { m_data + << Data("10,000 Reasons", "10,000 reasons for my heart to sing", "Matt Redman", "13470183", "") + << Data("Marvelous Light", "Into marvelous light I'm running", "Chris Tomlin", "13470183", "") + << Data("10,000 Reasons", "10,000 reasons for my heart to sing", "Matt Redman", "13470183", "") + << Data("Marvelous Light", "Into marvelous light I'm running", "Chris Tomlin", "13470183", "") + << Data("10,000 Reasons", "10,000 reasons for my heart to sing", "Matt Redman", "13470183", "") + << Data("Marvelous Light", "Into marvelous light I'm running", "Chris Tomlin", "13470183", "") + << Data("10,000 Reasons", "10,000 reasons for my heart to sing", "Matt Redman", "13470183", "") + << Data("Marvelous Light", "Into marvelous light I'm running", "Chris Tomlin", "13470183", "") + << Data("Marvelous Light", "Into marvelous light I'm running", "Chris Tomlin", "13470183", "") + << Data("10,000 Reasons", "10,000 reasons for my heart to sing", "Matt Redman", "13470183", "") + << Data("Marvelous Light", "Into marvelous light I'm running", "Chris Tomlin", "13470183", "") << Data("10,000 Reasons", "10,000 reasons for my heart to sing", "Matt Redman", "13470183", "") << Data("Marvelous Light", "Into marvelous light I'm running", "Chris Tomlin", "13470183", ""); }