From 2686c62a9139e3b8f81549e62063500ca52a8163 Mon Sep 17 00:00:00 2001 From: akl Date: Tue, 19 Nov 2013 16:45:08 +0000 Subject: [PATCH] Undo/Redo operations for Clear, Join, setClosed, setSectionName, setSectionType, setPoint. --- src/HYDROCurveCreator/CurveCreator_Curve.cxx | 179 +++++++++++++----- src/HYDROCurveCreator/CurveCreator_Curve.hxx | 26 ++- .../CurveCreator_Operation.cxx | 17 +- 3 files changed, 160 insertions(+), 62 deletions(-) diff --git a/src/HYDROCurveCreator/CurveCreator_Curve.cxx b/src/HYDROCurveCreator/CurveCreator_Curve.cxx index c1b66d58..69b0c38d 100644 --- a/src/HYDROCurveCreator/CurveCreator_Curve.cxx +++ b/src/HYDROCurveCreator/CurveCreator_Curve.cxx @@ -396,11 +396,8 @@ bool CurveCreator_Curve::redo() /***********************************************/ /*** Section methods ***/ /***********************************************/ -//======================================================================= -// function: clear -// purpose: -//======================================================================= -bool CurveCreator_Curve::clear() +//! For internal use only! Undo/Redo are not used here. +bool CurveCreator_Curve::clearInternal() { // erase curve from the viewer if( myDisplayer ) @@ -418,29 +415,55 @@ bool CurveCreator_Curve::clear() return true; } +//======================================================================= +// function: clear +// purpose: +//======================================================================= +bool CurveCreator_Curve::clear() +{ + bool res = false; + startOperation(); + // Set the difference. + if (addEmptyDiff()) { + myListDiffs.back().init(this, CurveCreator_Operation::Clear); + } + res = clearInternal(); + finishOperation(); + return res; +} + +//! For internal use only! Undo/Redo are not used here. +bool CurveCreator_Curve::joinInternal( const int theISectionTo, + const int theISectionFrom ) +{ + bool res = false; + CurveCreator_Section *aSection1 = mySections.at(theISectionTo); + CurveCreator_Section *aSection2 = mySections.at(theISectionFrom); + + aSection1->myPoints.insert(aSection1->myPoints.end(), + aSection2->myPoints.begin(), + aSection2->myPoints.end()); + + res = removeSection(theISectionFrom); + redisplayCurve(); + return res; +} + //! Join range of sections to one section (join all sections if -1 is passed in one of arguments) bool CurveCreator_Curve::join( const int theISectionTo, - const int theISectionFrom ) + const int theISectionFrom ) { + bool res = false; if (theISectionTo != theISectionFrom) { startOperation(); if (addEmptyDiff()) myListDiffs.back().init(this, CurveCreator_Operation::Join, theISectionTo, theISectionFrom); - CurveCreator_Section *aSection1 = mySections.at(theISectionTo); - CurveCreator_Section *aSection2 = mySections.at(theISectionFrom); - - aSection1->myPoints.insert(aSection1->myPoints.end(), - aSection2->myPoints.begin(), - aSection2->myPoints.end()); - - removeSection(theISectionFrom); - redisplayCurve(); + res = joinInternal( theISectionTo, theISectionFrom ); finishOperation(); - return true; } - return false; + return res; } //! Get number of sections @@ -449,7 +472,7 @@ int CurveCreator_Curve::getNbSections() const return mySections.size(); } -//! For internal use only! Undo/Redo is not used here. +//! For internal use only! Undo/Redo are not used here. int CurveCreator_Curve::addSectionInternal (const std::string& theName, const CurveCreator::SectionType theType, const bool theIsClosed, const CurveCreator::Coordinates &thePoints) @@ -513,6 +536,7 @@ int CurveCreator_Curve::addSection return resISection; } +//! For internal use only! Undo/Redo are not used here. bool CurveCreator_Curve::removeSectionInternal( const int theISection ) { if (theISection == -1) { @@ -571,12 +595,9 @@ bool CurveCreator_Curve::isClosed( const int theISection ) const return mySections.at(theISection)->myIsClosed; } -/** - * Set "closed" flag of the specified section (all sections if - * \a theISection is -1). - */ -bool CurveCreator_Curve::setClosed( const int theISection, - const bool theIsClosed ) +//! For internal use only! Undo/Redo are not used here. +bool CurveCreator_Curve::setClosedInternal( const int theISection, + const bool theIsClosed ) { if (theISection == -1) { int aSize = mySections.size(); @@ -593,6 +614,25 @@ bool CurveCreator_Curve::setClosed( const int theISection, return true; } +/** + * Set "closed" flag of the specified section (all sections if + * \a theISection is -1). + */ +bool CurveCreator_Curve::setClosed( const int theISection, + const bool theIsClosed ) +{ + bool res = false; + // Set the difference. + startOperation(); + if (addEmptyDiff()) { + myListDiffs.back().init(this, CurveCreator_Operation::SetClosed, + theIsClosed, theISection); + } + res = setClosedInternal( theISection, theIsClosed ); + finishOperation(); + return res; +} + //! Returns specified section name std::string CurveCreator_Curve::getSectionName( const int theISection ) const { @@ -601,15 +641,32 @@ std::string CurveCreator_Curve::getSectionName( const int theISection ) const return ""; } -/** Set name of the specified section */ -bool CurveCreator_Curve::setSectionName - ( const int theISection, const std::string& theName ) +//! For internal use only! Undo/Redo are not used here. +bool CurveCreator_Curve::setSectionNameInternal( const int theISection, + const std::string& theName ) { + bool res = false; if( ( theISection >= 0 ) && ( theISection < mySections.size() )){ mySections.at(theISection)->myName = theName; - return true; + res = true; + } + return res; +} + +/** Set name of the specified section */ +bool CurveCreator_Curve::setSectionName( const int theISection, + const std::string& theName ) +{ + bool res = false; + // Set the difference. + startOperation(); + if (addEmptyDiff()) { + myListDiffs.back().init(this, CurveCreator_Operation::RenameSection, + theName, theISection); } - return false; + res = setSectionNameInternal( theISection, theName ); + finishOperation(); + return res; } //! Get type of the specified section @@ -619,12 +676,9 @@ CurveCreator::SectionType CurveCreator_Curve::getSectionType return mySections.at(theISection)->myType; } -/** - * Set type of the specified section (or all sections - * if \a theISection is -1). - */ -bool CurveCreator_Curve::setSectionType( const int theISection, - const CurveCreator::SectionType theType ) +//! For internal use only! Undo/Redo are not used here. +bool CurveCreator_Curve::setSectionTypeInternal( const int theISection, + const CurveCreator::SectionType theType ) { if (theISection == -1) { int i = 0; @@ -643,12 +697,33 @@ bool CurveCreator_Curve::setSectionType( const int theISection, return true; } +/** + * Set type of the specified section (or all sections + * if \a theISection is -1). + */ +bool CurveCreator_Curve::setSectionType( const int theISection, + const CurveCreator::SectionType theType ) +{ + bool res = false; + startOperation(); + // Set the difference. + if (addEmptyDiff()) { + myListDiffs.back().init(this, CurveCreator_Operation::SetType, + theType, theISection); + } + + res = setSectionTypeInternal( theISection, theType ); + + finishOperation(); + return res; +} + /***********************************************/ /*** Point methods ***/ /***********************************************/ -//! For internal use only! Undo/Redo is not used here. +//! For internal use only! Undo/Redo are not used here. bool CurveCreator_Curve::addPointsInternal( const CurveCreator::Coordinates& theCoords, const std::vector &theISections, const std::vector &theIPnts ) @@ -705,20 +780,12 @@ bool CurveCreator_Curve::addPoints( const CurveCreator::Coordinates& theCoords, return res; } -//! Set coordinates of specified point -bool CurveCreator_Curve::setPoint( const int theISection, - const int theIPnt, - const CurveCreator::Coordinates& theNewCoords ) +//! For internal use only! Undo/Redo are not used here. +bool CurveCreator_Curve::setPointInternal( const int theISection, + const int theIPnt, + const CurveCreator::Coordinates& theNewCoords ) { - // Set the difference. - startOperation(); - if (addEmptyDiff()) { - myListDiffs.back().init(this, CurveCreator_Operation::SetCoordinates, - theNewCoords, theISection, theIPnt); - } - bool res = false; - // Update the curve. if (theNewCoords.size() == myDimension) { CurveCreator_Section *aSection = mySections.at(theISection); @@ -730,12 +797,28 @@ bool CurveCreator_Curve::setPoint( const int theISection, res = true; } + return res; +} +//! Set coordinates of specified point +bool CurveCreator_Curve::setPoint( const int theISection, + const int theIPnt, + const CurveCreator::Coordinates& theNewCoords ) +{ + bool res = false; + // Set the difference. + startOperation(); + if (addEmptyDiff()) { + myListDiffs.back().init(this, CurveCreator_Operation::SetCoordinates, + theNewCoords, theISection, theIPnt); + } + res = setPointInternal( theISection, theIPnt, theNewCoords ); finishOperation(); return res; } +//! For internal use only! Undo/Redo are not used here. bool CurveCreator_Curve::removePointsInternal( const std::vector &theISections, const std::vector &theIPnts ) { diff --git a/src/HYDROCurveCreator/CurveCreator_Curve.hxx b/src/HYDROCurveCreator/CurveCreator_Curve.hxx index f1998051..551fc973 100644 --- a/src/HYDROCurveCreator/CurveCreator_Curve.hxx +++ b/src/HYDROCurveCreator/CurveCreator_Curve.hxx @@ -128,9 +128,14 @@ public: /*** Section methods ***/ /***********************************************/ + //! For internal use only! Undo/Redo are not used here. + virtual bool clearInternal(); //! Clear the polyline (remove all sections) virtual bool clear(); + //! For internal use only! Undo/Redo are not used here. + virtual bool joinInternal( const int theISectionTo = -1, + const int theISectionFrom = -1 ); //! Join range of sections to one section (join all sections if -1 is passed in one of arguments) virtual bool join( const int theISectionTo = -1, const int theISectionFrom = -1 ); @@ -138,7 +143,7 @@ public: //! Get number of sections virtual int getNbSections() const; - //! For internal use only! Undo/Redo is not used here. + //! For internal use only! Undo/Redo are not used here. virtual int addSectionInternal( const std::string &theName, const CurveCreator::SectionType theType, const bool theIsClosed, @@ -153,7 +158,7 @@ public: const bool theIsClosed, const CurveCreator::Coordinates &thePoints); - //! For internal use only! Undo/Redo is not used here. + //! For internal use only! Undo/Redo are not used here. virtual bool removeSectionInternal( const int theISection ); //! Removes the given sections. virtual bool removeSection( const int theISection ); @@ -161,6 +166,9 @@ public: //! Get "closed" flag of the specified section virtual bool isClosed( const int theISection ) const; + //! For internal use only! Undo/Redo are not used here. + virtual bool setClosedInternal( const int theISection, + const bool theIsClosed ); /** * Set "closed" flag of the specified section (all sections if * \a theISection is -1). @@ -171,6 +179,9 @@ public: //! Returns specifyed section name virtual std::string getSectionName( const int theISection ) const; + //! For internal use only! Undo/Redo are not used here. + virtual bool setSectionNameInternal( const int theISection, + const std::string& theName ); /** Set name of the specified section */ virtual bool setSectionName( const int theISection, const std::string& theName ); @@ -178,6 +189,9 @@ public: //! Get type of the specified section virtual CurveCreator::SectionType getSectionType( const int theISection ) const; + //! For internal use only! Undo/Redo are not used here. + virtual bool setSectionTypeInternal( const int theISection, + const CurveCreator::SectionType theType ); /** * Set type of the specified section (or all sections * if \a theISection is -1). @@ -190,7 +204,7 @@ public: /*** Point methods ***/ /***********************************************/ - //! For internal use only! Undo/Redo is not used here. + //! For internal use only! Undo/Redo are not used here. virtual bool addPointsInternal( const CurveCreator::Coordinates &theCoords, const std::vector &theISections, const std::vector &theIPnts ); @@ -202,12 +216,16 @@ public: const int theISection, const int theIPnt = -1 ); + //! For internal use only! Undo/Redo are not used here. + virtual bool setPointInternal( const int theISection, + const int theIPnt, + const CurveCreator::Coordinates& theNewCoords ); //! Set coordinates of specified point virtual bool setPoint( const int theISection, const int theIPnt, const CurveCreator::Coordinates& theNewCoords ); - //! For internal use only! Undo/Redo is not used here. + //! For internal use only! Undo/Redo are not used here. virtual bool removePointsInternal( const std::vector &theISections, const std::vector &theIPnts ); /** Remove point with given id */ diff --git a/src/HYDROCurveCreator/CurveCreator_Operation.cxx b/src/HYDROCurveCreator/CurveCreator_Operation.cxx index e24e2dca..7e87af79 100644 --- a/src/HYDROCurveCreator/CurveCreator_Operation.cxx +++ b/src/HYDROCurveCreator/CurveCreator_Operation.cxx @@ -304,31 +304,28 @@ void CurveCreator_Operation::apply(CurveCreator_Curve *theCurve) { const CurveCreator::SectionType aType = (CurveCreator::SectionType) pInt[0]; - theCurve->setSectionType( pInt[1], aType ); + theCurve->setSectionTypeInternal( pInt[1], aType ); } break; case CurveCreator_Operation::Clear: - theCurve->clear(); + theCurve->clearInternal(); break; case CurveCreator_Operation::SetCoordinates: { CurveCreator::Coordinates aCoords; getCoords(&pInt[2], aCoords); - theCurve->setPoint(pInt[0], pInt[1], aCoords); + theCurve->setPointInternal(pInt[0], pInt[1], aCoords); } break; case CurveCreator_Operation::SetClosed: - theCurve->setClosed((pInt[0] != 0), pInt[1]); + theCurve->setClosedInternal((pInt[0] != 0), pInt[1]); break; -/* case CurveCreator_Operation::MoveSection: - theCurve->moveSection(pInt[0], pInt[1]); - break;*/ case CurveCreator_Operation::Join: if (myPData == NULL) { - theCurve->join(); + theCurve->joinInternal(); } else { - theCurve->join(pInt[0], pInt[1]); + theCurve->joinInternal(pInt[0], pInt[1]); } break; case CurveCreator_Operation::AddSection: @@ -351,7 +348,7 @@ void CurveCreator_Operation::apply(CurveCreator_Curve *theCurve) case CurveCreator_Operation::RenameSection: { std::string aName = std::string((char*)&pInt[1]); - theCurve->setSectionName(pInt[0], aName); + theCurve->setSectionNameInternal(pInt[0], aName); } break; default: -- 2.39.2