src/hbcore/primitives/hbrepeatitem_p.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 11 Jun 2010 13:58:22 +0300
changeset 5 627c4a0fd0e7
parent 0 16d8024aca5e
child 23 e6ad4ef83b23
permissions -rw-r--r--
Revision: 201021 Kit: 2010123

/****************************************************************************
**
** Copyright (C) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (developer.feedback@nokia.com)
**
** This file is part of the HbCore module of the UI Extensions for Mobile.
**
** GNU Lesser General Public License Usage
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights.  These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** If you have questions regarding the use of this file, please contact
** Nokia at developer.feedback@nokia.com.
**
****************************************************************************/


#include "hbrepeatitem_p.h"
#include <hbframedrawer.h>
#include <QPainter>
#include <QBitmap>
#include <QGraphicsSceneResizeEvent>
#include <QApplication>


/*
    Internal class used to draw infinite progress bar graphic.
    Draws the given image repeated times and animates it.
    this is used only to show wait progressbar.
*/
HbRepeatItem::HbRepeatItem(QGraphicsItem *parent):
    HbWidgetBase(parent),
    mMode(Qt::KeepAspectRatio),
    mOffset(0),
    mRepeatPixmap(0),
	mNumberOfRepeating(5),
	mOrientation(Qt::Horizontal),
	inverted(false),
	mRectWidth(0),
	mRectHeight(0),
	mBaseIconWidth(0),
	mBaseIconHeight(0),
	mBaseResizeWidth(0),
	mBaseResizeHeight(0),
	multiFactor(0)
{
		
}

HbRepeatItem::HbRepeatItem(const QString& name,QGraphicsItem *parent):
    HbWidgetBase(parent),
    mIcon(name),
    mMode(Qt::KeepAspectRatio),
    mOffset(0),
    mRepeatPixmap(0),
	mNumberOfRepeating(5),
	mOrientation(Qt::Horizontal),
	inverted(false),
	mRectWidth(0),
	mRectHeight(0),
	mBaseIconWidth(0),
	mBaseIconHeight(0),
	mBaseResizeWidth(0),
	mBaseResizeHeight(0),
	multiFactor(0)
{
	if(!mIcon.isNull()) {
		mBaseIconWidth = mIcon.width();
		mBaseIconHeight = mIcon.height();
	}
}
void HbRepeatItem::resizeEvent ( QGraphicsSceneResizeEvent * event ) 
{
	Q_UNUSED(event);
	createPixmap(boundingRect());

}
void HbRepeatItem::createPixmap(QRectF rect) 
{
	if(!mIcon.isNull()) {
		qreal parentWidth = rect.size().width();
		qreal parentHeight = rect.size().height();
		if(parentWidth !=0) {
			qreal tempWidth = mNumberOfRepeating*mBaseIconWidth;
			multiFactor = (qreal) parentWidth  / tempWidth;
			qreal tempHeight = multiFactor * mBaseIconHeight;
			if(tempHeight > parentHeight)
			{
				multiFactor = (qreal) parentHeight  / mBaseIconHeight;
			}
			//Convert multiple factor to two digit;
			int tempFactor = (int) (10 *multiFactor);
			multiFactor = (qreal) tempFactor / 10;
			mBaseResizeWidth = (int)(mBaseIconWidth*multiFactor);
			mBaseResizeHeight = (int)(mBaseIconHeight*multiFactor);

			mIcon.setSize(QSizeF(mBaseResizeWidth,mBaseResizeHeight));
			if(mRepeatPixmap) {
				delete mRepeatPixmap;
				mRepeatPixmap =0;
			}
			mRectWidth  = mBaseResizeWidth * mNumberOfRepeating;
			mRectHeight = mBaseResizeHeight;
			if(mOrientation == Qt::Horizontal){
				mRepeatPixmap = new QPixmap(mRectWidth,mRectHeight);
				mRepeatPixmap->fill(Qt::transparent);	
				QPainter p2;
				p2.begin(mRepeatPixmap);
				if(mBaseIconWidth > 0){
					for(qreal i = 0 ; i < mRectWidth ; i += mBaseResizeWidth) {
						mIcon.paint(&p2, QRectF(i, 0, mBaseResizeWidth, mBaseResizeHeight), mMode);
					}  
				}
				p2.end();
			}
			else{
				// TODO ANZ
			}
			setGeometry(0,0,mRectWidth,mRectHeight);//set geometry of QGI
			update();
		}
	}
}
HbRepeatItem::~HbRepeatItem()
{
	if(mRepeatPixmap ) { 
		delete mRepeatPixmap;
		mRepeatPixmap =0;
	}
}
void HbRepeatItem::setName(const QString& name) 
{
	if(!mIcon.isNull()){
		if (mIcon.iconName() == name) {
			return;
		}
	}
    mIcon.setIconName(name);
	mBaseIconWidth = mIcon.width();
	mBaseIconHeight = mIcon.height();
	createPixmap(boundingRect());

}
void HbRepeatItem::setInverted(bool inversion)
{
	inverted = inversion;
}

