Serialize/deserialize for copy/paste.

This commit is contained in:
Jim Evins
2017-03-14 23:29:46 -04:00
parent fd79d7c6bd
commit c8f7011cd0
6 changed files with 46 additions and 43 deletions
+2 -2
View File
@@ -32,9 +32,9 @@ namespace glabels
}
DataCache::DataCache( const LabelModel* model )
DataCache::DataCache( const QList<LabelModelObject*>& objects )
{
foreach( LabelModelObject* object, model->objectList() )
foreach( LabelModelObject* object, objects )
{
if ( LabelModelImageObject* imageObject = dynamic_cast<LabelModelImageObject*>(object) )
{
+1 -1
View File
@@ -33,7 +33,7 @@ namespace glabels
public:
DataCache();
DataCache( const LabelModel* model );
DataCache( const QList<LabelModelObject*>& objects );
bool hasImage( const QString& name ) const;
QImage getImage( const QString& name ) const;
+15 -20
View File
@@ -88,8 +88,10 @@ namespace glabels
QDomElement root = doc.createElement( "Glabels-objects" );
doc.appendChild( root );
XmlUtil::setStringAttr( root, "version", "4.0" );
addObjectsToNode( root, objects );
createDataNode( root, objects );
createObjectsNode( root, objects, false );
buffer = doc.toByteArray( 2 );
}
@@ -107,60 +109,53 @@ namespace glabels
XmlTemplateCreator().createTemplateNode( root, label->tmplate() );
createObjectsNode( root, label );
createObjectsNode( root, label->objectList(), label->rotate() );
if ( label->merge() && !dynamic_cast<merge::None*>(label->merge()) )
{
createMergeNode( root, label );
}
createDataNode( root, label );
createDataNode( root, label->objectList() );
}
void
XmlLabelCreator::createObjectsNode( QDomElement &parent, const LabelModel* label )
XmlLabelCreator::createObjectsNode( QDomElement &parent, const QList<LabelModelObject*>& objects, bool rotate )
{
QDomDocument doc = parent.ownerDocument();
QDomElement node = doc.createElement( "Objects" );
parent.appendChild( node );
XmlUtil::setStringAttr( node, "id", "0" );
XmlUtil::setBoolAttr( node, "rotate", label->rotate() );
XmlUtil::setBoolAttr( node, "rotate", rotate );
addObjectsToNode( node, label->objectList() );
}
void
XmlLabelCreator::addObjectsToNode( QDomElement &parent, const QList<LabelModelObject*>& objects )
{
foreach ( LabelModelObject* object, objects )
{
if ( LabelModelBoxObject* boxObject = dynamic_cast<LabelModelBoxObject*>(object) )
{
createObjectBoxNode( parent, boxObject );
createObjectBoxNode( node, boxObject );
}
else if ( LabelModelEllipseObject* ellipseObject = dynamic_cast<LabelModelEllipseObject*>(object) )
{
createObjectEllipseNode( parent, ellipseObject );
createObjectEllipseNode( node, ellipseObject );
}
else if ( LabelModelLineObject* lineObject = dynamic_cast<LabelModelLineObject*>(object) )
{
createObjectLineNode( parent, lineObject );
createObjectLineNode( node, lineObject );
}
else if ( LabelModelImageObject* imageObject = dynamic_cast<LabelModelImageObject*>(object) )
{
createObjectImageNode( parent, imageObject );
createObjectImageNode( node, imageObject );
}
else if ( LabelModelTextObject* textObject = dynamic_cast<LabelModelTextObject*>(object) )
{
createObjectTextNode( parent, textObject );
createObjectTextNode( node, textObject );
}
// TODO: other object types
else
{
Q_ASSERT_X( false, "XmlLabelCreator::addObjectsToNode", "Invalid object type." );
Q_ASSERT_X( false, "XmlLabelCreator::createObjectsNode", "Invalid object type." );
}
}
}
@@ -444,13 +439,13 @@ namespace glabels
void
XmlLabelCreator::createDataNode( QDomElement &parent, const LabelModel* label )
XmlLabelCreator::createDataNode( QDomElement &parent, const QList<LabelModelObject*>& objects )
{
QDomDocument doc = parent.ownerDocument();
QDomElement node = doc.createElement( "Data" );
parent.appendChild( node );
DataCache data( label );
DataCache data( objects );
foreach ( QString name, data.imageNames() )
{
+2 -3
View File
@@ -55,8 +55,7 @@ namespace glabels
private:
static void createDoc( QDomDocument& doc, const LabelModel* label );
static void createRootNode( const LabelModel* label );
static void createObjectsNode( QDomElement &parent, const LabelModel* label );
static void addObjectsToNode( QDomElement &parent, const QList<LabelModelObject*>& objects );
static void createObjectsNode( QDomElement &parent, const QList<LabelModelObject*>& objects, bool rotate );
static void createObjectBoxNode( QDomElement &parent, const LabelModelBoxObject* object );
static void createObjectEllipseNode( QDomElement &parent, const LabelModelEllipseObject* object );
static void createObjectLineNode( QDomElement &parent, const LabelModelLineObject* object );
@@ -67,7 +66,7 @@ namespace glabels
static void createAffineAttrs( QDomElement &node, const LabelModelObject* object );
static void createShadowAttrs( QDomElement &node, const LabelModelObject* object );
static void createMergeNode( QDomElement &parent, const LabelModel* label );
static void createDataNode( QDomElement &parent, const LabelModel* label );
static void createDataNode( QDomElement &parent, const QList<LabelModelObject*>& objects );
static void createPngFileNode( QDomElement &parent, const QString& name, const QImage& image );
static void createSvgFileNode( QDomElement &parent, const LabelModel* label, const QString& name );
+25 -15
View File
@@ -152,7 +152,25 @@ namespace glabels
return list;
}
return parseObjects( root, DataCache() );
/* Pass 1, extract data nodes to pre-load cache. */
DataCache data;
for ( QDomNode child = root.firstChild(); !child.isNull(); child = child.nextSibling() )
{
if ( child.toElement().tagName() == "Data" )
{
parseDataNode( child.toElement(), data );
}
}
/* Pass 2, now extract objects. */
for ( QDomNode child = root.firstChild(); !child.isNull(); child = child.nextSibling() )
{
if ( child.toElement().tagName() == "Objects" )
{
list = parseObjectsNode( child.toElement(), data );
}
}
return list;
}
@@ -244,7 +262,11 @@ namespace glabels
}
else if ( tagName == "Objects" )
{
parseObjectsNode( child.toElement(), data, label );
QList<LabelModelObject*> list = parseObjectsNode( child.toElement(), data );
foreach ( LabelModelObject* object, list )
{
label->addObject( object );
}
}
else if ( tagName == "Merge" )
{
@@ -266,7 +288,7 @@ namespace glabels
QList<LabelModelObject*>
XmlLabelParser::parseObjects( const QDomElement &node, const DataCache& data )
XmlLabelParser::parseObjectsNode( const QDomElement &node, const DataCache& data )
{
QList<LabelModelObject*> list;
@@ -310,18 +332,6 @@ namespace glabels
}
void
XmlLabelParser::parseObjectsNode( const QDomElement &node, const DataCache& data, LabelModel* label )
{
QList<LabelModelObject*> list = parseObjects( node, data );
foreach ( LabelModelObject* object, list )
{
label->addObject( object );
}
}
LabelModelBoxObject*
XmlLabelParser::parseObjectBoxNode( const QDomElement &node )
{
+1 -2
View File
@@ -56,8 +56,7 @@ namespace glabels
private:
static void gunzip( const QByteArray& gzippedData, QByteArray& data );
static LabelModel* parseRootNode( const QDomElement &node );
static QList<LabelModelObject*> parseObjects( const QDomElement &node, const DataCache& data );
static void parseObjectsNode( const QDomElement &node, const DataCache& data, LabelModel* label );
static QList<LabelModelObject*> parseObjectsNode( const QDomElement &node, const DataCache& data );
static LabelModelBoxObject* parseObjectBoxNode( const QDomElement &node );
static LabelModelEllipseObject* parseObjectEllipseNode( const QDomElement &node );
static LabelModelLineObject* parseObjectLineNode( const QDomElement &node );