Further work on snapshots feature
This commit is contained in:
parent
6156cbbe1d
commit
a22a17a995
3 changed files with 68 additions and 24 deletions
|
@ -31,6 +31,7 @@
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
#include <QRegularExpression>
|
#include <QRegularExpression>
|
||||||
|
#include <QDataStream>
|
||||||
|
|
||||||
#include "canvasconnection.h"
|
#include "canvasconnection.h"
|
||||||
|
|
||||||
|
@ -117,7 +118,7 @@ void ApplicationController::saveSnapshot(QString snapshotName)
|
||||||
|
|
||||||
// convert spaces to underscores
|
// convert spaces to underscores
|
||||||
QString filesystemCleanName = snapshotName.replace(QRegularExpression("[\\s-\\\"/]"), "_");
|
QString filesystemCleanName = snapshotName.replace(QRegularExpression("[\\s-\\\"/]"), "_");
|
||||||
QFile f(d.filePath(filesystemCleanName + ".json"));
|
QFile f(d.filePath(filesystemCleanName + ".fgcanvassnapshot"));
|
||||||
if (f.exists()) {
|
if (f.exists()) {
|
||||||
qWarning() << "not over-writing" << f.fileName();
|
qWarning() << "not over-writing" << f.fileName();
|
||||||
return;
|
return;
|
||||||
|
@ -135,7 +136,29 @@ void ApplicationController::saveSnapshot(QString snapshotName)
|
||||||
|
|
||||||
void ApplicationController::restoreSnapshot(int index)
|
void ApplicationController::restoreSnapshot(int index)
|
||||||
{
|
{
|
||||||
|
QString path = m_snapshots.at(index).toMap().value("path").toString();
|
||||||
|
QFile f(path);
|
||||||
|
if (!f.open(QIODevice::ReadOnly)) {
|
||||||
|
qWarning() << Q_FUNC_INFO << "failed to open the file";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
clearConnections();
|
||||||
|
|
||||||
|
{
|
||||||
|
QDataStream ds(&f);
|
||||||
|
int version, canvasCount;
|
||||||
|
QString name;
|
||||||
|
ds >> version >> name >> canvasCount;
|
||||||
|
|
||||||
|
for (int i=0; i < canvasCount; ++i) {
|
||||||
|
CanvasConnection* cc = new CanvasConnection(this);
|
||||||
|
cc->restoreSnapshot(ds);
|
||||||
|
m_activeCanvases.append(cc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
emit activeCanvasesChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ApplicationController::rebuildSnapshotData()
|
void ApplicationController::rebuildSnapshotData()
|
||||||
|
@ -148,17 +171,21 @@ void ApplicationController::rebuildSnapshotData()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// this requires parsing each snapshit in its entirety just to extract
|
Q_FOREACH (auto entry, d.entryList(QStringList() << "*.fgcanvassnapshot")) {
|
||||||
// the name, which is horrible.
|
|
||||||
Q_FOREACH (auto entry, d.entryList(QStringList() << "*.json")) {
|
|
||||||
QFile f(d.filePath(entry));
|
QFile f(d.filePath(entry));
|
||||||
f.open(QIODevice::ReadOnly);
|
f.open(QIODevice::ReadOnly);
|
||||||
QJsonDocument doc = QJsonDocument::fromJson(f.readAll());
|
{
|
||||||
|
QDataStream ds(&f);
|
||||||
|
int version;
|
||||||
|
QString name;
|
||||||
|
ds >> version;
|
||||||
|
|
||||||
QVariantMap m;
|
QVariantMap m;
|
||||||
m["path"] = f.fileName();
|
m["path"] = f.fileName();
|
||||||
m["name"] = doc.object().value("snapshotName").toString();
|
ds >>name;
|
||||||
m_snapshots.append(m);
|
m["name"] = name;
|
||||||
|
m_snapshots.append(m);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
emit snapshotListChanged();
|
emit snapshotListChanged();
|
||||||
|
@ -405,19 +432,17 @@ void ApplicationController::clearConnections()
|
||||||
|
|
||||||
QByteArray ApplicationController::createSnapshot(QString name) const
|
QByteArray ApplicationController::createSnapshot(QString name) const
|
||||||
{
|
{
|
||||||
QJsonObject json;
|
QByteArray bytes;
|
||||||
json["snapshotName"] = name;
|
const int version = 1;
|
||||||
#if 0
|
{
|
||||||
QJsonArray canvases;
|
QDataStream ds(&bytes, QIODevice::WriteOnly);
|
||||||
Q_FOREACH (auto canvas, m_activeCanvases) {
|
ds << version << name;
|
||||||
canvases.append(canvas->saveState());
|
|
||||||
|
ds << m_activeCanvases.size();
|
||||||
|
Q_FOREACH(auto c, m_activeCanvases) {
|
||||||
|
c->saveSnapshot(ds);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
json["canvases"] = canvases;
|
return bytes;
|
||||||
// background color?
|
|
||||||
// window geometry and state?
|
|
||||||
#endif
|
|
||||||
QJsonDocument doc;
|
|
||||||
doc.setObject(json);
|
|
||||||
return doc.toJson();
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include <QNetworkRequest>
|
#include <QNetworkRequest>
|
||||||
#include <QNetworkAccessManager>
|
#include <QNetworkAccessManager>
|
||||||
#include <QNetworkReply>
|
#include <QNetworkReply>
|
||||||
|
#include <QDataStream>
|
||||||
|
|
||||||
#include "localprop.h"
|
#include "localprop.h"
|
||||||
#include "fgqcanvasfontcache.h"
|
#include "fgqcanvasfontcache.h"
|
||||||
|
@ -88,6 +89,20 @@ bool CanvasConnection::restoreState(QJsonObject state)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CanvasConnection::saveSnapshot(QDataStream &ds) const
|
||||||
|
{
|
||||||
|
ds << m_webSocketUrl << m_rootPropertyPath << m_destRect;
|
||||||
|
m_localPropertyRoot->saveToStream(ds);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CanvasConnection::restoreSnapshot(QDataStream &ds)
|
||||||
|
{
|
||||||
|
ds >> m_webSocketUrl >> m_rootPropertyPath >> m_destRect;
|
||||||
|
m_localPropertyRoot.reset(new LocalProp{nullptr, NameIndexTuple("")});
|
||||||
|
m_localPropertyRoot->restoreFromStream(ds, nullptr);
|
||||||
|
setStatus(Snapshot);
|
||||||
|
}
|
||||||
|
|
||||||
void CanvasConnection::reconnect()
|
void CanvasConnection::reconnect()
|
||||||
{
|
{
|
||||||
m_webSocket.open(m_webSocketUrl);
|
m_webSocket.open(m_webSocketUrl);
|
||||||
|
|
|
@ -30,6 +30,7 @@ class LocalProp;
|
||||||
class QNetworkAccessManager;
|
class QNetworkAccessManager;
|
||||||
class FGQCanvasImageLoader;
|
class FGQCanvasImageLoader;
|
||||||
class FGQCanvasFontCache;
|
class FGQCanvasFontCache;
|
||||||
|
class QDataStream;
|
||||||
|
|
||||||
class CanvasConnection : public QObject
|
class CanvasConnection : public QObject
|
||||||
{
|
{
|
||||||
|
@ -59,7 +60,8 @@ public:
|
||||||
Connected,
|
Connected,
|
||||||
Closed,
|
Closed,
|
||||||
Reconnecting,
|
Reconnecting,
|
||||||
Error
|
Error,
|
||||||
|
Snapshot // offline mode, data from snapshot
|
||||||
};
|
};
|
||||||
|
|
||||||
Status status() const
|
Status status() const
|
||||||
|
@ -70,6 +72,9 @@ public:
|
||||||
QJsonObject saveState() const;
|
QJsonObject saveState() const;
|
||||||
bool restoreState(QJsonObject state);
|
bool restoreState(QJsonObject state);
|
||||||
|
|
||||||
|
void saveSnapshot(QDataStream& ds) const;
|
||||||
|
void restoreSnapshot(QDataStream &ds);
|
||||||
|
|
||||||
void connectWebSocket(QByteArray hostName, int port);
|
void connectWebSocket(QByteArray hostName, int port);
|
||||||
QPointF origin() const;
|
QPointF origin() const;
|
||||||
|
|
||||||
|
@ -129,7 +134,6 @@ private:
|
||||||
std::unique_ptr<LocalProp> m_localPropertyRoot;
|
std::unique_ptr<LocalProp> m_localPropertyRoot;
|
||||||
QHash<int, LocalProp*> idPropertyDict;
|
QHash<int, LocalProp*> idPropertyDict;
|
||||||
Status m_status = NotConnected;
|
Status m_status = NotConnected;
|
||||||
QString m_rootPath;
|
|
||||||
|
|
||||||
mutable FGQCanvasImageLoader* m_imageLoader = nullptr;
|
mutable FGQCanvasImageLoader* m_imageLoader = nullptr;
|
||||||
mutable FGQCanvasFontCache* m_fontCache = nullptr;
|
mutable FGQCanvasFontCache* m_fontCache = nullptr;
|
||||||
|
|
Loading…
Reference in a new issue