/*
 * 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_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;
	}
}

