[nostalgia/studio] Add save action and cleanup

This commit is contained in:
2020-02-29 00:28:32 -06:00
parent eddf89a321
commit 320d8c1143
17 changed files with 100 additions and 53 deletions
-18
View File
@@ -4,8 +4,6 @@ set(CMAKE_AUTOMOC ON)
add_library(
NostalgiaStudio SHARED
editor.cpp
json_read.cpp
json_write.cpp
wizard.cpp
plugin.cpp
project.cpp
@@ -27,10 +25,6 @@ target_link_libraries(
install(
FILES
editor.hpp
json.hpp
json_err.hpp
json_read.hpp
json_write.hpp
wizard.hpp
plugin.hpp
project.hpp
@@ -38,15 +32,3 @@ install(
DESTINATION
include/nostalgia/studio/lib
)
add_executable(
NostalgiaStudioJsonTest
json_test.cpp
)
target_link_libraries(
NostalgiaStudioJsonTest
NostalgiaStudio
)
add_test("Test\\ NostalgiaStudioJson" NostalgiaStudioJsonTest)
@@ -8,11 +8,16 @@
#pragma once
#include <QString>
#include <QWidget>
namespace nostalgia::studio {
enum {
JSON_ERR_FIELD_MISSING = 1,
JSON_ERR_UNEXPECTED_TYPE = 2,
struct Context {
QString appName;
QString orgName;
QWidget* tabParent = nullptr;
const class Project* project = nullptr;
};
}
+11 -1
View File
@@ -13,11 +13,21 @@ namespace nostalgia::studio {
Editor::Editor(QWidget *parent): QWidget(parent) {
}
void Editor::save() {
void Editor::saveItem() {
}
QUndoStack *Editor::undoStack() {
return nullptr;
}
void Editor::save() {
save();
setUnsavedChanges(false);
}
void Editor::setUnsavedChanges(bool uc) {
m_unsavedChanges = uc;
emit unsavedChangesUpdate(uc);
}
}
+18 -1
View File
@@ -18,6 +18,9 @@ namespace nostalgia::studio {
class NOSTALGIASTUDIO_EXPORT Editor: public QWidget {
Q_OBJECT
private:
bool m_unsavedChanges = false;
public:
Editor(QWidget *parent);
@@ -31,13 +34,27 @@ class NOSTALGIASTUDIO_EXPORT Editor: public QWidget {
/**
* Save changes to item being edited.
*/
virtual void save();
virtual void saveItem();
/**
* Returns the undo stack holding changes to the item being edited.
*/
virtual QUndoStack *undoStack();
/**
* Save changes to item being edited.
*/
void save();
/**
* Sets indication of item being edited has unsaved changes. Also emits
* unsavedChangesUpdate signal.
*/
void setUnsavedChanges(bool);
signals:
void unsavedChangesUpdate(bool);
};
}
-31
View File
@@ -1,31 +0,0 @@
/*
* Copyright 2016 - 2019 gtalent2@gmail.com
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#pragma once
#include "json_read.hpp"
#include "json_write.hpp"
namespace nostalgia::studio {
class JsonOperator {
public:
virtual ~JsonOperator() = default;
virtual int op(QString fieldName, int *dest) = 0;
virtual int op(QString fieldName, bool *dest) = 0;
virtual int op(QString fieldName, double *dest) = 0;
virtual int op(QString fieldName, QString *dest) = 0;
};
}
-87
View File
@@ -1,87 +0,0 @@
/*
* Copyright 2016 - 2019 gtalent2@gmail.com
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#include "json_read.hpp"
namespace nostalgia::studio {
JsonReader::JsonReader(QJsonObject &obj): m_src(obj) {
}
ox::Error JsonReader::field(QString fieldName, int *dest) {
if (m_src.contains(fieldName)) {
return field(m_src[fieldName], dest);
} else {
return OxError(JSON_ERR_FIELD_MISSING);
}
}
ox::Error JsonReader::field(QString fieldName, bool *dest) {
if (m_src.contains(fieldName)) {
return field(m_src[fieldName], dest);
} else {
return OxError(JSON_ERR_FIELD_MISSING);
}
}
ox::Error JsonReader::field(QString fieldName, double *dest) {
if (m_src.contains(fieldName)) {
return field(m_src[fieldName], dest);
} else {
return OxError(JSON_ERR_FIELD_MISSING);
}
}
ox::Error JsonReader::field(QString fieldName, QString *dest) {
if (m_src.contains(fieldName)) {
return field(m_src[fieldName], dest);
} else {
return OxError(JSON_ERR_FIELD_MISSING);
}
}
ox::Error JsonReader::field(QJsonValueRef src, int *dest) {
if (src.isDouble()) {
*dest = src.toInt();
return OxError(0);
} else {
return OxError(JSON_ERR_UNEXPECTED_TYPE);
}
}
ox::Error JsonReader::field(QJsonValueRef src, bool *dest) {
if (src.isBool()) {
*dest = src.toBool();
return OxError(0);
} else {
return OxError(JSON_ERR_UNEXPECTED_TYPE);
}
}
ox::Error JsonReader::field(QJsonValueRef src, double *dest) {
if (src.isDouble()) {
*dest = src.toDouble();
return OxError(0);
} else {
return OxError(JSON_ERR_UNEXPECTED_TYPE);
}
}
ox::Error JsonReader::field(QJsonValueRef src, QString *dest) {
if (src.isString()) {
*dest = src.toString();
return OxError(0);
} else {
return OxError(JSON_ERR_UNEXPECTED_TYPE);
}
}
}
-105
View File
@@ -1,105 +0,0 @@
/*
* Copyright 2016 - 2019 gtalent2@gmail.com
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#pragma once
#include <QDebug>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonDocument>
#include <ox/std/error.hpp>
#include "json_err.hpp"
namespace nostalgia::studio {
class JsonReader {
private:
QJsonObject &m_src;
public:
JsonReader(QJsonObject &obj);
ox::Error setTypeInfo(const char*, int) { return OxError(0); };
ox::Error field(QString fieldName, int *dest);
ox::Error field(QString fieldName, bool *dest);
ox::Error field(QString fieldName, double *dest);
ox::Error field(QString fieldName, QString *dest);
template<typename T>
ox::Error field(QString fieldName, T *dest);
template<typename T>
ox::Error field(QString fieldName, QVector<T> *dest);
private:
ox::Error field(QJsonValueRef src, int *dest);
ox::Error field(QJsonValueRef src, bool *dest);
ox::Error field(QJsonValueRef src, double *dest);
ox::Error field(QJsonValueRef src, QString *dest);
template<typename T>
ox::Error field(QJsonValueRef src, T *dest);
};
template<typename T>
ox::Error JsonReader::field(QString fieldName, T *dest) {
if (m_src.contains(fieldName)) {
auto obj = m_src[fieldName].toObject();
auto reader = JsonReader(obj);
return model(&reader, dest);
} else {
return OxError(JSON_ERR_FIELD_MISSING);
}
}
template<typename T>
ox::Error JsonReader::field(QString fieldName, QVector<T> *dest) {
auto err = OxError(0);
if (m_src.contains(fieldName)) {
auto a = m_src[fieldName].toArray();
dest->resize(a.size());
for (int i = 0; i < dest->size(); i++) {
oxReturnError(field(a[i], &(*dest)[i]));
}
} else {
err = OxError(JSON_ERR_FIELD_MISSING);
}
return err;
}
template<typename T>
ox::Error JsonReader::field(QJsonValueRef src, T *dest) {
auto obj = src.toObject();
auto reader = JsonReader(obj);
return model(&reader, dest);
}
template<typename T>
ox::Error readJson(QString json, T *dest) {
QJsonParseError err;
auto obj = QJsonDocument::fromJson(json.toUtf8(), &err).object();
if (err.error) {
qDebug() << "JSON parsing error:" << err.errorString();
return OxError(1);
}
JsonReader rdr(obj);
return model(&rdr, dest);
}
}
-90
View File
@@ -1,90 +0,0 @@
/*
* Copyright 2016 - 2019 gtalent2@gmail.com
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#include <iostream>
#include <ox/std/assert.hpp>
#include "json.hpp"
using namespace std;
using namespace ox;
using namespace nostalgia::studio;
struct TestStructNest {
bool Bool;
int Int;
double Double;
QString String;
};
template<typename T>
Error model(T *io, TestStructNest *obj) {
auto err = OxError(0);
err |= io->setTypeInfo("TestStructNest", 4);
err |= io->field("Bool", &obj->Bool);
err |= io->field("Int", &obj->Int);
err |= io->field("Double", &obj->Double);
err |= io->field("String", &obj->String);
return err;
}
struct TestStruct {
bool Bool;
int Int;
double Double;
QString String;
TestStructNest Struct;
};
template<typename T>
Error model(T *io, TestStruct *obj) {
auto err = OxError(0);
err |= io->setTypeInfo("TestStruct", 5);
err |= io->field("Bool", &obj->Bool);
err |= io->field("Int", &obj->Int);
err |= io->field("Double", &obj->Double);
err |= io->field("String", &obj->String);
err |= io->field("Struct", &obj->Struct);
return err;
}
int main() {
auto err = OxError(0);
QString json;
TestStruct ts = {
true,
42,
42.42,
"Test String",
{
true,
42,
42.42,
"Test String"
}
};
TestStruct tsOut;
err |= writeJson(&json, &ts);
err |= readJson(json, &tsOut);
cout << tsOut.Bool << endl;
cout << tsOut.Int << endl;
cout << tsOut.Double << endl;
cout << tsOut.String.toStdString() << endl;
oxAssert(tsOut.Bool, "Arg 1 failed");
oxAssert(tsOut.Int == 42, "Arg 2 failed");
oxAssert(tsOut.Double == 42.42, "Arg 3 failed");
oxAssert(tsOut.String == "Test String", "Arg 4 failed");
oxAssert(tsOut.Struct.Bool, "Arg 5 failed");
oxAssert(tsOut.Struct.Int == 42, "Arg 6 failed");
oxAssert(tsOut.Struct.Double == 42.42, "Arg 7 failed");
oxAssert(tsOut.Struct.String == "Test String", "Arg 8 failed");
return static_cast<int>(err);
}
-36
View File
@@ -1,36 +0,0 @@
/*
* Copyright 2016 - 2019 gtalent2@gmail.com
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#include "json_write.hpp"
namespace nostalgia::studio {
JsonWriter::JsonWriter(QJsonObject &obj): m_dest(obj) {
}
ox::Error JsonWriter::field(QString fieldName, int *src) {
m_dest[fieldName] = *src;
return OxError(0);
}
ox::Error JsonWriter::field(QString fieldName, bool *src) {
m_dest[fieldName] = *src;
return OxError(0);
}
ox::Error JsonWriter::field(QString fieldName, double *src) {
m_dest[fieldName] = *src;
return OxError(0);
}
ox::Error JsonWriter::field(QString fieldName, QString *src) {
m_dest[fieldName] = *src;
return OxError(0);
}
}
-76
View File
@@ -1,76 +0,0 @@
/*
* Copyright 2016 - 2019 gtalent2@gmail.com
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#pragma once
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonDocument>
#include <ox/std/error.hpp>
#include "json_err.hpp"
namespace nostalgia::studio {
class JsonWriter {
private:
QJsonObject &m_dest;
public:
JsonWriter(QJsonObject &obj);
ox::Error setTypeInfo(const char*, int) { return OxError(0); };
ox::Error field(QString fieldName, int *src);
ox::Error field(QString fieldName, bool *src);
ox::Error field(QString fieldName, double *src);
ox::Error field(QString fieldName, QString *src);
template<typename T>
ox::Error field(QString fieldName, T *src);
template<typename T>
ox::Error field(QString fieldName, QVector<T> *src);
};
template<typename T>
ox::Error JsonWriter::field(QString fieldName, T *src) {
auto obj = QJsonObject();
auto reader = JsonWriter(obj);
auto err = model(&reader, src);
m_dest[fieldName] = obj;
return err;
}
template<typename T>
ox::Error JsonWriter::field(QString fieldName, QVector<T> *src) {
auto err = OxError(0);
QJsonArray a;
for (int i = 0; i < src->size(); i++) {
err |= field(a[i], &src->at(i));
}
m_dest[fieldName] = a;
return err;
}
template<typename T>
ox::Error writeJson(QString *json, T *src) {
auto obj = QJsonObject();
JsonWriter rdr(obj);
auto err = model(&rdr, src);
*json = QJsonDocument(obj).toJson();
return err;
}
}
+1
View File
@@ -6,6 +6,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#include "context.hpp"
#include "plugin.hpp"
namespace nostalgia::studio {
+4 -13
View File
@@ -13,22 +13,13 @@
#include <QVector>
#include <QWizardPage>
#include "editor.hpp"
#include "project.hpp"
#include "wizard.hpp"
namespace nostalgia::studio {
struct Context {
QString appName;
QString orgName;
QWidget *tabParent = nullptr;
const Project *project = nullptr;
};
struct EditorMaker {
QStringList fileTypes;
std::function<Editor*(QString)> make;
std::function<class Editor*(QString)> make;
};
class Plugin {
@@ -36,13 +27,13 @@ class Plugin {
public:
virtual ~Plugin() = default;
virtual QVector<WizardMaker> newWizards(const Context *ctx);
virtual QVector<WizardMaker> newWizards(const class Context *ctx);
virtual QVector<WizardMaker> importWizards(const Context *ctx);
virtual QWidget *makeEditor(QString path, const Context *ctx);
virtual QWidget *makeEditor(QString path, const class Context *ctx);
virtual QVector<EditorMaker> editors(const Context *ctx);
virtual QVector<EditorMaker> editors(const class Context *ctx);
};