calendarui/views/dayview/src/calendaycontainer.cpp
author hgs
Mon, 06 Sep 2010 10:12:45 +0530
changeset 70 a5ed90760192
parent 64 1881ad52dc45
child 83 5aadd1120515
permissions -rw-r--r--
201035
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
45
hgs
parents:
diff changeset
     1
/*
57
hgs
parents: 55
diff changeset
     2
 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents: 55
diff changeset
     3
 * All rights reserved.
hgs
parents: 55
diff changeset
     4
 * This component and the accompanying materials are made available
hgs
parents: 55
diff changeset
     5
 * under the terms of "Eclipse Public License v1.0"
hgs
parents: 55
diff changeset
     6
 * which accompanies this distribution, and is available
hgs
parents: 55
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents: 55
diff changeset
     8
 *
hgs
parents: 55
diff changeset
     9
 * Initial Contributors:
hgs
parents: 55
diff changeset
    10
 * Nokia Corporation - initial contribution.
hgs
parents: 55
diff changeset
    11
 *
hgs
parents: 55
diff changeset
    12
 * Contributors:
hgs
parents: 55
diff changeset
    13
 *
hgs
parents: 55
diff changeset
    14
 * Description:  Day view container - parent widget for events (CalenDayItem)
hgs
parents: 55
diff changeset
    15
 * and hours area widgets (CalenDayEventsPane)
hgs
parents: 55
diff changeset
    16
 * Responsible for positioning and resizing events widgets.
hgs
parents: 55
diff changeset
    17
 */
45
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
//System includes
hgs
parents:
diff changeset
    20
#include <QTime>
hgs
parents:
diff changeset
    21
#include <QGraphicsLinearLayout>
hgs
parents:
diff changeset
    22
#include <QGesture>
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
#ifdef _DEBUG
hgs
parents:
diff changeset
    25
	#include <QPainter>
hgs
parents:
diff changeset
    26
#endif
hgs
parents:
diff changeset
    27
57
hgs
parents: 55
diff changeset
    28
#include <HbAbstractItemView>
hgs
parents: 55
diff changeset
    29
#include <HbTextItem>
hgs
parents: 55
diff changeset
    30
#include <HbModelIterator>
hgs
parents: 55
diff changeset
    31
#include <HbInstance>
45
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
//User includes
hgs
parents:
diff changeset
    34
#include "calendaycontainer.h"
hgs
parents:
diff changeset
    35
#include "calendayutils.h"
hgs
parents:
diff changeset
    36
#include "calendayeventspane.h"
hgs
parents:
diff changeset
    37
#include "calendayitem.h"
hgs
parents:
diff changeset
    38
#include "calendaymodel.h"
hgs
parents:
diff changeset
    39
#include "calendayinfo.h"
hgs
parents:
diff changeset
    40
#include "calendayview.h"
57
hgs
parents: 55
diff changeset
    41
#include "calenagendautils.h"
hgs
parents: 55
diff changeset
    42
#include "calendaycommonheaders.h"
hgs
parents: 55
diff changeset
    43
hgs
parents: 55
diff changeset
    44
/*!
hgs
parents: 55
diff changeset
    45
 \class CalenDayContainer
hgs
parents: 55
diff changeset
    46
 
hgs
parents: 55
diff changeset
    47
 \brief CalenDayContainer Item container class associated with model.
hgs
parents: 55
diff changeset
    48
 */
45
hgs
parents:
diff changeset
    49
55
hgs
parents: 45
diff changeset
    50
/*!
hgs
parents: 45
diff changeset
    51
 \brief Constructor
hgs
parents: 45
diff changeset
    52
 
hgs
parents: 45
diff changeset
    53
 Sets container initial geometry, creates hours area widgets.
57
hgs
parents: 55
diff changeset
    54
 \param parent Parent object
55
hgs
parents: 45
diff changeset
    55
 */
45
hgs
parents:
diff changeset
    56
CalenDayContainer::CalenDayContainer(QGraphicsItem *parent) :
hgs
parents:
diff changeset
    57
    HbAbstractItemContainer(parent), mGeometryUpdated(false), mInfo(0)
hgs
parents:
diff changeset
    58
{
hgs
parents:
diff changeset
    59
    getTimedEventLayoutValues(mLayoutValues);
57
hgs
parents: 55
diff changeset
    60
45
hgs
parents:
diff changeset
    61
    QGraphicsLinearLayout* timeLinesLayout = new QGraphicsLinearLayout(
hgs
parents:
diff changeset
    62
        Qt::Vertical, this);
57
hgs
parents: 55
diff changeset
    63
    for (int i = 0; i < KCalenHoursInDay; i++) {
45
hgs
parents:
diff changeset
    64
        CalenDayEventsPane* element = new CalenDayEventsPane(this);
57
hgs
parents: 55
diff changeset
    65
        // Draw top line at midnight
45
hgs
parents:
diff changeset
    66
        if (i == 0) {
55
hgs
parents: 45
diff changeset
    67
            element->setDrawTopLine(true);
45
hgs
parents:
diff changeset
    68
        }
hgs
parents:
diff changeset
    69
        timeLinesLayout->addItem(element);
hgs
parents:
diff changeset
    70
    }
hgs
parents:
diff changeset
    71
    timeLinesLayout->setContentsMargins(0.0, 0.0, 0.0, 0.0);
hgs
parents:
diff changeset
    72
    timeLinesLayout->setSpacing(0.0);
hgs
parents:
diff changeset
    73
hgs
parents:
diff changeset
    74
    setLayout(timeLinesLayout);
hgs
parents:
diff changeset
    75
}
hgs
parents:
diff changeset
    76
55
hgs
parents: 45
diff changeset
    77
/*!
hgs
parents: 45
diff changeset
    78
 \brief Destructor
hgs
parents: 45
diff changeset
    79
 */
45
hgs
parents:
diff changeset
    80
