calendarui/views/dayview/src/calendayitem.cpp
author hgs
Fri, 15 Oct 2010 12:10:36 +0530
changeset 83 5aadd1120515
parent 64 1881ad52dc45
permissions -rw-r--r--
201041
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:  Event view item, exact size and position of event is set in 
hgs
parents:
diff changeset
    15
*  				CalenDayContainer::setItemModelIndex based on event duration
hgs
parents:
diff changeset
    16
*
hgs
parents:
diff changeset
    17
*/
hgs
parents:
diff changeset
    18
63
hgs
parents: 57
diff changeset
    19
// System includes
hgs
parents: 57
diff changeset
    20
#include <HbFrameItem>
hgs
parents: 57
diff changeset
    21
#include <HbTextItem>
hgs
parents: 57
diff changeset
    22
#include <HbStyle>
hgs
parents: 57
diff changeset
    23
#include <HbColorScheme>
45
hgs
parents:
diff changeset
    24
#include <agendaentry.h>
83
hgs
parents: 64
diff changeset
    25
#include <QGraphicsSceneMoveEvent>
45
hgs
parents:
diff changeset
    26
63
hgs
parents: 57
diff changeset
    27
// User includes
hgs
parents: 57
diff changeset
    28
#include "calendaycommonheaders.h"
45
hgs
parents:
diff changeset
    29
#include "calendayitem.h"
hgs
parents:
diff changeset
    30
#include "calendaystatusstrip.h"
hgs
parents:
diff changeset
    31
#include "calendaymodel.h"
55
hgs
parents: 45
diff changeset
    32
#include "calendayutils.h"
57
hgs
parents: 55
diff changeset
    33
#include "calenagendautils.h"
55
hgs
parents: 45
diff changeset
    34
#include "calendaycontainer.h"
45
hgs
parents:
diff changeset
    35
57
hgs
parents: 55
diff changeset
    36
/*!
63
hgs
parents: 57
diff changeset
    37
 \brief Constructor.
hgs
parents: 57
diff changeset
    38
 */
hgs
parents: 57
diff changeset
    39
CalenDayItem::CalenDayItem(const CalenDayContainer *container) :
83
hgs
parents: 64
diff changeset
    40
    mUpdated(false), mEventDescMinWidth(0.0), mFrameMinWidth(0.0),
hgs
parents: 64
diff changeset
    41
	mBg(0), mEventDesc(0), mColorStripe(0),
hgs
parents: 64
diff changeset
    42
	mContainer(container), mBackgroundType(EStaticBackground)
45
hgs
parents:
diff changeset
    43
{
hgs
parents:
diff changeset
    44
}
hgs
parents:
diff changeset
    45
57
hgs
parents: 55
diff changeset
    46
/*!
63
hgs
parents: 57
diff changeset
    47
 \brief Constructor.
hgs
parents: 57
diff changeset
    48
 */
45
hgs
parents:
diff changeset
    49
CalenDayItem::CalenDayItem(const CalenDayItem & source) :
83
hgs
parents: 64
diff changeset
    50
    HbAbstractViewItem(source), 
hgs
parents: 64
diff changeset
    51
        mUpdated(false), mEventDescMinWidth(0.0),
hgs
parents: 64
diff changeset
    52
		mFrameMinWidth(0.0), mBg(0), mEventDesc(0),
hgs
parents: 64
diff changeset
    53
		mColorStripe(0), mContainer(source.container()),
hgs
parents: 64
diff changeset
    54
        mBackgroundType(EStaticBackground)
