calendarui/views/dayview/src/calendaycontainer.cpp
author hgs
Wed, 25 Aug 2010 14:02:13 +0530
changeset 63 a3cb48f6c889
parent 57 bb2d3e476f29
child 64 1881ad52dc45
permissions -rw-r--r--
201033
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
hgs
parents: 55
diff changeset
   250
        // from totalMarginSpace we need to subtract 
hgs
parents: 55
diff changeset
   251
        // mLayoutValues.eventMargin because first margin is always 1.5un
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
hgs
parents: 55
diff changeset
   262
            // New minWidth is KCalenTimeStripWidth [un] (time stripe only)
hgs
parents: 55
diff changeset
   263
            minWidth = KCalenTimeStripWidth * mLayoutValues.unitInPixels;
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
hgs
parents: 55
diff changeset
   280
    QRectF eventGeometry(eventStartX, eventStartY, eventWidth, eventHeight);
63
hgs
parents: 57
diff changeset
   281
    
hgs
parents: 57
diff changeset
   282
    // Workaround to prevent size hint caching inside effectiveSizeHint
hgs
parents: 57
diff changeset
   283
    item->setMinimumSize(0, 0);
hgs
parents: 57
diff changeset
   284
    item->setMaximumSize(eventWidth, eventHeight);
55
hgs
parents: 45
diff changeset
   285
    item->setGeometry(eventGeometry);
hgs
parents: 45
diff changeset
   286
}
45
hgs
parents:
diff changeset
   287
hgs
parents:
diff changeset
   288
55
hgs
parents: 45
diff changeset
   289
/*!
57
hgs
parents: 55
diff changeset
   290
 \brief Set size and position of singe all-day event widget (bubble)
hgs
parents: 55
diff changeset
   291
 \a item bubble widget
hgs
parents: 55
diff changeset
   292
 \a index pointing item data in model
55
hgs
parents: 45
diff changeset
   293
 */
57
hgs
parents: 55
diff changeset
   294
void CalenDayContainer::updateAllDayEventGeometry(
hgs
parents: 55
diff changeset
   295
    HbAbstractViewItem *item,
hgs
parents: 55
diff changeset
   296
    const QModelIndex &index)
