/*
* This file is part of project OpenEmbroidery. It's copyrighted by
* the contributors recorded in the version control history of the file.
* Original project location https://code.electrolab.fr/openEmbroidery/openEmbroidery_software
*
* SPDX-License-Identifier: CECILL-2.1
* License-Filename: Licence_CeCILL_V2.1-en.txt
*/

#include "actions/OE_actionsStitchs.h"
#include "actions/OE_actionsLinkStitchs.h"
#include "OE_document.h"

///////// OE_actionAddPointLinkStitch ///////////////
/// \brief OE_actionAddPointLinkStitch::OE_actionAddPointLinkStitch
/// \param pos
/// \param point
OE_actionAddPointLinkStitch::OE_actionAddPointLinkStitch(OE_document* doc, OE_linkstitch* stitch, int _pos, vector_2d _point) :
    OE_actions(doc), actionStitch(nullptr)
{
	if (!document || !stitch)
	{
		return;
	}

	pos = _pos;
	point = _point;
	actionStitch = stitch;
	actionStitch->addStepPt(pos, point);
}

OE_actionAddPointLinkStitch::~OE_actionAddPointLinkStitch()
{
}

void OE_actionAddPointLinkStitch::undo()
{
	if (active)
	{
		actionStitch->delStepPt(pos);
		active = false;
	}
}

void OE_actionAddPointLinkStitch::redo()
{
	if (!active)
	{
		actionStitch->addStepPt(pos, point + offset);
		active = true;
	}
}

void OE_actionAddPointLinkStitch::setOffset(vector_2d _offset)
{
	if (!actionStitch || !active)
	{
		return;
	}

	offset = _offset;
	actionStitch->setStepPt(pos, point + offset);
}

///////// OE_actionMovePointLinkStitch ///////////////
/// \brief OE_actionMovePointLinkStitch::OE_actionMovePointLinkStitch
/// \param pos
/// \param offset
OE_actionMovePointLinkStitch::OE_actionMovePointLinkStitch(OE_document* doc, OE_linkstitch* stitch, int _pos, vector_2d _offset) :
    OE_actions(doc), actionStitch(nullptr)
{
	if (!document || !stitch)
	{
		return;
	}

	pos = _pos;
	offset = _offset;
	actionStitch = stitch;
	oldPoint = actionStitch->getStepPt(pos);
	actionStitch->setStepPt(pos, oldPoint + offset);
}

OE_actionMovePointLinkStitch::~OE_actionMovePointLinkStitch()
{
}

void OE_actionMovePointLinkStitch::undo()
{
	if (active)
	{
		actionStitch->setStepPt(pos, oldPoint);
		active = false;
	}
}

void OE_actionMovePointLinkStitch::redo()
{
	if (!active)
	{
		actionStitch->setStepPt(pos, oldPoint + offset);
		active = true;
	}
}

void OE_actionMovePointLinkStitch::setOffset(vector_2d _offset)
{
	if (!actionStitch || !active)
	{
		return;
	}

	offset = _offset;
	actionStitch->setStepPt(pos,oldPoint + offset);
}

///////// OE_actionDelPointLinkStitch ///////////////
/// \brief OE_actionDelPointLinkStitch::OE_actionDelPointLinkStitch
/// \param pos
OE_actionDelPointLinkStitch::OE_actionDelPointLinkStitch(OE_document* doc, OE_linkstitch* stitch, int _pos) :
    OE_actions(doc), actionStitch(nullptr)
{
	if (!document || !stitch)
	{
		return;
	}

	pos = _pos;
	actionStitch = stitch;
	point = actionStitch->getStepPt(pos);
	actionStitch->delStepPt(pos);
}

OE_actionDelPointLinkStitch::~OE_actionDelPointLinkStitch()
{
}

void OE_actionDelPointLinkStitch::undo()
{
	if (active)
	{
		actionStitch->addStepPt(pos, point);
		active = false;
	}
}

void OE_actionDelPointLinkStitch::redo()
{
	if (!active)
	{
		actionStitch->delStepPt(pos);
		active = true;
	}
}

