calendarui/views/dayview/src/calendaystatusstrip.cpp
changeset 50 579cc610882e
child 55 2c54b51f39c4
child 58 ef813d54df51
--- /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 <QPainter>
+#include <QPen>
+
+#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<QTime,QTime> 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<QTime, QTime> 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<QTime,QTime> 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<QTime, QTime> (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;
+}