45
hgs
parents:
diff changeset
   297
{
57
hgs
parents: 55
diff changeset
   298
    // Safety check
hgs
parents: 55
diff changeset
   299
    if (!mInfo) {
hgs
parents: 55
diff changeset
   300
        return;
hgs
parents: 55
diff changeset
   301
    }
hgs
parents: 55
diff changeset
   302
hgs
parents: 55
diff changeset
   303
    QVariant variant = index.data(CalenDayEntry);
hgs
parents: 55
diff changeset
   304
    AgendaEntry entry = variant.value<AgendaEntry> ();
hgs
parents: 55
diff changeset
   305
hgs
parents: 55
diff changeset
   306
    // 1. Get 'virtual' event position from DayInfo 
hgs
parents: 55
diff changeset
   307
    SCalenApptInfo apptInfo;
hgs
parents: 55
diff changeset
   308
    apptInfo.iIndex = index;
hgs
parents: 55
diff changeset
   309
hgs
parents: 55
diff changeset
   310
    QDateTime start;
45
hgs
parents:
diff changeset
   311
    QDateTime end;
hgs
parents:
diff changeset
   312
    QDateTime currentDate;
57
hgs
parents: 55
diff changeset
   313
    currentDate
hgs
parents: 55
diff changeset
   314
        = static_cast<const CalenDayModel*> (index.model())->modelDate();
hgs
parents: 55
diff changeset
   315
    CalenDayUtils::instance()->getEventValidStartEndTime(start, end, entry,
hgs
parents: 55
diff changeset
   316
        currentDate);
45
hgs
parents:
diff changeset
   317
    apptInfo.iStartTime = start;
hgs
parents:
diff changeset
   318
    apptInfo.iEndTime = end;
57
hgs
parents: 55
diff changeset
   319
hgs
parents: 55
diff changeset
   320
    TCalenInstanceId id = TCalenInstanceId::nullInstanceId();
hgs
parents: 55
diff changeset
   321
    id.mEntryLocalUid = index.row(); //index.row() - temporary ID
hgs
parents: 55
diff changeset
   322
    id.mInstanceTime = apptInfo.iStartTime;
hgs
parents: 55
diff changeset
   323
    apptInfo.iId = id;
hgs
parents: 55
diff changeset
   324
    apptInfo.iAllDay = true;
hgs
parents: 55
diff changeset
   325
    apptInfo.iColor = 0xffff;
hgs
parents: 55
diff changeset
   326
hgs
parents: 55
diff changeset
   327
    int startSlot, endSlot, columnIdx, columns;
hgs
parents: 55
diff changeset
   328
    mInfo->GetLocation(apptInfo, startSlot, endSlot, columnIdx, columns);
45
hgs
parents:
diff changeset
   329
57
hgs
parents: 55
diff changeset
   330
    // 2. Set timed event's geometry
hgs
parents: 55
diff changeset
   331
    qreal eventStartX(0.0);
hgs
parents: 55
diff changeset
   332
    qreal eventStartY(0.0);
hgs
parents: 55
diff changeset
   333
    qreal eventWidth(mLayoutValues.eventAreaX);
hgs
parents: 55
diff changeset
   334
    qreal eventHeight = (endSlot - startSlot) * mLayoutValues.slotHeight;
hgs
parents: 55
diff changeset
   335
hgs
parents: 55
diff changeset
   336
    // Event's startX/width
hgs
parents: 55
diff changeset
   337
    if (columns > 1) {
hgs
parents: 55
diff changeset
   338
        eventWidth /= columns;
hgs
parents: 55
diff changeset
   339
        eventStartX += columnIdx * eventWidth + mLayoutValues.eventMargin;
hgs
parents: 55
diff changeset
   340
        // Add margins between the event
hgs
parents: 55
diff changeset
   341
        eventWidth -= mLayoutValues.eventMargin;
hgs
parents: 55
diff changeset
   342
    }
hgs
parents: 55
diff changeset
   343
    else {
hgs
parents: 55
diff changeset
   344
        eventStartX += mLayoutValues.eventMargin;
hgs
parents: 55
diff changeset
   345
        eventWidth -= mLayoutValues.eventMargin;
hgs
parents: 55
diff changeset
   346
    }
hgs
parents: 55
diff changeset
   347
hgs
parents: 55
diff changeset
   348
    QRectF eventGeometry(eventStartX, eventStartY, eventWidth, eventHeight);
63
hgs
parents: 57
diff changeset
   349
	
hgs
parents: 57
diff changeset
   350
    // Workaround to prevent size hint caching inside effectiveSizeHint
hgs
parents: 57
diff changeset
   351
    item->setMinimumSize(0, 0);
hgs
parents: 57
diff changeset
   352
    item->setMaximumSize(eventWidth, eventHeight);
57
hgs
parents: 55
diff changeset
   353
    item->setGeometry(eventGeometry);
45
hgs
parents:
diff changeset
   354
}
hgs
parents:
diff changeset
   355
hgs
parents:
diff changeset
   356
55
hgs
parents: 45
diff changeset
   357
/*!
57
hgs
parents: 55
diff changeset
   358
 \brief Gets event layout values
hgs
parents: 55
diff changeset
   359
 \a layoutValues structure to be filled with layout data
55
hgs
parents: 45
diff changeset
   360
 */
45
hgs
parents:
diff changeset
   361