57
hgs
parents: 55
diff changeset
    55
{
83
hgs
parents: 64
diff changeset
    56
    mBg = new HbFrameItem("qtg_fr_cal_meeting_bg", HbFrameDrawer::NinePieces, this);
hgs
parents: 64
diff changeset
    57
    
45
hgs
parents:
diff changeset
    58
    mEventDesc = new HbTextItem(this);
hgs
parents:
diff changeset
    59
    // TODO: probably ElideLeft needed for mirrored layout
hgs
parents:
diff changeset
    60
    mEventDesc->setElideMode(Qt::ElideRight);
hgs
parents:
diff changeset
    61
    mEventDesc->setTextWrapping(Hb::TextWrapAnywhere);
hgs
parents:
diff changeset
    62
    mColorStripe = new CalenDayStatusStrip(this);
63
hgs
parents: 57
diff changeset
    63
45
hgs
parents:
diff changeset
    64
    HbStyle::setItemName(mBg, QLatin1String("backgroundFrame"));
hgs
parents:
diff changeset
    65
    HbStyle::setItemName(mEventDesc, QLatin1String("eventDescription"));
63
hgs
parents: 57
diff changeset
    66
    HbStyle::setItemName(static_cast<QGraphicsItem *> (mColorStripe),
hgs
parents: 57
diff changeset
    67
        QLatin1String("colorStripe"));
hgs
parents: 57
diff changeset
    68
45
hgs
parents:
diff changeset
    69
    HbDeviceProfile deviceProfile;
63
hgs
parents: 57
diff changeset
    70
    qreal stripeWidth = KCalenTimeStripWidth * deviceProfile.unitValue();
hgs
parents: 57
diff changeset
    71
    mColorStripe->setPreferredWidth(stripeWidth);
hgs
parents: 57
diff changeset
    72
hgs
parents: 57
diff changeset
    73
    // Minimum size of event frame (without/with description) 
hgs
parents: 57
diff changeset
    74
    mFrameMinWidth = KCalenMinEventWidth * deviceProfile.unitValue();
hgs
parents: 57
diff changeset
    75
    mEventDescMinWidth = KCalenMinTouchableEventWidth
hgs
parents: 57
diff changeset
    76
        * deviceProfile.unitValue();
64
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
    77
    
63
hgs
parents: 57
diff changeset
    78
    // Minimum width is assured by widgetml and css, additionally called here 
hgs
parents: 57
diff changeset
    79
    // to prevent minimum size hint caching inside effectiveSizeHint
45
hgs
parents:
diff changeset
    80
    setMinimumWidth(stripeWidth);
83
hgs
parents: 64
diff changeset
    81
    
hgs
parents: 64
diff changeset
    82
    connect(this, SIGNAL(backgroundTypeChanged(const CalenDayItem*)), mContainer, SLOT(updateFloatingItemsList(const CalenDayItem*)));
45
hgs
parents:
diff changeset
    83
}
hgs
parents:
diff changeset
    84
57
hgs
parents: 55
diff changeset
    85
/*!
63
hgs
parents: 57
diff changeset
    86
 \brief Destructor.
hgs
parents: 57
diff changeset
    87
 */
45
hgs
parents:
diff changeset
    88
CalenDayItem::~CalenDayItem()
hgs
parents:
diff changeset
    89
{
hgs
parents:
diff changeset
    90
}
hgs
parents:
diff changeset
    91
57
hgs
parents: 55
diff changeset
    92
/*!
63
hgs
parents: 57
diff changeset
    93
 \brief Creates new instance of day item.
hgs
parents: 57
diff changeset
    94
 
hgs
parents: 57
diff changeset
    95
 \return New instance of day item.
hgs
parents: 57
diff changeset
    96
 */
45
hgs
parents:
diff changeset
    97
HbAbstractViewItem * CalenDayItem::createItem()
hgs
parents:
diff changeset
    98
{
hgs
parents:
diff changeset
    99
    CalenDayItem* newItem = new CalenDayItem(*this);
hgs
parents:
diff changeset
   100
    return newItem;
hgs
parents:
diff changeset
   101
}
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
57
hgs
parents: 55
diff changeset
   104
/*!
63
hgs
parents: 57
diff changeset
   105
 \brief Sets data to be displayed on item.
hgs
parents: 57
diff changeset
   106
 */