CalenDayContainer::~CalenDayContainer()
hgs
parents:
diff changeset
    81
{
57
hgs
parents: 55
diff changeset
    82
    // Remove absorbers if exist
hgs
parents: 55
diff changeset
    83
    if (mAbsorbers.count()) {
hgs
parents: 55
diff changeset
    84
        qDeleteAll(mAbsorbers);
hgs
parents: 55
diff changeset
    85
        mAbsorbers.clear();
hgs
parents: 55
diff changeset
    86
    }
45
hgs
parents:
diff changeset
    87
}
hgs
parents:
diff changeset
    88
55
hgs
parents: 45
diff changeset
    89
/*
57
hgs
parents: 55
diff changeset
    90
 \reimp
55
hgs
parents: 45
diff changeset
    91
 */
57
hgs
parents: 55
diff changeset
    92
void CalenDayContainer::itemAdded(
hgs
parents: 55
diff changeset
    93
    int index,
hgs
parents: 55
diff changeset
    94
    HbAbstractViewItem *item,
hgs
parents: 55
diff changeset
    95
    bool animate)
45
hgs
parents:
diff changeset
    96
{
hgs
parents:
diff changeset
    97
    Q_UNUSED( index )
hgs
parents:
diff changeset
    98
    Q_UNUSED( item )
hgs
parents:
diff changeset
    99
    Q_UNUSED( animate )
hgs
parents:
diff changeset
   100
}
hgs
parents:
diff changeset
   101
55
hgs
parents: 45
diff changeset
   102
hgs
parents: 45
diff changeset
   103
/*
57
hgs
parents: 55
diff changeset
   104
 \brief Resets the state of container.
hgs
parents: 55
diff changeset
   105
 
hgs
parents: 55
diff changeset
   106
 Removes absorbers, gets layout values and maintains current position.
55
hgs
parents: 45
diff changeset
   107
 */
45
hgs
parents:
diff changeset
   108
void CalenDayContainer::reset()
hgs
parents:
diff changeset
   109
{
57
hgs
parents: 55
diff changeset
   110
    // Remove absorbers if exist
hgs
parents: 55
diff changeset
   111
    if (mAbsorbers.count()) {
hgs
parents: 55
diff changeset
   112
        qDeleteAll(mAbsorbers);
hgs
parents: 55
diff changeset
   113
        mAbsorbers.clear();
hgs
parents: 55
diff changeset
   114
    }
hgs
parents: 55
diff changeset
   115
hgs
parents: 55
diff changeset
   116
    // Shrink event area when all-day events available after reset
hgs
parents: 55
diff changeset
   117
    getTimedEventLayoutValues(mLayoutValues);
hgs
parents: 55
diff changeset
   118
hgs
parents: 55
diff changeset
   119
    // Position need to be maintained while changing model
45
hgs
parents:
diff changeset
   120
    QPointF position(pos());
hgs
parents:
diff changeset
   121
    HbAbstractItemContainer::reset();
57
hgs
parents: 55
diff changeset
   122
    setPos(position);
45
hgs
parents:
diff changeset
   123
}
hgs
parents:
diff changeset
   124
55
hgs
parents: 45
diff changeset
   125
/*
57
hgs
parents: 55
diff changeset
   126
 \reimp
55
hgs
parents: 45
diff changeset
   127
 */
57
hgs
parents: 55
diff changeset
   128
void CalenDayContainer::itemRemoved(HbAbstractViewItem *item, bool animate)
45
hgs
parents:
diff changeset
   129
{
hgs
parents:
diff changeset
   130
    Q_UNUSED( item )
hgs
parents:
diff changeset
   131
    Q_UNUSED( animate )
hgs
parents:
diff changeset
   132
}
hgs
parents:
diff changeset
   133
55
hgs
parents: 45
diff changeset
   134
/*
57
hgs
parents: 55
diff changeset
   135
 \reimp
55
hgs
parents: 45
diff changeset
   136
 */
57
hgs
parents: 55
diff changeset
   137
void CalenDayContainer::viewResized(const QSizeF &size)
45
hgs
parents:
diff changeset
   138
{
hgs
parents:
diff changeset
   139
    resize(size);
hgs
parents:
diff changeset
   140
    if (!mGeometryUpdated) {
hgs
parents:
diff changeset
   141
        mGeometryUpdated = true;
hgs
parents:
diff changeset
   142
        updateGeometry();
hgs
parents:
diff changeset
   143
    }
hgs
parents:
diff changeset
   144
}
hgs
parents:
diff changeset
   145
55
hgs
parents: 45
diff changeset
   146
/*
57
hgs
parents: 55
diff changeset
   147
 \reimp
55
hgs
parents: 45
diff changeset
   148
 */
45
hgs
parents:
diff changeset
   149
HbAbstractViewItem * CalenDayContainer::createDefaultPrototype() const
hgs
parents:
diff changeset
   150
{
55
hgs
parents: 45
diff changeset
   151
    CalenDayItem *calendarViewItem = new CalenDayItem(this);
45
hgs
parents:
diff changeset
   152
    return calendarViewItem;
hgs
parents:
diff changeset
   153
}
hgs
parents:
diff changeset
   154
55
hgs
parents: 45
diff changeset
   155
/*
57
hgs
parents: 55
diff changeset
   156
 \reimp
55
hgs
parents: 45
diff changeset
   157
 */
57
hgs
parents: 55
diff changeset
   158
void CalenDayContainer::setItemModelIndex(
hgs
parents: 55
diff changeset
   159
    HbAbstractViewItem *item,
hgs
parents: 55
diff changeset
   160
    const QModelIndex &index)
