Save/restore file paths as relative to project file.

This commit is contained in:
Jim Evins
2019-08-18 21:56:37 -04:00
parent ec3d900e87
commit 6a789c9632
11 changed files with 312 additions and 132 deletions
+66 -32
View File
@@ -33,6 +33,7 @@
#include "XmlTemplateCreator.h"
#include "XmlUtil.h"
#include "merge/Factory.h"
#include "merge/None.h"
#include <QByteArray>
@@ -49,38 +50,41 @@ namespace glabels
{
void
XmlLabelCreator::writeFile( const Model* label, const QString& fileName )
XmlLabelCreator::writeFile( Model* model, const QString& fileName )
{
QDomDocument doc;
createDoc( doc, label );
QByteArray buffer = doc.toByteArray( 2 );
QFile file( fileName );
if ( !file.open( QFile::WriteOnly | QFile::Text) )
{
qWarning() << "Error: Cannot write file " << fileName
<< ": " << file.errorString();
return;
}
model->setFileName( fileName );
model->clearModified();
QDomDocument doc;
createDoc( doc, model );
QByteArray buffer = doc.toByteArray( 2 );
file.write( buffer.data(), buffer.size() );
}
void
XmlLabelCreator::writeBuffer( const Model* label, QByteArray& buffer )
XmlLabelCreator::writeBuffer( const Model* model, QByteArray& buffer )
{
QDomDocument doc;
createDoc( doc, label );
createDoc( doc, model );
buffer = doc.toByteArray( 2 );
}
void
XmlLabelCreator::serializeObjects( const QList<ModelObject*>& objects,
QByteArray& buffer )
const Model* model,
QByteArray& buffer )
{
QDomDocument doc;
@@ -91,15 +95,15 @@ namespace glabels
doc.appendChild( root );
XmlUtil::setStringAttr( root, "version", "4.0" );
createDataNode( root, objects );
createObjectsNode( root, objects, false );
createDataNode( root, model, objects );
createObjectsNode( root, model, objects, false );
buffer = doc.toByteArray( 2 );
}
void
XmlLabelCreator::createDoc( QDomDocument& doc, const Model* label )
XmlLabelCreator::createDoc( QDomDocument& doc, const Model* model )
{
QDomNode xmlNode( doc.createProcessingInstruction( "xml", "version=\"1.0\"" ) );
doc.appendChild( xmlNode );
@@ -108,26 +112,29 @@ namespace glabels
doc.appendChild( root );
XmlUtil::setStringAttr( root, "version", "4.0" );
XmlTemplateCreator().createTemplateNode( root, label->tmplate() );
XmlTemplateCreator().createTemplateNode( root, model->tmplate() );
createObjectsNode( root, label->objectList(), label->rotate() );
createObjectsNode( root, model, model->objectList(), model->rotate() );
if ( label->merge() && !dynamic_cast<merge::None*>(label->merge()) )
if ( model->merge() && !dynamic_cast<merge::None*>(model->merge()) )
{
createMergeNode( root, label );
createMergeNode( root, model );
}
if ( label->variables()->size() != 0 )
if ( model->variables()->size() != 0 )
{
createVariablesNode( root, label );
createVariablesNode( root, model );
}
createDataNode( root, label->objectList() );
createDataNode( root, model, model->objectList() );
}
void
XmlLabelCreator::createObjectsNode( QDomElement &parent, const QList<ModelObject*>& objects, bool rotate )
XmlLabelCreator::createObjectsNode( QDomElement& parent,
const Model* model,
const QList<ModelObject*>& objects,
bool rotate )
{
QDomDocument doc = parent.ownerDocument();
QDomElement node = doc.createElement( "Objects" );
@@ -152,7 +159,7 @@ namespace glabels
}
else if ( auto* imageObject = dynamic_cast<ModelImageObject*>(object) )
{
createObjectImageNode( node, imageObject );
createObjectImageNode( node, model, imageObject );
}
else if ( auto* barcodeObject = dynamic_cast<ModelBarcodeObject*>(object) )
{
@@ -250,7 +257,9 @@ namespace glabels
void
XmlLabelCreator::createObjectImageNode( QDomElement &parent, const ModelImageObject* object )
XmlLabelCreator::createObjectImageNode( QDomElement& parent,
const Model* model,
const ModelImageObject* object )
{
QDomDocument doc = parent.ownerDocument();
QDomElement node = doc.createElement( "Object-image" );
@@ -269,7 +278,8 @@ namespace glabels
}
else
{
XmlUtil::setStringAttr( node, "src", object->filenameNode().data() );
QString fn = model->dir().relativeFilePath( object->filenameNode().data() );
XmlUtil::setStringAttr( node, "src", fn );
}
/* affine attrs */
@@ -461,25 +471,45 @@ namespace glabels
void
XmlLabelCreator::createMergeNode( QDomElement &parent, const Model* label )
XmlLabelCreator::createMergeNode( QDomElement &parent, const Model* model )
{
QDomDocument doc = parent.ownerDocument();
QDomElement node = doc.createElement( "Merge" );
parent.appendChild( node );
XmlUtil::setStringAttr( node, "type", label->merge()->id() );
XmlUtil::setStringAttr( node, "src", label->merge()->source() );
QString id = model->merge()->id();
QString src = model->merge()->source();
XmlUtil::setStringAttr( node, "type", id );
switch ( merge::Factory::idToType( id ) )
{
case merge::Factory::NONE:
case merge::Factory::FIXED:
break;
case merge::Factory::FILE:
{
QString fn = model->dir().relativeFilePath( src );
XmlUtil::setStringAttr( node, "src", fn );
}
break;
default:
qWarning() << "XmlLabelCreator::createMergeNode(): Should not be reached!";
break;
}
}
void
XmlLabelCreator::createVariablesNode( QDomElement &parent, const Model* label )
XmlLabelCreator::createVariablesNode( QDomElement &parent, const Model* model )
{
QDomDocument doc = parent.ownerDocument();
QDomElement node = doc.createElement( "Variables" );
parent.appendChild( node );
for ( const auto& v : *label->variables() )
for ( const auto& v : *model->variables() )
{
createVariableNode( node, v );
}
@@ -512,7 +542,9 @@ namespace glabels
void
XmlLabelCreator::createDataNode( QDomElement &parent, const QList<ModelObject*>& objects )
XmlLabelCreator::createDataNode( QDomElement& parent,
const Model* model,
const QList<ModelObject*>& objects )
{
QDomDocument doc = parent.ownerDocument();
QDomElement node = doc.createElement( "Data" );
@@ -522,12 +554,14 @@ namespace glabels
foreach ( QString name, data.imageNames() )
{
createPngFileNode( node, name, data.getImage( name ) );
QString fn = model->dir().relativeFilePath( name );
createPngFileNode( node, fn, data.getImage( name ) );
}
foreach ( QString name, data.svgNames() )
{
createSvgFileNode( node, name, data.getSvg( name ) );
QString fn = model->dir().relativeFilePath( name );
createSvgFileNode( node, fn, data.getSvg( name ) );
}
}