45
hgs
parents:
diff changeset
   107
void CalenDayItem::updateChildItems()
hgs
parents:
diff changeset
   108
{
57
hgs
parents: 55
diff changeset
   109
    // there is no need to update items after creation
hgs
parents: 55
diff changeset
   110
    if (!mUpdated) {
hgs
parents: 55
diff changeset
   111
        AgendaEntry entry;
63
hgs
parents: 57
diff changeset
   112
        entry = modelIndex().data(CalenDayEntry).value<AgendaEntry> ();
57
hgs
parents: 55
diff changeset
   113
63
hgs
parents: 57
diff changeset
   114
        bool isAllDayEvent = CalenAgendaUtils::isAlldayEvent(entry);
57
hgs
parents: 55
diff changeset
   115
        setDescription(entry, isAllDayEvent);
hgs
parents: 55
diff changeset
   116
        setStatusStrip(entry, isAllDayEvent);
hgs
parents: 55
diff changeset
   117
hgs
parents: 55
diff changeset
   118
        mUpdated = true;
hgs
parents: 55
diff changeset
   119
    }
45
hgs
parents:
diff changeset
   120
}
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
57
hgs
parents: 55
diff changeset
   123
/*!
63
hgs
parents: 57
diff changeset
   124
 \brief Adds event description for the item.
hgs
parents: 57
diff changeset
   125
 
hgs
parents: 57
diff changeset
   126
 \param entry An for which description needs to be displayed.
hgs
parents: 57
diff changeset
   127
 \param allDayEvent Flag that indicates whether an item is all day event
hgs
parents: 57
diff changeset
   128
 */
45
hgs
parents:
diff changeset
   129
void CalenDayItem::setDescription(const AgendaEntry &entry, bool allDayEvent)
hgs
parents:
diff changeset
   130
{
63
hgs
parents: 57
diff changeset
   131
    QString description(entry.summary());
hgs
parents: 57
diff changeset
   132
    QString location(entry.location());
hgs
parents: 57
diff changeset
   133
hgs
parents: 57
diff changeset
   134
    int separtorPos = 0;
hgs
parents: 57
diff changeset
   135
    if (!location.isEmpty()) {
hgs
parents: 57
diff changeset
   136
        if (!description.isEmpty()) {
hgs
parents: 57
diff changeset
   137
            separtorPos = description.count();
hgs
parents: 57
diff changeset
   138
            description.append(", ");
hgs
parents: 57
diff changeset
   139
        }
hgs
parents: 57
diff changeset
   140
        description.append(location);
hgs
parents: 57
diff changeset
   141
    }
hgs
parents: 57
diff changeset
   142
hgs
parents: 57
diff changeset
   143
    if (description.isEmpty()) {
hgs
parents: 57
diff changeset
   144
        description.append(hbTrId("txt_calendar_dblist_unnamed"));
hgs
parents: 57
diff changeset
   145
    }
45
hgs
parents:
diff changeset
   146
63
hgs
parents: 57
diff changeset
   147
    //Description of all day events has to be displayed vertically
hgs
parents: 57
diff changeset
   148
    if (allDayEvent) {
hgs
parents: 57
diff changeset
   149
        QString verticalString;
hgs
parents: 57
diff changeset
   150
        for (int i = 0; i < description.count(); i++) {
hgs
parents: 57
diff changeset
   151
            verticalString.append(QString(description.at(i)) + "\n");
hgs
parents: 57
diff changeset
   152
        }
hgs
parents: 57
diff changeset
   153
hgs
parents: 57
diff changeset
   154
        // remove "\n" before comma separator if exist
hgs
parents: 57
diff changeset
   155
        if (separtorPos) {
hgs
parents: 57
diff changeset
   156
            verticalString.remove(2 * separtorPos - 1, 1);
hgs
parents: 57
diff changeset
   157
        }
hgs
parents: 57
diff changeset
   158
        description = verticalString;
hgs
parents: 57
diff changeset
   159
    }
hgs
parents: 57
diff changeset
   160
hgs
parents: 57
diff changeset
   161
    mEventDesc->setText(description);
45
hgs
parents:
diff changeset
   162
}
hgs
parents:
diff changeset
   163
