calendarui/views/dayview/src/calendaystatusstrip.cpp
author hgs
Wed, 25 Aug 2010 14:02:13 +0530
changeset 63 a3cb48f6c889
parent 57 bb2d3e476f29
child 70 a5ed90760192
permissions -rw-r--r--
201033
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
45
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
 * All rights reserved.
hgs
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
 * under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
 *
hgs
parents:
diff changeset
     9
 * Initial Contributors:
hgs
parents:
diff changeset
    10
 * Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
 *
hgs
parents:
diff changeset
    12
 * Contributors:
hgs
parents:
diff changeset
    13
 *
hgs
parents:
diff changeset
    14
 * Description:  Day view control of calendar
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
 */
hgs
parents:
diff changeset
    17
63
hgs
parents: 57
diff changeset
    18
// System includes
45
hgs
parents:
diff changeset
    19
#include <QPainter>
hgs
parents:
diff changeset
    20
#include <QPen>
63
hgs
parents: 57
diff changeset
    21
#include <HbColorScheme>
45
hgs
parents:
diff changeset
    22
63
hgs
parents: 57
diff changeset
    23
// User includes
45
hgs
parents:
diff changeset
    24
#include "calendaystatusstrip.h"
hgs
parents:
diff changeset
    25
63
hgs
parents: 57
diff changeset
    26
// Constants
45
hgs
parents:
diff changeset
    27
qreal const CalenDayStatusStrip::mMinute = 60;
hgs
parents:
diff changeset
    28
qreal const CalenDayStatusStrip::mMinimumTime = 5;
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
/*!
hgs
parents:
diff changeset
    31
  Constructor
hgs
parents:
diff changeset
    32
 */
hgs
parents:
diff changeset
    33
CalenDayStatusStrip::CalenDayStatusStrip(HbWidget *parent)
hgs
parents:
diff changeset
    34
    : HbWidget(parent), mRange(2), 
63
hgs
parents: 57
diff changeset
    35
      mDrawingStyle(CalenDayStatusStrip::Filled)
45
hgs
parents:
diff changeset
    36
{
hgs
parents:
diff changeset
    37
    setFlag(QGraphicsItem::ItemHasNoContents,false);
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
}
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
/*!
hgs
parents:
diff changeset
    42
  Destructor
hgs
parents:
diff changeset
    43
 */
hgs
parents:
diff changeset
    44
CalenDayStatusStrip::~CalenDayStatusStrip()
hgs
parents:
diff changeset
    45
{
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
}
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
/*!
57
hgs
parents: 55
diff changeset
    50
   \brief Returns range between two filled lines in StripWithLines drawing 
45
hgs
parents:
diff changeset
    51
   styles.
hgs
parents:
diff changeset
    52
   
hgs
parents:
diff changeset
    53
   \sa CalenDayStatusStrip::DrawingStyle, setRange
hgs
parents:
diff changeset
    54
 */
hgs
parents:
diff changeset
    55
qreal CalenDayStatusStrip::range() const
hgs
parents:
diff changeset
    56
{
hgs
parents:
diff changeset
    57
    return mRange;
hgs
parents:
diff changeset
    58
}
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
/*!
57
hgs
parents: 55
diff changeset
    61
   \brief Returns style of drawing.
45
hgs
parents:
diff changeset
    62
   
hgs
parents:
diff changeset
    63
   \sa CalenDayStatusStrip::DrawingStyle, setDrawingStyle
hgs
parents:
diff changeset
    64
 */
hgs
parents:
diff changeset
    65
CalenDayStatusStrip::DrawingStyle CalenDayStatusStrip::drawingStyle() const
hgs
parents:
diff changeset
    66
{
hgs
parents:
diff changeset
    67
    return mDrawingStyle;
hgs
parents:
diff changeset
    68
}
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
/*!
57
hgs
parents: 55
diff changeset
    71
   \brief Returns original start and entime fo event
45
hgs
parents:
diff changeset
    72
   
hgs
parents:
diff changeset
    73
   \sa setStartEndTime
hgs
parents:
diff changeset
    74
 */
hgs
parents:
diff changeset
    75
QPair<QTime,QTime> CalenDayStatusStrip::startEndTime() const
hgs
parents:
diff changeset
    76
{
hgs
parents:
diff changeset
    77
    return mStartEndEventTime;
hgs
parents:
diff changeset
    78
}
hgs
parents:
diff changeset
    79
hgs
parents:
diff changeset
    80
