calendarui/views/dayview/src/calendaycontentwidget.cpp
author hgs
Wed, 25 Aug 2010 14:02:13 +0530
changeset 63 a3cb48f6c889
parent 45 b6db4fd4947b
child 75 7ac58b2aae6f
permissions -rw-r--r--
201033
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
45
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
 * All rights reserved.
hgs
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
 * under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
 *
hgs
parents:
diff changeset
     9
 * Initial Contributors:
hgs
parents:
diff changeset
    10
 * Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
 *
hgs
parents:
diff changeset
    12
 * Contributors:
hgs
parents:
diff changeset
    13
 *
hgs
parents:
diff changeset
    14
 * Description:  CalenDayContentWidget implementation.
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
 */
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
// System includes
hgs
parents:
diff changeset
    19
#include <QGraphicsLinearLayout>
63
hgs
parents: 45
diff changeset
    20
#include <HbModelIterator>
45
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
// User includes
hgs
parents:
diff changeset
    23
#include "calendaymodelmanager.h"
hgs
parents:
diff changeset
    24
#include "calendaycontentwidget.h"
hgs
parents:
diff changeset
    25
#include "calendayitemview.h"
hgs
parents:
diff changeset
    26
#include "calendaycontentscrollarea.h"
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
/*!
hgs
parents:
diff changeset
    29
 \class CalenDayContentWidget
hgs
parents:
diff changeset
    30
 \brief Content widget is a container class for horizontal layouted widgets.
hgs
parents:
diff changeset
    31
 */
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
/*!
hgs
parents:
diff changeset
    34
 \brief Constructor
hgs
parents:
diff changeset
    35
 
63
hgs
parents: 45
diff changeset
    36
 \param modelManager Day View model manager
45
hgs
parents:
diff changeset
    37
 \param parent The parent of central widget
hgs
parents:
diff changeset
    38
 */
hgs
parents:
diff changeset
    39
CalenDayContentWidget::CalenDayContentWidget(
hgs
parents:
diff changeset
    40
    CalenDayModelManager &modelManager,
hgs
parents:
diff changeset
    41
    QGraphicsItem *parent) :
hgs
parents:
diff changeset
    42
    HbWidget(parent), mLayout(NULL), mModelManager(modelManager)
hgs
parents:
diff changeset
    43
{
hgs
parents:
diff changeset
    44
    mWidgets.clear();
63
hgs
parents: 45
diff changeset
    45
    initializeViews();
45
hgs
parents:
diff changeset
    46
}
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
/*!
hgs
parents:
diff changeset
    49
 \brief Destructor
hgs
parents:
diff changeset
    50
 */
hgs
parents:
diff changeset
    51
CalenDayContentWidget::~CalenDayContentWidget()
hgs
parents:
diff changeset
    52
{
hgs
parents:
diff changeset
    53
    // Just clear widget list - parent object will destroy its children
hgs
parents:
diff changeset
    54
    mWidgets.clear();
hgs
parents:
diff changeset
    55
}
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
/*!
hgs
parents:
diff changeset
    58
 \brief Adds the widget to central widget and layouts it horizontally.
hgs
parents:
diff changeset
    59
 
hgs
parents:
diff changeset
    60
 Ownership of item is passed to CalenDayContentWidget.
hgs
parents:
diff changeset
    61
 
hgs
parents:
diff changeset
    62
 \param item Widget to be added
hgs
parents:
diff changeset
    63
 \param where Place where widget should be added (as first/last item)
hgs
parents:
diff changeset
    64
 */
hgs
parents:
diff changeset
    65