void CalenDayContainer::getTimedEventLayoutValues(LayoutValues& layoutValues)
hgs
parents:
diff changeset
   362
{
57
hgs
parents: 55
diff changeset
   363
    // Get the width of content area
45
hgs
parents:
diff changeset
   364
    qreal contentWidth = CalenDayUtils::instance()->contentWidth();
57
hgs
parents: 55
diff changeset
   365
hgs
parents: 55
diff changeset
   366
    // 1. Time column width -> eventAreaX[out]
45
hgs
parents:
diff changeset
   367
    HbStyle style;
hgs
parents:
diff changeset
   368
    HbDeviceProfile deviceProfile;
hgs
parents:
diff changeset
   369
    layoutValues.unitInPixels = deviceProfile.unitValue();
57
hgs
parents: 55
diff changeset
   370
hgs
parents: 55
diff changeset
   371
    if (mInfo && mInfo->AlldayCount()) {
hgs
parents: 55
diff changeset
   372
        layoutValues.eventAreaX = KCalenAllDayEventArea * contentWidth;
hgs
parents: 55
diff changeset
   373
    }
hgs
parents: 55
diff changeset
   374
    else {
hgs
parents: 55
diff changeset
   375
        layoutValues.eventAreaX = 0;
hgs
parents: 55
diff changeset
   376
    }
hgs
parents: 55
diff changeset
   377
hgs
parents: 55
diff changeset
   378
    // 2. event area width -> eventAreaWidth[out]
63
hgs
parents: 57
diff changeset
   379
    qreal emptyRightColumnWidth = KCalenEmptyRightColumnWidth
57
hgs
parents: 55
diff changeset
   380
        * layoutValues.unitInPixels;
hgs
parents: 55
diff changeset
   381
    layoutValues.eventAreaWidth = contentWidth - emptyRightColumnWidth
hgs
parents: 55
diff changeset
   382
        - layoutValues.eventAreaX;
hgs
parents: 55
diff changeset
   383
hgs
parents: 55
diff changeset
   384
    // 3. margins between the overlapping events -> eventMargin[out]
hgs
parents: 55
diff changeset
   385
    layoutValues.eventMargin = KCalenSpaceBeetwenEvents
hgs
parents: 55
diff changeset
   386
        * layoutValues.unitInPixels;
hgs
parents: 55
diff changeset
   387
hgs
parents: 55
diff changeset
   388
    // 4. half-hour slot'h height -> slotHeight[out]
hgs
parents: 55
diff changeset
   389
    layoutValues.slotHeight = CalenDayUtils::instance()->hourElementHeight()
hgs
parents: 55
diff changeset
   390
        / KCalenSlotsInHour;
hgs
parents: 55
diff changeset
   391
hgs
parents: 55
diff changeset
   392
    // check if we should create absorber over some overlapping region
hgs
parents: 55
diff changeset
   393
    layoutValues.maxColumns = layoutValues.eventAreaWidth
63
hgs
parents: 57
diff changeset
   394
        / ((KCalenMinTouchableEventWidth + KCalenSpaceBeetwenEvents)
hgs
parents: 57
diff changeset
   395
            * layoutValues.unitInPixels);
45
hgs
parents:
diff changeset
   396
}
hgs
parents:
diff changeset
   397
55
hgs
parents: 45
diff changeset
   398
hgs
parents: 45
diff changeset
   399
/*!
57
hgs
parents: 55
diff changeset
   400
 \brief Sets day's info structure to the container.
hgs
parents: 55
diff changeset
   401
 \a dayInfo day's info data
hgs
parents: 55
diff changeset
   402
hgs
parents: 55
diff changeset
   403
 \sa CalenDayInfo, CalenDayContainer::dayInfo
55
hgs
parents: 45
diff changeset
   404
 */
57
hgs
parents: 55
diff changeset
   405
void CalenDayContainer::setDayInfo(CalenDayInfo* dayInfo)
45
hgs
parents:
diff changeset
   406
{
hgs
parents:
diff changeset
   407
    mInfo = dayInfo;
hgs
parents:
diff changeset
   408
}
hgs
parents:
diff changeset
   409
57
hgs
parents: 55
diff changeset
   410
/*!
hgs
parents: 55
diff changeset
   411
 \brief It return pointer to info structure of container.
hgs
parents: 55
diff changeset
   412
 
hgs
parents: 55
diff changeset
   413
 \sa CalenDayInfo, CalenDayContainer::setDayInfo
hgs
parents: 55
diff changeset
   414
 */
hgs
parents: 55
diff changeset
   415
CalenDayInfo* CalenDayContainer::dayInfo()
hgs
parents: 55
diff changeset
   416
{
hgs
parents: 55
diff changeset
   417
    return mInfo;
hgs
parents: 55
diff changeset
   418
}
hgs
parents: 55
diff changeset
   419
hgs
parents: 55
diff changeset
   420
/*!
hgs
parents: 55
diff changeset
   421
 \brief Sets date to the container. 
hgs
parents: 55
diff changeset
   422
 Changes according to model which is connected to given view.
hgs
parents: 55
diff changeset
   423
 
hgs
parents: 55
diff changeset
   424
 \a date Date of container
hgs
parents: 55
diff changeset
   425
 */
55
hgs
parents: 45
diff changeset
   426
void CalenDayContainer::setDate(const QDate &date)
hgs
parents: 45
diff changeset
   427
{
hgs
parents: 45
diff changeset
   428
    mDate = date;
hgs
parents: 45
diff changeset
   429
}
hgs
parents: 45
diff changeset
   430
hgs
parents: 45
diff changeset
   431
// -----------------------------------------------------------------------------
hgs
parents: 45
diff changeset
   432
// date()
hgs
parents: 45
diff changeset
   433
// Returns date of the container.
hgs
parents: 45
diff changeset
   434
// -----------------------------------------------------------------------------
hgs
parents: 45
diff changeset
   435