hgs
parents:
diff changeset
   164
/*!
63
hgs
parents: 57
diff changeset
   165
 \brief It set all needed things for status strip from Agenda Entry.
hgs
parents: 57
diff changeset
   166
 
hgs
parents: 57
diff changeset
   167
 \param entry Status Strip is created from Agenda Entry
hgs
parents: 57
diff changeset
   168
 */
45
hgs
parents:
diff changeset
   169
void CalenDayItem::setStatusStrip(const AgendaEntry &entry, bool allDayEvent)
hgs
parents:
diff changeset
   170
{
hgs
parents:
diff changeset
   171
    if (!allDayEvent) {
55
hgs
parents: 45
diff changeset
   172
hgs
parents: 45
diff changeset
   173
        QDateTime startTime;
hgs
parents: 45
diff changeset
   174
        QDateTime endTime;
hgs
parents: 45
diff changeset
   175
        QDateTime currentDateTime;
hgs
parents: 45
diff changeset
   176
        currentDateTime.setDate(container()->date());
hgs
parents: 45
diff changeset
   177
63
hgs
parents: 57
diff changeset
   178
        CalenDayUtils::instance()->getEventValidStartEndTime(startTime,
hgs
parents: 57
diff changeset
   179
            endTime, entry, currentDateTime);
55
hgs
parents: 45
diff changeset
   180
hgs
parents: 45
diff changeset
   181
        mColorStripe->setStartEndTime(startTime.time(), endTime.time());
hgs
parents: 45
diff changeset
   182
    }
hgs
parents: 45
diff changeset
   183
    else {
hgs
parents: 45
diff changeset
   184
        // This is workaround for displaying all-day events.
hgs
parents: 45
diff changeset
   185
        // Now for MS Outlook compability all-day events' start and end time is
hgs
parents: 45
diff changeset
   186
        // 00:00:00 and 00:00:00 next day respectively.
hgs
parents: 45
diff changeset
   187
        // To draw it correctly we need times like those visible for user in
hgs
parents: 45
diff changeset
   188
        // editor: 00:00:00 to 23:59:59 (the same day)
63
hgs
parents: 57
diff changeset
   189
        mColorStripe->setStartEndTime(entry.startTime().time(),
hgs
parents: 57
diff changeset
   190
            entry.endTime().time().addSecs(-1));
45
hgs
parents:
diff changeset
   191
    }
63
hgs
parents: 57
diff changeset
   192
45
hgs
parents:
diff changeset
   193
    switch (entry.status()) {
hgs
parents:
diff changeset
   194
        case AgendaEntry::Confirmed:
hgs
parents:
diff changeset
   195
            mColorStripe->setDrawingStyle(CalenDayStatusStrip::Filled);
63
hgs
parents: 57
diff changeset
   196
            break;
45
hgs
parents:
diff changeset
   197
        case AgendaEntry::Tentative:
hgs
parents:
diff changeset
   198
            mColorStripe->setDrawingStyle(CalenDayStatusStrip::StripWithLines);
63
hgs
parents: 57
diff changeset
   199
            break;
45
hgs
parents:
diff changeset
   200
        case AgendaEntry::Cancelled:
hgs
parents:
diff changeset
   201
            mColorStripe->setDrawingStyle(CalenDayStatusStrip::OnlyFrame);
63
hgs
parents: 57
diff changeset
   202
            break;
45
hgs
parents:
diff changeset
   203
        default:
hgs
parents:
diff changeset
   204
            mColorStripe->setDrawingStyle(CalenDayStatusStrip::Filled);
63
hgs
parents: 57
diff changeset
   205
            break;
45
hgs
parents:
diff changeset
   206
    }
hgs
parents:
diff changeset
   207
}
hgs
parents:
diff changeset
   208
