calendarui/views/dayview/src/calendaycontentwidget.cpp
author hgs
Mon, 20 Sep 2010 12:44:39 +0530
changeset 75 7ac58b2aae6f
parent 63 a3cb48f6c889
permissions -rw-r--r--
201037
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
hgs
parents:
diff changeset
    21
// User includes
hgs
parents:
diff changeset
    22
#include "calendaycontentwidget.h"
hgs
parents:
diff changeset
    23
#include "calendayitemview.h"
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
/*!
hgs
parents:
diff changeset
    26
 \class CalenDayContentWidget
hgs
parents:
diff changeset
    27
 \brief Content widget is a container class for horizontal layouted widgets.
hgs
parents:
diff changeset
    28
 */
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
/*!
hgs
parents:
diff changeset
    31
 \brief Constructor
hgs
parents:
diff changeset
    32
 
hgs
parents:
diff changeset
    33
 \param parent The parent of central widget
hgs
parents:
diff changeset
    34
 */
75
hgs
parents: 63
diff changeset
    35
CalenDayContentWidget::CalenDayContentWidget(QGraphicsItem *parent) :
hgs
parents: 63
diff changeset
    36
    HbWidget(parent), mLayout(NULL)
45
hgs
parents:
diff changeset
    37
{
hgs
parents:
diff changeset
    38
    mWidgets.clear();
hgs
parents:
diff changeset
    39
}
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
/*!
hgs
parents:
diff changeset
    42
 \brief Destructor
hgs
parents:
diff changeset
    43
 */
hgs
parents:
diff changeset
    44
CalenDayContentWidget::~CalenDayContentWidget()
hgs
parents:
diff changeset
    45
{
hgs
parents:
diff changeset
    46
    // Just clear widget list - parent object will destroy its children
hgs
parents:
diff changeset
    47
    mWidgets.clear();
hgs
parents:
diff changeset
    48
}
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
/*!
hgs
parents:
diff changeset
    51
 \brief Adds the widget to central widget and layouts it horizontally.
hgs
parents:
diff changeset
    52
 
hgs
parents:
diff changeset
    53
 Ownership of item is passed to CalenDayContentWidget.
hgs
parents:
diff changeset
    54
 
hgs
parents:
diff changeset
    55
 \param item Widget to be added
hgs
parents:
diff changeset
    56
 \param where Place where widget should be added (as first/last item)
hgs
parents:
diff changeset
    57
 */
75
hgs
parents: 63
diff changeset
    58
void CalenDayContentWidget::add(HbWidget *item, CalenWidgetPosition where)
45
hgs
parents:
diff changeset
    59
{
75
hgs
parents: 63
diff changeset
    60
    if (item) {
hgs
parents: 63
diff changeset
    61
        // Create linear, horizontal layout if not exist
hgs
parents: 63
diff changeset
    62
        if (!mLayout) {
hgs
parents: 63
diff changeset
    63
            mLayout = new QGraphicsLinearLayout(Qt::Horizontal, NULL);
hgs
parents: 63
diff changeset
    64
            mLayout->setContentsMargins(0.0, 0.0, 0.0, 0.0);
hgs
parents: 63
diff changeset
    65
            mLayout->setSpacing(0.0);
hgs
parents: 63
diff changeset
    66
        }
45
hgs
parents:
diff changeset
    67
75
hgs
parents: 63
diff changeset
    68
        switch (where) {
hgs
parents: 63
diff changeset
    69
            case ECalenFirstWidget: {
hgs
parents: 63
diff changeset
    70
                mLayout->insertItem(0, item);
hgs
parents: 63
diff changeset
    71
                mWidgets.insert(0, item);
hgs
parents: 63
diff changeset
    72
                break;
hgs
parents: 63
diff changeset
    73
            }
hgs
parents: 63
diff changeset
    74
            case ECalenLastWidget:
hgs
parents: 63
diff changeset
    75
            default: {
hgs
parents: 63
diff changeset
    76
                mLayout->addItem(item);
hgs
parents: 63
diff changeset
    77
                mWidgets.append(item);
hgs
parents: 63
diff changeset
    78
            }
45
hgs
parents:
diff changeset
    79
        }
75
hgs
parents: 63
diff changeset
    80
hgs
parents: 63
diff changeset
    81
        // If layout has no parent - apply it to central widget
hgs
parents: 63
diff changeset
    82
        if (mLayout && !mLayout->parentLayoutItem()) {
hgs
parents: 63
diff changeset
    83
            setLayout(mLayout);
45
hgs
parents:
diff changeset
    84
        }
hgs
parents:
diff changeset
    85
    }
hgs
parents:
diff changeset
    86
}
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
/*!
hgs
parents:
diff changeset
    89
 \brief Takes the widget and removes it from central widget.
hgs
parents:
diff changeset
    90
 
hgs
parents:
diff changeset
    91
 Ownership of item is passed to caller.
hgs
parents:
diff changeset
    92
 
hgs
parents:
diff changeset
    93
 \param which Indicates which widget should be taken (first/last)
hgs
parents:
diff changeset
    94
 \return Pointer to HbWidget or NULL if widget was not found
hgs
parents:
diff changeset
    95
 */
hgs
parents:
diff changeset
    96