45
hgs
parents:
diff changeset
   161
{
57
hgs
parents: 55
diff changeset
   162
    QVariant variant = index.data(CalenDayEntry);
hgs
parents: 55
diff changeset
   163
    AgendaEntry entry = variant.value<AgendaEntry> ();
hgs
parents: 55
diff changeset
   164
hgs
parents: 55
diff changeset
   165
    // Check for All Day Events and Timed entries
hgs
parents: 55
diff changeset
   166
    if (CalenAgendaUtils::isAlldayEvent(entry)) {
hgs
parents: 55
diff changeset
   167
        updateAllDayEventGeometry(item, index);
45
hgs
parents:
diff changeset
   168
        item->setParentItem(this);
hgs
parents:
diff changeset
   169
    }
57
hgs
parents: 55
diff changeset
   170
    else
hgs
parents: 55
diff changeset
   171
        if (entry.isTimedEntry()) {
hgs
parents: 55
diff changeset
   172
            updateTimedEventGeometry(item, index);
hgs
parents: 55
diff changeset
   173
            item->setParentItem(this);
hgs
parents: 55
diff changeset
   174
        }
hgs
parents: 55
diff changeset
   175
        else {
hgs
parents: 55
diff changeset
   176
            item->setVisible(false);
hgs
parents: 55
diff changeset
   177
        }
hgs
parents: 55
diff changeset
   178
hgs
parents: 55
diff changeset
   179
    // Create touch event absorbers after last item
45
hgs
parents:
diff changeset
   180
    if (index.row() == index.model()->rowCount() - 1) {
57
hgs
parents: 55
diff changeset
   181
        createTouchEventAbsorbers();
45
hgs
parents:
diff changeset
   182
    }
hgs
parents:
diff changeset
   183
hgs
parents:
diff changeset
   184
    HbAbstractItemContainer::setItemModelIndex(item, index);
hgs
parents:
diff changeset
   185
}
hgs
parents:
diff changeset
   186
55
hgs
parents: 45
diff changeset
   187
hgs
parents: 45
diff changeset
   188
/*!
57
hgs
parents: 55
diff changeset
   189
 \brief Set size and position of singe timed event widget (bubble)
hgs
parents: 55
diff changeset
   190
 \a item bubble widget
hgs
parents: 55
diff changeset
   191
 \a index pointing item data in model
55
hgs
parents: 45
diff changeset
   192
 */
57
hgs
parents: 55
diff changeset
   193
void CalenDayContainer::updateTimedEventGeometry(
hgs
parents: 55
diff changeset
   194
    HbAbstractViewItem *item,
hgs
parents: 55
diff changeset
   195
    const QModelIndex &index)
