screensaver/snsrplugins/snsrbigclockscreensaverplugin/src/snsrbigclockcontainer.cpp
author hgs
Mon, 18 Oct 2010 10:20:15 +0300
changeset 98 e6f74eb7f69f
parent 97 66b5fe3c07fd
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
97
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
     1
/*
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
     2
* Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
     3
* All rights reserved.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
     8
*
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
     9
* Initial Contributors:
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    11
*
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    12
* Contributors:
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    13
*
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    14
* Description:  Base class container.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    15
*
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    16
*/
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    17
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    18
#include "snsrbigclockcontainer.h"
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    19
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    20
#include <QPainter>
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    21
#include <QDebug>
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    22
#include <QTime>
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    23
#include <QGraphicsLinearLayout>
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    24
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    25
#include <HbEvent>
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    26
#include <HbColorScheme>
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    27
#include <HbMainWindow>
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    28
#include <HbEffect>
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    29
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    30
#ifdef Q_OS_SYMBIAN
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    31
#include <xqsettingsmanager.h>
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    32
#include <screensaverdomaincrkeys.h>
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    33
#endif //Q_OS_SYMBIAN
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    34
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    35
#include "snsrbigclockcontainer.h"
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    36
#include "snsrindicatorwidget.h"
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    37
#include "snsrindicatormodel.h"
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    38
#include "snsrcolors.h"
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    39
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    40
/*!
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    41
    \class SnsrBigClockContainer
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    42
    \ingroup group_snsrbigclockscreensaverplugin
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    43
    \brief Base class. Container used for drawing background and for preparing layout.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    44
 */
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    45
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    46
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    47
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    48
const int gStep(5);
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    49
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    50
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    51
/*!
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    52
    Constructs a new SnsrBigClockContainer.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    53
 */
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    54
SnsrBigClockContainer::SnsrBigClockContainer() :
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    55
    mBackgroundContainerLayout(0),
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    56
    mMainView(0),
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    57
    mMainContainer(0),
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    58
    mIndicatorModel(0),
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    59
    mIndicatorWidget(0),
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    60
    mCurrentOrientation(-1)
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    61
{
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    62
    setBackgroundColor();
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    63
    mBackgroundContainerLayout = new QGraphicsLinearLayout(Qt::Vertical, this);
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    64
    setLayout(mBackgroundContainerLayout);
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    65
    qsrand(QTime::currentTime().msec());
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    66
    connect( mainWindow(), SIGNAL(aboutToChangeOrientation()), SLOT(fadeOutView()) );
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    67
}
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    68
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    69
/*!
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    70
    Destructs the class.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    71
 */
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    72
SnsrBigClockContainer::~SnsrBigClockContainer()
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    73
{
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    74
    // e.g. mIndicatorWidget gets deleted during this call
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    75
    resetWidgets();
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    76
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    77
    //mBackgroundContainerLayout - deleted by the parent
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    78
    mIndicatorModel = 0; // not owned
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    79
}
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    80
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    81
/*!
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    82
    \fn virtual void update() = 0;
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    83
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    84
    Slot for members update in container e.g. when time or date changed.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    85
 */
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    86
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    87
/*!
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    88
    Changes screensaver layout based on orientation changes.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    89
    \param orientation Current orientation.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    90
 */
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    91
void SnsrBigClockContainer::changeLayout(Qt::Orientation orientation)
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    92
{
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    93
    SCREENSAVER_TEST_FUNC_ENTRY("SnsrBigClockContainer::changeLayout")
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    94
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    95
    if (mCurrentOrientation != orientation) {
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    96
        mCurrentOrientation = orientation;
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    97
        
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    98
        // delete any old widgets
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
    99
        if ( mBackgroundContainerLayout->count() ) {
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   100
            mBackgroundContainerLayout->removeAt(0);
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   101
        }
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   102
        resetWidgets();
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   103
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   104
        // reload widgets from docml
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   105
        loadWidgets();
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   106
        
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   107
        // register orientation effects for the newly loaded main view
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   108
        HbEffect::add( mMainView, "notificationdialog_appear", "appear" );
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   109
        HbEffect::add( mMainView, "notificationdialog_disappear", "disappear" );
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   110
    }
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   111
    mBackgroundContainerLayout->setGeometry( mainWindow()->layoutRect() );
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   112
    update();
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   113
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   114
    // Run the fade-in effect, except if this container is a low-power one.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   115
    // In low-power mode, animations don't look good because of reduced 
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   116
    // color-depth and refresh rate.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   117
    if ( displayPowerMode() == Screensaver::ScreenModeFullPower ) {
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   118
        HbEffect::start( mMainView, "appear" );
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   119
    }
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   120
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   121
    SCREENSAVER_TEST_FUNC_EXIT("SnsrBigClockContainer::changeLayout")
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   122
}
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   123
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   124
/*!
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   125
    Set used indicator model that is owned by the screensaver class. 
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   126
    Model's life cycle must be the same as screensaver's so that indicators'
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   127
    status data can be kept in memory and one can receive updates. 
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   128
    This method should be called when the current container is set.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   129
 */
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   130
void SnsrBigClockContainer::setIndicatorModel(SnsrIndicatorModel &model)
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   131
{
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   132
    mIndicatorModel = &model;
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   133
}
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   134
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   135
/*!
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   136
    @copydoc Screensaver::currentPowerMode()
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   137
 */
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   138
Screensaver::ScreenPowerMode SnsrBigClockContainer::displayPowerMode()
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   139
{
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   140
    // The default implementation returns full power mode. Inherited classes
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   141
    // must override this if low power or display off mode are required.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   142
    return Screensaver::ScreenModeFullPower;
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   143
}
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   144
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   145
/*!
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   146
    @copydoc Screensaver::getActiveScreenRows()
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   147
 */
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   148
void SnsrBigClockContainer::getActiveScreenRows(int *firstActiveRow, int *lastActiveRow)
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   149
{
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   150
    // This default implementation return the whole area of the
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   151
    // container. Inherited low power mode containers can and should
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   152
    // return smaller area which just barely encloses all the content.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   153
    if ( mMainContainer ) {
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   154
        QRect mainRect = mMainContainer->rect().toRect();
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   155
        if ( mCurrentOrientation == Qt::Vertical ) {
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   156
            *firstActiveRow = mainRect.top();
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   157
            *lastActiveRow = mainRect.bottom();
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   158
        }
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   159
        else {
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   160
            *firstActiveRow = mainRect.left();
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   161
            *lastActiveRow = mainRect.right();
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   162
        }
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   163
    }
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   164
}
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   165
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   166
/*!
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   167
    Tell if this container wants to lock the screen orientation.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   168
    Default implementation in not locked but inherited classes may
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   169
    override this.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   170
 */
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   171
bool SnsrBigClockContainer::isOrientationLocked()
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   172
{
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   173
    return false;
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   174
}
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   175
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   176
/*!
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   177
    \fn virtual int updateIntervalInMilliseconds() = 0;
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   178
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   179
    Concrete inherited container classes must implement this to return
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   180
    the desired update interval for that clock mode.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   181
 */
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   182
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   183
/*!
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   184
    \fn virtual int loadWidgets() = 0;
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   185
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   186
    Concrete inherited container classes must implement this to instantiate
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   187
    all the widgets shown in the container. The base class calls this
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   188
    method when screen layuot is changed. The old widgets are already 
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   189
    deleted by the base class before this is called. Also changing the visible
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   190
    container is treated as a layout change, and results in call to this method.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   191
    Thus, inherited containers don't have to load their widgets yet in their
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   192
    constructors.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   193
 */
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   194
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   195
/*!
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   196
    \reimp
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   197
 */
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   198
void SnsrBigClockContainer::changeEvent(QEvent *event)
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   199
{
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   200
    if (event->type() == HbEvent::ThemeChanged) {
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   201
        setBackgroundColor();
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   202
    }
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   203
    return QGraphicsWidget::changeEvent(event);
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   204
}
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   205
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   206
/*!
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   207
    Returns random point for given range.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   208
    \param rect Area within which the generated point will be.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   209
 */
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   210
QPointF SnsrBigClockContainer::randomPosition(const QRectF &rect)
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   211
{
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   212
    int width( rect.width() );
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   213
    int height( rect.height() );
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   214
    if ( width > 0 && height > 0 ) {
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   215
        return rect.topLeft() + QPointF( qrand()%width, qrand()%height );
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   216
    }
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   217
    else {
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   218
        return QPointF();
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   219
    }
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   220
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   221
}
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   222
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   223
/*!
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   224
    Returns new position between curRect position and destPos position.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   225
    \param curPos Current position.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   226
    \param destPos Destination position. When current position is near this
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   227
                   position or outside of the container, a new value is generated.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   228
    \param containerRect The container within which the destination position will always
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   229
                         be after a call.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   230
 */
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   231
QPointF SnsrBigClockContainer::nextRandomPosition(const QPointF &curPos, QPointF &destPos, const QRectF &containerRect)
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   232
{
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   233
    const int delta(gStep+2);
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   234
    const int minCntDimension(3*delta);
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   235
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   236
    // The random movement logic can work only if the container has enough space to move the
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   237
    // clock around. If the container is too small, just return the middle point of the container.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   238
    if ( containerRect.width() < minCntDimension && containerRect.height() < minCntDimension ) {
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   239
        return containerRect.center();
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   240
    }
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   241
    
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   242
    int xDistance = abs( destPos.x() - curPos.x() );
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   243
    int yDistance = abs( destPos.y() - curPos.y() );
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   244
    
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   245
    // Generate new destination position when current widget position is close to 
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   246
    // destination random position or when current destination position is out of bounds.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   247
    // It is possible that the new random position is very close to the current position,
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   248
    // in which case the random position is generated again.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   249
    // It is paramount that container is large enough when next loop is entered
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   250
    // to prevent infinite looping.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   251
    while ( (xDistance < delta && yDistance < delta)
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   252
            || !containerRect.contains(destPos) ) {
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   253
        destPos = randomPosition( containerRect );
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   254
        xDistance = abs( destPos.x() - curPos.x() );
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   255
        yDistance = abs( destPos.y() - curPos.y() );
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   256
    }
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   257
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   258
    // If, for some reason, the current position is out-of-bounds, then there's no
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   259
    // point to slowly move towards the destination. In that case, move immediately
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   260
    // to destination point.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   261
    if ( !containerRect.contains(curPos) ) {
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   262
        return destPos;
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   263
    }
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   264
    // Otherwise, this is normal case and we will calculate a point which is just
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   265
    // a bit closer to the destination.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   266
    
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   267
    // Version 1:
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   268
    //  o-----o---------------------------o
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   269
    //  p1    p2                          p3
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   270
    //
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   271
    // Version 2:
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   272
    //  o---------------------------o-----o
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   273
    //  p3                          p2    p1
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   274
    //
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   275
    // p1 - current widget position
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   276
    // p2 - next position to compute
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   277
    // p3 - destination random position
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   278
    QPointF p1(curPos);
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   279
    QPointF p2(0,0);
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   280
    QPointF p3(destPos);
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   281
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   282
    // Computes point p2 - new position between p1 and p3
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   283
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   284
    // Move the coordinate which is further away from the destination
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   285
    // and calculate the other coordinate from that so that the
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   286
    // result point p2 lies on the straigth line between p1 and p3.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   287
    if ( yDistance > xDistance ) {
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   288
        if (p3.y() > p1.y()) {
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   289
            p2.setY(p1.y()+gStep);
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   290
        }
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   291
        else {
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   292
            p2.setY(p1.y()-gStep);
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   293
        }
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   294
        p2.setX((((p2.y()-p1.y())*(p3.x()-p1.x())) / (p3.y()-p1.y())) + p1.x()); // x2 = (((y2-y1)*(x3-x1)) / (y3-y1)) + x1
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   295
    }
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   296
    else {
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   297
        if (p3.x() > p1.x()) {
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   298
            p2.setX(p1.x()+gStep);
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   299
        }
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   300
        else {
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   301
            p2.setX(p1.x()-gStep);
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   302
        }
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   303
        p2.setY((((p3.y()-p1.y())*(p2.x()-p1.x())) / (p3.x()-p1.x())) + p1.y()); // y2 = (((y3-y1)*(x2-x1)) / (x3-x1)) + y1
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   304
    }
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   305
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   306
    // Return new position between points p1 and p3.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   307
    return p2;
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   308
}
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   309
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   310
/*!
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   311
    Do necessary initializations to show currently active indicators.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   312
    Should be called after the indicator widget is created.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   313
 */
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   314
void SnsrBigClockContainer::connectIndicatorWidgetToModel()
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   315
{
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   316
    Q_ASSERT(mIndicatorModel && mIndicatorWidget);
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   317
    
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   318
    connect(mIndicatorModel, SIGNAL(indicatorsUpdated(QList<SnsrIndicatorInfo>)),
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   319
            mIndicatorWidget, SLOT(showIndicators(QList<SnsrIndicatorInfo>)));
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   320
                
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   321
    connect(mIndicatorModel, SIGNAL(allIndicatorsDeactivated()),
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   322
            mIndicatorWidget, SLOT(removeAllIndicators()));
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   323
        
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   324
    mIndicatorModel->initializeIndicatorWidget();
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   325
}
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   326
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   327
/*!
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   328
    Disconnect connections between indicator model and widget.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   329
    Should be called before deleting the indicator widget.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   330
 */
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   331
void SnsrBigClockContainer::resetIndicatorConnections()
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   332
{   
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   333
    if (mIndicatorWidget && mIndicatorModel) {
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   334
        disconnect(mIndicatorModel, SIGNAL(indicatorsUpdated(QList<SnsrIndicatorInfo>)),
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   335
                   mIndicatorWidget, SLOT(showIndicators(QList<SnsrIndicatorInfo>)));
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   336
        
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   337
        disconnect(mIndicatorModel, SIGNAL(allIndicatorsDeactivated()),
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   338
                   mIndicatorWidget, SLOT(removeAllIndicators()));
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   339
    }
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   340
}
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   341
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   342
/*!
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   343
    Destroy all the contained widgets
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   344
 */
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   345
void SnsrBigClockContainer::resetWidgets()
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   346
{
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   347
    // deregister effects
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   348
    if ( mMainView ) {
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   349
        HbEffect::remove( mMainView );
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   350
    }
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   351
    
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   352
    mDocumentLoader.reset();
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   353
    qDeleteAll(mDocumentObjects);
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   354
    mDocumentObjects.clear();
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   355
}
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   356
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   357
/*!
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   358
    Set background color.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   359
 */
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   360
void SnsrBigClockContainer::setBackgroundColor()
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   361
{
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   362
    mBackgroundColor = SnsrColors::BackgroundColor;
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   363
}
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   364
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   365
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   366
/*
98
hgs
parents: 97
diff changeset
   367
 * Returns true if unlockbutton is used,
hgs
parents: 97
diff changeset
   368
 * false if it is not used.
97
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   369
 */