/*!
57
hgs
parents: 55
diff changeset
    81
   \brief It sets range between two filled lines in StripWithLines drawing 
45
hgs
parents:
diff changeset
    82
   styles.
hgs
parents:
diff changeset
    83
   
57
hgs
parents: 55
diff changeset
    84
   \param range Range between two filled lines
45
hgs
parents:
diff changeset
    85
   
hgs
parents:
diff changeset
    86
   \sa CalenDayStatusStrip::DrawingStyle, range
hgs
parents:
diff changeset
    87
 */
hgs
parents:
diff changeset
    88
void CalenDayStatusStrip::setRange(qreal range)
hgs
parents:
diff changeset
    89
{
hgs
parents:
diff changeset
    90
    mRange = range;
hgs
parents:
diff changeset
    91
}
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
/*!
57
hgs
parents: 55
diff changeset
    94
   \brief It sets drawing style of strip 
45
hgs
parents:
diff changeset
    95
   
hgs
parents:
diff changeset
    96
   \param drawingStyle Style of strip drawing.
hgs
parents:
diff changeset
    97
   
hgs
parents:
diff changeset
    98
   \sa CalenDayStatusStrip::DrawingStyle, drawingStyle
hgs
parents:
diff changeset
    99
 */
hgs
parents:
diff changeset
   100
void 
hgs
parents:
diff changeset
   101
CalenDayStatusStrip::setDrawingStyle(CalenDayStatusStrip::DrawingStyle drawingStyle)
hgs
parents:
diff changeset
   102
{
hgs
parents:
diff changeset
   103
    mDrawingStyle = drawingStyle;
hgs
parents:
diff changeset
   104
}
hgs
parents:
diff changeset
   105
hgs
parents:
diff changeset
   106
/*!
57
hgs
parents: 55
diff changeset
   107
   It sets start and end time of event
45
hgs
parents:
diff changeset
   108
   
hgs
parents:
diff changeset
   109
   \param startTime Start of event
hgs
parents:
diff changeset
   110
   \param endTime End of event
hgs
parents:
diff changeset
   111
 */
hgs
parents:
diff changeset
   112
void CalenDayStatusStrip::setStartEndTime(const QTime &startTime, 
hgs
parents:
diff changeset
   113
                                            const QTime &endTime)
hgs
parents:
diff changeset
   114
{
hgs
parents:
diff changeset
   115
    mStartEndEventTime.first = startTime;
hgs
parents:
diff changeset
   116
    mStartEndEventTime.second = endTime;
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
    //check if startEndEvent is longer than mMinimumTimeminutes;
hgs
parents:
diff changeset
   119
    if (mStartEndEventTime.first.secsTo(mStartEndEventTime.second) < mMinute * mMinimumTime) {
hgs
parents:
diff changeset
   120
        mStartEndEventTime.second = QTime(mStartEndEventTime.first.hour(),
hgs
parents:
diff changeset
   121
            mStartEndEventTime.first.minute() + mMinimumTime);
hgs
parents:
diff changeset
   122
    }
hgs
parents:
diff changeset
   123
}
hgs
parents:
diff changeset
   124
hgs
parents:
diff changeset
   125
/*!
hgs
parents:
diff changeset
   126
   \brief Reimplemented function...
hgs
parents:
diff changeset
   127
   
hgs
parents:
diff changeset
   128
   Reimplemented function to draw status strip. 
hgs
parents:
diff changeset
   129
   It is based on CalenDayStatusStrip::DrawingStyle, range and color
hgs
parents:
diff changeset
   130
 */
hgs
parents:
diff changeset
   131
void CalenDayStatusStrip::paint(
hgs
parents:
diff changeset
   132
    QPainter *painter,
hgs
parents:
diff changeset
   133
    const QStyleOptionGraphicsItem *option,
hgs
parents:
diff changeset
   134
    QWidget *widget)