void CalenDayContentWidget::add(HbWidget* item, CalenWidgetPosition where)
hgs
parents:
diff changeset
    66
{
hgs
parents:
diff changeset
    67
    // Create linear, horizontal layout if not exist
hgs
parents:
diff changeset
    68
    if (!mLayout) {
hgs
parents:
diff changeset
    69
        mLayout = new QGraphicsLinearLayout(Qt::Horizontal, NULL);
hgs
parents:
diff changeset
    70
        mLayout->setContentsMargins(0.0, 0.0, 0.0, 0.0);
hgs
parents:
diff changeset
    71
        mLayout->setSpacing(0.0);
hgs
parents:
diff changeset
    72
    }
hgs
parents:
diff changeset
    73
hgs
parents:
diff changeset
    74
    switch (where) {
hgs
parents:
diff changeset
    75
        case ECalenFirstWidget: {
hgs
parents:
diff changeset
    76
            mLayout->insertItem(0, item);
hgs
parents:
diff changeset
    77
            mWidgets.insert(0, item);
hgs
parents:
diff changeset
    78
            break;
hgs
parents:
diff changeset
    79
        }
hgs
parents:
diff changeset
    80
        case ECalenLastWidget:
hgs
parents:
diff changeset
    81
        default: {
hgs
parents:
diff changeset
    82
            mLayout->addItem(item);
hgs
parents:
diff changeset
    83
            mWidgets.append(item);
hgs
parents:
diff changeset
    84
        }
hgs
parents:
diff changeset
    85
    }
hgs
parents:
diff changeset
    86
hgs
parents:
diff changeset
    87
    // If layout has no parent - apply it to central widget
hgs
parents:
diff changeset
    88
    if (mLayout && !mLayout->parentLayoutItem()) {
hgs
parents:
diff changeset
    89
        setLayout(mLayout);
hgs
parents:
diff changeset
    90
    }
hgs
parents:
diff changeset
    91
}
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
/*!
hgs
parents:
diff changeset
    94
 \brief Takes the widget and removes it from central widget.
hgs
parents:
diff changeset
    95
 
hgs
parents:
diff changeset
    96
 Ownership of item is passed to caller.
hgs
parents:
diff changeset
    97
 
hgs
parents:
diff changeset
    98
 \param which Indicates which widget should be taken (first/last)
hgs
parents:
diff changeset
    99
 \return Pointer to HbWidget or NULL if widget was not found
hgs
parents:
diff changeset
   100
 */
hgs
parents:
diff changeset
   101
HbWidget* CalenDayContentWidget::take(CalenWidgetPosition which)
hgs
parents:
diff changeset
   102
{
hgs
parents:
diff changeset
   103
    Q_ASSERT(mLayout);
hgs
parents:
diff changeset
   104
hgs
parents:
diff changeset
   105
    HbWidget* itemToTake = NULL;
hgs
parents:
diff changeset
   106
    switch (which) {
hgs
parents:
diff changeset
   107
        case ECalenFirstWidget: {
hgs
parents:
diff changeset
   108
            itemToTake = mWidgets.takeFirst();
hgs
parents:
diff changeset
   109
            break;
hgs
parents:
diff changeset
   110
        }
hgs
parents:
diff changeset
   111
        case ECalenLastWidget:
hgs
parents:
diff changeset
   112
        default: {
hgs
parents:
diff changeset
   113
            itemToTake = mWidgets.takeLast();
hgs
parents:
diff changeset
   114
        }
hgs
parents:
diff changeset
   115
    }
hgs
parents:
diff changeset
   116
hgs
parents:
diff changeset
   117
    if (itemToTake) {
hgs
parents:
diff changeset
   118
        mLayout->removeItem(itemToTake);
hgs
parents:
diff changeset
   119
    }
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
    return itemToTake;
hgs
parents:
diff changeset
   122
}
hgs
parents:
diff changeset
   123
hgs
parents:
diff changeset
   124
/*!
hgs
parents:
diff changeset
   125
 \brief Removed the widget from central widget.
hgs
parents:
diff changeset
   126
 
hgs
parents:
diff changeset
   127
 Widget is removed and deleted.
hgs
parents:
diff changeset
   128
 
hgs
parents:
diff changeset
   129
 \param which Indicates which widget should be removed (first/last)
hgs
parents:
diff changeset
   130
 */
hgs
parents:
diff changeset
   131