98
hgs
parents: 97
diff changeset
   370
bool SnsrBigClockContainer::unlockButtonSupported()
97
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   371
{
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   372
#ifdef Q_OS_SYMBIAN 
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   373
    XQSettingsManager::Error error;
98
hgs
parents: 97
diff changeset
   374
    int unlockButton = 0; 
97
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   375
    XQCentralRepositorySettingsKey settingsKey(
98
hgs
parents: 97
diff changeset
   376
            KCRUidValueScreensaverSettings, KScreensaverUnlockWidget ); 
97
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   377
    XQSettingsManager settingsManager;
98
hgs
parents: 97
diff changeset
   378
    unlockButton = settingsManager.readItemValue(settingsKey, XQSettingsManager::TypeInt).toInt();
97
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   379
    error = settingsManager.error();
98
hgs
parents: 97
diff changeset
   380
    if (error == XQSettingsManager::NoError && unlockButton == 1) {
97
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   381
        return true;
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   382
    }
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   383
    else {
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   384
        return false;
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   385
    }
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   386
#else
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   387
    return true;
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   388
#endif //Q_OS_SYMBIAN
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   389
}
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   390
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   391
/*!
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   392
    Paints the contents of an item in local coordinates.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   393
 */
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   394
#ifdef COVERAGE_MEASUREMENT
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   395
#pragma CTC SKIP
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   396
#endif //COVERAGE_MEASUREMENT
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   397
void SnsrBigClockContainer::paint(
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   398
        QPainter *painter,
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   399
        const QStyleOptionGraphicsItem *option,
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   400
        QWidget *widget
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   401
        )
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   402
{
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   403
    Q_UNUSED(option)
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   404
    Q_UNUSED(widget)
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   405
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   406
    painter->fillRect(rect(), mBackgroundColor);
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   407
}
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   408
#ifdef COVERAGE_MEASUREMENT
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   409
#pragma CTC ENDSKIP
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   410
#endif //COVERAGE_MEASUREMENT
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   411
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   412
/*!
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   413
    Run the fade-out transition effect.
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   414
 */
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   415
void SnsrBigClockContainer::fadeOutView()
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   416
{
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   417
    // there's no point in animating the fade-out in the low-power mode
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   418
    if ( mMainView && displayPowerMode() == Screensaver::ScreenModeFullPower ) {
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   419
        HbEffect::start( mMainView, "disappear" );
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   420
    }
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   421
}
66b5fe3c07fd 201039_01
hgs
parents:
diff changeset
   422