hgs
parents:
diff changeset
   135
{
hgs
parents:
diff changeset
   136
    Q_UNUSED(option);
hgs
parents:
diff changeset
   137
    Q_UNUSED(widget);
hgs
parents:
diff changeset
   138
    
hgs
parents:
diff changeset
   139
    //calculate bubble start and end time of bubble
hgs
parents:
diff changeset
   140
    QPair<QTime, QTime> startEndEvent = 
hgs
parents:
diff changeset
   141
        calculateStartEndPostion(mStartEndEventTime.first,
hgs
parents:
diff changeset
   142
                                 mStartEndEventTime.second
hgs
parents:
diff changeset
   143
                                );
hgs
parents:
diff changeset
   144
    //calculate how big is Minute
hgs
parents:
diff changeset
   145
    qreal minuteHeight = calculateMinuteHeight(startEndEvent.first, 
hgs
parents:
diff changeset
   146
                                               startEndEvent.second
hgs
parents:
diff changeset
   147
                                              );
hgs
parents:
diff changeset
   148
hgs
parents:
diff changeset
   149
    painter->save();//   saves the painter state.
hgs
parents:
diff changeset
   150
    
hgs
parents:
diff changeset
   151
hgs
parents:
diff changeset
   152
    //calculate how long is event in minutes
hgs
parents:
diff changeset
   153
    qreal eventMinutes = 
hgs
parents:
diff changeset
   154
           mStartEndEventTime.first.secsTo(mStartEndEventTime.second) / mMinute;
hgs
parents:
diff changeset
   155
    //calculate height and width of status stripe
hgs
parents:
diff changeset
   156
    qreal dx = size().width() - 1;
hgs
parents:
diff changeset
   157
    qreal dy = eventMinutes * minuteHeight;
hgs
parents:
diff changeset
   158
hgs
parents:
diff changeset
   159
    //calculate time from wehre it should be drawed
hgs
parents:
diff changeset
   160
    qreal startTime = 
hgs
parents:
diff changeset
   161
                 startEndEvent.first.secsTo(mStartEndEventTime.first) / mMinute;
hgs
parents:
diff changeset
   162
    //this is done because bubble can be drawed from half hour
hgs
parents:
diff changeset
   163
    startTime = startTime > 30 ? startTime - 30 : startTime;
hgs
parents:
diff changeset
   164
    //calculate status stripe height
hgs
parents:
diff changeset
   165
    qreal startTimeHeight = startTime * minuteHeight;
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
    //set bounding rect of drawed area
hgs
parents:
diff changeset
   168
    QRectF bounding(boundingRect());
hgs
parents:
diff changeset
   169
    //set size smaller by 1px in each side
hgs
parents:
diff changeset
   170
    bounding.setRect(bounding.left() + 1, bounding.top() + startTimeHeight, 
hgs
parents:
diff changeset
   171
                     dx - 1, dy - 1
hgs
parents:
diff changeset
   172
                    );
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
    //set clip region
hgs
parents:
diff changeset
   175
    painter->setClipRect(bounding, Qt::IntersectClip);
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
    //prepare brush and paint
63
hgs
parents: 57
diff changeset
   178
    QBrush brush(HbColorScheme::color("qtc_cal_month_current_day"));
45
hgs
parents:
diff changeset
   179
    painter->setBrush(brush);
hgs
parents:
diff changeset
   180
    QPen pen;
hgs
parents:
diff changeset
   181
    pen.setWidth(1);
hgs
parents:
diff changeset
   182
    pen.setBrush(brush);
hgs
parents:
diff changeset
   183
    pen.setCapStyle(Qt::RoundCap);
hgs
parents:
diff changeset
   184
    pen.setJoinStyle(Qt::RoundJoin);
hgs
parents:
diff changeset
   185
hgs
parents:
diff changeset
   186
    painter->setPen(pen);
hgs
parents:
diff changeset
   187
    QPointF startPoint(0, dy + dx);
hgs
parents:
diff changeset
   188
    
hgs
parents:
diff changeset
   189
    switch (mDrawingStyle) {
hgs
parents:
diff changeset
   190
        case StripWithLines:
hgs
parents:
diff changeset
   191
            for (int i = 0; startPoint.y() > 0; i++) {
hgs
parents:
diff changeset
   192
                painter->drawPolygon(diagonalLine(startPoint, dx, 3));
hgs
parents:
diff changeset
   193
                startPoint.setY(startPoint.y() - 6 - mRange);
hgs
parents:
diff changeset
   194
            }
hgs
parents:
diff changeset
   195
        case OnlyFrame:
hgs
parents:
diff changeset
   196
            painter->setBrush(Qt::NoBrush);
hgs
parents:
diff changeset
   197
            break;
hgs
parents:
diff changeset
   198
    }
hgs
parents:
diff changeset
   199
hgs
parents:
diff changeset
   200
    //draw rectangle
hgs
parents:
diff changeset
   201
    painter->drawRect(bounding);
hgs
parents:
diff changeset
   202
hgs
parents:
diff changeset
   203
    // restore the painter
hgs
parents:
diff changeset
   204
    painter->restore();
hgs
parents:
diff changeset
   205
}
hgs
parents:
diff changeset
   206
hgs
parents:
diff changeset
   207
/*!
57
hgs
parents: 55
diff changeset
   208
   \brief It preapres points to draw filled polygon when StripWithLines style is
45
hgs
parents:
diff changeset
   209
   on.
hgs
parents:
diff changeset
   210
 */
