camerauis/cameraxui/cxengine/src/cxezoomcontroldesktop.cpp
author hgs
Fri, 23 Jul 2010 11:35:41 +0300
changeset 45 24fd82631616
permissions -rw-r--r--
201029
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:
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include "cxezoomcontroldesktop.h"
hgs
parents:
diff changeset
    19
#include "cxecameradevicecontrol.h"
hgs
parents:
diff changeset
    20
#include "cxutils.h"
hgs
parents:
diff changeset
    21
#include "cxenamespace.h"
hgs
parents:
diff changeset
    22
#include "cxestate.h"
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
const int NOT_DEFINED = -1;
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
/*!
hgs
parents:
diff changeset
    27
 * Constructor
hgs
parents:
diff changeset
    28
 */
hgs
parents:
diff changeset
    29
CxeZoomControlDesktop::CxeZoomControlDesktop(CxeCameraDeviceControl &cameraDeviceControl) :
hgs
parents:
diff changeset
    30
    mCameraDeviceControl(cameraDeviceControl)
hgs
parents:
diff changeset
    31
{
hgs
parents:
diff changeset
    32
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
    qRegisterMetaType<CxeZoomControl::State> ();
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
    init();
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
    39
}
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
/*!
hgs
parents:
diff changeset
    42
 * Destructor
hgs
parents:
diff changeset
    43
 */
hgs
parents:
diff changeset
    44
CxeZoomControlDesktop::~CxeZoomControlDesktop()
hgs
parents:
diff changeset
    45
{
hgs
parents:
diff changeset
    46
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
    47
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
    48
}
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
/*!
hgs
parents:
diff changeset
    51
 * Get the minimum zoom index
hgs
parents:
diff changeset
    52
 */
hgs
parents:
diff changeset
    53
int CxeZoomControlDesktop::min() const
hgs
parents:
diff changeset
    54
{
hgs
parents:
diff changeset
    55
    return mMinZoomLevel;
hgs
parents:
diff changeset
    56
}
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
/*!
hgs
parents:
diff changeset
    59
 * Get the maximum zoom index
hgs
parents:
diff changeset
    60
 */
hgs
parents:
diff changeset
    61
int CxeZoomControlDesktop::max() const
hgs
parents:
diff changeset
    62
{
hgs
parents:
diff changeset
    63
    return mMaxZoomLevel;
hgs
parents:
diff changeset
    64
}
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
/*!
hgs
parents:
diff changeset
    67
 * Init
hgs
parents:
diff changeset
    68
 */
hgs
parents:
diff changeset
    69
void CxeZoomControlDesktop::init()
hgs
parents:
diff changeset
    70
{
hgs
parents:
diff changeset
    71
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
    // Initialize the variables
hgs
parents:
diff changeset
    74
    mMinZoomLevel = 0;
hgs
parents:
diff changeset
    75
    mMaxZoomLevel = 0;
hgs
parents:
diff changeset
    76
    mCurrentZoomLevel = 0;
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
    mState = Idle;
hgs
parents:
diff changeset
    79
hgs
parents:
diff changeset
    80
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
    81
}
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
/*!
hgs
parents:
diff changeset
    84
 * Re-initializes the zoom control
hgs
parents:
diff changeset
    85
 */
hgs
parents:
diff changeset
    86
void CxeZoomControlDesktop::reset()
hgs
parents:
diff changeset
    87
{
hgs
parents:
diff changeset
    88
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
    89
hgs
parents:
diff changeset
    90
    init();
hgs
parents:
diff changeset
    91
    emit zoomLevelChanged(mCurrentZoomLevel);
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
    94
}
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
/*!
hgs
parents:
diff changeset
    97
* slot to prepare zoom control for still mode
hgs
parents:
diff changeset
    98
*/
hgs
parents:
diff changeset
    99
void CxeZoomControlDesktop::prepareZoomForStill(int ecamStillResolutionIndex)
hgs
parents:
diff changeset
   100
{
hgs
parents:
diff changeset
   101
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
    Q_UNUSED(ecamStillResolutionIndex);
hgs
parents:
diff changeset
   104
hgs
parents:
diff changeset
   105
    if (mCameraDeviceControl.state() == CxeCameraDeviceControl::Ready) {
hgs
parents:
diff changeset
   106
        reset();
hgs
parents:
diff changeset
   107
        int error;
hgs
parents:
diff changeset
   108
        int imageQualityIndex;
hgs
parents:
diff changeset
   109
        CxeError::Id cxErr;
hgs
parents:
diff changeset
   110
        if (cxErr == CxeError::None && mStillMaxZoomLimits.count() > 0) {
hgs
parents:
diff changeset
   111
            // fetching the zoom limit based on the image quality
hgs
parents:
diff changeset
   112
            mMaxZoomLevel = mStillMaxZoomLimits[imageQualityIndex];
hgs
parents:
diff changeset
   113
        } else {
hgs
parents:
diff changeset
   114
            mMaxZoomLevel = NOT_DEFINED;
hgs
parents:
diff changeset
   115
        }
hgs
parents:
diff changeset
   116
        
hgs
parents:
diff changeset
   117
        finalizeZoomPreparation(error);
hgs
parents:
diff changeset
   118
    }
hgs
parents:
diff changeset
   119
    
hgs
parents:
diff changeset
   120
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   121
}
hgs
parents:
diff changeset
   122
hgs
parents:
diff changeset
   123
/*!
hgs
parents:
diff changeset
   124
* slot to prepare zoom control for video mode
hgs
parents:
diff changeset
   125
*/
hgs
parents:
diff changeset
   126