//
57
hgs
parents: 55
diff changeset
   436
/*!
hgs
parents: 55
diff changeset
   437
 \brief Returns date of the container.
hgs
parents: 55
diff changeset
   438
 
hgs
parents: 55
diff changeset
   439
 \sa date Date of container
hgs
parents: 55
diff changeset
   440
 */
55
hgs
parents: 45
diff changeset
   441
const QDate &CalenDayContainer::date() const
hgs
parents: 45
diff changeset
   442
{
hgs
parents: 45
diff changeset
   443
    return mDate;
hgs
parents: 45
diff changeset
   444
}
hgs
parents: 45
diff changeset
   445
hgs
parents: 45
diff changeset
   446
/*!
57
hgs
parents: 55
diff changeset
   447
 \brief Slot handles layout switch.
hgs
parents: 55
diff changeset
   448
 \a orientation current device orientation
55
hgs
parents: 45
diff changeset
   449
 */
45
hgs
parents:
diff changeset
   450
void CalenDayContainer::orientationChanged(Qt::Orientation orientation)
hgs
parents:
diff changeset
   451
{
57
hgs
parents: 55
diff changeset
   452
    getTimedEventLayoutValues(mLayoutValues);
hgs
parents: 55
diff changeset
   453
45
hgs
parents:
diff changeset
   454
    Q_UNUSED( orientation )
hgs
parents:
diff changeset
   455
    QList<HbAbstractViewItem *> items = this->items();
hgs
parents:
diff changeset
   456
    int count(items.count());
hgs
parents:
diff changeset
   457
    for (int i = 0; i < count; i++) {
hgs
parents:
diff changeset
   458
        QModelIndex modelIndex = items[i]->modelIndex();
hgs
parents:
diff changeset
   459
        if (modelIndex.isValid()) {
hgs
parents:
diff changeset
   460
            QVariant variant = modelIndex.data(CalenDayEntry);
hgs
parents:
diff changeset
   461
            AgendaEntry entry = variant.value<AgendaEntry> ();
57
hgs
parents: 55
diff changeset
   462
            if (entry.isTimedEntry() && !CalenAgendaUtils::isAlldayEvent(entry)) {
45
hgs
parents:
diff changeset
   463
                updateTimedEventGeometry(items[i], modelIndex);
hgs
parents:
diff changeset
   464
            }
57
hgs
parents: 55
diff changeset
   465
            else
hgs
parents: 55
diff changeset
   466
                if (CalenAgendaUtils::isAlldayEvent(entry)) {
hgs
parents: 55
diff changeset
   467
                    updateAllDayEventGeometry(items[i], modelIndex);
hgs
parents: 55
diff changeset
   468
                }
45
hgs
parents:
diff changeset
   469
        }
hgs
parents:
diff changeset
   470
    }
57
hgs
parents: 55
diff changeset
   471
45
hgs
parents:
diff changeset
   472
    createTouchEventAbsorbers();
hgs
parents:
diff changeset
   473
}
hgs
parents:
diff changeset
   474
55
hgs
parents: 45
diff changeset
   475
hgs
parents: 45
diff changeset
   476
/*!
57
hgs
parents: 55
diff changeset
   477
 \brief Creates absorbers which prevent touching to small items
hgs
parents: 55
diff changeset
   478
 According to UI spec items smaller than 8.2 un are untouchable
55
hgs
parents: 45
diff changeset
   479
 */
45
hgs
parents:
diff changeset
   480