hgs
parents:
diff changeset
   211
QPolygonF 
hgs
parents:
diff changeset
   212
CalenDayStatusStrip::diagonalLine(QPointF startPoint, qreal dx, qreal dy)
hgs
parents:
diff changeset
   213
{
hgs
parents:
diff changeset
   214
    QPolygonF polygon;
hgs
parents:
diff changeset
   215
    polygon << QPointF(startPoint.x(), startPoint.y());
hgs
parents:
diff changeset
   216
    polygon << QPointF(startPoint.x(), startPoint.y() - dy);
hgs
parents:
diff changeset
   217
    polygon << QPointF(startPoint.x() + dx, startPoint.y() - 2 * dy);
hgs
parents:
diff changeset
   218
    polygon << QPointF(startPoint.x() + dx, startPoint.y() - dy);
hgs
parents:
diff changeset
   219
    return polygon;
hgs
parents:
diff changeset
   220
}
hgs
parents:
diff changeset
   221
hgs
parents:
diff changeset
   222
/*!
57
hgs
parents: 55
diff changeset
   223
    Returns time for position 0 and height in widget 
45
hgs
parents:
diff changeset
   224
    
hgs
parents:
diff changeset
   225
    \param startTime Start of event
hgs
parents:
diff changeset
   226
    \param endTime End of event
hgs
parents:
diff changeset
   227
    \return Draw region of bubble
hgs
parents:
diff changeset
   228
  */
hgs
parents:
diff changeset
   229
 QPair<QTime,QTime> CalenDayStatusStrip::calculateStartEndPostion(
hgs
parents:
diff changeset
   230
                                                 const QTime &startTime, 
hgs
parents:
diff changeset
   231
                                                 const QTime &endTime
hgs
parents:
diff changeset
   232
                                             )
hgs
parents:
diff changeset
   233
{
hgs
parents:
diff changeset
   234
     
hgs
parents:
diff changeset
   235
    QTime start;
hgs
parents:
diff changeset
   236
    QTime end;
hgs
parents:
diff changeset
   237
hgs
parents:
diff changeset
   238
    if (startTime.minute() < 30) {
hgs
parents:
diff changeset
   239
        start = QTime(startTime.hour(), 0);
hgs
parents:
diff changeset
   240
    }
hgs
parents:
diff changeset
   241
    else {
hgs
parents:
diff changeset
   242
        start = QTime(startTime.hour(), 30);
hgs
parents:
diff changeset
   243
    }
hgs
parents:
diff changeset
   244
hgs
parents:
diff changeset
   245
    if (endTime.minute() == 0) {
hgs
parents:
diff changeset
   246
        end = endTime;
hgs
parents:
diff changeset
   247
    }
55
hgs
parents: 45
diff changeset
   248
    else if (endTime.hour() == 23 and endTime.minute() > 30) {
45
hgs
parents:
diff changeset
   249
        end = QTime(endTime.hour(), 59);
hgs
parents:
diff changeset
   250
    }
hgs
parents:
diff changeset
   251
    else if (endTime.minute() <= 30) {
hgs
parents:
diff changeset
   252
        end = QTime(endTime.hour(), 30);
hgs
parents:
diff changeset
   253
    }
hgs
parents:
diff changeset
   254
    else {
hgs
parents:
diff changeset
   255
        end = QTime(endTime.hour() + 1, 0);
hgs
parents:
diff changeset
   256
    }
hgs
parents:
diff changeset
   257
hgs
parents:
diff changeset
   258
    return QPair<QTime, QTime> (start, end);
hgs
parents:
diff changeset
   259
}
hgs
parents:
diff changeset
   260
hgs
parents:
diff changeset
   261
/*!
57
hgs
parents: 55
diff changeset
   262
   Calculates height of one minute from widget height, and start/end time. 
45
hgs
parents:
diff changeset
   263
 */
hgs
parents:
diff changeset
   264
qreal CalenDayStatusStrip::calculateMinuteHeight(const QTime &start, 
hgs
parents:
diff changeset
   265
                                                   const QTime &end)
hgs
parents:
diff changeset
   266
{
hgs
parents:
diff changeset
   267
    qreal min = start.secsTo(end) / mMinute;
hgs
parents:
diff changeset
   268
hgs
parents:
diff changeset
   269
    qreal height = size().height();
hgs
parents:
diff changeset
   270
hgs
parents:
diff changeset
   271
    return height / min;
hgs
parents:
diff changeset
   272
}