diff -r 5de72ea7a065 -r 579cc610882e calendarui/views/dayview/src/calendaystatusstrip.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/src/calendaystatusstrip.cpp Tue Jul 06 14:14:56 2010 +0300 @@ -0,0 +1,290 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: Day view control of calendar + * + */ + +#include +#include + +#include "calendaystatusstrip.h" + +qreal const CalenDayStatusStrip::mMinute = 60; +qreal const CalenDayStatusStrip::mMinimumTime = 5; + +/*! + Constructor + */ +CalenDayStatusStrip::CalenDayStatusStrip(HbWidget *parent) + : HbWidget(parent), mRange(2), + mDrawingStyle(CalenDayStatusStrip::Filled) +{ + setFlag(QGraphicsItem::ItemHasNoContents,false); + +} + +/*! + Destructor + */ +CalenDayStatusStrip::~CalenDayStatusStrip() +{ + +} + +/*! + \brief Return range beatween two filled lines in StripWithLines drawing + styles. + + \sa CalenDayStatusStrip::DrawingStyle, setRange + */ +qreal CalenDayStatusStrip::range() const +{ + return mRange; +} + +/*! + \brief Return color drawing + + \sa setColor + */ +QColor CalenDayStatusStrip::color() const +{ + return mColor; +} + +/*! + \brief Return style of drawing. + + \sa CalenDayStatusStrip::DrawingStyle, setDrawingStyle + */ +CalenDayStatusStrip::DrawingStyle CalenDayStatusStrip::drawingStyle() const +{ + return mDrawingStyle; +} + +/*! + \brief Return orginal start and entime fo event + + \sa setStartEndTime + */ +QPair CalenDayStatusStrip::startEndTime() const +{ + return mStartEndEventTime; +} + +/*! + \brief It set range beatween two filled lines in StripWithLines drawing + styles. + + \param range Range beatween two filled lines + + \sa CalenDayStatusStrip::DrawingStyle, range + */ +void CalenDayStatusStrip::setRange(qreal range) +{ + mRange = range; +} + +/*! + \brief It set color drawing + + \param stripColor Color of drawing + + \sa stripColor + */ +void CalenDayStatusStrip::setColor(QColor stripColor) +{ + mColor = stripColor; +} + +/*! + \brief It set drawing style of strip + + \param drawingStyle Style of strip drawing. + + \sa CalenDayStatusStrip::DrawingStyle, drawingStyle + */ +void +CalenDayStatusStrip::setDrawingStyle(CalenDayStatusStrip::DrawingStyle drawingStyle) +{ + mDrawingStyle = drawingStyle; +} + +/*! + It set start and end time of event + + \param startTime Start of event + \param endTime End of event + */ +void CalenDayStatusStrip::setStartEndTime(const QTime &startTime, + const QTime &endTime) +{ + mStartEndEventTime.first = startTime; + mStartEndEventTime.second = endTime; + + //check if startEndEvent is longer than mMinimumTimeminutes; + if (mStartEndEventTime.first.secsTo(mStartEndEventTime.second) < mMinute * mMinimumTime) { + mStartEndEventTime.second = QTime(mStartEndEventTime.first.hour(), + mStartEndEventTime.first.minute() + mMinimumTime); + } +} + +/*! + \brief Reimplemented function... + + Reimplemented function to draw status strip. + It is based on CalenDayStatusStrip::DrawingStyle, range and color + */ +void CalenDayStatusStrip::paint( + QPainter *painter, + const QStyleOptionGraphicsItem *option, + QWidget *widget) +{ + Q_UNUSED(option); + Q_UNUSED(widget); + + //calculate bubble start and end time of bubble + QPair startEndEvent = + calculateStartEndPostion(mStartEndEventTime.first, + mStartEndEventTime.second + ); + //calculate how big is Minute + qreal minuteHeight = calculateMinuteHeight(startEndEvent.first, + startEndEvent.second + ); + + painter->save();// saves the painter state. + + + //calculate how long is event in minutes + qreal eventMinutes = + mStartEndEventTime.first.secsTo(mStartEndEventTime.second) / mMinute; + //calculate height and width of status stripe + qreal dx = size().width() - 1; + qreal dy = eventMinutes * minuteHeight; + + //calculate time from wehre it should be drawed + qreal startTime = + startEndEvent.first.secsTo(mStartEndEventTime.first) / mMinute; + //this is done because bubble can be drawed from half hour + startTime = startTime > 30 ? startTime - 30 : startTime; + //calculate status stripe height + qreal startTimeHeight = startTime * minuteHeight; + + //set bounding rect of drawed area + QRectF bounding(boundingRect()); + //set size smaller by 1px in each side + bounding.setRect(bounding.left() + 1, bounding.top() + startTimeHeight, + dx - 1, dy - 1 + ); + + //set clip region + painter->setClipRect(bounding, Qt::IntersectClip); + + //prepare brush and paint + QBrush brush(mColor); + painter->setBrush(brush); + QPen pen; + pen.setWidth(1); + pen.setBrush(brush); + pen.setCapStyle(Qt::RoundCap); + pen.setJoinStyle(Qt::RoundJoin); + + painter->setPen(pen); + QPointF startPoint(0, dy + dx); + + switch (mDrawingStyle) { + case StripWithLines: + for (int i = 0; startPoint.y() > 0; i++) { + painter->drawPolygon(diagonalLine(startPoint, dx, 3)); + startPoint.setY(startPoint.y() - 6 - mRange); + } + case OnlyFrame: + painter->setBrush(Qt::NoBrush); + break; + } + + //draw rectangle + painter->drawRect(bounding); + + // restore the painter + painter->restore(); +} + +/*! + \brief It preapre points to draw filled polygon when StripWithLines style is + on. + */ +QPolygonF +CalenDayStatusStrip::diagonalLine(QPointF startPoint, qreal dx, qreal dy) +{ + QPolygonF polygon; + polygon << QPointF(startPoint.x(), startPoint.y()); + polygon << QPointF(startPoint.x(), startPoint.y() - dy); + polygon << QPointF(startPoint.x() + dx, startPoint.y() - 2 * dy); + polygon << QPointF(startPoint.x() + dx, startPoint.y() - dy); + return polygon; +} + +/*! + Return time for position 0 and height in widget + + \param startTime Start of event + \param endTime End of event + \return Draw region of bubble + */ + QPair CalenDayStatusStrip::calculateStartEndPostion( + const QTime &startTime, + const QTime &endTime + ) +{ + + QTime start; + QTime end; + + if (startTime.minute() < 30) { + start = QTime(startTime.hour(), 0); + } + else { + start = QTime(startTime.hour(), 30); + } + + if (endTime.minute() == 0) { + end = endTime; + } + else if (endTime.hour() == 23) { + end = QTime(endTime.hour(), 59); + } + else if (endTime.minute() <= 30) { + end = QTime(endTime.hour(), 30); + } + else { + end = QTime(endTime.hour() + 1, 0); + } + + return QPair (start, end); +} + +/*! + Calculate height of one minute from widget height, and start/end time. + */ +qreal CalenDayStatusStrip::calculateMinuteHeight(const QTime &start, + const QTime &end) +{ + qreal min = start.secsTo(end) / mMinute; + + qreal height = size().height(); + + return height / min; +}