calendarui/views/dayview/src/calendaycontentwidget.cpp
author hgs
Mon, 28 Jun 2010 15:22:02 +0530
changeset 45 b6db4fd4947b
child 63 a3cb48f6c889
permissions -rw-r--r--
201025
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>
hgs
parents:
diff changeset
    20
#include <hbmodeliterator.h>
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
 
hgs
parents:
diff changeset
    36
 \param parent The parent of central widget
hgs
parents:
diff changeset
    37
 */
hgs
parents:
diff changeset
    38
CalenDayContentWidget::CalenDayContentWidget(
hgs
parents:
diff changeset
    39
    CalenDayModelManager &modelManager,
hgs
parents:
diff changeset
    40
    QGraphicsItem *parent) :
hgs
parents:
diff changeset
    41
    HbWidget(parent), mLayout(NULL), mModelManager(modelManager)
hgs
parents:
diff changeset
    42
{
hgs
parents:
diff changeset
    43
    mWidgets.clear();
hgs
parents:
diff changeset
    44
    initializeViews(parent);
hgs
parents:
diff changeset
    45
}
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
/*!
hgs
parents:
diff changeset
    48
 \brief Destructor
hgs
parents:
diff changeset
    49
 */
hgs
parents:
diff changeset
    50
CalenDayContentWidget::~CalenDayContentWidget()
hgs
parents:
diff changeset
    51
{
hgs
parents:
diff changeset
    52
    // Just clear widget list - parent object will destroy its children
hgs
parents:
diff changeset
    53
    mWidgets.clear();
hgs
parents:
diff changeset
    54
}
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
/*!
hgs
parents:
diff changeset
    57
 \brief Adds the widget to central widget and layouts it horizontally.
hgs
parents:
diff changeset
    58
 
hgs
parents:
diff changeset
    59
 Ownership of item is passed to CalenDayContentWidget.
hgs
parents:
diff changeset
    60
 
hgs
parents:
diff changeset
    61
 \param item Widget to be added
hgs
parents:
diff changeset
    62
 \param where Place where widget should be added (as first/last item)
hgs
parents:
diff changeset
    63
 */
hgs
parents:
diff changeset
    64
void CalenDayContentWidget::add(HbWidget* item, CalenWidgetPosition where)
hgs
parents:
diff changeset
    65
{
hgs
parents:
diff changeset
    66
    // Create linear, horizontal layout if not exist
hgs
parents:
diff changeset
    67
    if (!mLayout) {
hgs
parents:
diff changeset
    68
        mLayout = new QGraphicsLinearLayout(Qt::Horizontal, NULL);
hgs
parents:
diff changeset
    69
        mLayout->setContentsMargins(0.0, 0.0, 0.0, 0.0);
hgs
parents:
diff changeset
    70
        mLayout->setSpacing(0.0);
hgs
parents:
diff changeset
    71
    }
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
    switch (where) {
hgs
parents:
diff changeset
    74
        case ECalenFirstWidget: {
hgs
parents:
diff changeset
    75
            mLayout->insertItem(0, item);
hgs
parents:
diff changeset
    76
            mWidgets.insert(0, item);
hgs
parents:
diff changeset
    77
            break;
hgs
parents:
diff changeset
    78
        }
hgs
parents:
diff changeset
    79
        case ECalenLastWidget:
hgs
parents:
diff changeset
    80
        default: {
hgs
parents:
diff changeset
    81
            mLayout->addItem(item);
hgs
parents:
diff changeset
    82
            mWidgets.append(item);
hgs
parents:
diff changeset
    83
        }
hgs
parents:
diff changeset
    84
    }
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
    // If layout has no parent - apply it to central widget
hgs
parents:
diff changeset
    87
    if (mLayout && !mLayout->parentLayoutItem()) {
hgs
parents:
diff changeset
    88
        setLayout(mLayout);
hgs
parents:
diff changeset
    89
    }
hgs
parents:
diff changeset
    90
}
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
/*!
hgs
parents:
diff changeset
    93
 \brief Takes the widget and removes it from central widget.
hgs
parents:
diff changeset
    94
 
hgs
parents:
diff changeset
    95
 Ownership of item is passed to caller.
hgs
parents:
diff changeset
    96
 
hgs
parents:
diff changeset
    97
 \param which Indicates which widget should be taken (first/last)
hgs
parents:
diff changeset
    98
 \return Pointer to HbWidget or NULL if widget was not found
hgs
parents:
diff changeset
    99
 */
hgs
parents:
diff changeset
   100