45
hgs
parents:
diff changeset
   196
{
57
hgs
parents: 55
diff changeset
   197
    // Safety check
hgs
parents: 55
diff changeset
   198
    if (!mInfo) {
45
hgs
parents:
diff changeset
   199
        return;
hgs
parents:
diff changeset
   200
    }
57
hgs
parents: 55
diff changeset
   201
hgs
parents: 55
diff changeset
   202
    QVariant variant = index.data(CalenDayEntry);
hgs
parents: 55
diff changeset
   203
    AgendaEntry entry = variant.value<AgendaEntry> ();
hgs
parents: 55
diff changeset
   204
hgs
parents: 55
diff changeset
   205
    // 1. Get 'virtual' event position from DayInfo
45
hgs
parents:
diff changeset
   206
    SCalenApptInfo apptInfo;
hgs
parents:
diff changeset
   207
    apptInfo.iIndex = index;
57
hgs
parents: 55
diff changeset
   208
45
hgs
parents:
diff changeset
   209
    QDateTime start;
hgs
parents:
diff changeset
   210
    QDateTime end;
hgs
parents:
diff changeset
   211
    QDateTime currentDate;
57
hgs
parents: 55
diff changeset
   212
    currentDate
hgs
parents: 55
diff changeset
   213
        = static_cast<const CalenDayModel*> (index.model())->modelDate();
hgs
parents: 55
diff changeset
   214
    CalenDayUtils::instance()->getEventValidStartEndTime(start, end, entry,
hgs
parents: 55
diff changeset
   215
        currentDate);
45
hgs
parents:
diff changeset
   216
    apptInfo.iStartTime = start;
hgs
parents:
diff changeset
   217
    apptInfo.iEndTime = end;
57
hgs
parents: 55
diff changeset
   218
45
hgs
parents:
diff changeset
   219
    TCalenInstanceId id = TCalenInstanceId::nullInstanceId();
hgs
parents:
diff changeset
   220
    id.mEntryLocalUid = index.row(); //index.row() - temporary ID
57
hgs
parents: 55
diff changeset
   221
    id.mInstanceTime = apptInfo.iStartTime;
45
hgs
parents:
diff changeset
   222
    apptInfo.iId = id;
hgs
parents:
diff changeset
   223
    apptInfo.iAllDay = 0;
hgs
parents:
diff changeset
   224
    apptInfo.iColor = 0xffff;
57
hgs
parents: 55
diff changeset
   225
45
hgs
parents:
diff changeset
   226
    int startSlot, endSlot, columnIdx, columns;
57
hgs
parents: 55
diff changeset
   227
    mInfo->GetLocation(apptInfo, startSlot, endSlot, columnIdx, columns);
45
hgs
parents:
diff changeset
   228
57
hgs
parents: 55
diff changeset
   229
    // 2. Set timed event's geometry
hgs
parents: 55
diff changeset
   230
    qreal eventStartX(mLayoutValues.eventAreaX);
45
hgs
parents:
diff changeset
   231
    qreal eventStartY(0.0);
hgs
parents:
diff changeset
   232
    qreal eventWidth(mLayoutValues.eventAreaWidth);
hgs
parents:
diff changeset
   233
    qreal eventHeight(0.0);
57
hgs
parents: 55
diff changeset
   234
hgs
parents: 55
diff changeset
   235
    // Event's startY/height
45
hgs
parents:
diff changeset
   236
    eventStartY = startSlot * mLayoutValues.slotHeight;
hgs
parents:
diff changeset
   237
    eventHeight = (endSlot - startSlot) * mLayoutValues.slotHeight;
hgs
parents:
diff changeset
   238
57
hgs
parents: 55
diff changeset
   239
    // Event's startX/width
45
hgs
parents:
diff changeset
   240
    eventWidth /= columns;
63
hgs
parents: 57
diff changeset
   241
    
hgs
parents: 57
diff changeset
   242
    // In case when eventWidth will be smaller then KCalenMinEventWidth [un]
57
hgs
parents: 55
diff changeset
   243
    // spacings between events should be smaller.
hgs
parents: 55
diff changeset
   244
    // Check whether it's possible to shrink them so the bubbles width 
63
hgs
parents: 57
diff changeset
   245
    // can stay at KCalenMinEventWidth [un] (time stripe + frame margins).
hgs
parents: 57
diff changeset
   246
    qreal minWidth = KCalenMinEventWidth * mLayoutValues.unitInPixels;
57
hgs
parents: 55
diff changeset
   247
    if (eventWidth - mLayoutValues.eventMargin < minWidth) {
hgs
parents: 55
diff changeset
   248
hgs
parents: 55
diff changeset
   249
        // Calculate new margin value
64
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
   250
        // from totalMarginSpace we need to subtract mLayoutValues.eventMargin 
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
   251
        // because first margin is always KCalenSpaceBeetwenEvents
57
hgs
parents: 55
diff changeset
   252
        qreal totalMarginSpace = mLayoutValues.eventAreaWidth - minWidth
hgs
parents: 55
diff changeset
   253
            * columns - mLayoutValues.eventMargin;
45
hgs
parents:
diff changeset
   254
        qreal newMarginValue = totalMarginSpace / (columns - 1);
57
hgs
parents: 55
diff changeset
   255
hgs
parents: 55
diff changeset
   256
        // Check if we managed to pack all the events into space we have
hgs
parents: 55
diff changeset
   257
        if (newMarginValue > 0) {
45
hgs
parents:
diff changeset
   258
            eventWidth = minWidth;
hgs
parents:
diff changeset
   259
        }
57
hgs
parents: 55
diff changeset
   260
        else {
hgs
parents: 55
diff changeset
   261
            // There's not enough space
64
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
   262
            // New minWidth is KCalenMinTimeStripWidth [un] (time stripe only)
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
   263
            minWidth = KCalenMinTimeStripWidth * mLayoutValues.unitInPixels;
57
hgs
parents: 55
diff changeset
   264
            totalMarginSpace = mLayoutValues.eventAreaWidth - minWidth * columns 
hgs
parents: 55
diff changeset
   265
				- mLayoutValues.eventMargin;
45
hgs
parents:
diff changeset
   266
            newMarginValue = totalMarginSpace / (columns - 1);
hgs
parents:
diff changeset
   267
            eventWidth = minWidth;
hgs
parents:
diff changeset
   268
        }
hgs
parents:
diff changeset
   269
        
63
hgs
parents: 57
diff changeset
   270
        // First column margin should be always KCalenSpaceBeetwenEvents 
hgs
parents: 57
diff changeset
   271
        // (mLayoutValues.eventMargin)
45
hgs
parents:
diff changeset
   272
        eventStartX += columnIdx * (eventWidth + newMarginValue) + mLayoutValues.eventMargin;
hgs
parents:
diff changeset
   273
    }
57
hgs
parents: 55
diff changeset
   274
    else {
hgs
parents: 55
diff changeset
   275
        // Add margins between the event
45
hgs
parents:
diff changeset
   276
        eventStartX += columnIdx * eventWidth + mLayoutValues.eventMargin;
hgs
parents:
diff changeset
   277
        eventWidth -= mLayoutValues.eventMargin;
hgs
parents:
diff changeset
   278
    }
57
hgs
parents: 55
diff changeset
   279
70
hgs
parents: 64
diff changeset
   280
    // Verify if height of event is greater than minimum (UI spec)
hgs
parents: 64
diff changeset
   281
    qreal minHeight = CalenDayUtils::instance()->minEventHeight();
hgs
parents: 64
diff changeset
   282
    eventHeight = (eventHeight < minHeight ? minHeight : eventHeight);
57
hgs
parents: 55
diff changeset
   283
    QRectF eventGeometry(eventStartX, eventStartY, eventWidth, eventHeight);
63
hgs
parents: 57
diff changeset
   284
    
hgs
parents: 57
diff changeset
   285
    // Workaround to prevent size hint caching inside effectiveSizeHint
hgs
parents: 57
diff changeset
   286
    item->setMinimumSize(0, 0);
hgs
parents: 57
diff changeset
   287
    item->setMaximumSize(eventWidth, eventHeight);
55
hgs
parents: 45
diff changeset
   288
    item->setGeometry(eventGeometry);
hgs
parents: 45
diff changeset
   289
}
45
hgs
parents:
diff changeset
   290
hgs
parents:
diff changeset
   291
55
hgs
parents: 45
diff changeset
   292
/*!
57
hgs
parents: 55
diff changeset
   293
 \brief Set size and position of singe all-day event widget (bubble)
hgs
parents: 55
diff changeset
   294
 \a item bubble widget
hgs
parents: 55
diff changeset
   295
 \a index pointing item data in model
55
hgs
parents: 45
diff changeset
   296
 */
57
hgs
parents: 55
diff changeset
   297
void CalenDayContainer::updateAllDayEventGeometry(
hgs
parents: 55
diff changeset
   298
    HbAbstractViewItem *item,
hgs
parents: 55
diff changeset
   299
    const QModelIndex &index)