void CxeZoomControlDesktop::prepareZoomForVideo()
hgs
parents:
diff changeset
   127
{
hgs
parents:
diff changeset
   128
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   129
    
hgs
parents:
diff changeset
   130
    if (mCameraDeviceControl.state() == CxeCameraDeviceControl::Ready) {
hgs
parents:
diff changeset
   131
        reset();
hgs
parents:
diff changeset
   132
        int error;
hgs
parents:
diff changeset
   133
        if (mVideoMaxZoomLimits.count() > 0) {
hgs
parents:
diff changeset
   134
            // fetching the zoom limit based on the video quality
hgs
parents:
diff changeset
   135
            mMaxZoomLevel = mVideoMaxZoomLimits[0];
hgs
parents:
diff changeset
   136
        } else {
hgs
parents:
diff changeset
   137
            mMaxZoomLevel = NOT_DEFINED;
hgs
parents:
diff changeset
   138
        }
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
        finalizeZoomPreparation(error);
hgs
parents:
diff changeset
   141
    }
hgs
parents:
diff changeset
   142
    
hgs
parents:
diff changeset
   143
hgs
parents:
diff changeset
   144
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   145
}
hgs
parents:
diff changeset
   146
hgs
parents:
diff changeset
   147
/*!
hgs
parents:
diff changeset
   148
* Completes zoom control preparation.
hgs
parents:
diff changeset
   149
*/
hgs
parents:
diff changeset
   150
void CxeZoomControlDesktop::finalizeZoomPreparation(int error)
hgs
parents:
diff changeset
   151
{
hgs
parents:
diff changeset
   152
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   153
    
hgs
parents:
diff changeset
   154
    CX_DEBUG(("Maximum zoom limit: %d", mMaxZoomLevel));
hgs
parents:
diff changeset
   155
    
hgs
parents:
diff changeset
   156
    if (!error) {
hgs
parents:
diff changeset
   157
        // Note that this is called only after setting the resolution.
hgs
parents:
diff changeset
   158
        // emit the zoom changed signal so that clients can do any updates if necessary.
hgs
parents:
diff changeset
   159
        emit zoomLevelChanged(mCurrentZoomLevel);
hgs
parents:
diff changeset
   160
hgs
parents:
diff changeset
   161
        mState = Ready;
hgs
parents:
diff changeset
   162
        emit stateChanged(mState, CxeError::None);
hgs
parents:
diff changeset
   163
    }
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   166
}
hgs
parents:
diff changeset
   167
hgs
parents:
diff changeset
   168
/*!
hgs
parents:
diff changeset
   169
* Zooms to the level specified in the parameter
hgs
parents:
diff changeset
   170
*/
hgs
parents:
diff changeset
   171
void CxeZoomControlDesktop::zoomTo(int value)
hgs
parents:
diff changeset
   172
{
hgs
parents:
diff changeset
   173
    CX_DEBUG_ENTER_FUNCTION();
hgs
parents:
diff changeset
   174
hgs
parents:
diff changeset
   175
    CX_DEBUG(("Zoom to: %d, current zoom: %d", value, mCurrentZoomLevel));
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
    // If not currently zooming and value falls between min & max
hgs
parents:
diff changeset
   178
    // then zoom to the passed level. Also there's no need to zoom if new zoom
hgs
parents:
diff changeset
   179
    // level is same as the current.
hgs
parents:
diff changeset
   180
    if (state() == CxeZoomControl::Ready && (value <= mMaxZoomLevel)
hgs
parents:
diff changeset
   181
            && (value >= mMinZoomLevel) && (mCurrentZoomLevel != value)) {
hgs
parents:
diff changeset
   182
hgs
parents:
diff changeset
   183
        // Could also check the number of values in the array to avoid out of bounds indexing,
hgs
parents:
diff changeset
   184
        // though this is done in alternate way by the min and max limits.
hgs
parents:
diff changeset
   185
        mCurrentZoomLevel = value;
hgs
parents:
diff changeset
   186
hgs
parents:
diff changeset
   187
        // Set the appropriate zooming state
hgs
parents:
diff changeset
   188
        if (value < mCurrentZoomLevel) {
hgs
parents:
diff changeset
   189
             mState = ZoomingOut;
hgs
parents:
diff changeset
   190
        } else {
hgs
parents:
diff changeset
   191
            mState = ZoomingIn;
hgs
parents:
diff changeset
   192
        }
hgs
parents:
diff changeset
   193
        emit stateChanged(mState, CxeError::None);
hgs
parents:
diff changeset
   194
hgs
parents:
diff changeset
   195
        //! @todo: Wait for zoom callback: ECamEventZoomStateChanged ?
hgs
parents:
diff changeset
   196
        mState = Ready;
hgs
parents:
diff changeset
   197
        emit stateChanged(mState, CxeError::None);
hgs
parents:
diff changeset
   198
hgs
parents:
diff changeset
   199
        // Emit the zoom level change signal
hgs
parents:
diff changeset
   200
        emit zoomLevelChanged(mCurrentZoomLevel);
hgs
parents:
diff changeset
   201
    }
hgs
parents:
diff changeset
   202
hgs
parents:
diff changeset
   203
    CX_DEBUG_EXIT_FUNCTION();
hgs
parents:
diff changeset
   204
}
hgs
parents:
diff changeset
   205
hgs
parents:
diff changeset
   206
CxeZoomControl::State CxeZoomControlDesktop::state() const
hgs
parents:
diff changeset
   207
{
hgs
parents:
diff changeset
   208
    return mState;
hgs
parents:
diff changeset
   209
}