void CalenDayContainer::createTouchEventAbsorbers()
hgs
parents:
diff changeset
   481
{
57
hgs
parents: 55
diff changeset
   482
    // remove absorbers if exist
hgs
parents: 55
diff changeset
   483
    if (mAbsorbers.count()) {
hgs
parents: 55
diff changeset
   484
        qDeleteAll(mAbsorbers);
hgs
parents: 55
diff changeset
   485
        mAbsorbers.clear();
hgs
parents: 55
diff changeset
   486
    }
hgs
parents: 55
diff changeset
   487
hgs
parents: 55
diff changeset
   488
    // Create absorber for all-day events
hgs
parents: 55
diff changeset
   489
    Qt::Orientation orientation = CalenDayUtils::instance()->orientation();
hgs
parents: 55
diff changeset
   490
    int allDayCount = mInfo->AlldayCount();
hgs
parents: 55
diff changeset
   491
hgs
parents: 55
diff changeset
   492
    if ((orientation == Qt::Vertical 
hgs
parents: 55
diff changeset
   493
        && allDayCount > KCalenTouchableAllDayEventsCountPortrait) 
hgs
parents: 55
diff changeset
   494
        || (orientation == Qt::Horizontal
hgs
parents: 55
diff changeset
   495
        && allDayCount > KCalenTouchableAllDayEventsCountLandscape)) {
hgs
parents: 55
diff changeset
   496
        TouchEventAbsorber* absorber = crateAbsorberBetweenSlots(0, 0, true);
hgs
parents: 55
diff changeset
   497
        mAbsorbers.append(absorber);
hgs
parents: 55
diff changeset
   498
    }
hgs
parents: 55
diff changeset
   499
hgs
parents: 55
diff changeset
   500
    // Create absorbers for timed events
hgs
parents: 55
diff changeset
   501
    const QList<CalenTimeRegion>& regionList = mInfo->RegionList();
hgs
parents: 55
diff changeset
   502
    for (int i = 0; i < regionList.count(); i++) {
hgs
parents: 55
diff changeset
   503
        if (regionList[i].iColumns.count() > mLayoutValues.maxColumns) {
hgs
parents: 55
diff changeset
   504
            TouchEventAbsorber* absorber = crateAbsorberBetweenSlots(
hgs
parents: 55
diff changeset
   505
                regionList[i].iStartSlot, regionList[i].iEndSlot, false);
hgs
parents: 55
diff changeset
   506
hgs
parents: 55
diff changeset
   507
            mAbsorbers.append(absorber);
hgs
parents: 55
diff changeset
   508
        }
hgs
parents: 55
diff changeset
   509
    }
45
hgs
parents:
diff changeset
   510
}
hgs
parents:
diff changeset
   511
55
hgs
parents: 45
diff changeset
   512
hgs
parents: 45
diff changeset
   513
/*!
57
hgs
parents: 55
diff changeset
   514
 \brief Creates single absorber in given location
hgs
parents: 55
diff changeset
   515
 \a startSlot absorber area starts from there
hgs
parents: 55
diff changeset
   516
 \a endSlot absobrber area ends here
hgs
parents: 55
diff changeset
   517
 \a forAllDayEvents if true absorber in all-day events area is created
55
hgs
parents: 45
diff changeset
   518
 */
57
hgs
parents: 55
diff changeset
   519
TouchEventAbsorber *CalenDayContainer::crateAbsorberBetweenSlots(
hgs
parents: 55
diff changeset
   520
    int startSlot,
hgs
parents: 55
diff changeset
   521
    int endSlot,
hgs
parents: 55
diff changeset
   522
    bool forAllDayEvents)
45
hgs
parents:
diff changeset
   523
{
hgs
parents:
diff changeset
   524
    TouchEventAbsorber *absorber = new TouchEventAbsorber(this);
hgs
parents:
diff changeset
   525
    absorber->setZValue(1000);
hgs
parents:
diff changeset
   526
    absorber->setVisible(true);
57
hgs
parents: 55
diff changeset
   527
    if (!forAllDayEvents) {
hgs
parents: 55
diff changeset
   528
        absorber->setGeometry(mLayoutValues.eventAreaX, // x
hgs
parents: 55
diff changeset
   529
            startSlot * mLayoutValues.slotHeight, // y
hgs
parents: 55
diff changeset
   530
            mLayoutValues.eventAreaWidth, // w
hgs
parents: 55
diff changeset
   531
            (endSlot - startSlot) * mLayoutValues.slotHeight); // h
hgs
parents: 55
diff changeset
   532
    }
hgs
parents: 55
diff changeset
   533
    else {
hgs
parents: 55
diff changeset
   534
        absorber->setGeometry(0, 0, mLayoutValues.eventAreaX,
hgs
parents: 55
diff changeset
   535
            KCalenHoursInDay * KCalenSlotsInHour * mLayoutValues.slotHeight);
hgs
parents: 55
diff changeset
   536
    }
hgs
parents: 55
diff changeset
   537
45
hgs
parents:
diff changeset
   538
    return absorber;
hgs
parents:
diff changeset
   539
}
hgs
parents:
diff changeset
   540
hgs
parents:
diff changeset
   541
55
hgs
parents: 45
diff changeset
   542
/*!
57
hgs
parents: 55
diff changeset
   543
 \brief Handles tap event on overlapping area
hgs
parents: 55
diff changeset
   544
 Currently it leads to Agenda View -  as described in UI spec
hgs
parents: 55
diff changeset
   545
 \a event qt gesture event
55
hgs
parents: 45
diff changeset
   546
 */
