diff --git a/glabels/File.cpp b/glabels/File.cpp index 1e65f59..8af7562 100644 --- a/glabels/File.cpp +++ b/glabels/File.cpp @@ -111,8 +111,6 @@ namespace glabels model::Model *model = model::XmlLabelParser::readFile( fileName ); if ( model ) { - model->setFileName( fileName ); - // Either apply to current window or open a new one if ( window->isEmpty() ) { @@ -156,7 +154,6 @@ namespace glabels } model::XmlLabelCreator::writeFile( window->model(), window->model()->fileName() ); - window->model()->clearModified(); // Save CWD mCwd = QFileInfo( window->model()->fileName() ).absolutePath(); @@ -170,7 +167,8 @@ namespace glabels /// bool File::saveAs( MainWindow *window ) { - // Either use the saved CWD from a previous open/save or grab it from the path of the current file + // Either use the saved CWD from a previous open/save or grab it from the path + // of the current file. QString cwd = mCwd; if ( window->model() && !window->model()->fileName().isEmpty() ) { @@ -210,8 +208,6 @@ namespace glabels } model::XmlLabelCreator::writeFile( window->model(), fileName ); - window->model()->setFileName( fileName ); - window->model()->clearModified(); // Save CWD mCwd = QFileInfo( fileName ).absolutePath(); diff --git a/glabels/MergeView.cpp b/glabels/MergeView.cpp index bf0f306..f534209 100644 --- a/glabels/MergeView.cpp +++ b/glabels/MergeView.cpp @@ -63,7 +63,7 @@ namespace glabels mUndoRedoModel = undoRedoModel; // Initialize CWD - mCwd = mModel->dir(); + mCwd = mModel->dirPath(); onMergeChanged(); connect( mModel, SIGNAL(mergeChanged()), this, SLOT(onMergeChanged()) ); @@ -93,7 +93,7 @@ namespace glabels case merge::Factory::FILE: locationLabel->setEnabled( true ); - fn = QDir(mModel->dir()).relativeFilePath( mModel->merge()->source() ); + fn = mModel->dir().relativeFilePath( mModel->merge()->source() ); locationLineEdit->setText( fn ); locationBrowseButton->setVisible( true ); break; @@ -124,7 +124,7 @@ namespace glabels /// void MergeView::onMergeSourceChanged() { - QString fn = QDir(mModel->dir()).relativeFilePath( mModel->merge()->source() ); + QString fn = mModel->dir().relativeFilePath( mModel->merge()->source() ); locationLineEdit->setText( fn ); recordsTable->clear(); diff --git a/glabels/ObjectEditor.cpp b/glabels/ObjectEditor.cpp index 206eff6..83ee153 100644 --- a/glabels/ObjectEditor.cpp +++ b/glabels/ObjectEditor.cpp @@ -130,7 +130,7 @@ namespace glabels } else { - QString fn = QDir(mModel->dir()).relativeFilePath( filenameNode.data() ); + QString fn = mModel->dir().relativeFilePath( filenameNode.data() ); imageFilenameLineEdit->setText( fn ); } diff --git a/model/Model.cpp b/model/Model.cpp index 07801b2..e9c76e8 100644 --- a/model/Model.cpp +++ b/model/Model.cpp @@ -32,7 +32,6 @@ #include #include -#include #include #include #include @@ -282,9 +281,25 @@ namespace glabels /// - /// Get directory. + /// Get directory as a QDir. /// - QString Model::dir() const + QDir Model::dir() const + { + if ( mFileName.isEmpty() ) + { + return QDir::current(); + } + else + { + return QFileInfo( mFileName ).absoluteDir(); + } + } + + + /// + /// Get directory as a path. + /// + QString Model::dirPath() const { if ( mFileName.isEmpty() ) { @@ -1400,7 +1415,7 @@ namespace glabels QClipboard *clipboard = QApplication::clipboard(); QByteArray buffer; - XmlLabelCreator::serializeObjects( getSelection(), buffer ); + XmlLabelCreator::serializeObjects( getSelection(), this, buffer ); auto *mimeData = new QMimeData; mimeData->setData( MIME_TYPE, buffer ); @@ -1456,7 +1471,7 @@ namespace glabels { // Native objects QByteArray buffer = mimeData->data( MIME_TYPE ); - QList objects = XmlLabelParser::deserializeObjects( buffer ); + QList objects = XmlLabelParser::deserializeObjects( buffer, this ); unselectAll(); foreach ( ModelObject* object, objects ) diff --git a/model/Model.h b/model/Model.h index b1c5b33..ef6e69d 100644 --- a/model/Model.h +++ b/model/Model.h @@ -29,6 +29,7 @@ #include "merge/Merge.h" #include "merge/Record.h" +#include #include #include #include @@ -91,7 +92,8 @@ namespace glabels void setModified(); void clearModified(); - QString dir() const; + QDir dir() const; + QString dirPath() const; QString shortName(); const QString& fileName() const; void setFileName( const QString &fileName ); diff --git a/model/ModelImageObject.cpp b/model/ModelImageObject.cpp index 550de8c..7d94728 100644 --- a/model/ModelImageObject.cpp +++ b/model/ModelImageObject.cpp @@ -435,7 +435,7 @@ namespace glabels { // Look for image file relative to project file 1st then CWD 2nd auto* model = dynamic_cast( parent() ); - QDir::setSearchPaths( "images", {model->dir(), QDir::currentPath()} ); + QDir::setSearchPaths( "images", {model->dirPath(), QDir::currentPath()} ); QString filename = QString("images:") + mFilenameNode.text( record, variables ); auto* image = new QImage( filename ); @@ -537,7 +537,7 @@ namespace glabels { // Look for image file relative to project file 1st then CWD 2nd auto* model = dynamic_cast( parent() ); - QDir::setSearchPaths( "images", {model->dir(), QDir::currentPath()} ); + QDir::setSearchPaths( "images", {model->dirPath(), QDir::currentPath()} ); QString filename = QString("images:") + mFilenameNode.text( record, variables ); auto* image = new QImage( filename ); diff --git a/model/XmlLabelCreator.cpp b/model/XmlLabelCreator.cpp index 90a1ced..7504d3f 100644 --- a/model/XmlLabelCreator.cpp +++ b/model/XmlLabelCreator.cpp @@ -33,6 +33,7 @@ #include "XmlTemplateCreator.h" #include "XmlUtil.h" +#include "merge/Factory.h" #include "merge/None.h" #include @@ -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& 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(label->merge()) ) + if ( model->merge() && !dynamic_cast(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& objects, bool rotate ) + XmlLabelCreator::createObjectsNode( QDomElement& parent, + const Model* model, + const QList& objects, + bool rotate ) { QDomDocument doc = parent.ownerDocument(); QDomElement node = doc.createElement( "Objects" ); @@ -152,7 +159,7 @@ namespace glabels } else if ( auto* imageObject = dynamic_cast(object) ) { - createObjectImageNode( node, imageObject ); + createObjectImageNode( node, model, imageObject ); } else if ( auto* barcodeObject = dynamic_cast(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& objects ) + XmlLabelCreator::createDataNode( QDomElement& parent, + const Model* model, + const QList& 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 ) ); } } diff --git a/model/XmlLabelCreator.h b/model/XmlLabelCreator.h index 2e3d87a..9c765ac 100644 --- a/model/XmlLabelCreator.h +++ b/model/XmlLabelCreator.h @@ -51,33 +51,87 @@ namespace glabels Q_OBJECT public: - static void writeFile( const Model* label, const QString& fileName ); - static void writeBuffer( const Model* label, QByteArray& buffer ); - static void serializeObjects( const QList& objects, QByteArray& buffer ); + static void writeFile( Model* model, + const QString& fileName ); + + static void writeBuffer( const Model* model, + QByteArray& buffer ); + + static void serializeObjects( const QList& objects, + const Model* model, + QByteArray& buffer ); private: - static void createDoc( QDomDocument& doc, const Model* label ); - static void createRootNode( const Model* label ); - static void createObjectsNode( QDomElement &parent, const QList& objects, bool rotate ); - static void createObjectBoxNode( QDomElement &parent, const ModelBoxObject* object ); - static void createObjectEllipseNode( QDomElement &parent, const ModelEllipseObject* object ); - static void createObjectLineNode( QDomElement &parent, const ModelLineObject* object ); - static void createObjectImageNode( QDomElement &parent, const ModelImageObject* object ); - static void createObjectBarcodeNode( QDomElement &parent, const ModelBarcodeObject* object ); - static void createObjectTextNode( QDomElement &parent, const ModelTextObject* object ); - static void createPNode( QDomElement &parent, const QString& blockText ); - static void createPositionAttrs( QDomElement &node, const ModelObject* object ); - static void createSizeAttrs( QDomElement &node, const ModelObject* object ); - static void createLineAttrs( QDomElement &node, const ModelObject* object ); - static void createFillAttrs( QDomElement &node, const ModelObject* object ); - static void createAffineAttrs( QDomElement &node, const ModelObject* object ); - static void createShadowAttrs( QDomElement &node, const ModelObject* object ); - static void createMergeNode( QDomElement &parent, const Model* label ); - static void createVariablesNode( QDomElement &parent, const Model* label ); - static void createVariableNode( QDomElement &parent, const Variable& v ); - 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 QString& name, const QByteArray& svg ); + static void createDoc( QDomDocument& doc, + const Model* model ); + + static void createRootNode( const Model* model ); + + static void createObjectsNode( QDomElement& parent, + const Model* model, + const QList& objects, + bool rotate ); + + static void createObjectBoxNode( QDomElement& parent, + const ModelBoxObject* object ); + + static void createObjectEllipseNode( QDomElement& parent, + const ModelEllipseObject* object ); + + static void createObjectLineNode( QDomElement& parent, + const ModelLineObject* object ); + + static void createObjectImageNode( QDomElement& parent, + const Model* model, + const ModelImageObject* object ); + + static void createObjectBarcodeNode( QDomElement& parent, + const ModelBarcodeObject* object ); + + static void createObjectTextNode( QDomElement& parent, + const ModelTextObject* object ); + + static void createPNode( QDomElement& parent, + const QString& blockText ); + + static void createPositionAttrs( QDomElement& node, + const ModelObject* object ); + + static void createSizeAttrs( QDomElement& node, + const ModelObject* object ); + + static void createLineAttrs( QDomElement& node, + const ModelObject* object ); + + static void createFillAttrs( QDomElement& node, + const ModelObject* object ); + + static void createAffineAttrs( QDomElement& node, + const ModelObject* object ); + + static void createShadowAttrs( QDomElement& node, + const ModelObject* object ); + + static void createMergeNode( QDomElement& parent, + const Model* model ); + + static void createVariablesNode( QDomElement& parent, + const Model* model ); + + static void createVariableNode( QDomElement& parent, + const Variable& v ); + + static void createDataNode( QDomElement& parent, + const Model* model, + const QList& objects ); + + static void createPngFileNode( QDomElement& parent, + const QString& name, + const QImage& image ); + + static void createSvgFileNode( QDomElement& parent, + const QString& name, + const QByteArray& svg ); }; diff --git a/model/XmlLabelParser.cpp b/model/XmlLabelParser.cpp index ed9bdb9..601f488 100644 --- a/model/XmlLabelParser.cpp +++ b/model/XmlLabelParser.cpp @@ -105,7 +105,7 @@ namespace glabels return nullptr; } - return parseRootNode( root ); + return parseRootNode( root, fileName ); } @@ -132,12 +132,12 @@ namespace glabels return nullptr; } - return parseRootNode( root ); + return parseRootNode( root, QString() ); } QList - XmlLabelParser::deserializeObjects( const QByteArray& buffer ) + XmlLabelParser::deserializeObjects( const QByteArray& buffer, const Model* model ) { QList list; @@ -167,7 +167,7 @@ namespace glabels { if ( child.toElement().tagName() == "Data" ) { - parseDataNode( child.toElement(), data ); + parseDataNode( child.toElement(), model, data ); } } @@ -176,9 +176,10 @@ namespace glabels { if ( child.toElement().tagName() == "Objects" ) { - list = parseObjectsNode( child.toElement(), data ); + list = parseObjectsNode( child.toElement(), model, data ); } } + return list; } @@ -236,7 +237,7 @@ namespace glabels Model* - XmlLabelParser::parseRootNode( const QDomElement &node ) + XmlLabelParser::parseRootNode( const QDomElement &node, const QString& fileName ) { QString version = XmlUtil::getStringAttr( node, "version", "" ); if ( version != "4.0" ) @@ -245,7 +246,8 @@ namespace glabels return XmlLabelParser_3::parseRootNode(node); } - auto* label = new Model(); + auto* model = new Model(); + model->setFileName( fileName ); /* Pass 1, extract data nodes to pre-load cache. */ DataCache data; @@ -253,7 +255,7 @@ namespace glabels { if ( child.toElement().tagName() == "Data" ) { - parseDataNode( child.toElement(), data ); + parseDataNode( child.toElement(), model, data ); } } @@ -268,27 +270,27 @@ namespace glabels if ( tmplate == nullptr ) { qWarning() << "Unable to parse template"; - delete label; + delete model; return nullptr; } - label->setTmplate( tmplate ); + model->setTmplate( tmplate ); } else if ( tagName == "Objects" ) { - label->setRotate( parseRotateAttr( child.toElement() ) ); - QList list = parseObjectsNode( child.toElement(), data ); + model->setRotate( parseRotateAttr( child.toElement() ) ); + auto list = parseObjectsNode( child.toElement(), model, data ); foreach ( ModelObject* object, list ) { - label->addObject( object ); + model->addObject( object ); } } else if ( tagName == "Merge" ) { - parseMergeNode( child.toElement(), label ); + parseMergeNode( child.toElement(), model ); } else if ( tagName == "Variables" ) { - parseVariablesNode( child.toElement(), label ); + parseVariablesNode( child.toElement(), model ); } else if ( tagName == "Data" ) { @@ -300,13 +302,15 @@ namespace glabels } } - label->clearModified(); - return label; + model->clearModified(); + return model; } QList - XmlLabelParser::parseObjectsNode( const QDomElement &node, const DataCache& data ) + XmlLabelParser::parseObjectsNode( const QDomElement& node, + const Model* model, + const DataCache& data ) { QList list; @@ -332,7 +336,7 @@ namespace glabels } else if ( tagName == "Object-image" ) { - list.append( parseObjectImageNode( child.toElement(), data ) ); + list.append( parseObjectImageNode( child.toElement(), model, data ) ); } else if ( tagName == "Object-barcode" ) { @@ -501,7 +505,9 @@ namespace glabels ModelImageObject* - XmlLabelParser::parseObjectImageNode( const QDomElement &node, const DataCache& data ) + XmlLabelParser::parseObjectImageNode( const QDomElement& node, + const Model* model, + const DataCache& data ) { /* position attrs */ Distance x0 = XmlUtil::getLengthAttr( node, "x", 0.0 ); @@ -546,23 +552,25 @@ namespace glabels } else { - if ( data.hasImage( filename ) ) + QString fn = QDir::cleanPath( model->dir().absoluteFilePath( filename ) ); + + if ( data.hasImage( fn ) ) { return new ModelImageObject( x0, y0, w, h, - filename, data.getImage( filename ), + fn, data.getImage( fn ), QMatrix( a[0], a[1], a[2], a[3], a[4], a[5] ), shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode ); } - else if ( data.hasSvg( filename ) ) + else if ( data.hasSvg( fn ) ) { return new ModelImageObject( x0, y0, w, h, - filename, data.getSvg( filename ), + fn, data.getSvg( fn ), QMatrix( a[0], a[1], a[2], a[3], a[4], a[5] ), shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode ); } else { - qWarning() << "Embedded file" << filename << "missing. Trying actual file."; + qWarning() << "Embedded file" << fn << "missing. Trying actual file."; return new ModelImageObject( x0, y0, w, h, filenameNode, QMatrix( a[0], a[1], a[2], a[3], a[4], a[5] ), @@ -711,20 +719,37 @@ namespace glabels void - XmlLabelParser::parseMergeNode( const QDomElement &node, Model* label ) + XmlLabelParser::parseMergeNode( const QDomElement &node, Model* model ) { - QString type = XmlUtil::getStringAttr( node, "type", "None" ); - QString src = XmlUtil::getStringAttr( node, "src", "" ); + QString id = XmlUtil::getStringAttr( node, "type", "None" ); + QString src = XmlUtil::getStringAttr( node, "src", "" ); - merge::Merge* merge = merge::Factory::createMerge( type ); - merge->setSource( src ); + merge::Merge* merge = merge::Factory::createMerge( id ); - label->setMerge( merge ); + switch ( merge::Factory::idToType( id ) ) + { + case merge::Factory::NONE: + case merge::Factory::FIXED: + break; + + case merge::Factory::FILE: + { + QString fn = QDir::cleanPath( model->dir().absoluteFilePath( src ) ); + merge->setSource( fn ); + } + break; + + default: + qWarning() << "XmlLabelCreator::createMergeNode(): Should not be reached!"; + break; + } + + model->setMerge( merge ); } void - XmlLabelParser::parseVariablesNode( const QDomElement &node, Model* label ) + XmlLabelParser::parseVariablesNode( const QDomElement &node, Model* model ) { for ( QDomNode child = node.firstChild(); !child.isNull(); child = child.nextSibling() ) { @@ -732,7 +757,7 @@ namespace glabels if ( tagName == "Variable" ) { - parseVariableNode( child.toElement(), label ); + parseVariableNode( child.toElement(), model ); } else if ( !child.isComment() ) { @@ -743,7 +768,7 @@ namespace glabels void - XmlLabelParser::parseVariableNode( const QDomElement &node, Model* label ) + XmlLabelParser::parseVariableNode( const QDomElement &node, Model* model ) { QString typeString = XmlUtil::getStringAttr( node, "type", "string" ); QString name = XmlUtil::getStringAttr( node, "name", "unknown" ); @@ -755,12 +780,14 @@ namespace glabels auto increment = Variable::idStringToIncrement( incrementString ); Variable v( type, name, initialValue, increment, stepSize ); - label->variables()->addVariable( v ); + model->variables()->addVariable( v ); } void - XmlLabelParser::parseDataNode( const QDomElement &node, DataCache& data ) + XmlLabelParser::parseDataNode( const QDomElement &node, + const Model* model, + DataCache& data ) { for ( QDomNode child = node.firstChild(); !child.isNull(); child = child.nextSibling() ) { @@ -768,7 +795,7 @@ namespace glabels if ( tagName == "File" ) { - parseFileNode( child.toElement(), data ); + parseFileNode( child.toElement(), model, data ); } else if ( !child.isComment() ) { @@ -779,12 +806,17 @@ namespace glabels void - XmlLabelParser::parseFileNode( const QDomElement& node, DataCache& data ) + XmlLabelParser::parseFileNode( const QDomElement& node, + const Model* model, + DataCache& data ) { QString name = XmlUtil::getStringAttr( node, "name", "" ); QString mimetype = XmlUtil::getStringAttr( node, "mimetype", "image/png" ); QString encoding = XmlUtil::getStringAttr( node, "encoding", "base64" ); + // Rewrite name as absolute file path + QString fn = QDir::cleanPath( model->dir().absoluteFilePath( name ) ); + if ( mimetype == "image/png" ) { if ( encoding == "base64" ) @@ -794,7 +826,7 @@ namespace glabels QImage image; image.loadFromData( ba, "PNG" ); - data.addImage( name, image ); + data.addImage( fn, image ); } else { @@ -803,7 +835,7 @@ namespace glabels } else if ( mimetype == "image/svg+xml" ) { - data.addSvg( name, node.text().toUtf8() ); + data.addSvg( fn, node.text().toUtf8() ); } } diff --git a/model/XmlLabelParser.h b/model/XmlLabelParser.h index c13edf4..93e90e8 100644 --- a/model/XmlLabelParser.h +++ b/model/XmlLabelParser.h @@ -52,26 +52,57 @@ namespace glabels public: static Model* readFile( const QString& fileName ); + static Model* readBuffer( const QByteArray& buffer ); - static QList deserializeObjects( const QByteArray& buffer ); + + static QList deserializeObjects( const QByteArray& buffer, + const Model* model ); private: - static void gunzip( const QByteArray& gzippedData, QByteArray& data ); - static Model* parseRootNode( const QDomElement &node ); - static QList parseObjectsNode( const QDomElement &node, const DataCache& data ); - static ModelBoxObject* parseObjectBoxNode( const QDomElement &node ); - static ModelEllipseObject* parseObjectEllipseNode( const QDomElement &node ); - static ModelLineObject* parseObjectLineNode( const QDomElement &node ); - static ModelImageObject* parseObjectImageNode( const QDomElement &node, const DataCache& data ); - static ModelBarcodeObject* parseObjectBarcodeNode( const QDomElement &node ); - static ModelTextObject* parseObjectTextNode( const QDomElement &node ); - static QString parsePNode( const QDomElement &node ); - static bool parseRotateAttr( const QDomElement &node ); - static void parseMergeNode( const QDomElement &node, Model* label ); - static void parseVariablesNode( const QDomElement &node, Model* label ); - static void parseVariableNode( const QDomElement &node, Model* label ); - static void parseDataNode( const QDomElement &node, DataCache& data ); - static void parseFileNode( const QDomElement &node, DataCache& data ); + static void gunzip( const QByteArray& gzippedData, + QByteArray& data ); + + static Model* parseRootNode( const QDomElement& node, + const QString& fileName ); + + static QList parseObjectsNode( const QDomElement& node, + const Model* model, + const DataCache& data ); + + static ModelBoxObject* parseObjectBoxNode( const QDomElement& node ); + + static ModelEllipseObject* parseObjectEllipseNode( const QDomElement& node ); + + static ModelLineObject* parseObjectLineNode( const QDomElement& node ); + + static ModelImageObject* parseObjectImageNode( const QDomElement& node, + const Model* model, + const DataCache& data ); + + static ModelBarcodeObject* parseObjectBarcodeNode( const QDomElement& node ); + + static ModelTextObject* parseObjectTextNode( const QDomElement& node ); + + static QString parsePNode( const QDomElement& node ); + + static bool parseRotateAttr( const QDomElement& node ); + + static void parseMergeNode( const QDomElement& node, + Model* model ); + + static void parseVariablesNode( const QDomElement& node, + Model* model ); + + static void parseVariableNode( const QDomElement& node, + Model* model ); + + static void parseDataNode( const QDomElement& node, + const Model* model, + DataCache& data ); + + static void parseFileNode( const QDomElement& node, + const Model* model, + DataCache& data ); }; diff --git a/translations/glabels_C.ts b/translations/glabels_C.ts index d300fce..645d124 100644 --- a/translations/glabels_C.ts +++ b/translations/glabels_C.ts @@ -1169,6 +1169,14 @@ Use substitution field + + Use key + + + + Custom color #%1 + + glabels::EditVariableDialog @@ -1938,6 +1946,14 @@ Use substitution field + + Insert Field + + + + Selected File... + + glabels::PrintView