diff --git a/glabels/DataCache.cpp b/glabels/DataCache.cpp index 92a2181..efb8dfc 100644 --- a/glabels/DataCache.cpp +++ b/glabels/DataCache.cpp @@ -32,9 +32,9 @@ namespace glabels } - DataCache::DataCache( const LabelModel* model ) + DataCache::DataCache( const QList& objects ) { - foreach( LabelModelObject* object, model->objectList() ) + foreach( LabelModelObject* object, objects ) { if ( LabelModelImageObject* imageObject = dynamic_cast(object) ) { diff --git a/glabels/DataCache.h b/glabels/DataCache.h index 45a752e..68a5d01 100644 --- a/glabels/DataCache.h +++ b/glabels/DataCache.h @@ -33,7 +33,7 @@ namespace glabels public: DataCache(); - DataCache( const LabelModel* model ); + DataCache( const QList& objects ); bool hasImage( const QString& name ) const; QImage getImage( const QString& name ) const; diff --git a/glabels/XmlLabelCreator.cpp b/glabels/XmlLabelCreator.cpp index 7dd98b1..412ada5 100644 --- a/glabels/XmlLabelCreator.cpp +++ b/glabels/XmlLabelCreator.cpp @@ -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(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& 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& objects ) - { foreach ( LabelModelObject* object, objects ) { if ( LabelModelBoxObject* boxObject = dynamic_cast(object) ) { - createObjectBoxNode( parent, boxObject ); + createObjectBoxNode( node, boxObject ); } else if ( LabelModelEllipseObject* ellipseObject = dynamic_cast(object) ) { - createObjectEllipseNode( parent, ellipseObject ); + createObjectEllipseNode( node, ellipseObject ); } else if ( LabelModelLineObject* lineObject = dynamic_cast(object) ) { - createObjectLineNode( parent, lineObject ); + createObjectLineNode( node, lineObject ); } else if ( LabelModelImageObject* imageObject = dynamic_cast(object) ) { - createObjectImageNode( parent, imageObject ); + createObjectImageNode( node, imageObject ); } else if ( LabelModelTextObject* textObject = dynamic_cast(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& objects ) { QDomDocument doc = parent.ownerDocument(); QDomElement node = doc.createElement( "Data" ); parent.appendChild( node ); - DataCache data( label ); + DataCache data( objects ); foreach ( QString name, data.imageNames() ) { diff --git a/glabels/XmlLabelCreator.h b/glabels/XmlLabelCreator.h index f305753..e7a031b 100644 --- a/glabels/XmlLabelCreator.h +++ b/glabels/XmlLabelCreator.h @@ -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& objects ); + static void createObjectsNode( QDomElement &parent, const QList& 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& objects ); static void createPngFileNode( QDomElement &parent, const QString& name, const QImage& image ); static void createSvgFileNode( QDomElement &parent, const LabelModel* label, const QString& name ); diff --git a/glabels/XmlLabelParser.cpp b/glabels/XmlLabelParser.cpp index 791eb9d..6874724 100644 --- a/glabels/XmlLabelParser.cpp +++ b/glabels/XmlLabelParser.cpp @@ -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 list = parseObjectsNode( child.toElement(), data ); + foreach ( LabelModelObject* object, list ) + { + label->addObject( object ); + } } else if ( tagName == "Merge" ) { @@ -266,7 +288,7 @@ namespace glabels QList - XmlLabelParser::parseObjects( const QDomElement &node, const DataCache& data ) + XmlLabelParser::parseObjectsNode( const QDomElement &node, const DataCache& data ) { QList list; @@ -310,18 +332,6 @@ namespace glabels } - void - XmlLabelParser::parseObjectsNode( const QDomElement &node, const DataCache& data, LabelModel* label ) - { - QList list = parseObjects( node, data ); - - foreach ( LabelModelObject* object, list ) - { - label->addObject( object ); - } - } - - LabelModelBoxObject* XmlLabelParser::parseObjectBoxNode( const QDomElement &node ) { diff --git a/glabels/XmlLabelParser.h b/glabels/XmlLabelParser.h index 9694303..93e4c4d 100644 --- a/glabels/XmlLabelParser.h +++ b/glabels/XmlLabelParser.h @@ -56,8 +56,7 @@ namespace glabels private: static void gunzip( const QByteArray& gzippedData, QByteArray& data ); static LabelModel* parseRootNode( const QDomElement &node ); - static QList parseObjects( const QDomElement &node, const DataCache& data ); - static void parseObjectsNode( const QDomElement &node, const DataCache& data, LabelModel* label ); + static QList 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 );