From 0f7f4338334a34eec22a5c5f857c89be179d6286 Mon Sep 17 00:00:00 2001 From: Le Tan Date: Wed, 5 Oct 2016 17:13:40 +0800 Subject: [PATCH] move config logics to VConfigManager Signed-off-by: Le Tan --- VNote.pro | 6 ++- vconfigmanager.cpp | 62 +++++++++++++++++++++++++++ vconfigmanager.h | 22 ++++++++++ vdirectorytree.cpp | 103 +++++++-------------------------------------- vdirectorytree.h | 10 +---- vmainwindow.cpp | 2 +- vnote.cpp | 1 - vnote.h | 2 - 8 files changed, 106 insertions(+), 102 deletions(-) create mode 100644 vconfigmanager.cpp create mode 100644 vconfigmanager.h diff --git a/VNote.pro b/VNote.pro index b955d779..914d8d08 100644 --- a/VNote.pro +++ b/VNote.pro @@ -17,13 +17,15 @@ SOURCES += main.cpp\ vdirectorytree.cpp \ vnote.cpp \ vnotebook.cpp \ - vnewdirdialog.cpp + vnewdirdialog.cpp \ + vconfigmanager.cpp HEADERS += vmainwindow.h \ vdirectorytree.h \ vnote.h \ vnotebook.h \ - vnewdirdialog.h + vnewdirdialog.h \ + vconfigmanager.h RESOURCES += \ vnote.qrc diff --git a/vconfigmanager.cpp b/vconfigmanager.cpp new file mode 100644 index 00000000..ec1f1f29 --- /dev/null +++ b/vconfigmanager.cpp @@ -0,0 +1,62 @@ +#include "vconfigmanager.h" +#include +#include +#include +#include +#include +#include +#include + +const QString VConfigManager::dirConfigFileName = QString(".vnote.json"); + +VConfigManager::VConfigManager() +{ + +} + +QJsonObject VConfigManager::readDirectoryConfig(const QString &path) +{ + QString configFile = QDir(path).filePath(dirConfigFileName); + + qDebug() << "read config file:" << configFile; + QFile config(configFile); + if (!config.open(QIODevice::ReadOnly)) { + qWarning() << "error: fail to read directory configuration file:" + << configFile; + return QJsonObject(); + } + + QByteArray configData = config.readAll(); + return QJsonDocument::fromJson(configData).object(); +} + +bool VConfigManager::writeDirectoryConfig(const QString &path, const QJsonObject &configJson) +{ + QString configFile = QDir(path).filePath(dirConfigFileName); + + qDebug() << "write config file:" << configFile; + QFile config(configFile); + if (!config.open(QIODevice::WriteOnly)) { + qWarning() << "error: fail to open directory configuration file for write:" + << configFile; + return false; + } + + QJsonDocument configDoc(configJson); + config.write(configDoc.toJson()); + return true; +} + +bool VConfigManager::deleteDirectoryConfig(const QString &path) +{ + QString configFile = QDir(path).filePath(dirConfigFileName); + + QFile config(configFile); + if (!config.remove()) { + qWarning() << "error: fail to delete directory configuration file:" + << configFile; + return false; + } + qDebug() << "delete config file:" << configFile; + return true; +} diff --git a/vconfigmanager.h b/vconfigmanager.h new file mode 100644 index 00000000..146e0813 --- /dev/null +++ b/vconfigmanager.h @@ -0,0 +1,22 @@ +#ifndef VCONFIGMANAGER_H +#define VCONFIGMANAGER_H + +class QJsonObject; +class QString; + +class VConfigManager +{ +public: + VConfigManager(); + + // Read config from the directory config json file into a QJsonObject + static QJsonObject readDirectoryConfig(const QString &path); + static bool writeDirectoryConfig(const QString &path, const QJsonObject &configJson); + static bool deleteDirectoryConfig(const QString &path); + +private: + // The name of the config file in each directory + static const QString dirConfigFileName; +}; + +#endif // VCONFIGMANAGER_H diff --git a/vdirectorytree.cpp b/vdirectorytree.cpp index a7ab44cc..98814364 100644 --- a/vdirectorytree.cpp +++ b/vdirectorytree.cpp @@ -2,9 +2,10 @@ #include #include "vdirectorytree.h" #include "vnewdirdialog.h" +#include "vconfigmanager.h" -VDirectoryTree::VDirectoryTree(const QString &dirConfigFileName, QWidget *parent) - : QTreeWidget(parent), dirConfigFileName(dirConfigFileName) +VDirectoryTree::VDirectoryTree(QWidget *parent) + : QTreeWidget(parent) { setColumnCount(1); setHeaderHidden(true); @@ -54,14 +55,7 @@ void VDirectoryTree::setTreePath(const QString& path) bool VDirectoryTree::validatePath(const QString &path) { - QDir dir(path); - if (!dir.exists()) { - return false; - } - - QString configFile = dir.filePath(dirConfigFileName); - QFileInfo fileInfo(configFile); - return fileInfo.exists() && fileInfo.isFile(); + return QDir(path).exists(); } void VDirectoryTree::updateDirectoryTree() @@ -141,8 +135,8 @@ void VDirectoryTree::updateDirectoryTreeTopLevel() return; } - QJsonObject configJson = readDirectoryConfig(path); - if (!validateDirConfigFile(configJson)) { + QJsonObject configJson = VConfigManager::readDirectoryConfig(path); + if (configJson.isEmpty()) { qDebug() << "invalid notebook configuration for path:" << path; QMessageBox msgBox(QMessageBox::Warning, tr("Warning"), tr("Invalid notebook configuration.")); msgBox.setInformativeText(QString("Notebook path \"%1\" does not contain a valid configuration file.") @@ -182,8 +176,8 @@ void VDirectoryTree::updateDirectoryTreeOne(QTreeWidgetItem &parent, int depth) return; } - QJsonObject configJson = readDirectoryConfig(path); - if (!validateDirConfigFile(configJson)) { + QJsonObject configJson = VConfigManager::readDirectoryConfig(path); + if (configJson.isEmpty()) { qDebug() << "invalid notebook configuration for directory:" << path; QMessageBox msgBox(QMessageBox::Warning, tr("Warning"), tr("Invalid notebook directory configuration.")); msgBox.setInformativeText(QString("Notebook path \"%1\" does not contain a valid configuration file.") @@ -205,73 +199,6 @@ void VDirectoryTree::updateDirectoryTreeOne(QTreeWidgetItem &parent, int depth) } } -QJsonObject VDirectoryTree::readDirectoryConfig(const QString &path) -{ - QString configFile = QDir(path).filePath(dirConfigFileName); - - qDebug() << "read config file:" << configFile; - QFile config(configFile); - if (!config.open(QIODevice::ReadOnly)) { - qWarning() << "error: fail to read directory configuration file:" - << configFile; - QMessageBox msgBox(QMessageBox::Warning, tr("Warning"), - QString("Could not read directory configuration file \"%1\"") - .arg(dirConfigFileName)); - msgBox.setInformativeText(QString("Notebook directory \"%1\" may be corrupted").arg(path)); - msgBox.exec(); - return QJsonObject(); - } - - QByteArray configData = config.readAll(); - return QJsonDocument::fromJson(configData).object(); -} - -bool VDirectoryTree::writeDirectoryConfig(const QString &path, const QJsonObject &configJson) -{ - QString configFile = QDir(path).filePath(dirConfigFileName); - - qDebug() << "write config file:" << configFile; - QFile config(configFile); - if (!config.open(QIODevice::WriteOnly)) { - qWarning() << "error: fail to open directory configuration file for write:" - << configFile; - QMessageBox msgBox(QMessageBox::Warning, tr("Warning"), - QString("Could not write directory configuration file \"%1\"") - .arg(dirConfigFileName)); - msgBox.exec(); - return false; - } - - QJsonDocument configDoc(configJson); - config.write(configDoc.toJson()); - return true; -} - -bool VDirectoryTree::deleteDirectoryConfig(const QString &path) -{ - QString configFile = QDir(path).filePath(dirConfigFileName); - - QFile config(configFile); - if (!config.remove()) { - qWarning() << "error: fail to delete directory configuration file:" - << configFile; - return false; - } - qDebug() << "delete config file:" << configFile; - return true; -} - -bool VDirectoryTree::validateDirConfigFile(const QJsonObject &configJson) -{ - if (configJson.isEmpty()) { - return false; - } - if (!configJson.contains("version") || !configJson.contains("name")) { - return false; - } - return true; -} - void VDirectoryTree::updateItemSubtree(QTreeWidgetItem *item) { QJsonObject itemJson = item->data(0, Qt::UserRole).toJsonObject(); @@ -443,20 +370,21 @@ QTreeWidgetItem* VDirectoryTree::createDirectoryAndUpdateTree(QTreeWidgetItem *p configJson["sub_directories"] = QJsonArray(); configJson["files"] = QJsonArray(); - if (!writeDirectoryConfig(QDir(path).filePath(name), configJson)) { + if (!VConfigManager::writeDirectoryConfig(QDir(path).filePath(name), configJson)) { return NULL; } // Update parent's config file to include this new directory - configJson = readDirectoryConfig(path); + configJson = VConfigManager::readDirectoryConfig(path); + Q_ASSERT(!configJson.isEmpty()); QJsonObject itemJson; itemJson["name"] = name; itemJson["description"] = description; QJsonArray subDirArray = configJson["sub_directories"].toArray(); subDirArray.append(itemJson); configJson["sub_directories"] = subDirArray; - if (!writeDirectoryConfig(path, configJson)) { - deleteDirectoryConfig(QDir(path).filePath(name)); + if (!VConfigManager::writeDirectoryConfig(path, configJson)) { + VConfigManager::deleteDirectoryConfig(QDir(path).filePath(name)); dir.rmdir(name); return NULL; } @@ -472,7 +400,8 @@ void VDirectoryTree::deleteDirectoryAndUpdateTree(QTreeWidgetItem *item) // Update parent's config file to exclude this directory QString path = QDir(treePath).filePath(relativePath); - QJsonObject configJson = readDirectoryConfig(path); + QJsonObject configJson = VConfigManager::readDirectoryConfig(path); + Q_ASSERT(!configJson.isEmpty()); QJsonArray subDirArray = configJson["sub_directories"].toArray(); bool deleted = false; for (int i = 0; i < subDirArray.size(); ++i) { @@ -488,7 +417,7 @@ void VDirectoryTree::deleteDirectoryAndUpdateTree(QTreeWidgetItem *item) return; } configJson["sub_directories"] = subDirArray; - if (!writeDirectoryConfig(path, configJson)) { + if (!VConfigManager::writeDirectoryConfig(path, configJson)) { qWarning() << "error: fail to update parent's configuration file to delete" << itemName; return; } diff --git a/vdirectorytree.h b/vdirectorytree.h index f17e520b..e0cfe0f9 100644 --- a/vdirectorytree.h +++ b/vdirectorytree.h @@ -9,7 +9,7 @@ class VDirectoryTree : public QTreeWidget { Q_OBJECT public: - VDirectoryTree(const QString &dirConfigFileName, QWidget *parent = 0); + VDirectoryTree(QWidget *parent = 0); signals: @@ -38,8 +38,6 @@ private: void updateDirectoryTreeOne(QTreeWidgetItem &parent, int depth); // Validate if a directory is valid bool validatePath(const QString &path); - // Validate if a directory config file is valid - bool validateDirConfigFile(const QJsonObject &configJson); // Fill the QTreeWidgetItem according to its QJsonObject. // @relative_path is the path related to treePath. void fillDirectoryTreeItem(QTreeWidgetItem &item, QJsonObject itemJson, const QString &relativePath); @@ -49,18 +47,12 @@ private: void deleteDirectoryAndUpdateTree(QTreeWidgetItem *item); // If @name conflict with the children's names of @parent. bool isConflictNameWithChildren(const QTreeWidgetItem *parent, const QString &name); - // Read config from the directory config json file into a QJsonObject - QJsonObject readDirectoryConfig(const QString &path); - bool writeDirectoryConfig(const QString &path, const QJsonObject &configJson); - bool deleteDirectoryConfig(const QString &path); QTreeWidgetItem* insertDirectoryTreeItem(QTreeWidgetItem *parent, QTreeWidgetItem *preceding, const QJsonObject &newItem); void removeDirectoryTreeItem(QTreeWidgetItem *item); // The path of the directory tree root QString treePath; - // The name of the config file in each subdirectory - QString dirConfigFileName; // Actions QAction *newRootDirAct; diff --git a/vmainwindow.cpp b/vmainwindow.cpp index fb1e1afb..7a797a53 100644 --- a/vmainwindow.cpp +++ b/vmainwindow.cpp @@ -23,7 +23,7 @@ void VMainWindow::setupUI() // Notebook directory browser tree notebookLabel = new QLabel(tr("Notebook")); notebookComboBox = new QComboBox(); - directoryTree = new VDirectoryTree(VNote::dirConfigFileName); + directoryTree = new VDirectoryTree(); QHBoxLayout *nbTopLayout = new QHBoxLayout; notebookComboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); diff --git a/vnote.cpp b/vnote.cpp index 297ad8ce..2b486524 100644 --- a/vnote.cpp +++ b/vnote.cpp @@ -4,7 +4,6 @@ const QString VNote::orgName = QString("tamlok"); const QString VNote::appName = QString("VNote"); -const QString VNote::dirConfigFileName = QString(".vnote.json"); VNote::VNote() : curNotebookIndex(0) diff --git a/vnote.h b/vnote.h index b15ca59e..a57cf92b 100644 --- a/vnote.h +++ b/vnote.h @@ -17,8 +17,6 @@ public: int getCurNotebookIndex() const; void setCurNotebookIndex(int index); - // The name of the config file in each subdirectory - static const QString dirConfigFileName; static const QString orgName; static const QString appName;