45
hgs
parents:
diff changeset
   547
void TouchEventAbsorber::gestureEvent(QGestureEvent *event)
hgs
parents:
diff changeset
   548
{
hgs
parents:
diff changeset
   549
    QTapGesture *tapGesture = qobject_cast<QTapGesture*> (event->gesture(
hgs
parents:
diff changeset
   550
        Qt::TapGesture));
hgs
parents:
diff changeset
   551
    
57
hgs
parents: 55
diff changeset
   552
    if (tapGesture && tapGesture->state() == Qt::GestureFinished) {
45
hgs
parents:
diff changeset
   553
    	CalenDayView* dayView = static_cast<CalenDayView*>
hgs
parents:
diff changeset
   554
                (CalenDayUtils::instance()->mainWindow()->currentView());
hgs
parents:
diff changeset
   555
    	
hgs
parents:
diff changeset
   556
    	dayView->changeView(ECalenAgendaView);
57
hgs
parents: 55
diff changeset
   557
    }
45
hgs
parents:
diff changeset
   558
}
hgs
parents:
diff changeset
   559
55
hgs
parents: 45
diff changeset
   560
/*!
57
hgs
parents: 55
diff changeset
   561
 \brief Constructor
55
hgs
parents: 45
diff changeset
   562
 */
57
hgs
parents: 55
diff changeset
   563
TouchEventAbsorber::TouchEventAbsorber(QGraphicsItem *parent) :
hgs
parents: 55
diff changeset
   564
    HbWidget(parent)
45
hgs
parents:
diff changeset
   565
{
hgs
parents:
diff changeset
   566
#ifdef _DEBUG
hgs
parents:
diff changeset
   567
    setFlag(QGraphicsItem::ItemHasNoContents, false);
hgs
parents:
diff changeset
   568
#endif	
57
hgs
parents: 55
diff changeset
   569
    grabGesture(Qt::TapGesture);
45
hgs
parents:
diff changeset
   570
}
hgs
parents:
diff changeset
   571
55
hgs
parents: 45
diff changeset
   572
hgs
parents: 45
diff changeset
   573
/*!
hgs
parents: 45
diff changeset
   574
 \brief Destructor
hgs
parents: 45
diff changeset
   575
 
hgs
parents: 45
diff changeset
   576
 Sets container initial geometry, creates hours area widgets.
hgs
parents: 45
diff changeset
   577
 */
45
hgs
parents:
diff changeset
   578
TouchEventAbsorber::~TouchEventAbsorber()
hgs
parents:
diff changeset
   579
{
55
hgs
parents: 45
diff changeset
   580
45
hgs
parents:
diff changeset
   581
}
hgs
parents:
diff changeset
   582
55
hgs
parents: 45
diff changeset
   583
hgs
parents: 45
diff changeset
   584
/*!
57
hgs
parents: 55
diff changeset
   585
 \brief Used for debugging purposes to see absorbers areas
hgs
parents: 55
diff changeset
   586
 Not active in release builds!
55
hgs
parents: 45
diff changeset
   587
 
hgs
parents: 45
diff changeset
   588
 */
45
hgs
parents:
diff changeset
   589
#ifdef _DEBUG
57
hgs
parents: 55
diff changeset
   590
void TouchEventAbsorber::paint(
hgs
parents: 55
diff changeset
   591
    QPainter *painter,
hgs
parents: 55
diff changeset
   592
    const QStyleOptionGraphicsItem *option,
hgs
parents: 55
diff changeset
   593
    QWidget *widget)
45
hgs
parents:
diff changeset
   594
{
57
hgs
parents: 55
diff changeset
   595
    Q_UNUSED(option)
hgs
parents: 55
diff changeset
   596
    Q_UNUSED(widget)
hgs
parents: 55
diff changeset
   597
hgs
parents: 55
diff changeset
   598
    painter->save();
hgs
parents: 55
diff changeset
   599
    QPen pen;
hgs
parents: 55
diff changeset
   600
    pen.setWidth(2);
hgs
parents: 55
diff changeset
   601
    pen.setColor(Qt::red);
hgs
parents: 55
diff changeset
   602
    painter->setPen(pen);
hgs
parents: 55
diff changeset
   603
    painter->drawRect(boundingRect());
hgs
parents: 55
diff changeset
   604
    painter->restore();
45
hgs
parents:
diff changeset
   605
}
hgs
parents:
diff changeset
   606
#endif
hgs
parents:
diff changeset
   607
// End of File