HbWidget* CalenDayContentWidget::take(CalenWidgetPosition which)
hgs
parents:
diff changeset
    97
{
75
hgs
parents: 63
diff changeset
    98
    HbWidget *itemToTake = NULL;
hgs
parents: 63
diff changeset
    99
    if (mWidgets.count() > 0) {
hgs
parents: 63
diff changeset
   100
        switch (which) {
hgs
parents: 63
diff changeset
   101
            case ECalenFirstWidget: {
hgs
parents: 63
diff changeset
   102
                itemToTake = mWidgets.takeFirst();
hgs
parents: 63
diff changeset
   103
                break;
hgs
parents: 63
diff changeset
   104
            }
hgs
parents: 63
diff changeset
   105
            case ECalenLastWidget: {
hgs
parents: 63
diff changeset
   106
                itemToTake = mWidgets.takeLast();
hgs
parents: 63
diff changeset
   107
                break;
hgs
parents: 63
diff changeset
   108
            }
hgs
parents: 63
diff changeset
   109
            default: {
hgs
parents: 63
diff changeset
   110
                // do nothing
hgs
parents: 63
diff changeset
   111
            }
45
hgs
parents:
diff changeset
   112
        }
75
hgs
parents: 63
diff changeset
   113
hgs
parents: 63
diff changeset
   114
        if (mLayout && itemToTake) {
hgs
parents: 63
diff changeset
   115
            mLayout->removeItem(itemToTake);
45
hgs
parents:
diff changeset
   116
        }
hgs
parents:
diff changeset
   117
    }
hgs
parents:
diff changeset
   118
hgs
parents:
diff changeset
   119
    return itemToTake;
hgs
parents:
diff changeset
   120
}
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
/*!
hgs
parents:
diff changeset
   123
 \brief Removed the widget from central widget.
hgs
parents:
diff changeset
   124
 
hgs
parents:
diff changeset
   125
 Widget is removed and deleted.
hgs
parents:
diff changeset
   126
 
hgs
parents:
diff changeset
   127
 \param which Indicates which widget should be removed (first/last)
hgs
parents:
diff changeset
   128
 */
hgs
parents:
diff changeset
   129
void CalenDayContentWidget::remove(CalenWidgetPosition which)
hgs
parents:
diff changeset
   130
{
75
hgs
parents: 63
diff changeset
   131
    HbWidget *itemToRemove = take(which);
45
hgs
parents:
diff changeset
   132
    if (itemToRemove) {
hgs
parents:
diff changeset
   133
        delete itemToRemove;
hgs
parents:
diff changeset
   134
    }
hgs
parents:
diff changeset
   135
}
hgs
parents:
diff changeset
   136
hgs
parents:
diff changeset
   137
/*!
hgs
parents:
diff changeset
   138
 \brief Performs relayout of widgets when it is needed.
hgs
parents:
diff changeset
   139
 
hgs
parents:
diff changeset
   140
 Relayout is done depending on last scroll move:
hgs
parents:
diff changeset
   141
 - if widget was scrolled to next: first widget is taken and added as last
hgs
parents:
diff changeset
   142
 - if widget was scrolled to prev: last widget is taken and inserted as first
hgs
parents:
diff changeset
   143
 
hgs
parents:
diff changeset
   144
 Emits widgetsRelayoutFinished SIGNAL when relayout is over.
hgs
parents:
diff changeset
   145
 
hgs
parents:
diff changeset
   146
 \param scrollTo Direction of last movement
hgs
parents:
diff changeset
   147
 */
hgs
parents:
diff changeset
   148
void CalenDayContentWidget::relayoutWidgets(CalenScrollDirection scrollTo)
hgs
parents:
diff changeset
   149
{
75
hgs
parents: 63
diff changeset
   150
    HbWidget *widget = NULL;
45
hgs
parents:
diff changeset
   151
    switch (scrollTo) {
hgs
parents:
diff changeset
   152
        case ECalenScrollToNext: {
hgs
parents:
diff changeset
   153
            widget = take(ECalenFirstWidget);
hgs
parents:
diff changeset
   154
            add(widget, ECalenLastWidget);
hgs
parents:
diff changeset
   155
            break;
hgs
parents:
diff changeset
   156
        }
75
hgs
parents: 63
diff changeset
   157
        case ECalenScrollToPrev: {
45
hgs
parents:
diff changeset
   158
            widget = take(ECalenLastWidget);
hgs
parents:
diff changeset
   159
            add(widget, ECalenFirstWidget);
hgs
parents:
diff changeset
   160
        }
75
hgs
parents: 63
diff changeset
   161
        case ECalenScrollNoDayChange: 
hgs
parents: 63
diff changeset
   162
        default: {
hgs
parents: 63
diff changeset
   163
            // do nothing
hgs
parents: 63
diff changeset
   164
        }
45
hgs
parents:
diff changeset
   165
    }
hgs
parents:
diff changeset
   166
    emit widgetsRelayoutFinished(scrollTo);
hgs
parents:
diff changeset
   167
}
hgs
parents:
diff changeset
   168
hgs
parents:
diff changeset
   169
/*!
hgs
parents:
diff changeset
   170
 \brief SLOT handles simultanous vertical scrolling of owned widgets.
hgs
parents:
diff changeset
   171
 
hgs
parents:
diff changeset
   172
 \param newPos New scroll position
hgs
parents:
diff changeset
   173
 */
hgs
parents:
diff changeset
   174
void CalenDayContentWidget::widgetScrolled(const QPointF &newPos)
hgs
parents:
diff changeset
   175
{
hgs
parents:
diff changeset
   176
    for (int i = 0; i < mWidgets.count(); i++) {
hgs
parents:
diff changeset
   177
        CalenDayItemView *view =
hgs
parents:
diff changeset
   178
            static_cast<CalenDayItemView *> (mWidgets[i]);
hgs
parents:
diff changeset
   179
        view->scrollVertically(newPos);
hgs
parents:
diff changeset
   180
    }
hgs
parents:
diff changeset
   181
    emit scrollPositionChanged(newPos);
hgs
parents:
diff changeset
   182
}
hgs
parents:
diff changeset
   183
hgs
parents:
diff changeset
   184
// End of File