45
hgs
parents:
diff changeset
   300
{
57
hgs
parents: 55
diff changeset
   301
    // Safety check
hgs
parents: 55
diff changeset
   302
    if (!mInfo) {
hgs
parents: 55
diff changeset
   303
        return;
hgs
parents: 55
diff changeset
   304
    }
hgs
parents: 55
diff changeset
   305
hgs
parents: 55
diff changeset
   306
    QVariant variant = index.data(CalenDayEntry);
hgs
parents: 55
diff changeset
   307
    AgendaEntry entry = variant.value<AgendaEntry> ();
hgs
parents: 55
diff changeset
   308
hgs
parents: 55
diff changeset
   309
    // 1. Get 'virtual' event position from DayInfo 
hgs
parents: 55
diff changeset
   310
    SCalenApptInfo apptInfo;
hgs
parents: 55
diff changeset
   311
    apptInfo.iIndex = index;
hgs
parents: 55
diff changeset
   312
hgs
parents: 55
diff changeset
   313
    QDateTime start;
45
hgs
parents:
diff changeset
   314
    QDateTime end;
hgs
parents:
diff changeset
   315
    QDateTime currentDate;
57
hgs
parents: 55
diff changeset
   316
    currentDate
hgs
parents: 55
diff changeset
   317
        = static_cast<const CalenDayModel*> (index.model())->modelDate();
hgs
parents: 55
diff changeset
   318
    CalenDayUtils::instance()->getEventValidStartEndTime(start, end, entry,
hgs
parents: 55
diff changeset
   319
        currentDate);
45
hgs
parents:
diff changeset
   320
    apptInfo.iStartTime = start;
hgs
parents:
diff changeset
   321
    apptInfo.iEndTime = end;
57
hgs
parents: 55
diff changeset
   322
hgs
parents: 55
diff changeset
   323
    TCalenInstanceId id = TCalenInstanceId::nullInstanceId();
hgs
parents: 55
diff changeset
   324
    id.mEntryLocalUid = index.row(); //index.row() - temporary ID
hgs
parents: 55
diff changeset
   325
    id.mInstanceTime = apptInfo.iStartTime;
hgs
parents: 55
diff changeset
   326
    apptInfo.iId = id;
hgs
parents: 55
diff changeset
   327
    apptInfo.iAllDay = true;
hgs
parents: 55
diff changeset
   328
    apptInfo.iColor = 0xffff;
hgs
parents: 55
diff changeset
   329
hgs
parents: 55
diff changeset
   330
    int startSlot, endSlot, columnIdx, columns;
hgs
parents: 55
diff changeset
   331
    mInfo->GetLocation(apptInfo, startSlot, endSlot, columnIdx, columns);
45
hgs
parents:
diff changeset
   332
57
hgs
parents: 55
diff changeset
   333
    // 2. Set timed event's geometry
hgs
parents: 55
diff changeset
   334
    qreal eventStartX(0.0);
hgs
parents: 55
diff changeset
   335
    qreal eventStartY(0.0);
hgs
parents: 55
diff changeset
   336
    qreal eventWidth(mLayoutValues.eventAreaX);
hgs
parents: 55
diff changeset
   337
    qreal eventHeight = (endSlot - startSlot) * mLayoutValues.slotHeight;
hgs
parents: 55
diff changeset
   338
hgs
parents: 55
diff changeset
   339
    // Event's startX/width
hgs
parents: 55
diff changeset
   340
    if (columns > 1) {
hgs
parents: 55
diff changeset
   341
        eventWidth /= columns;
hgs
parents: 55
diff changeset
   342
        eventStartX += columnIdx * eventWidth + mLayoutValues.eventMargin;
hgs
parents: 55
diff changeset
   343
        // Add margins between the event
hgs
parents: 55
diff changeset
   344
        eventWidth -= mLayoutValues.eventMargin;
hgs
parents: 55
diff changeset
   345
    }
hgs
parents: 55
diff changeset
   346
    else {
hgs
parents: 55
diff changeset
   347
        eventStartX += mLayoutValues.eventMargin;
hgs
parents: 55
diff changeset
   348
        eventWidth -= mLayoutValues.eventMargin;
hgs
parents: 55
diff changeset
   349
    }
hgs
parents: 55
diff changeset
   350
hgs
parents: 55
diff changeset
   351
    QRectF eventGeometry(eventStartX, eventStartY, eventWidth, eventHeight);
63
hgs
parents: 57
diff changeset
   352
	
hgs
parents: 57
diff changeset
   353
    // Workaround to prevent size hint caching inside effectiveSizeHint
hgs
parents: 57
diff changeset
   354
    item->setMinimumSize(0, 0);
hgs
parents: 57
diff changeset
   355
    item->setMaximumSize(eventWidth, eventHeight);
57
hgs
parents: 55
diff changeset
   356
    item->setGeometry(eventGeometry);
45
hgs
parents:
diff changeset
   357
}
hgs
parents:
diff changeset
   358
hgs
parents:
diff changeset
   359
55
hgs
parents: 45
diff changeset
   360
/*!
57
hgs
parents: 55
diff changeset
   361
 \brief Gets event layout values
hgs
parents: 55
diff changeset
   362
 \a layoutValues structure to be filled with layout data
55
hgs
parents: 45
diff changeset
   363
 */
45
hgs
parents:
diff changeset
   364
