diff --git a/glabels/Handles.cpp b/glabels/Handles.cpp index 6e55686..bd4b0f5 100644 --- a/glabels/Handles.cpp +++ b/glabels/Handles.cpp @@ -119,41 +119,6 @@ QPainterPath Handle::pathAt( double scale, } -/// -/// HandleNorthWest Constructor -/// -HandleNorthWest::HandleNorthWest( LabelModelObject* owner ) - : Handle( owner, NW ) -{ -} - - -/// -/// HandleNorthWest Destructor -/// -HandleNorthWest::~HandleNorthWest() -{ -} - - -/// -/// Draw HandleNorthWest -/// -void HandleNorthWest::draw( QPainter* painter, double scale ) const -{ - drawAt( painter, scale, 0, 0, originHandleFillColor ); -} - - -/// -/// HandleNorthWest Path -/// -QPainterPath HandleNorthWest::path( double scale ) const -{ - return pathAt( scale, 0, 0 ); -} - - /// /// HandleNorth Constructor /// @@ -171,6 +136,15 @@ HandleNorth::~HandleNorth() } +/// +/// HandleNorth Clone +/// +HandleNorth* HandleNorth::clone( LabelModelObject* newOwner ) const +{ + return new HandleNorth( newOwner ); +} + + /// /// Draw HandleNorth /// @@ -206,6 +180,15 @@ HandleNorthEast::~HandleNorthEast() } +/// +/// HandleNorthEast Clone +/// +HandleNorthEast* HandleNorthEast::clone( LabelModelObject* newOwner ) const +{ + return new HandleNorthEast( newOwner ); +} + + /// /// Draw HandleNorthEast /// @@ -241,6 +224,15 @@ HandleEast::~HandleEast() } +/// +/// HandleEast Clone +/// +HandleEast* HandleEast::clone( LabelModelObject* newOwner ) const +{ + return new HandleEast( newOwner ); +} + + /// /// Draw HandleEast /// @@ -276,6 +268,15 @@ HandleSouthEast::~HandleSouthEast() } +/// +/// HandleSouthEast Clone +/// +HandleSouthEast* HandleSouthEast::clone( LabelModelObject* newOwner ) const +{ + return new HandleSouthEast( newOwner ); +} + + /// /// Draw HandleSouthEast /// @@ -311,6 +312,15 @@ HandleSouth::~HandleSouth() } +/// +/// HandleSouth Clone +/// +HandleSouth* HandleSouth::clone( LabelModelObject* newOwner ) const +{ + return new HandleSouth( newOwner ); +} + + /// /// Draw HandleSouth /// @@ -346,6 +356,15 @@ HandleSouthWest::~HandleSouthWest() } +/// +/// HandleSouthWest Clone +/// +HandleSouthWest* HandleSouthWest::clone( LabelModelObject* newOwner ) const +{ + return new HandleSouthWest( newOwner ); +} + + /// /// Draw HandleSouthWest /// @@ -381,6 +400,15 @@ HandleWest::~HandleWest() } +/// +/// HandleWest Clone +/// +HandleWest* HandleWest::clone( LabelModelObject* newOwner ) const +{ + return new HandleWest( newOwner ); +} + + /// /// Draw HandleWest /// @@ -399,6 +427,49 @@ QPainterPath HandleWest::path( double scale ) const } +/// +/// HandleNorthWest Constructor +/// +HandleNorthWest::HandleNorthWest( LabelModelObject* owner ) + : Handle( owner, NW ) +{ +} + + +/// +/// HandleNorthWest Destructor +/// +HandleNorthWest::~HandleNorthWest() +{ +} + +/// +/// HandleNorthWest Clone +/// +HandleNorthWest* HandleNorthWest::clone( LabelModelObject* newOwner ) const +{ + return new HandleNorthWest( newOwner ); +} + + +/// +/// Draw HandleNorthWest +/// +void HandleNorthWest::draw( QPainter* painter, double scale ) const +{ + drawAt( painter, scale, 0, 0, originHandleFillColor ); +} + + +/// +/// HandleNorthWest Path +/// +QPainterPath HandleNorthWest::path( double scale ) const +{ + return pathAt( scale, 0, 0 ); +} + + /// /// HandleP1 Constructor /// @@ -416,6 +487,15 @@ HandleP1::~HandleP1() } +/// +/// HandleP1 Clone +/// +HandleP1* HandleP1::clone( LabelModelObject* newOwner ) const +{ + return new HandleP1( newOwner ); +} + + /// /// Draw HandleP1 /// @@ -451,6 +531,15 @@ HandleP2::~HandleP2() } +/// +/// HandleP2 Clone +/// +HandleP2* HandleP2::clone( LabelModelObject* newOwner ) const +{ + return new HandleP2( newOwner ); +} + + /// /// Draw HandleP2 /// diff --git a/glabels/Handles.h b/glabels/Handles.h index 300fa64..3769efa 100644 --- a/glabels/Handles.h +++ b/glabels/Handles.h @@ -50,6 +50,12 @@ protected: public: virtual ~Handle(); + + //////////////////////////// + // Duplication + //////////////////////////// + virtual Handle* clone( LabelModelObject* newOwner ) const = 0; + //////////////////////////// // Attribue Methods @@ -97,6 +103,7 @@ class HandleNorth : public Handle public: HandleNorth( LabelModelObject* owner ); virtual ~HandleNorth(); + virtual HandleNorth* clone( LabelModelObject* newOwner ) const; //////////////////////////// @@ -119,6 +126,7 @@ class HandleNorthEast : public Handle public: HandleNorthEast( LabelModelObject* owner ); virtual ~HandleNorthEast(); + virtual HandleNorthEast* clone( LabelModelObject* newOwner ) const; //////////////////////////// @@ -141,6 +149,7 @@ class HandleEast : public Handle public: HandleEast( LabelModelObject* owner ); virtual ~HandleEast(); + virtual HandleEast* clone( LabelModelObject* newOwner ) const; //////////////////////////// @@ -163,6 +172,7 @@ class HandleSouthEast : public Handle public: HandleSouthEast( LabelModelObject* owner ); virtual ~HandleSouthEast(); + virtual HandleSouthEast* clone( LabelModelObject* newOwner ) const; //////////////////////////// @@ -185,6 +195,7 @@ class HandleSouth : public Handle public: HandleSouth( LabelModelObject* owner ); virtual ~HandleSouth(); + virtual HandleSouth* clone( LabelModelObject* newOwner ) const; //////////////////////////// @@ -207,6 +218,7 @@ class HandleSouthWest : public Handle public: HandleSouthWest( LabelModelObject* owner ); virtual ~HandleSouthWest(); + virtual HandleSouthWest* clone( LabelModelObject* newOwner ) const; //////////////////////////// @@ -229,6 +241,7 @@ class HandleWest : public Handle public: HandleWest( LabelModelObject* owner ); virtual ~HandleWest(); + virtual HandleWest* clone( LabelModelObject* newOwner ) const; //////////////////////////// @@ -251,6 +264,7 @@ class HandleNorthWest : public Handle public: HandleNorthWest( LabelModelObject* owner ); virtual ~HandleNorthWest(); + virtual HandleNorthWest* clone( LabelModelObject* newOwner ) const; //////////////////////////// @@ -273,6 +287,7 @@ class HandleP1 : public Handle public: HandleP1( LabelModelObject* owner ); virtual ~HandleP1(); + virtual HandleP1* clone( LabelModelObject* newOwner ) const; //////////////////////////// @@ -296,6 +311,11 @@ public: HandleP2( LabelModelObject* owner ); virtual ~HandleP2(); + //////////////////////////// + // Duplication + //////////////////////////// + virtual HandleP2* clone( LabelModelObject* newOwner ) const; + //////////////////////////// // Drawing Methods diff --git a/glabels/LabelModel.cpp b/glabels/LabelModel.cpp index 72e9917..251133c 100644 --- a/glabels/LabelModel.cpp +++ b/glabels/LabelModel.cpp @@ -48,6 +48,49 @@ LabelModel::LabelModel() : mUntitledInstance(0), mModified(true), mTmplate(0), m } +/// +/// Save model state +/// +LabelModel* LabelModel::save() const +{ + LabelModel* savedModel = new LabelModel; + savedModel->restore( this ); + + return savedModel; +} + + +/// +/// Restore model state +/// +void LabelModel::restore( const LabelModel *savedModel ) +{ + // Clear current object list + foreach ( LabelModelObject* object, mObjectList ) + { + delete object; + } + mObjectList.clear(); + + // Now copy state + mUntitledInstance = savedModel->mUntitledInstance; + mModified = savedModel->mModified; + mFileName = savedModel->mFileName; + mCompressionLevel = savedModel->mCompressionLevel; + mTmplate = savedModel->mTmplate; + mFrame = savedModel->mFrame; + mRotate = savedModel->mRotate; + + foreach ( LabelModelObject* object, savedModel->mObjectList ) + { + mObjectList.append( object->clone() ); + } + + emit changed(); + emit selectionChanged(); +} + + /// /// Short name. /// diff --git a/glabels/LabelModel.h b/glabels/LabelModel.h index ac9b068..bf8ec1f 100644 --- a/glabels/LabelModel.h +++ b/glabels/LabelModel.h @@ -54,6 +54,13 @@ public: LabelModel(); virtual ~LabelModel() {} + + ///////////////////////////////// + // Save/restore model state + ///////////////////////////////// + LabelModel* save() const; + void restore( const LabelModel *savedModel ); + ///////////////////////////////// // Signals diff --git a/glabels/LabelModelBoxObject.cpp b/glabels/LabelModelBoxObject.cpp index 818cc4f..e14a3c6 100644 --- a/glabels/LabelModelBoxObject.cpp +++ b/glabels/LabelModelBoxObject.cpp @@ -33,7 +33,15 @@ namespace /// /// Constructor /// -LabelModelBoxObject::LabelModelBoxObject( QObject* parent ) : LabelModelShapeObject(parent) +LabelModelBoxObject::LabelModelBoxObject() +{ +} + + +/// +/// Copy constructor +/// +LabelModelBoxObject::LabelModelBoxObject( const LabelModelBoxObject* object ) : LabelModelShapeObject( object ) { } @@ -46,6 +54,15 @@ LabelModelBoxObject::~LabelModelBoxObject() } +/// +/// Clone +/// +LabelModelBoxObject* LabelModelBoxObject::clone() const +{ + return new LabelModelBoxObject( this ); +} + + /// /// Draw shadow of object /// diff --git a/glabels/LabelModelBoxObject.h b/glabels/LabelModelBoxObject.h index 588f362..cf7c287 100644 --- a/glabels/LabelModelBoxObject.h +++ b/glabels/LabelModelBoxObject.h @@ -36,9 +36,16 @@ class LabelModelBoxObject : public LabelModelShapeObject // Lifecycle Methods /////////////////////////////////////////////////////////////// public: - LabelModelBoxObject( QObject* parent = 0 ); + LabelModelBoxObject(); + LabelModelBoxObject( const LabelModelBoxObject* object ); virtual ~LabelModelBoxObject(); + + /////////////////////////////////////////////////////////////// + // Object duplication + /////////////////////////////////////////////////////////////// + virtual LabelModelBoxObject* clone() const; + /////////////////////////////////////////////////////////////// // Drawing operations diff --git a/glabels/LabelModelObject.cpp b/glabels/LabelModelObject.cpp index 6450ecb..3f1cc31 100644 --- a/glabels/LabelModelObject.cpp +++ b/glabels/LabelModelObject.cpp @@ -41,7 +41,7 @@ int LabelModelObject::msNextId = 0; /// /// Constructor /// -LabelModelObject::LabelModelObject( QObject *parent = 0 ) : QObject(parent) +LabelModelObject::LabelModelObject() : QObject(0) { mId = msNextId++; @@ -63,6 +63,36 @@ LabelModelObject::LabelModelObject( QObject *parent = 0 ) : QObject(parent) } +/// +/// Copy constructor +/// +LabelModelObject::LabelModelObject( const LabelModelObject* object ) +{ + mId = msNextId++; + + mSelectedFlag = object->mSelectedFlag; + + mX0 = object->mX0; + mY0 = object->mY0; + mW = object->mW; + mH = object->mH; + + mShadowState = object->mShadowState; + mShadowX = object->mShadowX; + mShadowY = object->mShadowY; + mShadowOpacity = object->mShadowOpacity; + mShadowColorNode = object->mShadowColorNode; + + foreach ( Handle* handle, object->mHandles ) + { + mHandles.append( handle->clone( this ) ); + } + mOutline = object->mOutline->clone( this ); + + mMatrix = object->mMatrix; +} + + /// /// Destructor /// diff --git a/glabels/LabelModelObject.h b/glabels/LabelModelObject.h index 27573a1..d7e6197 100644 --- a/glabels/LabelModelObject.h +++ b/glabels/LabelModelObject.h @@ -49,11 +49,19 @@ class LabelModelObject : public QObject /////////////////////////////////////////////////////////////// // Lifecycle Methods /////////////////////////////////////////////////////////////// +protected: + LabelModelObject(); + LabelModelObject( const LabelModelObject* object ); public: - LabelModelObject( QObject *parent ); virtual ~LabelModelObject(); + /////////////////////////////////////////////////////////////// + // Object duplication + /////////////////////////////////////////////////////////////// + virtual LabelModelObject* clone() const = 0; + + /////////////////////////////////////////////////////////////// // Signals /////////////////////////////////////////////////////////////// diff --git a/glabels/LabelModelShapeObject.cpp b/glabels/LabelModelShapeObject.cpp index 017db99..b4f6730 100644 --- a/glabels/LabelModelShapeObject.cpp +++ b/glabels/LabelModelShapeObject.cpp @@ -27,7 +27,7 @@ /// /// Constructor /// -LabelModelShapeObject::LabelModelShapeObject( QObject* parent ) : LabelModelObject(parent) +LabelModelShapeObject::LabelModelShapeObject() { mOutline = new Outline( this ); @@ -46,6 +46,17 @@ LabelModelShapeObject::LabelModelShapeObject( QObject* parent ) : LabelModelObje } +/// +/// Copy constructor +/// +LabelModelShapeObject::LabelModelShapeObject( const LabelModelShapeObject* object ) : LabelModelObject(object) +{ + mLineWidth = object->mLineWidth; + mLineColorNode = object->mLineColorNode; + mFillColorNode = object->mFillColorNode; +} + + /// /// Destructor /// diff --git a/glabels/LabelModelShapeObject.h b/glabels/LabelModelShapeObject.h index 486c1a2..588e7c4 100644 --- a/glabels/LabelModelShapeObject.h +++ b/glabels/LabelModelShapeObject.h @@ -35,7 +35,8 @@ class LabelModelShapeObject : public LabelModelObject // Lifecycle Methods /////////////////////////////////////////////////////////////// protected: - LabelModelShapeObject( QObject* parent = 0 ); + LabelModelShapeObject(); + LabelModelShapeObject( const LabelModelShapeObject* object ); public: virtual ~LabelModelShapeObject(); diff --git a/glabels/Outline.cpp b/glabels/Outline.cpp index 1b496e3..6338345 100644 --- a/glabels/Outline.cpp +++ b/glabels/Outline.cpp @@ -60,6 +60,18 @@ Outline::Outline( LabelModelObject* owner ) } +/// +/// Outline Copy constructor +/// +Outline::Outline( const Outline* outline, LabelModelObject* newOwner ) + : mOwner(newOwner) +{ + mDashes = outline->mDashes; + mPen1 = outline->mPen1; + mPen2 = outline->mPen2; +} + + /// /// Outline Destructor /// @@ -68,6 +80,15 @@ Outline::~Outline() } +/// +/// Clone Outline +/// +Outline* Outline::clone( LabelModelObject* newOwner ) const +{ + return new Outline( this, newOwner ); +} + + /// /// Draw Outline /// diff --git a/glabels/Outline.h b/glabels/Outline.h index aadf5dc..f331ddb 100644 --- a/glabels/Outline.h +++ b/glabels/Outline.h @@ -39,8 +39,15 @@ class Outline //////////////////////////// public: Outline( LabelModelObject* owner ); + Outline( const Outline* outline, LabelModelObject* newOwner ); virtual ~Outline(); + + //////////////////////////// + // Duplication + //////////////////////////// + Outline* clone( LabelModelObject* newOwner ) const; + //////////////////////////// // Drawing Methods