Save/restore file paths as relative to project file.
This commit is contained in:
+2
-6
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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 );
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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
@@ -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() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+48
-17
@@ -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 ModelBoxObject* parseObjectBoxNode( const QDomElement &node );
|
static Model* parseRootNode( const QDomElement& node,
|
||||||
static ModelEllipseObject* parseObjectEllipseNode( const QDomElement &node );
|
const QString& fileName );
|
||||||
static ModelLineObject* parseObjectLineNode( const QDomElement &node );
|
|
||||||
static ModelImageObject* parseObjectImageNode( const QDomElement &node, const DataCache& data );
|
static QList<ModelObject*> parseObjectsNode( const QDomElement& node,
|
||||||
static ModelBarcodeObject* parseObjectBarcodeNode( const QDomElement &node );
|
const Model* model,
|
||||||
static ModelTextObject* parseObjectTextNode( const QDomElement &node );
|
const DataCache& data );
|
||||||
static QString parsePNode( const QDomElement &node );
|
|
||||||
static bool parseRotateAttr( const QDomElement &node );
|
static ModelBoxObject* parseObjectBoxNode( const QDomElement& node );
|
||||||
static void parseMergeNode( const QDomElement &node, Model* label );
|
|
||||||
static void parseVariablesNode( const QDomElement &node, Model* label );
|
static ModelEllipseObject* parseObjectEllipseNode( const QDomElement& node );
|
||||||
static void parseVariableNode( const QDomElement &node, Model* label );
|
|
||||||
static void parseDataNode( const QDomElement &node, DataCache& data );
|
static ModelLineObject* parseObjectLineNode( const QDomElement& node );
|
||||||
static void parseFileNode( const QDomElement &node, DataCache& data );
|
|
||||||
|
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 );
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user