/* * Copyright (c) 2015 Tricoire Sebastien 3dsman@free.fr * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. * */ #include "actions/OE_actionsStitchs.h" #include "actions/OE_actionsFillStitchs.h" #include "OE_document.h" ///////// actionNewFillStitch /////////////// /// \brief OE_actionNewFillStitch::OE_actionNewFillStitch /// \param curve /// \param len /// \param width /// \param Pattern /// \param offset /// OE_actionNewFillStitch::OE_actionNewFillStitch(float len, float width, OE_pattern* pattern) : action(nullptr), FillStitch(nullptr) { if (document) { FillStitch = new OE_fillstitch(document->threads.front(), len, width, pattern); action = new OE_actionNewStitch(FillStitch); } } OE_actionNewFillStitch::~OE_actionNewFillStitch() { if (!active) { if (action) { delete action; } if (FillStitch) { delete FillStitch; } } } void OE_actionNewFillStitch::undo() { if (active&&action) { action->undo(); } active = false; } void OE_actionNewFillStitch::redo() { if (!active&&action) { action->redo(); } active = true; } ///////// OE_actionSetFillStitchPattern /////////////// /// \brief OE_actionSetFillStitchPattern::OE_actionSetFillStitchPattern /// \param stitch /// \param pattern /// OE_actionSetFillStitchPattern::OE_actionSetFillStitchPattern(OE_fillstitch* stitch, OE_pattern* pattern) : actionStitch(nullptr), oldPattern(nullptr), newPattern(nullptr) { if (document&&stitch) { actionStitch = stitch; oldPattern = actionStitch->getPattern(); newPattern = pattern; actionStitch->setPattern(pattern); } } OE_actionSetFillStitchPattern::~OE_actionSetFillStitchPattern() { } void OE_actionSetFillStitchPattern::undo() { if (active) { actionStitch->setPattern(oldPattern); active = false; } } void OE_actionSetFillStitchPattern::redo() { if (!active) { actionStitch->setPattern(newPattern); active = true; } } ///////// OE_actionSetFillStitchLen /////////////// /// \brief OE_actionSetFillStitchLen::OE_actionSetFillStitchLen /// \param stitch /// \param len /// OE_actionSetFillStitchLen::OE_actionSetFillStitchLen(OE_fillstitch* stitch, float len) : actionStitch(nullptr) { if (document && stitch) { actionStitch = stitch; oldLen = actionStitch->getLen(); actionStitch->setLen(len); } } OE_actionSetFillStitchLen::~OE_actionSetFillStitchLen() { } void OE_actionSetFillStitchLen::undo() { if (active) { actionStitch->setLen(switchVal(actionStitch->getLen(), &oldLen)); active = false; } } void OE_actionSetFillStitchLen::redo() { if (!active) { actionStitch->setLen(switchVal(actionStitch->getLen(), &oldLen)); active = true; } } ///////// OE_actionSetFillStitchWidth /////////////// /// \brief OE_actionSetFillStitchWidth::OE_actionSetFillStitchWidth /// \param stitch /// \param width /// OE_actionSetFillStitchWidth::OE_actionSetFillStitchWidth(OE_fillstitch* stitch, float width) : actionStitch(0), oldWidth(0), oldOffset(0) { if (document && stitch) { actionStitch = stitch; oldWidth = actionStitch->getWidth(); actionStitch->setWidth(width); } } OE_actionSetFillStitchWidth::~OE_actionSetFillStitchWidth() { } void OE_actionSetFillStitchWidth::undo() { if (active) { actionStitch->setWidth(switchVal(actionStitch->getWidth(), &oldWidth)); active = false; } } void OE_actionSetFillStitchWidth::redo() { if (!active) { actionStitch->setWidth(switchVal(actionStitch->getWidth(), &oldWidth)); active = true; } } void OE_actionSetFillStitchWidth::setWidth(float width) { if (document) { actionStitch->setWidth(width); } } void OE_actionSetFillStitchWidth::offsetWidth(float offset) { if (document) { actionStitch->setWidth(actionStitch->getWidth()-oldOffset+offset); } oldOffset = offset; } float OE_actionSetFillStitchWidth::getWidth() { if (document) { return actionStitch->getWidth(); } return 0; } ///////// OE_actionSetSelectedFillStitchWidth /////////////// /// \brief OE_actionSetSelectedFillStitchWidth::OE_actionSetFillStitchWidth /// \param scale /// OE_actionScaleSelectedFillStitchWidth::OE_actionScaleSelectedFillStitchWidth(float scale) { if (document) { OE_fillstitch* tmpFillStitch; for(auto selStitch : document->selectedStitchs) { tmpFillStitch = dynamic_cast(selStitch); if (tmpFillStitch) { actions.push_back(new OE_actionSetFillStitchWidth(tmpFillStitch,tmpFillStitch->getWidth()*scale)); } } oldScale = scale; } } OE_actionScaleSelectedFillStitchWidth::~OE_actionScaleSelectedFillStitchWidth() { } void OE_actionScaleSelectedFillStitchWidth::undo() { if (active) { for(auto action : actions) { action->undo(); } active = false; } } void OE_actionScaleSelectedFillStitchWidth::redo() { if (!active) { for(auto action : actions) { action->redo(); } active = true; } } void OE_actionScaleSelectedFillStitchWidth::scaleWidth(float scale) { for(auto action : actions) { action->setWidth(action->getWidth()/oldScale*scale); } oldScale = scale; } ///////// OE_actionSetSelectedFillStitchLen/////////////// /// \brief OE_actionSetSelectedFillStitchLen::OE_actionSetSelectedFillStitchLen /// \param scale /// OE_actionScaleSelectedFillStitchLen::OE_actionScaleSelectedFillStitchLen(float scale) { if (document) { OE_fillstitch* tmpFillStitch; for(auto selStitch : document->selectedStitchs) { tmpFillStitch = dynamic_cast(selStitch); if (tmpFillStitch) { actions.push_back(new OE_actionSetFillStitchLen(tmpFillStitch, tmpFillStitch->getLen()*scale)); } } } } OE_actionScaleSelectedFillStitchLen::~OE_actionScaleSelectedFillStitchLen() { } void OE_actionScaleSelectedFillStitchLen::undo() { if (active) { for(auto action : actions) { action->undo(); } active = false; } } void OE_actionScaleSelectedFillStitchLen::redo() { if (!active) { for(auto action : actions) { action->redo(); } active = true; } } void OE_actionScaleSelectedFillStitchLen::scaleLen(float scale) { } ///////// OE_actionSetSelectedFillStitchPattern /////////////// /// \brief OE_actionSetSelectedFillStitchPattern::OE_actionSetSelectedFillStitchPattern /// \param pattern /// OE_actionSetSelectedFillStitchPattern::OE_actionSetSelectedFillStitchPattern( OE_pattern* pattern) { if (document) { OE_fillstitch* tmpFillStitch; for(auto selStitch : document->selectedStitchs) { tmpFillStitch = dynamic_cast(selStitch); if (tmpFillStitch) { actions.push_back(new OE_actionSetFillStitchPattern(tmpFillStitch, pattern)); } } } } OE_actionSetSelectedFillStitchPattern::~OE_actionSetSelectedFillStitchPattern() { } void OE_actionSetSelectedFillStitchPattern::undo() { if (active) { for(auto action : actions) { action->undo(); } active = false; } } void OE_actionSetSelectedFillStitchPattern::redo() { if (!active) { for(auto action : actions) { action->redo(); } active = true; } } ///////// OE_actionMovePointFillStitch /////////////// /// \brief OE_actionMovePointFillStitch::OE_actionMovePointFillStitch /// \param pos /// \param offset OE_actionMovePointFillStitch::OE_actionMovePointFillStitch(OE_fillstitch* stitch, int _pos, vector_2d _offset) : actionStitch(nullptr) { if (!document || !stitch) { return; } pos = _pos; offset = _offset; actionStitch = stitch; oldPoint = actionStitch->getGridControlPoint(pos); actionStitch->setGridControlPoint(pos, oldPoint + offset); } OE_actionMovePointFillStitch::~OE_actionMovePointFillStitch() { } void OE_actionMovePointFillStitch::undo() { if (active) { actionStitch->setGridControlPoint(pos, oldPoint); active = false; } } void OE_actionMovePointFillStitch::redo() { if (!active) { actionStitch->setGridControlPoint(pos, oldPoint + offset); active = true; } } void OE_actionMovePointFillStitch::setOffset(vector_2d _offset) { if (!actionStitch || !active) { return; } offset = _offset; actionStitch->setGridControlPoint(pos,oldPoint + offset); }