diff --git a/CMakeLists.txt b/CMakeLists.txt index d5492fe..ec6dc0a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,6 +28,7 @@ add_library(${TARGET_APP} STATIC model/commands/insertrowscommand.h model/commands/insertrowscommand.cpp model/commands/removerowscommand.h model/commands/removerowscommand.cpp model/commands/edititemcommand.h model/commands/edititemcommand.cpp + data/filehandler.h data/filehandler.cpp ) include_directories(${CMAKE_CURRENT_BINARY_DIR}) diff --git a/data/filehandler.cpp b/data/filehandler.cpp new file mode 100644 index 0000000..336b1a9 --- /dev/null +++ b/data/filehandler.cpp @@ -0,0 +1,31 @@ +#include "filehandler.h" + +#include +#include +#include +#include + +bool FileHandler::saveToFile(const QJsonDocument& doc, const QString& fileName) { + qDebug() << "saving file..."; + QString path = QStandardPaths::standardLocations(QStandardPaths::AppDataLocation).at(0); + qDebug() << path; + + QDir dir; + if (!dir.exists(path)) { + dir.mkpath(path); + } + // qDebug() << path + fileName; + const QString filePath = path + '/' + fileName; + QFile file(filePath); + + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + qWarning() << "can't open file"; + return false; + } + QTextStream out(&file); + out.setEncoding(QStringConverter::Utf8); + out << doc.toJson(QJsonDocument::Indented); + return true; +} + +FileHandler::FileHandler() {} diff --git a/data/filehandler.h b/data/filehandler.h new file mode 100644 index 0000000..e6b954d --- /dev/null +++ b/data/filehandler.h @@ -0,0 +1,15 @@ +#ifndef FILEHANDLER_H +#define FILEHANDLER_H + +class QJsonDocument; +class QString; + +class FileHandler { + public: + static bool saveToFile(const QJsonDocument& doc, const QString& fileName); + + private: + explicit FileHandler(); +}; + +#endif // FILEHANDLER_H diff --git a/genericcore.cpp b/genericcore.cpp index e1a68a7..2f79c04 100644 --- a/genericcore.cpp +++ b/genericcore.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -10,6 +11,7 @@ #include "../../ApplicationConfig.h" #include "CoreConfig.h" #include "constants.h" +#include "data/filehandler.h" #include "model/tablemodel.h" #include @@ -88,6 +90,21 @@ QUndoStack* GenericCore::getModelUndoStack() const { return m_modelUndoStack; } std::shared_ptr GenericCore::getModel() const { return m_mainModel; } +void GenericCore::saveItems() { + qDebug() << "saving items..."; + + const QJsonDocument doc = m_mainModel->getAllItemsAsJsonDoc(); + const bool successfulSave = FileHandler::saveToFile(doc, "items.json"); + if (successfulSave) { + // QStringList completedTaskStrings = m_model->completedTasks(); + // appendCompletedTasksToFile(completedTaskStrings, "completed.txt"); + m_modelUndoStack->setClean(); + emit displayStatusMessage(QString("Items saved.")); + } else { + emit displayStatusMessage(QString("Error: Items couldn't be saved.")); + } +} + void GenericCore::setupModels() { m_mainModel = make_shared(m_modelUndoStack, this); // TODO add QAbstractItemModelTester diff --git a/genericcore.h b/genericcore.h index 20ac805..4ea4dd4 100644 --- a/genericcore.h +++ b/genericcore.h @@ -25,6 +25,8 @@ class GenericCore : public QObject { QUndoStack* getModelUndoStack() const; std::shared_ptr getModel() const; + void saveItems(); + signals: void displayStatusMessage(QString message); diff --git a/model/modelitem.cpp b/model/modelitem.cpp index a168b7f..5df55b6 100644 --- a/model/modelitem.cpp +++ b/model/modelitem.cpp @@ -1,5 +1,10 @@ #include "modelitem.h" +#include "tablemodel.h" + +#include +#include + ModelItem::ModelItem(const QHash values) : m_values(values) {} @@ -38,3 +43,27 @@ bool ModelItem::setItemData(const QMap& changedValues) { return valueChanged; } + +QJsonObject ModelItem::toJsonObject() const { + QJsonObject itemObject; + // itemObject.insert("uuid", m_uuid.toString()); + // itemObject.insert("entryDateUTC", m_entryDateUTC.toString(Qt::ISODate)); + itemObject.insert(TableModel::ROLE_NAMES.value(TableModel::NameRole), + data(TableModel::NameRole).toString()); + itemObject.insert(TableModel::ROLE_NAMES.value(TableModel::DescriptionRole), + data(TableModel::DescriptionRole).toString()); + itemObject.insert(TableModel::ROLE_NAMES.value(TableModel::InfoRole), + data(TableModel::InfoRole).toString()); + itemObject.insert(TableModel::ROLE_NAMES.value(TableModel::AmountRole), + data(TableModel::AmountRole).toInt()); + itemObject.insert(TableModel::ROLE_NAMES.value(TableModel::FactorRole), + data(TableModel::FactorRole).toReal()); + + // if (m_modifiedDateUTC.isValid()) { + // itemObject.insert("modifiedDateUTC", m_modifiedDateUTC.toString(Qt::ISODate)); + // } + // if (m_endDateUTC.isValid()) { + // itemObject.insert("endDateUTC", m_endDateUTC.toString(Qt::ISODate)); + // } + return itemObject; +} diff --git a/model/modelitem.h b/model/modelitem.h index 6f9c366..2f3e037 100644 --- a/model/modelitem.h +++ b/model/modelitem.h @@ -12,6 +12,9 @@ class ModelItem { // TODO change return value to list of changed roles bool setItemData(const QMap& changedValues); + // QString toString() const; + QJsonObject toJsonObject() const; + private: QHash m_values; }; diff --git a/model/tablemodel.cpp b/model/tablemodel.cpp index 675309a..94a5ddd 100644 --- a/model/tablemodel.cpp +++ b/model/tablemodel.cpp @@ -6,6 +6,10 @@ #include "commands/removerowscommand.h" #include "modelitem.h" +#include +#include +#include + QHash TableModel::ROLE_NAMES = {{NameRole, "Name"}, {DescriptionRole, "Description"}, {InfoRole, "Info"}, @@ -241,3 +245,18 @@ bool TableModel::isEmptyValueEqualToZero(const int role) const { } return false; } + +QJsonDocument TableModel::getAllItemsAsJsonDoc() const { + QJsonDocument doc = QJsonDocument(); + QJsonObject rootObject; + QJsonArray array; + + foreach (shared_ptr item, m_items) { + QJsonObject itemObject = item->toJsonObject(); + array.append(itemObject); + } + rootObject.insert("items", array); + + doc.setObject(rootObject); + return doc; +} diff --git a/model/tablemodel.h b/model/tablemodel.h index dd54f3a..539378d 100644 --- a/model/tablemodel.h +++ b/model/tablemodel.h @@ -34,6 +34,8 @@ class TableModel : public QAbstractTableModel { bool setData(const QModelIndex& index, const QVariant& value, int role) override; bool setItemData(const QModelIndex& index, const QMap& roles) override; + QJsonDocument getAllItemsAsJsonDoc() const; + public slots: // bool insertRows(int position, int rows, const QModelIndex& parentIndex = QModelIndex()) // override;