void CalenDayContainer::getTimedEventLayoutValues(LayoutValues& layoutValues)
hgs
parents:
diff changeset
   365
{
64
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
   366
    // Get the width of entire content area
45
hgs
parents:
diff changeset
   367
    qreal contentWidth = CalenDayUtils::instance()->contentWidth();
57
hgs
parents: 55
diff changeset
   368
45
hgs
parents:
diff changeset
   369
    HbStyle style;
hgs
parents:
diff changeset
   370
    HbDeviceProfile deviceProfile;
hgs
parents:
diff changeset
   371
    layoutValues.unitInPixels = deviceProfile.unitValue();
57
hgs
parents: 55
diff changeset
   372
64
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
   373
    // Empty right column's width
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
   374
    qreal emptyRightColumnWidth = KCalenEmptyRightColumnWidth
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
   375
        * layoutValues.unitInPixels;
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
   376
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
   377
    // Margins between the overlapping events -> eventMargin[out]
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
   378
    layoutValues.eventMargin = KCalenSpaceBeetwenEvents
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
   379
        * layoutValues.unitInPixels;
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
   380
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
   381
    // Start position (x) for drawing events -> eventAreaX[out]
57
hgs
parents: 55
diff changeset
   382
    if (mInfo && mInfo->AlldayCount()) {
64
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
   383
        layoutValues.eventAreaX = KCalenAllDayEventArea * (contentWidth
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
   384
            - emptyRightColumnWidth);
57
hgs
parents: 55
diff changeset
   385
    }
hgs
parents: 55
diff changeset
   386
    else {
hgs
parents: 55
diff changeset
   387
        layoutValues.eventAreaX = 0;
hgs
parents: 55
diff changeset
   388
    }
hgs
parents: 55
diff changeset
   389
64
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
   390
    // Event area width (excluding All Day Events area)-> eventAreaWidth[out]
57
hgs
parents: 55
diff changeset
   391
    layoutValues.eventAreaWidth = contentWidth - emptyRightColumnWidth
hgs
parents: 55
diff changeset
   392
        - layoutValues.eventAreaX;
hgs
parents: 55
diff changeset
   393
64
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
   394
    // Half-hour slot's height -> slotHeight[out]
57
hgs
parents: 55
diff changeset
   395
    layoutValues.slotHeight = CalenDayUtils::instance()->hourElementHeight()
hgs
parents: 55
diff changeset
   396
        / KCalenSlotsInHour;
hgs
parents: 55
diff changeset
   397
64
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
   398
    // Check if touch absorbers should be created over some overlapping regions
57
hgs
parents: 55
diff changeset
   399
    layoutValues.maxColumns = layoutValues.eventAreaWidth
63
hgs
parents: 57
diff changeset
   400
        / ((KCalenMinTouchableEventWidth + KCalenSpaceBeetwenEvents)
hgs
parents: 57
diff changeset
   401
            * layoutValues.unitInPixels);
45
hgs
parents:
diff changeset
   402
}
hgs
parents:
diff changeset
   403
55
hgs
parents: 45
diff changeset
   404
hgs
parents: 45
diff changeset
   405
/*!
57
hgs
parents: 55
diff changeset
   406
 \brief Sets day's info structure to the container.
hgs
parents: 55
diff changeset
   407
 \a dayInfo day's info data
hgs
parents: 55
diff changeset
   408
hgs
parents: 55
diff changeset
   409
 \sa CalenDayInfo, CalenDayContainer::dayInfo
55
hgs
parents: 45
diff changeset
   410
 */
57
hgs
parents: 55
diff changeset
   411
void CalenDayContainer::setDayInfo(CalenDayInfo* dayInfo)
45
hgs
parents:
diff changeset
   412
{
hgs
parents:
diff changeset
   413
    mInfo = dayInfo;
hgs
parents:
diff changeset
   414
}
hgs
parents:
diff changeset
   415
57
hgs
parents: 55
diff changeset
   416
/*!
hgs
parents: 55
diff changeset
   417
 \brief It return pointer to info structure of container.
hgs
parents: 55
diff changeset
   418
 
hgs
parents: 55
diff changeset
   419
 \sa CalenDayInfo, CalenDayContainer::setDayInfo
hgs
parents: 55
diff changeset
   420
 */
hgs
parents: 55
diff changeset
   421
CalenDayInfo* CalenDayContainer::dayInfo()
hgs
parents: 55
diff changeset
   422
{
hgs
parents: 55
diff changeset
   423
    return mInfo;
hgs
parents: 55
diff changeset
   424
}
hgs
parents: 55
diff changeset
   425
hgs
parents: 55
diff changeset
   426
/*!
hgs
parents: 55
diff changeset
   427
 \brief Sets date to the container. 
hgs
parents: 55
diff changeset
   428
 Changes according to model which is connected to given view.
hgs
parents: 55
diff changeset
   429
 
hgs
parents: 55
diff changeset
   430
 \a date Date of container
hgs
parents: 55
diff changeset
   431
 */
55
hgs
parents: 45
diff changeset
   432
void CalenDayContainer::setDate(const QDate &date)
hgs
parents: 45
diff changeset
   433
{
hgs
parents: 45
diff changeset
   434
    mDate = date;
hgs
parents: 45
diff changeset
   435
}
hgs
parents: 45
diff changeset
   436
hgs
parents: 45
diff changeset
   437
// -----------------------------------------------------------------------------
hgs
parents: 45
diff changeset
   438
// date()
hgs
parents: 45
diff changeset
   439
// Returns date of the container.
hgs
parents: 45
diff changeset
   440
// -----------------------------------------------------------------------------
hgs
parents: 45
diff changeset
   441
//
57
hgs
parents: 55
diff changeset
   442
/*!
hgs
parents: 55
diff changeset
   443
 \brief Returns date of the container.
hgs
parents: 55
diff changeset
   444
 
hgs
parents: 55
diff changeset
   445
 \sa date Date of container
hgs
parents: 55
diff changeset
   446
 */
55
hgs
parents: 45
diff changeset
   447
const QDate &CalenDayContainer::date() const
hgs
parents: 45
diff changeset
   448
{
hgs
parents: 45
diff changeset
   449
    return mDate;
hgs
parents: 45
diff changeset
   450
}
hgs
parents: 45
diff changeset
   451
hgs
parents: 45
diff changeset
   452
/*!
57
hgs
parents: 55
diff changeset
   453
 \brief Slot handles layout switch.
hgs
parents: 55
diff changeset
   454
 \a orientation current device orientation
55
hgs
parents: 45
diff changeset
   455
 */
45
hgs
parents:
diff changeset
   456
