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
+2 -6
View File
@@ -111,8 +111,6 @@ namespace glabels
model::Model *model = model::XmlLabelParser::readFile( fileName ); model::Model *model = model::XmlLabelParser::readFile( fileName );
if ( model ) if ( model )
{ {
model->setFileName( fileName );
// Either apply to current window or open a new one // Either apply to current window or open a new one
if ( window->isEmpty() ) if ( window->isEmpty() )
{ {
@@ -156,7 +154,6 @@ namespace glabels
} }
model::XmlLabelCreator::writeFile( window->model(), window->model()->fileName() ); model::XmlLabelCreator::writeFile( window->model(), window->model()->fileName() );
window->model()->clearModified();
// Save CWD // Save CWD
mCwd = QFileInfo( window->model()->fileName() ).absolutePath(); mCwd = QFileInfo( window->model()->fileName() ).absolutePath();
@@ -170,7 +167,8 @@ namespace glabels
/// ///
bool File::saveAs( MainWindow *window ) 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; QString cwd = mCwd;
if ( window->model() && !window->model()->fileName().isEmpty() ) if ( window->model() && !window->model()->fileName().isEmpty() )
{ {
@@ -210,8 +208,6 @@ namespace glabels
} }
model::XmlLabelCreator::writeFile( window->model(), fileName ); model::XmlLabelCreator::writeFile( window->model(), fileName );
window->model()->setFileName( fileName );
window->model()->clearModified();
// Save CWD // Save CWD
mCwd = QFileInfo( fileName ).absolutePath(); mCwd = QFileInfo( fileName ).absolutePath();
+3 -3
View File
@@ -63,7 +63,7 @@ namespace glabels
mUndoRedoModel = undoRedoModel; mUndoRedoModel = undoRedoModel;
// Initialize CWD // Initialize CWD
mCwd = mModel->dir(); mCwd = mModel->dirPath();
onMergeChanged(); onMergeChanged();
connect( mModel, SIGNAL(mergeChanged()), this, SLOT(onMergeChanged()) ); connect( mModel, SIGNAL(mergeChanged()), this, SLOT(onMergeChanged()) );
@@ -93,7 +93,7 @@ namespace glabels
case merge::Factory::FILE: case merge::Factory::FILE:
locationLabel->setEnabled( true ); locationLabel->setEnabled( true );
fn = QDir(mModel->dir()).relativeFilePath( mModel->merge()->source() ); fn = mModel->dir().relativeFilePath( mModel->merge()->source() );
locationLineEdit->setText( fn ); locationLineEdit->setText( fn );
locationBrowseButton->setVisible( true ); locationBrowseButton->setVisible( true );
break; break;
@@ -124,7 +124,7 @@ namespace glabels
/// ///
void MergeView::onMergeSourceChanged() void MergeView::onMergeSourceChanged()
{ {
QString fn = QDir(mModel->dir()).relativeFilePath( mModel->merge()->source() ); QString fn = mModel->dir().relativeFilePath( mModel->merge()->source() );
locationLineEdit->setText( fn ); locationLineEdit->setText( fn );
recordsTable->clear(); recordsTable->clear();
+1 -1
View File
@@ -130,7 +130,7 @@ namespace glabels
} }
else else
{ {
QString fn = QDir(mModel->dir()).relativeFilePath( filenameNode.data() ); QString fn = mModel->dir().relativeFilePath( filenameNode.data() );
imageFilenameLineEdit->setText( fn ); imageFilenameLineEdit->setText( fn );
} }
+20 -5
View File
@@ -32,7 +32,6 @@
#include <QApplication> #include <QApplication>
#include <QClipboard> #include <QClipboard>
#include <QDir>
#include <QFileInfo> #include <QFileInfo>
#include <QMimeData> #include <QMimeData>
#include <QtDebug> #include <QtDebug>
@@ -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() ) if ( mFileName.isEmpty() )
{ {
@@ -1400,7 +1415,7 @@ namespace glabels
QClipboard *clipboard = QApplication::clipboard(); QClipboard *clipboard = QApplication::clipboard();
QByteArray buffer; QByteArray buffer;
XmlLabelCreator::serializeObjects( getSelection(), buffer ); XmlLabelCreator::serializeObjects( getSelection(), this, buffer );
auto *mimeData = new QMimeData; auto *mimeData = new QMimeData;
mimeData->setData( MIME_TYPE, buffer ); mimeData->setData( MIME_TYPE, buffer );
@@ -1456,7 +1471,7 @@ namespace glabels
{ {
// Native objects // Native objects
QByteArray buffer = mimeData->data( MIME_TYPE ); QByteArray buffer = mimeData->data( MIME_TYPE );
QList <ModelObject*> objects = XmlLabelParser::deserializeObjects( buffer ); QList <ModelObject*> objects = XmlLabelParser::deserializeObjects( buffer, this );
unselectAll(); unselectAll();
foreach ( ModelObject* object, objects ) foreach ( ModelObject* object, objects )
+3 -1
View File
@@ -29,6 +29,7 @@
#include "merge/Merge.h" #include "merge/Merge.h"
#include "merge/Record.h" #include "merge/Record.h"
#include <QDir>
#include <QList> #include <QList>
#include <QObject> #include <QObject>
#include <QPainter> #include <QPainter>
@@ -91,7 +92,8 @@ namespace glabels
void setModified(); void setModified();
void clearModified(); void clearModified();
QString dir() const; QDir dir() const;
QString dirPath() const;
QString shortName(); QString shortName();
const QString& fileName() const; const QString& fileName() const;
void setFileName( const QString &fileName ); void setFileName( const QString &fileName );
+2 -2
View File
@@ -435,7 +435,7 @@ namespace glabels
{ {
// Look for image file relative to project file 1st then CWD 2nd // Look for image file relative to project file 1st then CWD 2nd
auto* model = dynamic_cast<Model*>( parent() ); auto* model = dynamic_cast<Model*>( parent() );
QDir::setSearchPaths( "images", {model->dir(), QDir::currentPath()} ); QDir::setSearchPaths( "images", {model->dirPath(), QDir::currentPath()} );
QString filename = QString("images:") + mFilenameNode.text( record, variables ); QString filename = QString("images:") + mFilenameNode.text( record, variables );
auto* image = new QImage( filename ); auto* image = new QImage( filename );
@@ -537,7 +537,7 @@ namespace glabels
{ {
// Look for image file relative to project file 1st then CWD 2nd // Look for image file relative to project file 1st then CWD 2nd
auto* model = dynamic_cast<Model*>( parent() ); auto* model = dynamic_cast<Model*>( parent() );
QDir::setSearchPaths( "images", {model->dir(), QDir::currentPath()} ); QDir::setSearchPaths( "images", {model->dirPath(), QDir::currentPath()} );
QString filename = QString("images:") + mFilenameNode.text( record, variables ); QString filename = QString("images:") + mFilenameNode.text( record, variables );
auto* image = new QImage( filename ); auto* image = new QImage( filename );
+65 -31
View File
@@ -33,6 +33,7 @@
#include "XmlTemplateCreator.h" #include "XmlTemplateCreator.h"
#include "XmlUtil.h" #include "XmlUtil.h"
#include "merge/Factory.h"
#include "merge/None.h" #include "merge/None.h"
#include <QByteArray> #include <QByteArray>
@@ -49,37 +50,40 @@ namespace glabels
{ {
void 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 ); QFile file( fileName );
if ( !file.open( QFile::WriteOnly | QFile::Text) ) if ( !file.open( QFile::WriteOnly | QFile::Text) )
{ {
qWarning() << "Error: Cannot write file " << fileName qWarning() << "Error: Cannot write file " << fileName
<< ": " << file.errorString(); << ": " << file.errorString();
return;
} }
model->setFileName( fileName );
model->clearModified();
QDomDocument doc;
createDoc( doc, model );
QByteArray buffer = doc.toByteArray( 2 );
file.write( buffer.data(), buffer.size() ); file.write( buffer.data(), buffer.size() );
} }
void void
XmlLabelCreator::writeBuffer( const Model* label, QByteArray& buffer ) XmlLabelCreator::writeBuffer( const Model* model, QByteArray& buffer )
{ {
QDomDocument doc; QDomDocument doc;
createDoc( doc, label ); createDoc( doc, model );
buffer = doc.toByteArray( 2 ); buffer = doc.toByteArray( 2 );
} }
void void
XmlLabelCreator::serializeObjects( const QList<ModelObject*>& objects, XmlLabelCreator::serializeObjects( const QList<ModelObject*>& objects,
const Model* model,
QByteArray& buffer ) QByteArray& buffer )
{ {
QDomDocument doc; QDomDocument doc;
@@ -91,15 +95,15 @@ namespace glabels
doc.appendChild( root ); doc.appendChild( root );
XmlUtil::setStringAttr( root, "version", "4.0" ); XmlUtil::setStringAttr( root, "version", "4.0" );
createDataNode( root, objects ); createDataNode( root, model, objects );
createObjectsNode( root, objects, false ); createObjectsNode( root, model, objects, false );
buffer = doc.toByteArray( 2 ); buffer = doc.toByteArray( 2 );
} }
void void
XmlLabelCreator::createDoc( QDomDocument& doc, const Model* label ) XmlLabelCreator::createDoc( QDomDocument& doc, const Model* model )
{ {
QDomNode xmlNode( doc.createProcessingInstruction( "xml", "version=\"1.0\"" ) ); QDomNode xmlNode( doc.createProcessingInstruction( "xml", "version=\"1.0\"" ) );
doc.appendChild( xmlNode ); doc.appendChild( xmlNode );
@@ -108,26 +112,29 @@ namespace glabels
doc.appendChild( root ); doc.appendChild( root );
XmlUtil::setStringAttr( root, "version", "4.0" ); 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 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(); QDomDocument doc = parent.ownerDocument();
QDomElement node = doc.createElement( "Objects" ); QDomElement node = doc.createElement( "Objects" );
@@ -152,7 +159,7 @@ namespace glabels
} }
else if ( auto* imageObject = dynamic_cast<ModelImageObject*>(object) ) else if ( auto* imageObject = dynamic_cast<ModelImageObject*>(object) )
{ {
createObjectImageNode( node, imageObject ); createObjectImageNode( node, model, imageObject );
} }
else if ( auto* barcodeObject = dynamic_cast<ModelBarcodeObject*>(object) ) else if ( auto* barcodeObject = dynamic_cast<ModelBarcodeObject*>(object) )
{ {
@@ -250,7 +257,9 @@ namespace glabels
void void
XmlLabelCreator::createObjectImageNode( QDomElement &parent, const ModelImageObject* object ) XmlLabelCreator::createObjectImageNode( QDomElement& parent,
const Model* model,
const ModelImageObject* object )
{ {
QDomDocument doc = parent.ownerDocument(); QDomDocument doc = parent.ownerDocument();
QDomElement node = doc.createElement( "Object-image" ); QDomElement node = doc.createElement( "Object-image" );
@@ -269,7 +278,8 @@ namespace glabels
} }
else else
{ {
XmlUtil::setStringAttr( node, "src", object->filenameNode().data() ); QString fn = model->dir().relativeFilePath( object->filenameNode().data() );
XmlUtil::setStringAttr( node, "src", fn );
} }
/* affine attrs */ /* affine attrs */
@@ -461,25 +471,45 @@ namespace glabels
void void
XmlLabelCreator::createMergeNode( QDomElement &parent, const Model* label ) XmlLabelCreator::createMergeNode( QDomElement &parent, const Model* model )
{ {
QDomDocument doc = parent.ownerDocument(); QDomDocument doc = parent.ownerDocument();
QDomElement node = doc.createElement( "Merge" ); QDomElement node = doc.createElement( "Merge" );
parent.appendChild( node ); parent.appendChild( node );
XmlUtil::setStringAttr( node, "type", label->merge()->id() ); QString id = model->merge()->id();
XmlUtil::setStringAttr( node, "src", label->merge()->source() ); 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 void
XmlLabelCreator::createVariablesNode( QDomElement &parent, const Model* label ) XmlLabelCreator::createVariablesNode( QDomElement &parent, const Model* model )
{ {
QDomDocument doc = parent.ownerDocument(); QDomDocument doc = parent.ownerDocument();
QDomElement node = doc.createElement( "Variables" ); QDomElement node = doc.createElement( "Variables" );
parent.appendChild( node ); parent.appendChild( node );
for ( const auto& v : *label->variables() ) for ( const auto& v : *model->variables() )
{ {
createVariableNode( node, v ); createVariableNode( node, v );
} }
@@ -512,7 +542,9 @@ namespace glabels
void void
XmlLabelCreator::createDataNode( QDomElement &parent, const QList<ModelObject*>& objects ) XmlLabelCreator::createDataNode( QDomElement& parent,
const Model* model,
const QList<ModelObject*>& objects )
{ {
QDomDocument doc = parent.ownerDocument(); QDomDocument doc = parent.ownerDocument();
QDomElement node = doc.createElement( "Data" ); QDomElement node = doc.createElement( "Data" );
@@ -522,12 +554,14 @@ namespace glabels
foreach ( QString name, data.imageNames() ) 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() ) foreach ( QString name, data.svgNames() )
{ {
createSvgFileNode( node, name, data.getSvg( name ) ); QString fn = model->dir().relativeFilePath( name );
createSvgFileNode( node, fn, data.getSvg( name ) );
} }
} }
+79 -25
View File
@@ -51,33 +51,87 @@ namespace glabels
Q_OBJECT Q_OBJECT
public: public:
static void writeFile( const Model* label, const QString& fileName ); static void writeFile( Model* model,
static void writeBuffer( const Model* label, QByteArray& buffer ); const QString& fileName );
static void serializeObjects( const QList<ModelObject*>& objects, QByteArray& buffer );
static void writeBuffer( const Model* model,
QByteArray& buffer );
static void serializeObjects( const QList<ModelObject*>& objects,
const Model* model,
QByteArray& buffer );
private: private:
static void createDoc( QDomDocument& doc, const Model* label ); static void createDoc( QDomDocument& doc,
static void createRootNode( const Model* label ); const Model* model );
static void createObjectsNode( QDomElement &parent, const QList<ModelObject*>& objects, bool rotate );
static void createObjectBoxNode( QDomElement &parent, const ModelBoxObject* object ); static void createRootNode( const Model* model );
static void createObjectEllipseNode( QDomElement &parent, const ModelEllipseObject* object );
static void createObjectLineNode( QDomElement &parent, const ModelLineObject* object ); static void createObjectsNode( QDomElement& parent,
static void createObjectImageNode( QDomElement &parent, const ModelImageObject* object ); const Model* model,
static void createObjectBarcodeNode( QDomElement &parent, const ModelBarcodeObject* object ); const QList<ModelObject*>& objects,
static void createObjectTextNode( QDomElement &parent, const ModelTextObject* object ); bool rotate );
static void createPNode( QDomElement &parent, const QString& blockText );
static void createPositionAttrs( QDomElement &node, const ModelObject* object ); static void createObjectBoxNode( QDomElement& parent,
static void createSizeAttrs( QDomElement &node, const ModelObject* object ); const ModelBoxObject* object );
static void createLineAttrs( QDomElement &node, const ModelObject* object );
static void createFillAttrs( QDomElement &node, const ModelObject* object ); static void createObjectEllipseNode( QDomElement& parent,
static void createAffineAttrs( QDomElement &node, const ModelObject* object ); const ModelEllipseObject* object );
static void createShadowAttrs( QDomElement &node, const ModelObject* object );
static void createMergeNode( QDomElement &parent, const Model* label ); static void createObjectLineNode( QDomElement& parent,
static void createVariablesNode( QDomElement &parent, const Model* label ); const ModelLineObject* object );
static void createVariableNode( QDomElement &parent, const Variable& v );
static void createDataNode( QDomElement &parent, const QList<ModelObject*>& objects ); static void createObjectImageNode( QDomElement& parent,
static void createPngFileNode( QDomElement &parent, const QString& name, const QImage& image ); const Model* model,
static void createSvgFileNode( QDomElement &parent, const QString& name, const QByteArray& svg ); 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<ModelObject*>& objects );
static void createPngFileNode( QDomElement& parent,
const QString& name,
const QImage& image );
static void createSvgFileNode( QDomElement& parent,
const QString& name,
const QByteArray& svg );
}; };
+71 -39
View File
@@ -105,7 +105,7 @@ namespace glabels
return nullptr; return nullptr;
} }
return parseRootNode( root ); return parseRootNode( root, fileName );
} }
@@ -132,12 +132,12 @@ namespace glabels
return nullptr; return nullptr;
} }
return parseRootNode( root ); return parseRootNode( root, QString() );
} }
QList<ModelObject*> QList<ModelObject*>
XmlLabelParser::deserializeObjects( const QByteArray& buffer ) XmlLabelParser::deserializeObjects( const QByteArray& buffer, const Model* model )
{ {
QList<ModelObject*> list; QList<ModelObject*> list;
@@ -167,7 +167,7 @@ namespace glabels
{ {
if ( child.toElement().tagName() == "Data" ) 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" ) if ( child.toElement().tagName() == "Objects" )
{ {
list = parseObjectsNode( child.toElement(), data ); list = parseObjectsNode( child.toElement(), model, data );
} }
} }
return list; return list;
} }
@@ -236,7 +237,7 @@ namespace glabels
Model* Model*
XmlLabelParser::parseRootNode( const QDomElement &node ) XmlLabelParser::parseRootNode( const QDomElement &node, const QString& fileName )
{ {
QString version = XmlUtil::getStringAttr( node, "version", "" ); QString version = XmlUtil::getStringAttr( node, "version", "" );
if ( version != "4.0" ) if ( version != "4.0" )
@@ -245,7 +246,8 @@ namespace glabels
return XmlLabelParser_3::parseRootNode(node); 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. */ /* Pass 1, extract data nodes to pre-load cache. */
DataCache data; DataCache data;
@@ -253,7 +255,7 @@ namespace glabels
{ {
if ( child.toElement().tagName() == "Data" ) if ( child.toElement().tagName() == "Data" )
{ {
parseDataNode( child.toElement(), data ); parseDataNode( child.toElement(), model, data );
} }
} }
@@ -268,27 +270,27 @@ namespace glabels
if ( tmplate == nullptr ) if ( tmplate == nullptr )
{ {
qWarning() << "Unable to parse template"; qWarning() << "Unable to parse template";
delete label; delete model;
return nullptr; return nullptr;
} }
label->setTmplate( tmplate ); model->setTmplate( tmplate );
} }
else if ( tagName == "Objects" ) else if ( tagName == "Objects" )
{ {
label->setRotate( parseRotateAttr( child.toElement() ) ); model->setRotate( parseRotateAttr( child.toElement() ) );
QList<ModelObject*> list = parseObjectsNode( child.toElement(), data ); auto list = parseObjectsNode( child.toElement(), model, data );
foreach ( ModelObject* object, list ) foreach ( ModelObject* object, list )
{ {
label->addObject( object ); model->addObject( object );
} }
} }
else if ( tagName == "Merge" ) else if ( tagName == "Merge" )
{ {
parseMergeNode( child.toElement(), label ); parseMergeNode( child.toElement(), model );
} }
else if ( tagName == "Variables" ) else if ( tagName == "Variables" )
{ {
parseVariablesNode( child.toElement(), label ); parseVariablesNode( child.toElement(), model );
} }
else if ( tagName == "Data" ) else if ( tagName == "Data" )
{ {
@@ -300,13 +302,15 @@ namespace glabels
} }
} }
label->clearModified(); model->clearModified();
return label; return model;
} }
QList<ModelObject*> QList<ModelObject*>
XmlLabelParser::parseObjectsNode( const QDomElement &node, const DataCache& data ) XmlLabelParser::parseObjectsNode( const QDomElement& node,
const Model* model,
const DataCache& data )
{ {
QList<ModelObject*> list; QList<ModelObject*> list;
@@ -332,7 +336,7 @@ namespace glabels
} }
else if ( tagName == "Object-image" ) else if ( tagName == "Object-image" )
{ {
list.append( parseObjectImageNode( child.toElement(), data ) ); list.append( parseObjectImageNode( child.toElement(), model, data ) );
} }
else if ( tagName == "Object-barcode" ) else if ( tagName == "Object-barcode" )
{ {
@@ -501,7 +505,9 @@ namespace glabels
ModelImageObject* ModelImageObject*
XmlLabelParser::parseObjectImageNode( const QDomElement &node, const DataCache& data ) XmlLabelParser::parseObjectImageNode( const QDomElement& node,
const Model* model,
const DataCache& data )
{ {
/* position attrs */ /* position attrs */
Distance x0 = XmlUtil::getLengthAttr( node, "x", 0.0 ); Distance x0 = XmlUtil::getLengthAttr( node, "x", 0.0 );
@@ -546,23 +552,25 @@ namespace glabels
} }
else else
{ {
if ( data.hasImage( filename ) ) QString fn = QDir::cleanPath( model->dir().absoluteFilePath( filename ) );
if ( data.hasImage( fn ) )
{ {
return new ModelImageObject( x0, y0, w, h, 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] ), QMatrix( a[0], a[1], a[2], a[3], a[4], a[5] ),
shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode ); shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode );
} }
else if ( data.hasSvg( filename ) ) else if ( data.hasSvg( fn ) )
{ {
return new ModelImageObject( x0, y0, w, h, 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] ), QMatrix( a[0], a[1], a[2], a[3], a[4], a[5] ),
shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode ); shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode );
} }
else else
{ {
qWarning() << "Embedded file" << filename << "missing. Trying actual file."; qWarning() << "Embedded file" << fn << "missing. Trying actual file.";
return new ModelImageObject( x0, y0, w, h, return new ModelImageObject( x0, y0, w, h,
filenameNode, filenameNode,
QMatrix( a[0], a[1], a[2], a[3], a[4], a[5] ), QMatrix( a[0], a[1], a[2], a[3], a[4], a[5] ),
@@ -711,20 +719,37 @@ namespace glabels
void void
XmlLabelParser::parseMergeNode( const QDomElement &node, Model* label ) XmlLabelParser::parseMergeNode( const QDomElement &node, Model* model )
{ {
QString type = XmlUtil::getStringAttr( node, "type", "None" ); QString id = XmlUtil::getStringAttr( node, "type", "None" );
QString src = XmlUtil::getStringAttr( node, "src", "" ); QString src = XmlUtil::getStringAttr( node, "src", "" );
merge::Merge* merge = merge::Factory::createMerge( type ); merge::Merge* merge = merge::Factory::createMerge( id );
merge->setSource( src );
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 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() ) for ( QDomNode child = node.firstChild(); !child.isNull(); child = child.nextSibling() )
{ {
@@ -732,7 +757,7 @@ namespace glabels
if ( tagName == "Variable" ) if ( tagName == "Variable" )
{ {
parseVariableNode( child.toElement(), label ); parseVariableNode( child.toElement(), model );
} }
else if ( !child.isComment() ) else if ( !child.isComment() )
{ {
@@ -743,7 +768,7 @@ namespace glabels
void void
XmlLabelParser::parseVariableNode( const QDomElement &node, Model* label ) XmlLabelParser::parseVariableNode( const QDomElement &node, Model* model )
{ {
QString typeString = XmlUtil::getStringAttr( node, "type", "string" ); QString typeString = XmlUtil::getStringAttr( node, "type", "string" );
QString name = XmlUtil::getStringAttr( node, "name", "unknown" ); QString name = XmlUtil::getStringAttr( node, "name", "unknown" );
@@ -755,12 +780,14 @@ namespace glabels
auto increment = Variable::idStringToIncrement( incrementString ); auto increment = Variable::idStringToIncrement( incrementString );
Variable v( type, name, initialValue, increment, stepSize ); Variable v( type, name, initialValue, increment, stepSize );
label->variables()->addVariable( v ); model->variables()->addVariable( v );
} }
void 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() ) for ( QDomNode child = node.firstChild(); !child.isNull(); child = child.nextSibling() )
{ {
@@ -768,7 +795,7 @@ namespace glabels
if ( tagName == "File" ) if ( tagName == "File" )
{ {
parseFileNode( child.toElement(), data ); parseFileNode( child.toElement(), model, data );
} }
else if ( !child.isComment() ) else if ( !child.isComment() )
{ {
@@ -779,12 +806,17 @@ namespace glabels
void 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 name = XmlUtil::getStringAttr( node, "name", "" );
QString mimetype = XmlUtil::getStringAttr( node, "mimetype", "image/png" ); QString mimetype = XmlUtil::getStringAttr( node, "mimetype", "image/png" );
QString encoding = XmlUtil::getStringAttr( node, "encoding", "base64" ); 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 ( mimetype == "image/png" )
{ {
if ( encoding == "base64" ) if ( encoding == "base64" )
@@ -794,7 +826,7 @@ namespace glabels
QImage image; QImage image;
image.loadFromData( ba, "PNG" ); image.loadFromData( ba, "PNG" );
data.addImage( name, image ); data.addImage( fn, image );
} }
else else
{ {
@@ -803,7 +835,7 @@ namespace glabels
} }
else if ( mimetype == "image/svg+xml" ) else if ( mimetype == "image/svg+xml" )
{ {
data.addSvg( name, node.text().toUtf8() ); data.addSvg( fn, node.text().toUtf8() );
} }
} }
+41 -10
View File
@@ -52,26 +52,57 @@ namespace glabels
public: public:
static Model* readFile( const QString& fileName ); static Model* readFile( const QString& fileName );
static Model* readBuffer( const QByteArray& buffer ); static Model* readBuffer( const QByteArray& buffer );
static QList<ModelObject*> deserializeObjects( const QByteArray& buffer );
static QList<ModelObject*> deserializeObjects( const QByteArray& buffer,
const Model* model );
private: private:
static void gunzip( const QByteArray& gzippedData, QByteArray& data ); static void gunzip( const QByteArray& gzippedData,
static Model* parseRootNode( const QDomElement &node ); QByteArray& data );
static QList<ModelObject*> parseObjectsNode( const QDomElement &node, const DataCache& data );
static Model* parseRootNode( const QDomElement& node,
const QString& fileName );
static QList<ModelObject*> parseObjectsNode( const QDomElement& node,
const Model* model,
const DataCache& data );
static ModelBoxObject* parseObjectBoxNode( const QDomElement& node ); static ModelBoxObject* parseObjectBoxNode( const QDomElement& node );
static ModelEllipseObject* parseObjectEllipseNode( const QDomElement& node ); static ModelEllipseObject* parseObjectEllipseNode( const QDomElement& node );
static ModelLineObject* parseObjectLineNode( const QDomElement& node ); static ModelLineObject* parseObjectLineNode( const QDomElement& node );
static ModelImageObject* parseObjectImageNode( const QDomElement &node, const DataCache& data );
static ModelImageObject* parseObjectImageNode( const QDomElement& node,
const Model* model,
const DataCache& data );
static ModelBarcodeObject* parseObjectBarcodeNode( const QDomElement& node ); static ModelBarcodeObject* parseObjectBarcodeNode( const QDomElement& node );
static ModelTextObject* parseObjectTextNode( const QDomElement& node ); static ModelTextObject* parseObjectTextNode( const QDomElement& node );
static QString parsePNode( const QDomElement& node ); static QString parsePNode( const QDomElement& node );
static bool parseRotateAttr( 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 parseMergeNode( const QDomElement& node,
static void parseVariableNode( const QDomElement &node, Model* label ); Model* model );
static void parseDataNode( const QDomElement &node, DataCache& data );
static void parseFileNode( const QDomElement &node, DataCache& data ); 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 );
}; };
+16
View File
@@ -1169,6 +1169,14 @@
<source>Use substitution field</source> <source>Use substitution field</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Use key</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Custom color #%1</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>glabels::EditVariableDialog</name> <name>glabels::EditVariableDialog</name>
@@ -1938,6 +1946,14 @@
<source>Use substitution field</source> <source>Use substitution field</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Insert Field</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Selected File...</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>glabels::PrintView</name> <name>glabels::PrintView</name>