/*
 * Copyright 2009-2010  Stefan Gehn <stefan@srcbox.net>
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of 
 * the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include "PhotoPageWidgets.hpp"

#include <qdebug.h>
#include <qpainter.h>
#include <qstyleoption.h>

#define ACTIVE_CORNER_MOVEMENT 100


// ----------------------------------------------------------------------------


RectWidget::RectWidget(QGraphicsItem *parent)
		: QGraphicsWidget(parent, 0)
{
	setFlags(QGraphicsItem::ItemClipsChildrenToShape);
	QPalette pal = palette();
	pal.setColor(QPalette::Window, Qt::white);
	pal.setColor(QPalette::WindowText, Qt::black);
	setPalette(pal);
}

void RectWidget::paint(QPainter *painter,
											 const QStyleOptionGraphicsItem *option,
											 QWidget *widget)
{
	Q_UNUSED(widget);
	painter->save();

	painter->setClipRect(option->exposedRect);
	painter->setBrush(palette().window());
	painter->setPen(QPen(palette().windowText(), 1.0, Qt::SolidLine));

	qreal halfPenW = painter->pen().widthF();
	QRectF r(- halfPenW,
					 - halfPenW,
					 size().width() + 2*halfPenW,
					 size().height() + 2*halfPenW);
	painter->drawRect(r);

	painter->restore();
}


// ----------------------------------------------------------------------------


EdgeWidget::EdgeWidget(EdgeSide side, QGraphicsItem *parent)
		: QGraphicsWidget(parent, 0), mSide(side)
{
}

void EdgeWidget::paint(QPainter *painter,
											 const QStyleOptionGraphicsItem *option,
											 QWidget *widget)
{
	Q_UNUSED(widget);
	painter->save();
	painter->setClipRect(option->exposedRect);
	painter->setBrush(palette().window());
	if (mStartPos.isNull())
		painter->setPen(QPen(palette().windowText(), 1, Qt::SolidLine));
	else
		painter->setPen(QPen(Qt::red, 1, Qt::SolidLine));

	qreal w = size().width();
	qreal h = size().height();

	//painter->drawRect(rect()); // debug
	if (mSide == Left)
	{
		for (qreal i = 4; i < w; i += 4)
		{
			painter->drawLine(QLineF(0, h - i, i, h));
		}
	}
	else
	{
		for (qreal i = 4; i < w; i += 4)
		{
			painter->drawLine(QLineF(w - i, h, w, h - i));
		}
	}
	painter->restore();
} // paint()

void EdgeWidget::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
	if (event->button() != Qt::LeftButton)
	{
		QGraphicsWidget::mousePressEvent(event);
	}
	else
	{
		event->accept();
		qDebug() << "Remembering position for possible page turn";
		mStartPos = event->pos();
	}
} // mousePressEvent()

void EdgeWidget::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
	if (mStartPos.isNull())
	{
		QGraphicsWidget::mouseMoveEvent(event);
	}
	else
	{
		event->accept();
		if (
				((mSide == Left) && event->pos().x() > (mStartPos.x() + ACTIVE_CORNER_MOVEMENT)) ||
				((mSide == Right) && event->pos().x() < (mStartPos.x() - ACTIVE_CORNER_MOVEMENT))
			 )
		{
			mStartPos = QPointF();
			emit activated();
		}
	}
} // mouseMoveEvent()

void EdgeWidget::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
	if (event->button() != Qt::LeftButton)
	{
		QGraphicsWidget::mouseReleaseEvent(event);
	}
	else
	{
		event->accept();
		mStartPos = QPointF();
	}
} // mouseReleaseEvent()


// ----------------------------------------------------------------------------


NumberWidget::NumberWidget(QGraphicsItem * parent)
		: QGraphicsWidget(parent, 0)
{
	mNumber = 0;
}

void NumberWidget::setNumber(int number)
{
	if (number == mNumber)
		return;
	mNumber = number;
	//qDebug() << "NumberWidget::setNumber(); " << mNumber;
	update();
}

void NumberWidget::paint(QPainter *painter,
												 const QStyleOptionGraphicsItem *option,
												 QWidget *widget)
{
	Q_UNUSED(widget);
	painter->setClipRect(option->exposedRect);
	painter->drawText(rect(), Qt::AlignCenter, QString::number(mNumber));
} // paint()


#include "moc_PhotoPageWidgets.cpp"