void HbRepeatItem::setAspectRatioMode(Qt::AspectRatioMode mode)
{
    mMode = mode;
}

void HbRepeatItem::paint (QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget )
{
    Q_UNUSED(option);
    Q_UNUSED(widget);
	if(mRepeatPixmap != 0) {
		if(boundingRect().isValid()) {
			painter->drawPixmap(QPointF(0,0),*mRepeatPixmap);
		}
	}
}


void HbRepeatItem::setRepeatingNumber(int number)
{
	if(number != mNumberOfRepeating) {
		mNumberOfRepeating = number;
		createPixmap(boundingRect());
		//resizeEvent(0);
	}

}

void HbRepeatItem::setOrientation(Qt::Orientation orientation)
{
    mOrientation = orientation;
}

HbRepeatMaskItem::HbRepeatMaskItem(QGraphicsItem *parent):
HbRepeatItem(parent),mMaskValue(0),mMaximum(5)
{
	
}

HbRepeatMaskItem::HbRepeatMaskItem(const QString &name, QGraphicsItem *parent):
HbRepeatItem(name,parent),mMaskValue(0),mMaximum(5)
{
	
}
void HbRepeatMaskItem::paint (QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
	Q_UNUSED(option);
    Q_UNUSED(widget);

	if(mRepeatPixmap != 0) {
		QPixmap mask(mRectWidth,mRectHeight);
		mask.fill(Qt::white);
		QPainter p;
		p.begin(&mask);
		p.setBrush(QBrush(Qt::black));
		if(mOrientation == Qt::Horizontal){

			QRectF test = boundingRect();
					qreal left = (qreal)boundingRect().topLeft().x();
					if(qApp->layoutDirection() == Qt::RightToLeft) {
						left = (qreal)boundingRect().width()* ((mMaximum - mMaskValue)/(qreal) mMaximum );
					}
					p.drawRect(QRectF(
						left,
						(qreal)boundingRect().topLeft().y(),
						(qreal)boundingRect().width()* (mMaskValue/(qreal) mMaximum ),
						(qreal)boundingRect().height()
					));
				}
		else {
		
			//TODO ANZ

		}

		mRepeatPixmap->setMask(mask);
		
		if(boundingRect().isValid()) {
				painter->drawPixmap(QPointF(0,0),*mRepeatPixmap);
		}
	}

}

void HbRepeatMaskItem::resizeEvent ( QGraphicsSceneResizeEvent * event ) 
{
	Q_UNUSED(event);
	createPixmap(boundingRect());

}
void HbRepeatMaskItem::setMaximum(int max)
{
	mMaximum = max;
}
void HbRepeatMaskItem::setMaskValue(int maskValue)
{
	mMaskValue = maskValue;
}