void CalenDayContentWidget::remove(CalenWidgetPosition which)
hgs
parents:
diff changeset
   132
{
hgs
parents:
diff changeset
   133
    Q_ASSERT(mLayout);
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
    HbWidget* itemToRemove = NULL;
hgs
parents:
diff changeset
   136
    switch (which) {
hgs
parents:
diff changeset
   137
        case ECalenFirstWidget: {
hgs
parents:
diff changeset
   138
            itemToRemove = mWidgets.takeFirst();
hgs
parents:
diff changeset
   139
            break;
hgs
parents:
diff changeset
   140
        }
hgs
parents:
diff changeset
   141
        case ECalenLastWidget:
hgs
parents:
diff changeset
   142
        default: {
hgs
parents:
diff changeset
   143
            itemToRemove = mWidgets.takeLast();
hgs
parents:
diff changeset
   144
        }
hgs
parents:
diff changeset
   145
    }
hgs
parents:
diff changeset
   146
hgs
parents:
diff changeset
   147
    if (itemToRemove) {
hgs
parents:
diff changeset
   148
        mLayout->removeItem(itemToRemove);
hgs
parents:
diff changeset
   149
        delete itemToRemove;
hgs
parents:
diff changeset
   150
    }
hgs
parents:
diff changeset
   151
}
hgs
parents:
diff changeset
   152
hgs
parents:
diff changeset
   153
/*!
hgs
parents:
diff changeset
   154
 \brief Performs relayout of widgets when it is needed.
hgs
parents:
diff changeset
   155
 
hgs
parents:
diff changeset
   156
 Relayout is done depending on last scroll move:
hgs
parents:
diff changeset
   157
 - if widget was scrolled to next: first widget is taken and added as last
hgs
parents:
diff changeset
   158
 - if widget was scrolled to prev: last widget is taken and inserted as first
hgs
parents:
diff changeset
   159
 
hgs
parents:
diff changeset
   160
 Emits widgetsRelayoutFinished SIGNAL when relayout is over.
hgs
parents:
diff changeset
   161
 
hgs
parents:
diff changeset
   162
 \param scrollTo Direction of last movement
hgs
parents:
diff changeset
   163
 */
hgs
parents:
diff changeset
   164
void CalenDayContentWidget::relayoutWidgets(CalenScrollDirection scrollTo)
hgs
parents:
diff changeset
   165
{
hgs
parents:
diff changeset
   166
    HbWidget* widget = NULL;
hgs
parents:
diff changeset
   167
    switch (scrollTo) {
hgs
parents:
diff changeset
   168
        case ECalenScrollToNext: {
hgs
parents:
diff changeset
   169
            widget = take(ECalenFirstWidget);
hgs
parents:
diff changeset
   170
            add(widget, ECalenLastWidget);
hgs
parents:
diff changeset
   171
            break;
hgs
parents:
diff changeset
   172
        }
hgs
parents:
diff changeset
   173
        case ECalenScrollToPrev:
hgs
parents:
diff changeset
   174
        default: {
hgs
parents:
diff changeset
   175
            widget = take(ECalenLastWidget);
hgs
parents:
diff changeset
   176
            add(widget, ECalenFirstWidget);
hgs
parents:
diff changeset
   177
        }
hgs
parents:
diff changeset
   178
    }
hgs
parents:
diff changeset
   179
    emit widgetsRelayoutFinished(scrollTo);
hgs
parents:
diff changeset
   180
}
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
/*!
hgs
parents:
diff changeset
   183
 \brief SLOT handles simultanous vertical scrolling of owned widgets.
hgs
parents:
diff changeset
   184
 
hgs
parents:
diff changeset
   185
 \param newPos New scroll position
hgs
parents:
diff changeset
   186
 */
hgs
parents:
diff changeset
   187
void CalenDayContentWidget::widgetScrolled(const QPointF &newPos)
hgs
parents:
diff changeset
   188
{
hgs
parents:
diff changeset
   189
    for (int i = 0; i < mWidgets.count(); i++) {
hgs
parents:
diff changeset
   190
        CalenDayItemView *view =
hgs
parents:
diff changeset
   191
            static_cast<CalenDayItemView *> (mWidgets[i]);
hgs
parents:
diff changeset
   192
        view->scrollVertically(newPos);
hgs
parents:
diff changeset
   193
    }
hgs
parents:
diff changeset
   194
    emit scrollPositionChanged(newPos);
hgs
parents:
diff changeset
   195
}
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
/*!
hgs
parents:
diff changeset
   198
 \brief Initializes content widgets and adds them to layout.
hgs
parents:
diff changeset
   199
 
hgs
parents:
diff changeset
   200
 \param parent Parent object 
hgs
parents:
diff changeset
   201
 */
