[nostalgia/studio] Add save action and cleanup
This commit is contained in:
@@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
@@ -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,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);
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user