HbWidget* CalenDayContentWidget::take(CalenWidgetPosition which)
hgs
parents:
diff changeset
   101
{
hgs
parents:
diff changeset
   102
    Q_ASSERT(mLayout);
hgs
parents:
diff changeset
   103
hgs
parents:
diff changeset
   104
    HbWidget* itemToTake = NULL;
hgs
parents:
diff changeset
   105
    switch (which) {
hgs
parents:
diff changeset
   106
        case ECalenFirstWidget: {
hgs
parents:
diff changeset
   107
            itemToTake = mWidgets.takeFirst();
hgs
parents:
diff changeset
   108
            break;
hgs
parents:
diff changeset
   109
        }
hgs
parents:
diff changeset
   110
        case ECalenLastWidget:
hgs
parents:
diff changeset
   111
        default: {
hgs
parents:
diff changeset
   112
            itemToTake = mWidgets.takeLast();
hgs
parents:
diff changeset
   113
        }
hgs
parents:
diff changeset
   114
    }
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
    if (itemToTake) {
hgs
parents:
diff changeset
   117
        mLayout->removeItem(itemToTake);
hgs
parents:
diff changeset
   118
    }
hgs
parents:
diff changeset
   119
hgs
parents:
diff changeset
   120
    return itemToTake;
hgs
parents:
diff changeset
   121
}
hgs
parents:
diff changeset
   122
hgs
parents:
diff changeset
   123
/*!
hgs
parents:
diff changeset
   124
 \brief Removed the widget from central widget.
hgs
parents:
diff changeset
   125
 
hgs
parents:
diff changeset
   126
 Widget is removed and deleted.
hgs
parents:
diff changeset
   127
 
hgs
parents:
diff changeset
   128
 \param which Indicates which widget should be removed (first/last)
hgs
parents:
diff changeset
   129
 */
hgs
parents:
diff changeset
   130
void CalenDayContentWidget::remove(CalenWidgetPosition which)
hgs
parents:
diff changeset
   131
{
hgs
parents:
diff changeset
   132
    Q_ASSERT(mLayout);
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
    HbWidget* itemToRemove = NULL;
hgs
parents:
diff changeset
   135
    switch (which) {
hgs
parents:
diff changeset
   136
        case ECalenFirstWidget: {
hgs
parents:
diff changeset
   137
            itemToRemove = mWidgets.takeFirst();
hgs
parents:
diff changeset
   138
            break;
hgs
parents:
diff changeset
   139
        }
hgs
parents:
diff changeset
   140
        case ECalenLastWidget:
hgs
parents:
diff changeset
   141
        default: {
hgs
parents:
diff changeset
   142
            itemToRemove = mWidgets.takeLast();
hgs
parents:
diff changeset
   143
        }
hgs
parents:
diff changeset
   144
    }
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
    if (itemToRemove) {
hgs
parents:
diff changeset
   147
        mLayout->removeItem(itemToRemove);
hgs
parents:
diff changeset
   148
        delete itemToRemove;
hgs
parents:
diff changeset
   149
    }
hgs
parents:
diff changeset
   150
}
hgs
parents:
diff changeset
   151
hgs
parents:
diff changeset
   152
/*!
hgs
parents:
diff changeset
   153
 \brief Performs relayout of widgets when it is needed.
hgs
parents:
diff changeset
   154
 
hgs
parents:
diff changeset
   155
 Relayout is done depending on last scroll move:
hgs
parents:
diff changeset
   156
 - if widget was scrolled to next: first widget is taken and added as last
hgs
parents:
diff changeset
   157
 - if widget was scrolled to prev: last widget is taken and inserted as first
hgs
parents:
diff changeset
   158
 
hgs
parents:
diff changeset
   159
 Emits widgetsRelayoutFinished SIGNAL when relayout is over.
hgs
parents:
diff changeset
   160
 
hgs
parents:
diff changeset
   161
 \param scrollTo Direction of last movement
hgs
parents:
diff changeset
   162
 */
hgs
parents:
diff changeset
   163
void CalenDayContentWidget::relayoutWidgets(CalenScrollDirection scrollTo)
hgs
parents:
diff changeset
   164
{
hgs
parents:
diff changeset
   165
    HbWidget* widget = NULL;
hgs
parents:
diff changeset
   166
    switch (scrollTo) {
hgs
parents:
diff changeset
   167
        case ECalenScrollToNext: {
hgs
parents:
diff changeset
   168
            widget = take(ECalenFirstWidget);
hgs
parents:
diff changeset
   169
            add(widget, ECalenLastWidget);
hgs
parents:
diff changeset
   170
            break;
hgs
parents:
diff changeset
   171
        }
hgs
parents:
diff changeset
   172
        case ECalenScrollToPrev:
hgs
parents:
diff changeset
   173
        default: {
hgs
parents:
diff changeset
   174
            widget = take(ECalenLastWidget);
hgs
parents:
diff changeset
   175
            add(widget, ECalenFirstWidget);
hgs
parents:
diff changeset
   176
        }
hgs
parents:
diff changeset
   177
    }
hgs
parents:
diff changeset
   178
    emit widgetsRelayoutFinished(scrollTo);
hgs
parents:
diff changeset
   179
}
hgs
parents:
diff changeset
   180
hgs
parents:
diff changeset
   181