57
hgs
parents: 55
diff changeset
   209
/*!
63
hgs
parents: 57
diff changeset
   210
 \brief Reimplemented from HbWidget. Handles resize event.
hgs
parents: 57
diff changeset
   211
 
hgs
parents: 57
diff changeset
   212
 \param event Instance of an event to be handled.
hgs
parents: 57
diff changeset
   213
 */
45
hgs
parents:
diff changeset
   214
void CalenDayItem::resizeEvent(QGraphicsSceneResizeEvent *event)
hgs
parents:
diff changeset
   215
{
hgs
parents:
diff changeset
   216
    Q_UNUSED(event)
hgs
parents:
diff changeset
   217
hgs
parents:
diff changeset
   218
    qreal width = rect().width();
83
hgs
parents: 64
diff changeset
   219
    qreal height = rect().height();
hgs
parents: 64
diff changeset
   220
    
hgs
parents: 64
diff changeset
   221
    //Backround height can't be bigger the screen. If event is long enough
hgs
parents: 64
diff changeset
   222
    //backround will start to float together with view content.
hgs
parents: 64
diff changeset
   223
    mBg->setMaximumHeight(CalenDayUtils::instance()->screenHeight());
45
hgs
parents:
diff changeset
   224
64
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
   225
    HbDeviceProfile deviceProfile;
63
hgs
parents: 57
diff changeset
   226
    if (width < mEventDescMinWidth) {
64
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
   227
        mColorStripe->setPreferredWidth(KCalenMinTimeStripWidth
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
   228
            * deviceProfile.unitValue());
83
hgs
parents: 64
diff changeset
   229
        mBg->setMaximumWidth(KCalenMinEventWidth
hgs
parents: 64
diff changeset
   230
            * deviceProfile.unitValue());        
45
hgs
parents:
diff changeset
   231
        mEventDesc->hide();
63
hgs
parents: 57
diff changeset
   232
    }
hgs
parents: 57
diff changeset
   233
    else {
64
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
   234
        mColorStripe->setPreferredWidth(KCalenTimeStripWidth
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
   235
            * deviceProfile.unitValue());
83
hgs
parents: 64
diff changeset
   236
        mBg->setMaximumWidth(CalenDayUtils::instance()->screenWidth());
45
hgs
parents:
diff changeset
   237
        mEventDesc->show();
hgs
parents:
diff changeset
   238
    }
63
hgs
parents: 57
diff changeset
   239
hgs
parents: 57
diff changeset
   240
    if (width < mFrameMinWidth) {
45
hgs
parents:
diff changeset
   241
        mBg->hide();
63
hgs
parents: 57
diff changeset
   242
    }
hgs
parents: 57
diff changeset
   243
    else {
45
hgs
parents:
diff changeset
   244
        mBg->show();
hgs
parents:
diff changeset
   245
    }
83
hgs
parents: 64
diff changeset
   246
    
hgs
parents: 64
diff changeset
   247
    //If following condition is fulfilled then background item needs to be
hgs
parents: 64
diff changeset
   248
    //switched to floating one.
hgs
parents: 64
diff changeset
   249
    if (height > CalenDayUtils::instance()->screenHeight()) {
hgs
parents: 64
diff changeset
   250
hgs
parents: 64
diff changeset
   251
        //If background item is floating then it needs to be removed from
hgs
parents: 64
diff changeset
   252
        //layout (see css & widgetml). In this case we need to take care of setting its
hgs
parents: 64
diff changeset
   253
        //geometry by ourselves.
hgs
parents: 64
diff changeset
   254
        QRectF newRect = rect();
hgs
parents: 64
diff changeset
   255
        qreal baseY = pos().y();
hgs
parents: 64
diff changeset
   256
        qreal mappedY = mapFromScene(pos()).y();
hgs
parents: 64
diff changeset
   257
        qreal normalizedY = mappedY - baseY; //aligns background to the top of viewport
hgs
parents: 64
diff changeset
   258
        //Check whether background won't go out of the event's rectangle
hgs
parents: 64
diff changeset
   259
        if(normalizedY < newRect.top()){
hgs
parents: 64
diff changeset
   260
            normalizedY = newRect.top();
hgs
parents: 64
diff changeset
   261
        }
hgs
parents: 64
diff changeset
   262
        newRect.setY(normalizedY);
hgs
parents: 64
diff changeset
   263
        mBg->setGeometry(newRect);
hgs
parents: 64
diff changeset
   264
hgs
parents: 64
diff changeset
   265
        //Notify the container about background type change.
hgs
parents: 64
diff changeset
   266
        //From now on this object is going to receive information
hgs
parents: 64
diff changeset
   267
        //about scrolling.
hgs
parents: 64
diff changeset
   268
        if (mBackgroundType == EStaticBackground) {
hgs
parents: 64
diff changeset
   269
            mBackgroundType = EFloatingBackground;
hgs
parents: 64
diff changeset
   270
            emit backgroundTypeChanged(this);
hgs
parents: 64
diff changeset
   271
        }
hgs
parents: 64
diff changeset
   272
    }else if (mBackgroundType == EFloatingBackground) {
hgs
parents: 64
diff changeset
   273
        mBackgroundType = EStaticBackground;
hgs
parents: 64
diff changeset
   274
        emit backgroundTypeChanged(this);
hgs
parents: 64
diff changeset
   275
    }
45
hgs
parents:
diff changeset
   276
63
hgs
parents: 57
diff changeset
   277
    // Necessary to switch layout
45
hgs
parents:
diff changeset
   278
    repolish();
hgs
parents:
diff changeset
   279
}
hgs
parents:
diff changeset
   280
