#include "ctrlitem.h"
#include <QPainterPath>
#include <QEvent>
#include <QGraphicsTextItem>
#include <QInputMethodEvent>
#include <QPainter>
#include <QString>

CtrlItem::CtrlItem(QGraphicsItem* parent, QString s, Qt::Alignment alignment)
{
	setParentItem(parent);
	setFlag(ItemIsMovable);
	if(s.isNull())
		textItem = 0;
	else
	{	
		textItem = new QGraphicsTextItem(s, this);
		textItem->installEventFilter(this);
	}
	textAlignment = QFlags<Qt::Alignment>(alignment);
}
CtrlItem::~CtrlItem()
{
	delete textItem;
}
void CtrlItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
	painter->setBrush(brush);
	painter->drawPath(ctrlItemShape);
}
QPainterPath CtrlItem::shape() const
{
	return ctrlItemShape;
}
QRectF CtrlItem::boundingRect() const
{
	return ctrlItemShape.boundingRect();
}
QBrush CtrlItem::getBrush() const
{
	return brush;
}
void CtrlItem::setBrush(QBrush b)
{
	brush = b;
}
void CtrlItem::setShape(const QPainterPath &shape)
{
	ctrlItemShape = shape;
	if(!textItem)
		return;
	if(textAlignment.testFlag(Qt::AlignTop))
		textItem->setPos(textItem->pos().x(), shape.boundingRect().top());
	else if(textAlignment.testFlag(Qt::AlignBottom))
		textItem->setPos(textItem->pos().x(), shape.boundingRect().y() - textItem->boundingRect().height());
	else if(textAlignment.testFlag(Qt::AlignVCenter))
		textItem->setPos(textItem->pos().x(), shape.boundingRect().center().y() - textItem->boundingRect().height() / 2);
	if(textAlignment.testFlag(Qt::AlignRight))
		textItem->setPos(shape.boundingRect().right(), textItem->pos().y());
	else if(textAlignment.testFlag(Qt::AlignLeft))
		textItem->setPos(shape.boundingRect().x() - textItem->boundingRect().width(), textItem->pos().y());
	else if(textAlignment.testFlag(Qt::AlignHCenter))
		textItem->setPos(shape.boundingRect().center().x() - textItem->boundingRect().width() / 2, textItem->pos().y());
}
QVariant CtrlItem::itemChange(GraphicsItemChange change, const QVariant &value)
{
	
	if(change == QGraphicsItem::ItemPositionChange)
		emit posChange(value.toPointF());
	else if(change == QGraphicsItem::ItemPositionHasChanged)
		emit posChanged();
	return value;
}
bool CtrlItem::eventFilter(QObject *watched, QEvent *event)
{
	if(dynamic_cast<QInputMethodEvent*>(event))
	{
		printf("input method Event\n");
		QInputMethodEvent *inputEvent = dynamic_cast<QInputMethodEvent*>(event);
		if(inputEvent)
			emit textChanged(textItem->toPlainText().replace(
					inputEvent->replacementStart(),
					inputEvent->replacementLength(),
					inputEvent->commitString()), this);
	}
	else
	{	
		printf("\n%d", (int)event->type());
	}
	return false;
}
void CtrlItem::setTextColor(QColor c)
{
	textItem->setDefaultTextColor(c);
}
void CtrlItem::setTextEditable(bool b)
{
	if(!textItem)
		return;
	if(b)
		textItem->setTextInteractionFlags(Qt::TextEditable);
	else
		textItem->setTextInteractionFlags(Qt::NoTextInteraction);
}
QString CtrlItem::getText() const
{
	return textItem->toPlainText();
}