63
hgs
parents: 45
diff changeset
   202
void CalenDayContentWidget::initializeViews()
45
hgs
parents:
diff changeset
   203
{
hgs
parents:
diff changeset
   204
    // Create item views
hgs
parents:
diff changeset
   205
    HbModelIterator *iterator(0);
hgs
parents:
diff changeset
   206
hgs
parents:
diff changeset
   207
    iterator = new HbModelIterator(&mModelManager.getModel(
hgs
parents:
diff changeset
   208
        CalenDayModelManager::PreviousDay));
hgs
parents:
diff changeset
   209
    CalenDayItemView *prevItemView = new CalenDayItemView(
hgs
parents:
diff changeset
   210
        mModelManager.getServices(), iterator, 0);
hgs
parents:
diff changeset
   211
hgs
parents:
diff changeset
   212
    iterator = new HbModelIterator(&mModelManager.getModel(
hgs
parents:
diff changeset
   213
        CalenDayModelManager::CurrentDay));
hgs
parents:
diff changeset
   214
    CalenDayItemView *currItemView = new CalenDayItemView(
hgs
parents:
diff changeset
   215
        mModelManager.getServices(), iterator, 0);
hgs
parents:
diff changeset
   216
hgs
parents:
diff changeset
   217
    iterator = new HbModelIterator(&mModelManager.getModel(
hgs
parents:
diff changeset
   218
        CalenDayModelManager::NextDay));
hgs
parents:
diff changeset
   219
    CalenDayItemView *nextItemView = new CalenDayItemView(
hgs
parents:
diff changeset
   220
        mModelManager.getServices(), iterator, 0);
hgs
parents:
diff changeset
   221
hgs
parents:
diff changeset
   222
    // Connecting views with widgetScrolled SLOT 
hgs
parents:
diff changeset
   223
    // to support simultanous vertical scrolling
hgs
parents:
diff changeset
   224
    connect(prevItemView, SIGNAL(scrollPositionChanged(const QPointF&)), this,
hgs
parents:
diff changeset
   225
        SLOT(widgetScrolled(const QPointF&)));
hgs
parents:
diff changeset
   226
    connect(currItemView, SIGNAL(scrollPositionChanged(const QPointF&)), this,
hgs
parents:
diff changeset
   227
        SLOT(widgetScrolled(const QPointF&)));
hgs
parents:
diff changeset
   228
    connect(nextItemView, SIGNAL(scrollPositionChanged(const QPointF&)), this,
hgs
parents:
diff changeset
   229
        SLOT(widgetScrolled(const QPointF&)));
hgs
parents:
diff changeset
   230
63
hgs
parents: 45
diff changeset
   231
    if (parentItem()) {
hgs
parents: 45
diff changeset
   232
        // Install event filters to receive events necessary for gesture handling
hgs
parents: 45
diff changeset
   233
        CalenDayContentScrollArea* scrollArea =
hgs
parents: 45
diff changeset
   234
            static_cast<CalenDayContentScrollArea*> (parentItem());
hgs
parents: 45
diff changeset
   235
        prevItemView->installEventFilter(scrollArea);
hgs
parents: 45
diff changeset
   236
        currItemView->installEventFilter(scrollArea);
hgs
parents: 45
diff changeset
   237
        nextItemView->installEventFilter(scrollArea);
hgs
parents: 45
diff changeset
   238
    }
45
hgs
parents:
diff changeset
   239
hgs
parents:
diff changeset
   240
    // Add views to layout
hgs
parents:
diff changeset
   241
    add(prevItemView);
hgs
parents:
diff changeset
   242
    add(currItemView);
hgs
parents:
diff changeset
   243
    add(nextItemView);
hgs
parents:
diff changeset
   244
}
hgs
parents:
diff changeset
   245
hgs
parents:
diff changeset
   246
// End of File