/*!
hgs
parents:
diff changeset
   182
 \brief SLOT handles simultanous vertical scrolling of owned widgets.
hgs
parents:
diff changeset
   183
 
hgs
parents:
diff changeset
   184
 \param newPos New scroll position
hgs
parents:
diff changeset
   185
 */
hgs
parents:
diff changeset
   186
void CalenDayContentWidget::widgetScrolled(const QPointF &newPos)
hgs
parents:
diff changeset
   187
{
hgs
parents:
diff changeset
   188
    for (int i = 0; i < mWidgets.count(); i++) {
hgs
parents:
diff changeset
   189
        CalenDayItemView *view =
hgs
parents:
diff changeset
   190
            static_cast<CalenDayItemView *> (mWidgets[i]);
hgs
parents:
diff changeset
   191
        view->scrollVertically(newPos);
hgs
parents:
diff changeset
   192
    }
hgs
parents:
diff changeset
   193
    emit scrollPositionChanged(newPos);
hgs
parents:
diff changeset
   194
}
hgs
parents:
diff changeset
   195
hgs
parents:
diff changeset
   196
/*!
hgs
parents:
diff changeset
   197
 \brief Initializes content widgets and adds them to layout.
hgs
parents:
diff changeset
   198
 
hgs
parents:
diff changeset
   199
 \param parent Parent object 
hgs
parents:
diff changeset
   200
 */
hgs
parents:
diff changeset
   201
void CalenDayContentWidget::initializeViews(QGraphicsItem *parent)
hgs
parents:
diff changeset
   202
{
hgs
parents:
diff changeset
   203
    // Create item views
hgs
parents:
diff changeset
   204
    HbModelIterator *iterator(0);
hgs
parents:
diff changeset
   205
hgs
parents:
diff changeset
   206
    iterator = new HbModelIterator(&mModelManager.getModel(
hgs
parents:
diff changeset
   207
        CalenDayModelManager::PreviousDay));
hgs
parents:
diff changeset
   208
    CalenDayItemView *prevItemView = new CalenDayItemView(
hgs
parents:
diff changeset
   209
        mModelManager.getServices(), iterator, 0);
hgs
parents:
diff changeset
   210
hgs
parents:
diff changeset
   211
    iterator = new HbModelIterator(&mModelManager.getModel(
hgs
parents:
diff changeset
   212
        CalenDayModelManager::CurrentDay));
hgs
parents:
diff changeset
   213
    CalenDayItemView *currItemView = new CalenDayItemView(
hgs
parents:
diff changeset
   214
        mModelManager.getServices(), iterator, 0);
hgs
parents:
diff changeset
   215
hgs
parents:
diff changeset
   216
    iterator = new HbModelIterator(&mModelManager.getModel(
hgs
parents:
diff changeset
   217
        CalenDayModelManager::NextDay));
hgs
parents:
diff changeset
   218
    CalenDayItemView *nextItemView = new CalenDayItemView(
hgs
parents:
diff changeset
   219
        mModelManager.getServices(), iterator, 0);
hgs
parents:
diff changeset
   220
hgs
parents:
diff changeset
   221
    // Connecting views with widgetScrolled SLOT 
hgs
parents:
diff changeset
   222
    // to support simultanous vertical scrolling
hgs
parents:
diff changeset
   223
    connect(prevItemView, SIGNAL(scrollPositionChanged(const QPointF&)), this,
hgs
parents:
diff changeset
   224
        SLOT(widgetScrolled(const QPointF&)));
hgs
parents:
diff changeset
   225
    connect(currItemView, SIGNAL(scrollPositionChanged(const QPointF&)), this,
hgs
parents:
diff changeset
   226
        SLOT(widgetScrolled(const QPointF&)));
hgs
parents:
diff changeset
   227
    connect(nextItemView, SIGNAL(scrollPositionChanged(const QPointF&)), this,
hgs
parents:
diff changeset
   228
        SLOT(widgetScrolled(const QPointF&)));
hgs
parents:
diff changeset
   229
hgs
parents:
diff changeset
   230
    // Install event filters to receive events necessary for gesture handling
hgs
parents:
diff changeset
   231
    CalenDayContentScrollArea* scrollArea =
hgs
parents:
diff changeset
   232
        static_cast<CalenDayContentScrollArea*> (parent);
hgs
parents:
diff changeset
   233
    prevItemView->installEventFilter(scrollArea);
hgs
parents:
diff changeset
   234
    currItemView->installEventFilter(scrollArea);
hgs
parents:
diff changeset
   235
    nextItemView->installEventFilter(scrollArea);
hgs
parents:
diff changeset
   236
hgs
parents:
diff changeset
   237
    // Add views to layout
hgs
parents:
diff changeset
   238
    add(prevItemView);
hgs
parents:
diff changeset
   239
    add(currItemView);
hgs
parents:
diff changeset
   240
    add(nextItemView);
hgs
parents:
diff changeset
   241
}
hgs
parents:
diff changeset
   242
hgs
parents:
diff changeset
   243
// End of File