ChunkStream add(int, Chunk)

Graphic save() and load() version 2


git-svn-id: svn://db.shs.com.ru/libs@346 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
2018-01-18 11:37:50 +00:00
parent e53bcb1733
commit 7a3f3a928e
5 changed files with 106 additions and 27 deletions

View File

@@ -1510,25 +1510,67 @@ bool Graphic::legendVisible() const {
QByteArray Graphic::save() {
QByteArray ba;
QDataStream s(&ba, QIODevice::ReadWrite);
s << openGL() << antialiasing() << borderInputsVisible() << statusVisible() << legendVisible();
s << graphics;
return ba;
// QByteArray ba;
// QDataStream s(&ba, QIODevice::ReadWrite);
// s << openGL() << antialiasing() << borderInputsVisible() << statusVisible() << legendVisible();
// s << graphics;
// return ba;
// version '2':
ChunkStream cs;
cs.add(1, antialiasing()).add(2, openGL()).add(3, borderInputsVisible()).add(4, statusVisible()).add(5, legendVisible());
cs.add(6, backgroundColor()).add(7, textColor()).add(8, margins());
cs.add(9, gridPen()).add(10, graduationX()).add(11, graduationY()).add(12, graduationStepX()).add(13, graduationStepY());
cs.add(14, graphics);
cs.add(15, isFit).add(16, visualRect());
return cs.data().prepend('2');
}
void Graphic::load(QByteArray ba) {
if (ba.isEmpty()) return;
QDataStream s(ba);
bool a;
s >> a; setOpenGL(a);
s >> a; setAntialiasing(a);
s >> a; setBorderInputsVisible(a);
s >> a; setStatusVisible(a);
s >> a;
s >> graphics;
setLegendVisible(a);
char ver = ba[0];
qDebug() << "load" << (int)ver;
switch(ver) {
case '2': {// version '2':
ba.remove(0, 1);
QRectF vrect;
ChunkStream cs(ba);
while (!cs.atEnd()) {
switch (cs.read()) {
case 1: setAntialiasing(cs.getData<bool>()); break;
case 2: setOpenGL(cs.getData<bool>()); break;
case 3: setBorderInputsVisible(cs.getData<bool>()); break;
case 4: setStatusVisible(cs.getData<bool>()); break;
case 5: setLegendVisible(cs.getData<bool>()); break;
case 6: setBackgroundColor(cs.getData<QColor>()); break;
case 7: setTextColor(cs.getData<QColor>()); break;
case 8: setMargins(cs.getData<QRect>()); break;
case 9: setGridPen(cs.getData<QPen>()); break;
case 10: setGraduationX(cs.getData<Graduation>()); break;
case 11: setGraduationY(cs.getData<Graduation>()); break;
case 12: setGraduationStepX(cs.getData<double>()); break;
case 13: setGraduationStepY(cs.getData<double>()); break;
case 14: graphics = cs.getData<QVector<GraphicType> >(); break;
case 15: isFit = cs.getData<bool>(); break;
case 16: vrect = cs.getData<QRectF>(); break;
default: break;
}
}
if (!isFit) setVisualRect(vrect);
} break;
default: {// old version 0:
QDataStream s(ba);
bool a;
s >> a; setOpenGL(a);
s >> a; setAntialiasing(a);
s >> a; setBorderInputsVisible(a);
s >> a; setStatusVisible(a);
s >> a;
s >> graphics;
setLegendVisible(a);
} break;
}
}

View File

@@ -83,7 +83,7 @@ class Graphic: public QFrame
Q_PROPERTY(QRectF visualRect READ visualRect WRITE setVisualRect)
Q_PROPERTY(QRectF defaultRect READ defaultRect WRITE setDefaultRect)
Q_PROPERTY(int minimumRepaintInterval READ minimumRepaintInterval WRITE setMinimumRepaintInterval)
Q_PROPERTY(double gridNumbersMultiplierX READ gridNumbersMultiplierX WRITE setGridNumbersMultiplierX)
Q_PROPERTY(double gridNumbersMultiplierY READ gridNumbersMultiplierY WRITE setGridNumbersMultiplierY)
Q_PROPERTY(Graduation graduationX READ graduationX WRITE setGraduationX)
@@ -95,7 +95,7 @@ class Graphic: public QFrame
Q_PROPERTY(int histogramMinIntervals READ histogramMinIntervals WRITE setHistogramMinIntervals)
Q_PROPERTY(int histogramMaxIntervals READ histogramMaxIntervals WRITE setHistogramMaxIntervals)
Q_PROPERTY(double histogramMinDeltaMultiplier READ histogramMinDeltaMultiplier WRITE setHistogramMinDeltaMultiplier)
Q_PROPERTY(Graphic::GraphicsData graphicsData READ graphicsData WRITE setGraphicsData)
public:
@@ -191,13 +191,13 @@ public:
///void reset() {mutex.lock(); clear(); mutex.unlock();}
void reset() {clear();}
GraphicType graphic(int arg) {if (arg < 0 || arg >= graphics.size()) return GraphicType(); return graphics[arg];}
const QVector<GraphicType> & allGraphics() const {return graphics;}
void setAllGraphics(const QVector<GraphicType> & g, bool update = true) {graphics = g; if (update) updateLegend();}
void setHistogramData(const QVector<float> & g, int graphic);
void setHistogramData(const QVector<float> & g) {setHistogramData(g, curGraphic);}
double canvas2realX(double px) const;
double canvas2realY(double py) const;
double real2canvasX(double px) const;
@@ -270,7 +270,7 @@ public slots:
void setHistogramMaxIntervals(int value) {max_int = value; updateGraphics();}
void setHistogramMinDeltaMultiplier(double value) {mdm = value; updateGraphics();}
void setGraphicsData(const GraphicsData & gd);
void setGridNumbersMultiplierX(double value) {grid_numbers_x = value; updateGraphics();}
void setGridNumbersMultiplierY(double value) {grid_numbers_y = value; updateGraphics();}
void setGraduationX(Graduation value) {grad_x = value; if (aupdate) update();;}
@@ -301,7 +301,7 @@ public slots:
void updateGraphics() {findGraphicsRect(); update();}
void setCurrentGraphic(int arg) {if (arg < 0 || arg >= graphics.size()) return; curGraphic = arg;}
void setGraphicsCount(int arg, bool update = true);
void zoom(float factor);
void zoomIn() {zoom(1. / 1.2);}
void zoomOut() {zoom(1.2);}
@@ -420,8 +420,8 @@ Q_DECLARE_METATYPE(Graphic::GraphicsData)
Q_DECLARE_OPERATORS_FOR_FLAGS(Graphic::Buttons)
//inline QDataStream & operator <<(QDataStream & s, const Graphic::GraphicsData & v) {s << v; return s;}
//inline QDataStream & operator >>(QDataStream & s, Graphic::GraphicsData & v) {s >> v; return s;}
inline QDataStream & operator <<(QDataStream & s, const Graphic::Graduation & v) {s << (int)v; return s;}
inline QDataStream & operator >>(QDataStream & s, Graphic::Graduation & v) {s >> *((int*)(&v)); return s;}
class __GraphicRegistrator__ {
public:

View File

@@ -13,7 +13,7 @@ public:
ChunkStream(QDataStream & str) {setSource(str);}
ChunkStream(QByteArray * data = 0) {setSource(data);}
~ChunkStream();
template <typename T>
struct Chunk {
Chunk(int i, const T & d): id(i), data(d) {}
@@ -21,14 +21,16 @@ public:
T data;
};
template <typename T> static Chunk<T> chunk(int id, const T & data) {return Chunk<T>(id, data);}
template <typename T> ChunkStream & add(int id, const T & data) {*this << Chunk<T>(id, data); return *this;}
void setSource(const QByteArray & data);
void setSource(QDataStream & str);
void setSource(QByteArray * data);
QDataStream & dataStream() {return stream_;}
QByteArray data() const {return tmp_data;}
bool atEnd() const {return stream_.atEnd();}
int read() {stream_ >> last_id >> last_data; return last_id;}
int getID() {return last_id;}
template <typename T>
@@ -37,12 +39,12 @@ public:
void get(T & v) const {v = getData<T>();}
private:
void _init();
int last_id;
QByteArray * data_, last_data, tmp_data;
QBuffer buffer;
QDataStream stream_;
};
template <typename T>