void CalenDayContainer::orientationChanged(Qt::Orientation orientation)
hgs
parents:
diff changeset
   457
{
57
hgs
parents: 55
diff changeset
   458
    getTimedEventLayoutValues(mLayoutValues);
hgs
parents: 55
diff changeset
   459
45
hgs
parents:
diff changeset
   460
    Q_UNUSED( orientation )
hgs
parents:
diff changeset
   461
    QList<HbAbstractViewItem *> items = this->items();
hgs
parents:
diff changeset
   462
    int count(items.count());
hgs
parents:
diff changeset
   463
    for (int i = 0; i < count; i++) {
hgs
parents:
diff changeset
   464
        QModelIndex modelIndex = items[i]->modelIndex();
hgs
parents:
diff changeset
   465
        if (modelIndex.isValid()) {
hgs
parents:
diff changeset
   466
            QVariant variant = modelIndex.data(CalenDayEntry);
hgs
parents:
diff changeset
   467
            AgendaEntry entry = variant.value<AgendaEntry> ();
57
hgs
parents: 55
diff changeset
   468
            if (entry.isTimedEntry() && !CalenAgendaUtils::isAlldayEvent(entry)) {
45
hgs
parents:
diff changeset
   469
                updateTimedEventGeometry(items[i], modelIndex);
hgs
parents:
diff changeset
   470
            }
57
hgs
parents: 55
diff changeset
   471
            else
hgs
parents: 55
diff changeset
   472
                if (CalenAgendaUtils::isAlldayEvent(entry)) {
hgs
parents: 55
diff changeset
   473
                    updateAllDayEventGeometry(items[i], modelIndex);
hgs
parents: 55
diff changeset
   474
                }
45
hgs
parents:
diff changeset
   475
        }
hgs
parents:
diff changeset
   476
    }
57
hgs
parents: 55
diff changeset
   477
45
hgs
parents:
diff changeset
   478
    createTouchEventAbsorbers();
hgs
parents:
diff changeset
   479
}
hgs
parents:
diff changeset
   480
55
hgs
parents: 45
diff changeset
   481
hgs
parents: 45
diff changeset
   482
/*!
57
hgs
parents: 55
diff changeset
   483
 \brief Creates absorbers which prevent touching to small items
hgs
parents: 55
diff changeset
   484
 According to UI spec items smaller than 8.2 un are untouchable
55
hgs
parents: 45
diff changeset
   485
 */
45
hgs
parents:
diff changeset
   486
void CalenDayContainer::createTouchEventAbsorbers()
hgs
parents:
diff changeset
   487
{
57
hgs
parents: 55
diff changeset
   488
    // remove absorbers if exist
hgs
parents: 55
diff changeset
   489
    if (mAbsorbers.count()) {
hgs
parents: 55
diff changeset
   490
        qDeleteAll(mAbsorbers);
hgs
parents: 55
diff changeset
   491
        mAbsorbers.clear();
hgs
parents: 55
diff changeset
   492
    }
hgs
parents: 55
diff changeset
   493
hgs
parents: 55
diff changeset
   494
    // Create absorber for all-day events
hgs
parents: 55
diff changeset
   495
    Qt::Orientation orientation = CalenDayUtils::instance()->orientation();
hgs
parents: 55
diff changeset
   496
    int allDayCount = mInfo->AlldayCount();
hgs
parents: 55
diff changeset
   497
hgs
parents: 55
diff changeset
   498
    if ((orientation == Qt::Vertical 
hgs
parents: 55
diff changeset
   499
        && allDayCount > KCalenTouchableAllDayEventsCountPortrait) 
hgs
parents: 55
diff changeset
   500
        || (orientation == Qt::Horizontal
hgs
parents: 55
diff changeset
   501
        && allDayCount > KCalenTouchableAllDayEventsCountLandscape)) {
hgs
parents: 55
diff changeset
   502
        TouchEventAbsorber* absorber = crateAbsorberBetweenSlots(0, 0, true);
hgs
parents: 55
diff changeset
   503
        mAbsorbers.append(absorber);
hgs
parents: 55
diff changeset
   504
    }
hgs
parents: 55
diff changeset
   505
hgs
parents: 55
diff changeset
   506
    // Create absorbers for timed events
hgs
parents: 55
diff changeset
   507
    const QList<CalenTimeRegion>& regionList = mInfo->RegionList();
hgs
parents: 55
diff changeset
   508
    for (int i = 0; i < regionList.count(); i++) {
hgs
parents: 55
diff changeset
   509
        if (regionList[i].iColumns.count() > mLayoutValues.maxColumns) {
hgs
parents: 55
diff changeset
   510
            TouchEventAbsorber* absorber = crateAbsorberBetweenSlots(
hgs
parents: 55
diff changeset
   511
                regionList[i].iStartSlot, regionList[i].iEndSlot, false);
hgs
parents: 55
diff changeset
   512
hgs
parents: 55
diff changeset
   513
            mAbsorbers.append(absorber);
hgs
parents: 55
diff changeset
   514
        }
hgs
parents: 55
diff changeset
   515
    }
45
hgs
parents:
diff changeset
   516
}
hgs
parents:
diff changeset
   517
55
hgs
parents: 45
diff changeset
   518
hgs
parents: 45
diff changeset
   519
/*!
57
hgs
parents: 55
diff changeset
   520
 \brief Creates single absorber in given location
hgs
parents: 55
diff changeset
   521
 \a startSlot absorber area starts from there
hgs
parents: 55
diff changeset
   522
 \a endSlot absobrber area ends here
hgs
parents: 55
diff changeset
   523
 \a forAllDayEvents if true absorber in all-day events area is created
55
hgs
parents: 45
diff changeset
   524
 */
57
hgs
parents: 55
diff changeset
   525
TouchEventAbsorber *CalenDayContainer::crateAbsorberBetweenSlots(
hgs
parents: 55
diff changeset
   526
    int startSlot,
hgs
parents: 55
diff changeset
   527
    int endSlot,
hgs
parents: 55
diff changeset
   528
    bool forAllDayEvents)
