From 37358aac437a66b310f01243de6874e39a9b0f7d Mon Sep 17 00:00:00 2001 From: Jim Evins Date: Sun, 8 May 2016 00:43:35 -0400 Subject: [PATCH] More fleshing out of merge framework. --- glabels/LabelModel.cpp | 31 ++++++++++++++ glabels/LabelModel.h | 6 +++ glabels/Merge.cpp | 10 ++--- glabels/Merge.h | 16 +++---- glabels/MergeFactory.cpp | 84 +++++++++++++++++++++++++++++++------ glabels/MergeFactory.h | 29 +++++++++++-- glabels/MergeNone.cpp | 12 +++++- glabels/MergeNone.h | 1 + glabels/MergeText.cpp | 7 +++- glabels/MergeTextCsv.cpp | 10 +++++ glabels/MergeTextCsv.h | 1 + glabels/XmlLabelCreator.cpp | 13 +++++- glabels/XmlLabelParser.cpp | 10 +++++ 13 files changed, 193 insertions(+), 37 deletions(-) diff --git a/glabels/LabelModel.cpp b/glabels/LabelModel.cpp index dc30fcf..ed0fd99 100644 --- a/glabels/LabelModel.cpp +++ b/glabels/LabelModel.cpp @@ -92,12 +92,16 @@ void LabelModel::restore( const LabelModel *savedModel ) connect( object, SIGNAL(moved()), this, SLOT(onObjectMoved()) ); } + delete mMerge; + mMerge = savedModel->mMerge->clone(); + // Emit signals based on potential changes emit changed(); emit selectionChanged(); emit modifiedChanged(); emit nameChanged(); emit sizeChanged(); + emit mergeChanged(); } @@ -263,6 +267,33 @@ QString LabelModel::shortName() } +/// +/// Get merge object +/// +Merge* LabelModel::merge() const +{ + return mMerge; +} + + +/// +/// Set merge object +/// +void LabelModel::setMerge( Merge* merge ) +{ + if ( merge != mMerge ) + { + if ( mMerge ) + { + delete mMerge; + } + mMerge = merge; + + emit mergeChanged(); + } +} + + /// /// Clear modified status /// diff --git a/glabels/LabelModel.h b/glabels/LabelModel.h index 7f90e60..7c47cf7 100644 --- a/glabels/LabelModel.h +++ b/glabels/LabelModel.h @@ -25,6 +25,7 @@ #include #include +#include "Merge.h" #include "MergeRecord.h" #include "libglabels/Template.h" #include "Settings.h" @@ -71,6 +72,7 @@ signals: void sizeChanged(); void selectionChanged(); void modifiedChanged(); + void mergeChanged(); ///////////////////////////////// @@ -99,6 +101,9 @@ public: const QList& objectList() const; + Merge* merge() const; + void setMerge( Merge* merge ); + ///////////////////////////////// // Manage objects @@ -218,6 +223,7 @@ private: QList mObjectList; + Merge* mMerge; }; diff --git a/glabels/Merge.cpp b/glabels/Merge.cpp index e19f747..2d41442 100644 --- a/glabels/Merge.cpp +++ b/glabels/Merge.cpp @@ -24,7 +24,7 @@ /// /// Constructor /// -Merge::Merge( SourceType type ) : mType(type) +Merge::Merge() { } @@ -32,7 +32,7 @@ Merge::Merge( SourceType type ) : mType(type) /// /// Constructor /// -Merge::Merge( const Merge* merge ) : mType(merge->mType), mSource(merge->mSource) +Merge::Merge( const Merge* merge ) : mSource(merge->mSource) { foreach ( MergeRecord* record, merge->mRecordList ) { @@ -55,11 +55,11 @@ Merge::~Merge() /// -/// Get type +/// Get id /// -Merge::SourceType Merge::type() const +QString Merge::id() const { - return mType; + return mId; } diff --git a/glabels/Merge.h b/glabels/Merge.h index aacd106..8731607 100644 --- a/glabels/Merge.h +++ b/glabels/Merge.h @@ -36,19 +36,13 @@ struct Merge : QObject Q_OBJECT - ///////////////////////////////// - // Source Type - ///////////////////////////////// -public: - enum SourceType { NONE, FIXED, FILE }; - - ///////////////////////////////// // Life Cycle ///////////////////////////////// protected: - Merge( SourceType type ); + Merge(); Merge( const Merge* merge ); +public: virtual ~Merge(); @@ -62,7 +56,7 @@ protected: // Properties ///////////////////////////////// public: - SourceType type() const; + QString id() const; QString source() const; void setSource( const QString& source ); @@ -103,9 +97,9 @@ signals: ///////////////////////////////// // Private data ///////////////////////////////// +protected: + QString mId; private: - SourceType mType; - QString mSource; QList mRecordList; }; diff --git a/glabels/MergeFactory.cpp b/glabels/MergeFactory.cpp index 030e55b..665fbd1 100644 --- a/glabels/MergeFactory.cpp +++ b/glabels/MergeFactory.cpp @@ -27,7 +27,8 @@ /// /// Static data /// -QMap MergeFactory::mBackendMap; +QMap MergeFactory::mBackendIdMap; +QMap MergeFactory::mBackendNameMap; /// @@ -35,8 +36,15 @@ QMap MergeFactory::mBackendMap; /// MergeFactory::MergeFactory() { - registerBackend( "None", &MergeNone::create ); - registerBackend( "Text/CSV", &MergeTextCsv::create ); + registerBackend( MergeNone::id(), + tr("None"), + NONE, + &MergeNone::create ); + + registerBackend( MergeTextCsv::id(), + tr("Text: Comma Separated Values (CSV)"), + FILE, + &MergeTextCsv::create ); } @@ -58,8 +66,8 @@ void MergeFactory::init() /// Merge* MergeFactory::createMerge( const QString& id ) { - QMap::iterator iBackend = mBackendMap.find( id ); - if ( iBackend != mBackendMap.end() ) + QMap::iterator iBackend = mBackendIdMap.find( id ); + if ( iBackend != mBackendIdMap.end() ) { return iBackend->create(); } @@ -69,16 +77,68 @@ Merge* MergeFactory::createMerge( const QString& id ) /// -/// Register backend +/// Get name list /// -void MergeFactory::registerBackend( const QString& id, CreateFct create ) +QList MergeFactory::nameList() { - BackendEntry backend; - - backend.id = id; - backend.create = create; + QList list; - mBackendMap[ id ] = backend; + foreach ( BackendEntry backend, mBackendIdMap ) + { + list << backend.name; + } + + return list; +} + + +/// +/// Convert ID to name +/// +QString MergeFactory::idToName( const QString& id ) +{ + if ( mBackendIdMap.contains( id ) ) + { + return mBackendIdMap[id].name; + } + else + { + return tr("None"); + } +} + + +/// +/// Convert name to ID +/// +QString MergeFactory::nameToId( const QString& name ) +{ + if ( mBackendNameMap.contains( name ) ) + { + return mBackendNameMap[name].id; + } + else + { + return "None"; + } +} + + +/// +/// Register backend +/// +void MergeFactory::registerBackend( const QString& id, + const QString& name, + SourceType type, + CreateFct create ) +{ + BackendEntry backend; + + backend.name = name; + backend.type = type; + backend.create = create; + + mBackendIdMap[ id ] = backend; } diff --git a/glabels/MergeFactory.h b/glabels/MergeFactory.h index 0837d0a..03527f9 100644 --- a/glabels/MergeFactory.h +++ b/glabels/MergeFactory.h @@ -22,6 +22,7 @@ #define MergeFactory_h #include "Merge.h" +#include /// @@ -29,7 +30,16 @@ /// struct MergeFactory { + Q_DECLARE_TR_FUNCTIONS(MergeFactory) + + ///////////////////////////////// + // Source Type + ///////////////////////////////// +public: + enum SourceType { NONE, FIXED, FILE }; + + ///////////////////////////////// // Life Cycle ///////////////////////////////// @@ -42,8 +52,13 @@ protected: ///////////////////////////////// public: static void init(); + static Merge* createMerge( const QString& id ); + static QList nameList(); + static QString idToName( const QString& id ); + static QString nameToId( const QString& name ); + ///////////////////////////////// // private methods @@ -51,7 +66,10 @@ public: private: typedef Merge* (*CreateFct)(); - static void registerBackend( const QString& id, CreateFct create ); + static void registerBackend( const QString& id, + const QString& name, + SourceType type, + CreateFct create ); ///////////////////////////////// @@ -60,11 +78,14 @@ private: class BackendEntry { public: - QString id; - CreateFct create; + QString id; + QString name; + SourceType type; + CreateFct create; }; - static QMap mBackendMap; + static QMap mBackendIdMap; + static QMap mBackendNameMap; }; diff --git a/glabels/MergeNone.cpp b/glabels/MergeNone.cpp index 76938d3..985afd8 100644 --- a/glabels/MergeNone.cpp +++ b/glabels/MergeNone.cpp @@ -24,8 +24,9 @@ /// /// Constructor /// -MergeNone::MergeNone() : Merge( Merge::NONE ) +MergeNone::MergeNone() : Merge() { + mId = "None"; } @@ -54,6 +55,15 @@ MergeNone* MergeNone::clone() const } +/// +/// Get ID +/// +QString MergeNone::id() +{ + return "None"; +} + + /// /// Create /// diff --git a/glabels/MergeNone.h b/glabels/MergeNone.h index d568eeb..a10b288 100644 --- a/glabels/MergeNone.h +++ b/glabels/MergeNone.h @@ -49,6 +49,7 @@ protected: // Static methods ///////////////////////////////// public: + static QString id(); static Merge* create(); diff --git a/glabels/MergeText.cpp b/glabels/MergeText.cpp index b20a47e..395f9e6 100644 --- a/glabels/MergeText.cpp +++ b/glabels/MergeText.cpp @@ -24,7 +24,8 @@ /// /// Constructor /// -MergeText::MergeText( QChar delimiter, bool line1HasKeys ) : Merge( Merge::FILE ), mNFieldsMax(0) +MergeText::MergeText( QChar delimiter, bool line1HasKeys ) + : mNFieldsMax(0), mDelimeter(delimiter), mLine1HasKeys(line1HasKeys) { } @@ -33,7 +34,9 @@ MergeText::MergeText( QChar delimiter, bool line1HasKeys ) : Merge( Merge::FILE /// Constructor /// MergeText::MergeText( const MergeText* merge ) - : Merge( merge ), mDelimeter(merge->mDelimeter), mLine1HasKeys(merge->mLine1HasKeys) + : Merge( merge ), + mNFieldsMax(merge->mNFieldsMax), + mDelimeter(merge->mDelimeter), mLine1HasKeys(merge->mLine1HasKeys) { } diff --git a/glabels/MergeTextCsv.cpp b/glabels/MergeTextCsv.cpp index 0b512eb..d951606 100644 --- a/glabels/MergeTextCsv.cpp +++ b/glabels/MergeTextCsv.cpp @@ -26,6 +26,7 @@ /// MergeTextCsv::MergeTextCsv() : MergeText(',',false) { + mId = "Text/CSV"; } @@ -54,6 +55,15 @@ MergeTextCsv* MergeTextCsv::clone() const } +/// +/// Get ID +/// +QString MergeTextCsv::id() +{ + return "Text/CSV"; +} + + /// /// Create /// diff --git a/glabels/MergeTextCsv.h b/glabels/MergeTextCsv.h index 1f63933..c6991ce 100644 --- a/glabels/MergeTextCsv.h +++ b/glabels/MergeTextCsv.h @@ -43,6 +43,7 @@ private: // Object duplication ///////////////////////////////// public: + static QString id(); MergeTextCsv* clone() const; diff --git a/glabels/XmlLabelCreator.cpp b/glabels/XmlLabelCreator.cpp index 6e8d773..0c4282a 100644 --- a/glabels/XmlLabelCreator.cpp +++ b/glabels/XmlLabelCreator.cpp @@ -27,6 +27,7 @@ //#include "LabelObjectLine.h" //#include "LabelObjectImage.h" //#include "LabelObjectBarcode.h" +#include "MergeNone.h" #include "libglabels/XmlTemplateCreator.h" #include "libglabels/XmlUtil.h" @@ -96,7 +97,10 @@ XmlLabelCreator::createDoc( QDomDocument& doc, const LabelModel* label ) createObjectsNode( root, label ); - // TODO merge node + if ( label->merge() && !dynamic_cast(label->merge()) ) + { + createMergeNode( root, label ); + } createDataNode( root, label ); } @@ -261,7 +265,12 @@ XmlLabelCreator::createShadowAttrs( QDomElement &node, const LabelModelObject* o void XmlLabelCreator::createMergeNode( QDomElement &parent, const LabelModel* label ) { - // TODO + QDomDocument doc = parent.ownerDocument(); + QDomElement node = doc.createElement( "Merge" ); + parent.appendChild( node ); + + glabels::XmlUtil::setStringAttr( node, "type", label->merge()->id() ); + glabels::XmlUtil::setStringAttr( node, "src", label->merge()->source() ); } diff --git a/glabels/XmlLabelParser.cpp b/glabels/XmlLabelParser.cpp index b18bbd9..8f43c30 100644 --- a/glabels/XmlLabelParser.cpp +++ b/glabels/XmlLabelParser.cpp @@ -27,6 +27,7 @@ //#include "LabelObjectLine.h" //#include "LabelObjectImage.h" //#include "LabelObjectBarcode.h" +#include "MergeFactory.h" #include "libglabels/XmlTemplateParser.h" #include "libglabels/XmlUtil.h" @@ -435,6 +436,15 @@ XmlLabelParser::parseShadowAttrs( const QDomElement &node, LabelModelObject* obj void XmlLabelParser::parseMergeNode( const QDomElement &node, LabelModel* label ) { + using namespace glabels; + + QString type = XmlUtil::getStringAttr( node, "type", "None" ); + QString src = XmlUtil::getStringAttr( node, "src", "" ); + + Merge* merge = MergeFactory::createMerge( type ); + merge->setSource( src ); + + label->setMerge( merge ); }