#include "testfuncplugin.h"
#include "variable.h"
#include <qcolor.h>
#include <qbrush.h>

TestFuncPlugin::TestFuncPlugin()
{
	representedFunction = "testFunction";
}

TestFuncPlugin::~TestFuncPlugin()
{

}

void TestFuncPlugin::calcGeometry()
{
	size = QSizeF(100, 300);
}

void TestFuncPlugin::calcDefaultGeometry(DataProvider* provider)
{
}

bool TestFuncPlugin::setData(TraceDataProvider* provider, GET_VARIABLES_RESULT result, QList<Variable*> & variables)
{
	return true;
}

QString TestFuncPlugin::getName() const
{
	return "Test func plugin";
}

bool TestFuncPlugin::isRequiredCustomVariables() const
{
	return false;
}

QStringList TestFuncPlugin::requiredCustomVariables() const
{
	return QStringList();
}

int TestFuncPlugin::onElementClicked(int id)
{
	return -1;
}

void TestFuncPlugin::setAllMinimized(bool minimized)
{
}

void TestFuncPlugin::markItem(int id)
{
}

void TestFuncPlugin::setFunctionParams(QString & functionName, TraceDataProvider* provider)
{
	if(functionName == representedFunction)// && !provider->getFunctionArguments(functionName).isEmpty())
	{ // Если была вызвана интересующая нас функция
		// Запоминаются аргументы вызванной функции
		arguments << provider->getFunctionArguments(functionName).last(); // Функция возвращает контейнер агрументов функции за все её вызовы, берём последний
		arguments.last() << provider->readVariableByPointer(arguments.last()[1]->getIntValue(), "int*"); // Считываем значение по адресу указателя - второго параметра
		// и добавляем третьим элементом в контейнер переданных в функцию аргументов - arguments
	}
	// Далее можно анализировать другие функции, если бы плагин возвращал в getRepresentedFunctionNames больше имён функций.
}

QStringList TestFuncPlugin::getRepresentedFunctionNames() const
{
	QStringList result;
	result << representedFunction;
	return result;
}

QAnimationGroup* TestFuncPlugin::getAnimationAfterStep()
{
	return NULL;
}

QGraphicsItem* TestFuncPlugin::createGraphicsItem()
{
	item = new QGraphicsRectItem(0,0, 100, 300);
	item->setFlags(QGraphicsItem::ItemSendsGeometryChanges | QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable);
	item->setBrush(QBrush(QColor(Qt::red)));
	return item;
}

void TestFuncPlugin::updateGraphicsItem()
{
	for(int i = 0; i < arguments.count(); i++)
	{
		QGraphicsTextItem* text = new QGraphicsTextItem(arguments[i].first()->getValue() + " + " + arguments[i].last()->getValue(), item);
		text->setPos(10, i * 20);
	}
}


 Q_EXPORT_PLUGIN2(testFuncPlugin, TestFuncPlugin);