functions for importing/exporting nodes from/to file
parent
9d3c06aef0
commit
ad49babb96
5
notes
5
notes
|
@ -45,10 +45,11 @@ project data {
|
||||||
|
|
||||||
TODO {
|
TODO {
|
||||||
immediate frontburner {
|
immediate frontburner {
|
||||||
patchboard copy+paste! cbor array of node objects, position relative to center of viewport
|
patchboard copy+paste! cbor array of node objects
|
||||||
|
position: copy relative to centroid, paste relative to center of viewport
|
||||||
also record connections between those particular nodes!
|
also record connections between those particular nodes!
|
||||||
- provide conversions to/from qcborvalue in node.cpp?
|
- provide conversions to/from qcborvalue in node.cpp?
|
||||||
while we're here, add file import/export of any given node (still .xyg? .xyn?)
|
> while we're here, add file import/export of any given node (.xyn)
|
||||||
|
|
||||||
probably exclude i/o ports from copy+paste lest things futz up on the parent
|
probably exclude i/o ports from copy+paste lest things futz up on the parent
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ probably have a field of raw data for (some) node saves, and keep it resident in
|
||||||
|
|
||||||
extensions {
|
extensions {
|
||||||
.xyp - project
|
.xyp - project
|
||||||
.xyg - graph
|
.xyn - node
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include "fileops.h"
|
#include "fileops.h"
|
||||||
|
|
||||||
#include "uisocket.h"
|
#include "uisocket.h"
|
||||||
|
#include "data/project.h"
|
||||||
#include "data/graph.h"
|
#include "data/graph.h"
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
@ -15,6 +16,8 @@
|
||||||
|
|
||||||
using Xybrid::Data::Project;
|
using Xybrid::Data::Project;
|
||||||
using Xybrid::Data::Pattern;
|
using Xybrid::Data::Pattern;
|
||||||
|
using Xybrid::Data::Graph;
|
||||||
|
using Xybrid::Data::Node;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
constexpr uint32_t packedVersion(uint8_t major = 0, uint8_t minor = 0, uint8_t revision = 0, uint8_t wip = 0) {
|
constexpr uint32_t packedVersion(uint8_t major = 0, uint8_t minor = 0, uint8_t revision = 0, uint8_t wip = 0) {
|
||||||
|
@ -123,13 +126,16 @@ bool Xybrid::FileOps::saveProject(std::shared_ptr<Project> project, QString file
|
||||||
|
|
||||||
|
|
||||||
std::shared_ptr<Xybrid::Data::Project> Xybrid::FileOps::loadProject(QString fileName) {
|
std::shared_ptr<Xybrid::Data::Project> Xybrid::FileOps::loadProject(QString fileName) {
|
||||||
QFile file(fileName);
|
QCborArray root;
|
||||||
if (!file.open(QFile::ReadOnly)) return nullptr;
|
{
|
||||||
QCborStreamReader read(&file);
|
QFile file(fileName);
|
||||||
|
if (!file.open(QFile::ReadOnly)) return nullptr;
|
||||||
|
QCborStreamReader read(&file);
|
||||||
|
|
||||||
// if it's not an array it'll just return an empty which will fail the header check anyway
|
// if it's not an array it'll just return an empty which will fail the header check anyway
|
||||||
QCborArray root = QCborValue::fromCbor(read).toArray();
|
root = QCborValue::fromCbor(read).toArray();
|
||||||
file.close(); // don't want to leave this hanging any longer than necessary
|
file.close(); // don't want to leave this hanging any longer than necessary
|
||||||
|
}
|
||||||
|
|
||||||
// header and sanity checks
|
// header and sanity checks
|
||||||
if (root.at(0) != QString("xybrid:project")) return nullptr; // not a project
|
if (root.at(0) != QString("xybrid:project")) return nullptr; // not a project
|
||||||
|
@ -209,3 +215,39 @@ std::shared_ptr<Xybrid::Data::Project> Xybrid::FileOps::loadProject(QString file
|
||||||
|
|
||||||
return project;
|
return project;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Xybrid::FileOps::saveNode(std::shared_ptr<Xybrid::Data::Node> node, QString fileName) {
|
||||||
|
QFile file(fileName);
|
||||||
|
if (!file.open(QFile::WriteOnly)) return false;
|
||||||
|
|
||||||
|
// we handle header and let the node handle the rest of its conversion
|
||||||
|
QCborArray root;
|
||||||
|
root << "xybrid:node" << XYBRID_VERSION << node->toCbor();
|
||||||
|
|
||||||
|
// write out
|
||||||
|
QCborStreamWriter w(&file);
|
||||||
|
root.toCborValue().toCbor(w);
|
||||||
|
file.close();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<Xybrid::Data::Node> Xybrid::FileOps::loadNode(QString fileName, std::shared_ptr<Graph> parent) {
|
||||||
|
QCborArray root;
|
||||||
|
{
|
||||||
|
QFile file(fileName);
|
||||||
|
if (!file.open(QFile::ReadOnly)) return nullptr;
|
||||||
|
QCborStreamReader read(&file);
|
||||||
|
|
||||||
|
// if it's not an array it'll just return an empty which will fail the header check anyway
|
||||||
|
root = QCborValue::fromCbor(read).toArray();
|
||||||
|
file.close(); // don't want to leave this hanging any longer than necessary
|
||||||
|
}
|
||||||
|
|
||||||
|
// header and sanity checks
|
||||||
|
if (root.at(0) != QString("xybrid:node")) return nullptr; // not a node
|
||||||
|
if (auto v = root.at(1); !v.isInteger() || v.toInteger() > XYBRID_VERSION) return nullptr; // invalid version or too new
|
||||||
|
if (!root.at(2).isMap()) return nullptr; // so close, but... nope
|
||||||
|
|
||||||
|
return Node::fromCbor(root.at(2), parent); // let Node handle the rest
|
||||||
|
}
|
||||||
|
|
|
@ -1,12 +1,21 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "data/project.h"
|
#include <memory>
|
||||||
|
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
|
|
||||||
|
namespace Xybrid::Data {
|
||||||
|
class Project;
|
||||||
|
class Graph;
|
||||||
|
class Node;
|
||||||
|
}
|
||||||
|
|
||||||
namespace Xybrid::FileOps {
|
namespace Xybrid::FileOps {
|
||||||
//
|
//
|
||||||
bool saveProject(std::shared_ptr<Data::Project> project, QString fileName = "");
|
bool saveProject(std::shared_ptr<Data::Project> project, QString fileName = "");
|
||||||
std::shared_ptr<Data::Project> loadProject(QString fileName);
|
std::shared_ptr<Data::Project> loadProject(QString fileName);
|
||||||
|
|
||||||
|
bool saveNode(std::shared_ptr<Data::Node> node, QString fileName = "");
|
||||||
|
std::shared_ptr<Data::Node> loadNode(QString fileName, std::shared_ptr<Data::Graph> parent = nullptr);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue