xybrid/xybrid/fileops-config.cpp

128 lines
3.0 KiB
C++

#include "fileops.h"
#include "uisocket.h"
#include "config/uistate.h"
#include "config/uiconfig.h"
#include <QDebug>
#include <QFile>
#include <QCborMap>
#include <QCborArray>
#include <QCborStreamReader>
#include <QCborStreamWriter>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonValue>
#include <QUndoStack>
#include <QFileDialog>
#define qs QStringLiteral
using Xybrid::Data::Project;
using Xybrid::Data::Pattern;
using Xybrid::Data::Graph;
using Xybrid::Data::Node;
namespace FileOps = Xybrid::FileOps;
using namespace Xybrid::Config;
namespace { // utilities
inline void load(QCborValueRef m, QString& v) { v = m.toString(v); }
inline void load(QCborValueRef m, bool& v) { v = m.toBool(v); }
}
void FileOps::loadConfig() {
QFile file(Config::Directories::configFile);
if (file.open(QFile::ReadOnly)) { // file exists! read in
QCborStreamReader read(&file);
auto root = QCborValue::fromCbor(read).toMap();
file.close();
if (auto dirs = root[qs("directories")].toMap(); !dirs.isEmpty()) {
load(dirs[qs("projects")], Directories::projects);
load(dirs[qs("presets")], Directories::presets);
}
if (auto ui = root[qs("ui")].toMap(); !ui.isEmpty()) {
load(ui[qs("verticalKnobs")], UIConfig::verticalKnobs);
}
}
// make sure directories exist
if (auto d = QDir(Directories::projects); !d.exists()) d.mkpath(".");
if (auto d = QDir(Directories::presets); !d.exists()) d.mkpath(".");
}
void FileOps::saveConfig() {
QFileInfo fi(Directories::configFile);
fi.dir().mkpath("."); // make sure directory exists
QFile file(fi.filePath());
if (!file.open(QFile::WriteOnly)) return;
QCborMap root;
{
QCborMap dirs;
dirs[qs("projects")] = Directories::projects;
dirs[qs("presets")] = Directories::presets;
root[qs("directories")] = dirs;
}
{
QCborMap ui;
ui[qs("verticalKnobs")] = UIConfig::verticalKnobs;
root[qs("ui")] = ui;
}
// write out
QCborStreamWriter w(&file);
root.toCborValue().toCbor(w);
file.close();
}
void FileOps::loadUIState() {
QFile file(Directories::stateFile);
if (file.open(QFile::ReadOnly)) { // file exists! read in
QCborStreamReader read(&file);
auto root = QCborValue::fromCbor(read).toMap();
file.close();
if (auto recent = root[qs("recent")].toArray(); !recent.isEmpty()) {
UIState::recentFiles.clear();
for (auto r : recent) UIState::recentFiles.push_back(r.toString());
}
}
}
void FileOps::saveUIState() {
QFileInfo fi(Directories::stateFile);
fi.dir().mkpath("."); // make sure directory exists
QFile file(fi.filePath());
if (!file.open(QFile::WriteOnly)) return;
QCborMap root;
{
QCborArray recent;
for (auto& r : UIState::recentFiles) recent.append(r);
root[qs("recent")] = recent;
}
// write out
QCborStreamWriter w(&file);
root.toCborValue().toCbor(w);
file.close();
}