45
hgs
parents:
diff changeset
   529
{
hgs
parents:
diff changeset
   530
    TouchEventAbsorber *absorber = new TouchEventAbsorber(this);
hgs
parents:
diff changeset
   531
    absorber->setZValue(1000);
hgs
parents:
diff changeset
   532
    absorber->setVisible(true);
57
hgs
parents: 55
diff changeset
   533
    if (!forAllDayEvents) {
hgs
parents: 55
diff changeset
   534
        absorber->setGeometry(mLayoutValues.eventAreaX, // x
hgs
parents: 55
diff changeset
   535
            startSlot * mLayoutValues.slotHeight, // y
hgs
parents: 55
diff changeset
   536
            mLayoutValues.eventAreaWidth, // w
hgs
parents: 55
diff changeset
   537
            (endSlot - startSlot) * mLayoutValues.slotHeight); // h
hgs
parents: 55
diff changeset
   538
    }
hgs
parents: 55
diff changeset
   539
    else {
hgs
parents: 55
diff changeset
   540
        absorber->setGeometry(0, 0, mLayoutValues.eventAreaX,
hgs
parents: 55
diff changeset
   541
            KCalenHoursInDay * KCalenSlotsInHour * mLayoutValues.slotHeight);
hgs
parents: 55
diff changeset
   542
    }
hgs
parents: 55
diff changeset
   543
45
hgs
parents:
diff changeset
   544
    return absorber;
hgs
parents:
diff changeset
   545
}
hgs
parents:
diff changeset
   546
hgs
parents:
diff changeset
   547
55
hgs
parents: 45
diff changeset
   548
/*!
57
hgs
parents: 55
diff changeset
   549
 \brief Handles tap event on overlapping area
hgs
parents: 55
diff changeset
   550
 Currently it leads to Agenda View -  as described in UI spec
hgs
parents: 55
diff changeset
   551
 \a event qt gesture event
55
hgs
parents: 45
diff changeset
   552
 */
45
hgs
parents:
diff changeset
   553
void TouchEventAbsorber::gestureEvent(QGestureEvent *event)
hgs
parents:
diff changeset
   554
{
hgs
parents:
diff changeset
   555
    QTapGesture *tapGesture = qobject_cast<QTapGesture*> (event->gesture(
hgs
parents:
diff changeset
   556
        Qt::TapGesture));
hgs
parents:
diff changeset
   557
    
57
hgs
parents: 55
diff changeset
   558
    if (tapGesture && tapGesture->state() == Qt::GestureFinished) {
45
hgs
parents:
diff changeset
   559
    	CalenDayView* dayView = static_cast<CalenDayView*>
hgs
parents:
diff changeset
   560
                (CalenDayUtils::instance()->mainWindow()->currentView());
hgs
parents:
diff changeset
   561
    	
hgs
parents:
diff changeset
   562
    	dayView->changeView(ECalenAgendaView);
57
hgs
parents: 55
diff changeset
   563
    }
45
hgs
parents:
diff changeset
   564
}
hgs
parents:
diff changeset
   565
55
hgs
parents: 45
diff changeset
   566
/*!
57
hgs
parents: 55
diff changeset
   567
 \brief Constructor
55
hgs
parents: 45
diff changeset
   568
 */
57
hgs
parents: 55
diff changeset
   569
TouchEventAbsorber::TouchEventAbsorber(QGraphicsItem *parent) :
hgs
parents: 55
diff changeset
   570
    HbWidget(parent)
45
hgs
parents:
diff changeset
   571
{
hgs
parents:
diff changeset
   572
#ifdef _DEBUG
hgs
parents:
diff changeset
   573
    setFlag(QGraphicsItem::ItemHasNoContents, false);
hgs
parents:
diff changeset
   574
#endif	
57
hgs
parents: 55
diff changeset
   575
    grabGesture(Qt::TapGesture);
45
hgs
parents:
diff changeset
   576
}
hgs
parents:
diff changeset
   577
55
hgs
parents: 45
diff changeset
   578
hgs
parents: 45
diff changeset
   579
/*!
hgs
parents: 45
diff changeset
   580
 \brief Destructor
hgs
parents: 45
diff changeset
   581
 
hgs
parents: 45
diff changeset
   582
 Sets container initial geometry, creates hours area widgets.
hgs
parents: 45
diff changeset
   583
 */
45
hgs
parents:
diff changeset
   584
TouchEventAbsorber::~TouchEventAbsorber()
hgs
parents:
diff changeset
   585
{
55
hgs
parents: 45
diff changeset
   586
45
hgs
parents:
diff changeset
   587
}
hgs
parents:
diff changeset
   588
55
hgs
parents: 45
diff changeset
   589
hgs
parents: 45
diff changeset
   590
/*!
57
hgs
parents: 55
diff changeset
   591
 \brief Used for debugging purposes to see absorbers areas
hgs
parents: 55
diff changeset
   592
 Not active in release builds!
55
hgs
parents: 45
diff changeset
   593
 
hgs
parents: 45
diff changeset
   594
 */
45
hgs
parents:
diff changeset
   595
#ifdef _DEBUG
57
hgs
parents: 55
diff changeset
   596
void TouchEventAbsorber::paint(
hgs
parents: 55
diff changeset
   597
    QPainter *painter,
hgs
parents: 55
diff changeset
   598
    const QStyleOptionGraphicsItem *option,
hgs
parents: 55
diff changeset
   599
    QWidget *widget)
45
hgs
parents:
diff changeset
   600
{
57
hgs
parents: 55
diff changeset
   601
    Q_UNUSED(option)
hgs
parents: 55
diff changeset
   602
    Q_UNUSED(widget)
hgs
parents: 55
diff changeset
   603
hgs
parents: 55
diff changeset
   604
    painter->save();
hgs
parents: 55
diff changeset
   605
    QPen pen;
hgs
parents: 55
diff changeset
   606
    pen.setWidth(2);
hgs
parents: 55
diff changeset
   607
    pen.setColor(Qt::red);
hgs
parents: 55
diff changeset
   608
    painter->setPen(pen);
hgs
parents: 55
diff changeset
   609
    painter->drawRect(boundingRect());
hgs
parents: 55
diff changeset
   610
    painter->restore();
45
hgs
parents:
diff changeset
   611
}
hgs
parents:
diff changeset
   612
#endif
hgs
parents:
diff changeset
   613
// End of File