83
hgs
parents: 64
diff changeset
   281
/*!
hgs
parents: 64
diff changeset
   282
 \brief This slot is triggered when backround type is set as EFloatingBackground.
hgs
parents: 64
diff changeset
   283
        It allows to scroll backround along with view content.
hgs
parents: 64
diff changeset
   284
 
hgs
parents: 64
diff changeset
   285
 \param pos Positoin to which backround needs to be scrolled.
hgs
parents: 64
diff changeset
   286
 */
hgs
parents: 64
diff changeset
   287
void CalenDayItem::scrollBackground(const QPointF &pos)
hgs
parents: 64
diff changeset
   288
{
hgs
parents: 64
diff changeset
   289
    qreal newY = mapFromParent(pos).y();
hgs
parents: 64
diff changeset
   290
    //margin to ensure that rounded corners will stay hidden
hgs
parents: 64
diff changeset
   291
    const qreal margin = 5.0;
hgs
parents: 64
diff changeset
   292
hgs
parents: 64
diff changeset
   293
    if (newY > rect().top() && newY + mBg->rect().height() < rect().bottom()) {
hgs
parents: 64
diff changeset
   294
hgs
parents: 64
diff changeset
   295
        mBg->setY(newY - margin);
hgs
parents: 64
diff changeset
   296
    }
hgs
parents: 64
diff changeset
   297
    else if (newY < rect().top()) { //condition for top boundary
hgs
parents: 64
diff changeset
   298
hgs
parents: 64
diff changeset
   299
        mBg->setY(rect().top());
hgs
parents: 64
diff changeset
   300
    
hgs
parents: 64
diff changeset
   301
    }else if (newY + mBg->rect().height() > rect().bottom()) { //condition for bottom boundary
hgs
parents: 64
diff changeset
   302
hgs
parents: 64
diff changeset
   303
        mBg->setY(rect().bottom() - mBg->rect().height());
hgs
parents: 64
diff changeset
   304
    }
hgs
parents: 64
diff changeset
   305
}
hgs
parents: 64
diff changeset
   306
45
hgs
parents:
diff changeset
   307
// End of File