diff -r 61bc0f252b2b -r bac7acad7cb3 camerauis/cameraxui/cxui/src/cxuistillprecaptureview.cpp --- a/camerauis/cameraxui/cxui/src/cxuistillprecaptureview.cpp Tue Aug 31 15:03:46 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1051 +0,0 @@ -/* -* Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: -* -*/ -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include // HbDeviceProfile -#include -#include -#include - -#include "cxuiselftimer.h" -#include "cxeengine.h" -#include "cxeviewfindercontrol.h" -#include "cxecameradevicecontrol.h" -#include "cxestillcapturecontrol.h" -#include "cxeautofocuscontrol.h" -#include "cxuicapturekeyhandler.h" -#include "cxutils.h" -#include "cxenamespace.h" // CxeSettingIds -#include "cxuienums.h" -#include "cxesettings.h" -#include "cxefeaturemanager.h" // mEngine->featureManager() -#include "cxuidocumentloader.h" - -#ifdef Q_OS_SYMBIAN -#include "OstTraceDefinitions.h" - -#ifdef OST_TRACE_COMPILER_IN_USE -#include "cxuistillprecaptureviewTraces.h" -#endif - -#endif //Q_OS_SYMBIAN - -#include "cxuistillprecaptureview.h" -#include "cxuiserviceprovider.h" -#include "cxuisettingdialog.h" -#include "cxuisettingradiobuttonlist.h" -#include "cxuizoomslider.h" - -using namespace Cxe; -using namespace CxUiLayout; -using namespace CxUiInternal; - -const int CXUI_CAPTURE_PENDING_TIMEOUT = 5000; // 5 seconds -const int CXUI_IMAGES_LEFT_LIMIT = 99; // images left is shown only if below this limit - -CxuiStillPrecaptureView::CxuiStillPrecaptureView( QGraphicsItem *parent) : - CxuiPrecaptureView(parent), - mSelfTimer(NULL), - mFlashSetting(NULL), - mStillSettingsPopup(NULL), - mSceneModePopup(NULL), - mCapturePending(false), - mImagesLeft(NULL), - mImagesLeftContainer(NULL), - mPendingAfCanceling(false) -{ - CX_DEBUG_IN_FUNCTION(); -} - -CxuiStillPrecaptureView::~CxuiStillPrecaptureView() -{ - CX_DEBUG_IN_FUNCTION(); - delete mSelfTimer; -} - -/*! - * Construct-method handles initialisation tasks for this class. Needs to be called - * before the instance of this class is used. - * @param mainwindow - * @param engine - * @param documentLoader - * @param keyHandler - */ -void CxuiStillPrecaptureView::construct(HbMainWindow *mainwindow, CxeEngine *engine, - CxuiDocumentLoader *documentLoader, - CxuiCaptureKeyHandler *keyHandler, - HbActivityManager *activityManager) -{ - CX_DEBUG_ENTER_FUNCTION(); - OstTrace0( camerax_performance, CXUISTILLPRECAPTUREVIEW_CONSTRUCT, "msg: e_CX_STILLPRECAPVIEW_CONSTRUCT 1" ); - - // constuct base class - CxuiPrecaptureView::construct(mainwindow, engine, documentLoader, keyHandler, activityManager); - - connect(&mEngine->autoFocusControl(), SIGNAL(stateChanged(CxeAutoFocusControl::State,CxeError::Id)), - this, SLOT(handleAutoFocusStateChanged(CxeAutoFocusControl::State,CxeError::Id))); - connect(&mEngine->stillCaptureControl(), SIGNAL(snapshotReady(CxeError::Id, const QImage&, int)), - this, SLOT(handleSnapshot(CxeError::Id))); - connect(&mEngine->stillCaptureControl(), SIGNAL(stateChanged(CxeStillCaptureControl::State, CxeError::Id)), - this, SLOT(handleStillCaptureStateChanged(CxeStillCaptureControl::State, CxeError::Id))); - connect(&mEngine->viewfinderControl(), SIGNAL(stateChanged(CxeViewfinderControl::State, CxeError::Id)), - this, SLOT(handleViewfinderStateChanged(CxeViewfinderControl::State, CxeError::Id))); - connect(&mEngine->stillCaptureControl(), SIGNAL(availableImagesChanged()), - this, SLOT(updateImagesLeftLabel())); - - mEngine->settings().listenForSetting(CxeSettingIds::IMAGE_SCENE_DATA, this, SLOT(handleSceneChanged(const QVariant&))); - - loadDefaultWidgets(); - hideControls(); - - OstTrace0( camerax_performance, DUP1_CXUISTILLPRECAPTUREVIEW_CONSTRUCT, "msg: e_CX_STILLPRECAPVIEW_CONSTRUCT 0" ); - CX_DEBUG_EXIT_FUNCTION(); -} - -/*! - * Loads default widgets in layouts xml. - */ -void CxuiStillPrecaptureView::loadDefaultWidgets() -{ - CX_DEBUG_ENTER_FUNCTION(); - CX_ASSERT_ALWAYS(mDocumentLoader); - - // get pointer to the viewfinder - QGraphicsWidget *widget = NULL; - widget = mDocumentLoader->findWidget(STILL_PRE_CAPTURE_VIEWFINDER); - mViewfinder = qobject_cast(widget); - CX_ASSERT_ALWAYS(mViewfinder); - - reloadIndicatorWidgets(); - CX_DEBUG_EXIT_FUNCTION(); -} - -/*! - * Loads default indicators from docml and modifies the visibility - * according to current settings. - */ -void CxuiStillPrecaptureView::reloadIndicatorWidgets() -{ - CX_DEBUG_ENTER_FUNCTION(); - CX_ASSERT_ALWAYS(mDocumentLoader); - - bool ok = false; - mDocumentLoader->load(STILL_1ST_XML, STILL_PRE_CAPTURE_INDICATORS_SECTION, &ok); - CX_ASSERT_ALWAYS(ok); - - QGraphicsWidget *widget = NULL; - widget = mDocumentLoader->findWidget(STILL_PRE_CAPTURE_QUALITY_ICON); - mQualityIcon = qobject_cast(widget); - CX_ASSERT_ALWAYS(mQualityIcon); - - widget = mDocumentLoader->findWidget(STILL_PRE_CAPTURE_FLASHBLINK_INDICATOR_ICON); - HbLabel *flashBlinkingIcon = qobject_cast(widget); - CX_ASSERT_ALWAYS(flashBlinkingIcon); - - widget = mDocumentLoader->findWidget(STILL_PRE_CAPTURE_GEOTAGGING_INDICATOR_ICON); - mGeoTaggingIndicatorIcon = qobject_cast(widget); - CX_ASSERT_ALWAYS(mGeoTaggingIndicatorIcon); - - widget = mDocumentLoader->findWidget(STILL_PRE_CAPTURE_FACE_TRACKING_ICON); - mFaceTrackingIcon = qobject_cast(widget); - CX_ASSERT_ALWAYS(mFaceTrackingIcon); - - widget = mDocumentLoader->findWidget(STILL_PRE_CAPTURE_INDICATOR_CONTAINER); - mIndicators = qobject_cast(widget); - CX_ASSERT_ALWAYS(mIndicators); - - QGraphicsLayout *layout = mIndicators->layout(); - QGraphicsLayoutItem *graphicsLayoutItem = NULL; - QGraphicsItem *graphicsItem = NULL; - QString key = ""; - int currentSettingValue = -1; - bool isSettingOff = false; - // Go through the items in the layout to check whether they should be - // shown or not in the indicator pane. Start from the last towards - // the first, so that removing items from between works correctly. - for (int i = layout->count() - 1; i >= 0; i--) { - graphicsLayoutItem = layout->itemAt(i); - isSettingOff = false; - if (graphicsLayoutItem) { - graphicsItem = graphicsLayoutItem->graphicsItem(); - currentSettingValue = -1; - if (graphicsItem == mGeoTaggingIndicatorIcon) { - key = CxeSettingIds::GEOTAGGING; - currentSettingValue = mEngine->settings().get(key, currentSettingValue); - if (currentSettingValue == Cxe::GeoTaggingOff) { - isSettingOff = true; - } - } else if (graphicsItem == mFaceTrackingIcon) { - key = CxeSettingIds::FACE_TRACKING; - currentSettingValue = mEngine->settings().get(key, currentSettingValue); - // facetracking implementation does not use - // enum for on/off values but instead - // 0 for off and 1 for on. - if (currentSettingValue == 0) { - isSettingOff = true; - } - } else if (graphicsItem == flashBlinkingIcon) { - //remove flash indicator - isSettingOff = true; - } - if (isSettingOff) { - layout->removeAt(i); - } - } - } - - // create background for indicator container - createWidgetBackgroundGraphic(mIndicators, TRANSPARENT_BACKGROUND_GRAPHIC); - - mIndicators->setVisible(true); - - CX_DEBUG_EXIT_FUNCTION(); -} - -/*! - * Loads widgets that are not part of the default section in layouts xml. - * Widgets are created at the time they are first loaded. - */ -void CxuiStillPrecaptureView::loadWidgets() -{ - CX_DEBUG_ENTER_FUNCTION(); - CX_ASSERT_ALWAYS(mDocumentLoader); - - if (mWidgetsLoaded) { - CX_DEBUG(("Widgets already loaded")); - CX_DEBUG_EXIT_FUNCTION(); - return; - } - - OstTrace0( camerax_performance, CXUISTILLPRECAPTUREVIEW_LOADWIDGETS, "msg: e_CX_STILLPRECAPTUREVIEW_LOADWIDGETS 1" ); - - bool ok = false; - - OstTrace0( camerax_performance, DUP4_CXUISTILLPRECAPTUREVIEW_LOADWIDGETS, "msg: e_CX_DOCUMENTLOADER_LOAD 1" ); - mDocumentLoader->load(STILL_1ST_XML, STILL_PRE_CAPTURE_WIDGETS_SECTION, &ok); - CX_ASSERT_ALWAYS(ok); - if (CxuiServiceProvider::isCameraEmbedded()) { - mDocumentLoader->load(STILL_1ST_XML, STILL_PRE_CAPTURE_EMBEDDED_SECTION, &ok); - } else { - mDocumentLoader->load(STILL_1ST_XML, STILL_PRE_CAPTURE_STANDALONE_SECTION, &ok); - } - OstTrace0( camerax_performance, DUP5_CXUISTILLPRECAPTUREVIEW_LOADWIDGETS, "msg: e_CX_DOCUMENTLOADER_LOAD 0" ); - CX_ASSERT_ALWAYS(ok); - - // get pointers to ui components from the layout data - QGraphicsWidget *widget = NULL; - QObject *object = NULL; - - widget = mDocumentLoader->findWidget(STILL_PRE_CAPTURE_ZOOM_SLIDER); - mSlider = qobject_cast(widget); - CX_ASSERT_ALWAYS(mSlider); - mSlider->addZoomButtons(); - createWidgetBackgroundGraphic(mSlider, TRANSPARENT_BACKGROUND_GRAPHIC); - - // create background for selftimer containers - HbWidget *container = NULL; - widget = mDocumentLoader->findWidget(STILL_PRE_CAPTURE_SELFTIMER_CONTAINER); - container = qobject_cast(widget); - CX_ASSERT_ALWAYS(container); - createWidgetBackgroundGraphic(container, TRANSPARENT_BACKGROUND_GRAPHIC); - - // connect selftimer start button to hide controls - widget = mDocumentLoader->findWidget(STILL_PRE_CAPTURE_SELFTIMER_START_BUTTON); - HbPushButton *startButton = qobject_cast(widget); - CX_ASSERT_ALWAYS(startButton); - connect(startButton, SIGNAL(released()), this, SLOT(hideControls())); - - widget = mDocumentLoader->findWidget(STILL_PRE_CAPTURE_TOOLBAR); - mToolbar = qobject_cast(widget); - CX_ASSERT_ALWAYS(mToolbar); - - object = mDocumentLoader->findObject(STILL_PRE_CAPTURE_FLASH_ACTION); - mFlashSetting = qobject_cast(object); - CX_ASSERT_ALWAYS(mFlashSetting); - - widget = mDocumentLoader->findWidget(STILL_PRE_CAPTURE_IMAGES_LEFT_LABEL); - mImagesLeft = qobject_cast(widget); - CX_ASSERT_ALWAYS(mImagesLeft); - - widget = mDocumentLoader->findWidget(STILL_PRE_CAPTURE_IMAGES_LEFT_CONTAINER); - mImagesLeftContainer = qobject_cast(widget); - CX_ASSERT_ALWAYS(mImagesLeftContainer); - createWidgetBackgroundGraphic(mImagesLeftContainer, TRANSPARENT_BACKGROUND_GRAPHIC); - updateImagesLeftLabel(); - - // Create self timer. - // Let selftimer class get needed selftimer related widgets from the documentloader - mSelfTimer = new CxuiSelfTimer(mEngine->settings()); - CX_ASSERT_ALWAYS(mSelfTimer); - connect(mSelfTimer, SIGNAL(timerFinished()), this, SLOT(focusAndCapture())); - mSelfTimer->loadSelftimerWidgets(mDocumentLoader); - - if (CxuiServiceProvider::isCameraEmbedded()) { - CX_DEBUG(("EMBEDDED: camera in embedded mode")); - - if (!CxuiServiceProvider::instance()->allowQualityChange()) { - - CX_DEBUG(("EMBEDDED: don't allow quality change")); - HbAction* iq = qobject_cast(mDocumentLoader->findObject(STILL_PRE_CAPTURE_IMAGE_QUALITY_ACTION)); - if (iq) { - CX_DEBUG(("EMBEDDED: setting image quality setting to disabled")); - iq->setEnabled(false); - } - } - if (!CxuiServiceProvider::instance()->allowModeSwitching()) { - CX_DEBUG(("EMBEDDED: don't allow mode switching")); - - HbAction *video = qobject_cast(mDocumentLoader->findObject(STILL_PRE_CAPTURE_GOTO_VIDEO_ACTION)); - if (video) { - CX_DEBUG(("EMBEDDED: setting mode switch to disabled")); - video->setEnabled(false); - } - } - if (!CxuiServiceProvider::instance()->allowCameraSwitching()) { - CX_DEBUG(("EMBEDDED: don't allow camera switching")); - } - - } - - // Setting widgets loaded here so updating icons works. - mWidgetsLoaded = true; - - // Update toolbar flash mode icon - int flash = mEngine->settings().get(CxeSettingIds::FLASH_MODE); - handleSettingValueChanged(CxeSettingIds::FLASH_MODE, flash); - - // Update toolbar scene mode icon - updateSceneIcon(mEngine->settings().get(CxeSettingIds::IMAGE_SCENE)); - - hideControls(); - - // Check if we need to show the geotagging disclaimer for first time use. - Cxe::GeoTaggingDisclaimer value = mEngine->settings().get(CxeSettingIds::GEOTAGGING_DISCLAIMER, Cxe::GeoTaggingDisclaimerDisabled); - if (value == Cxe::GeoTaggingDisclaimerEnabled) { - launchGeoTaggingDisclaimerDialog(); - } - - // View is ready. Needed for startup performance automated testing. - emit viewReady(); - - OstTrace0( camerax_performance, DUP1_CXUISTILLPRECAPTUREVIEW_LOADWIDGETS, "msg: e_CX_STILLPRECAPTUREVIEW_LOADWIDGETS 0" ); - CX_DEBUG_EXIT_FUNCTION(); -} - -/*! - * Restore view state from activity. - */ -void CxuiStillPrecaptureView::restoreActivity(const QString &activityId, const QVariant &data) -{ - Q_UNUSED(activityId); - Q_UNUSED(data); - - CX_DEBUG_ENTER_FUNCTION(); - // no need to restore any state - CX_DEBUG_EXIT_FUNCTION(); -} - -/*! - * Save view state to activity. - */ -void CxuiStillPrecaptureView::saveActivity() -{ - CX_DEBUG_ENTER_FUNCTION(); - QVariantMap data; - QVariantHash params; - - HbIcon activityScreenshot("qtg_graf_taskswitcher_camera"); - QPixmap screenshot = activityScreenshot.pixmap(); - params.insert("screenshot", screenshot); - - mActivityManager->removeActivity( - CxuiActivityIds::STILL_PRECAPTURE_ACTIVITY); - mActivityManager->addActivity(CxuiActivityIds::STILL_PRECAPTURE_ACTIVITY, - data, params); - CX_DEBUG_EXIT_FUNCTION(); -} - -/*! - * Clear activity from activity manager. - */ -void CxuiStillPrecaptureView::clearActivity() -{ - CX_DEBUG_ENTER_FUNCTION(); - mActivityManager->removeActivity(CxuiActivityIds::STILL_PRECAPTURE_ACTIVITY); - CX_DEBUG_EXIT_FUNCTION(); -} - -/*! -* Initializing settings grid -*/ -void CxuiStillPrecaptureView::initializeSettingsGrid() -{ - if(!mSettingsGrid) { - HbAction* action(NULL); - - // Initialize settings grid - mSettingsGrid = new HbToolBarExtension; - - action = mSettingsGrid->addAction(HbIcon("qtg_mono_exposure"), hbTrId("txt_cam_button_exposure_compensation"), this, SLOT(launchSliderSetting())); - action->setProperty(PROPERTY_KEY_SETTING_ID, CxeSettingIds::EV_COMPENSATION_VALUE); - action->setProperty(PROPERTY_KEY_SETTING_GRID, PROPERTY_KEY_TRUE); - - action = mSettingsGrid->addAction(HbIcon("qtg_mono_iso"), hbTrId("txt_cam_button_iso"), this, SLOT(launchSetting())); - action->setProperty(PROPERTY_KEY_SETTING_ID, CxeSettingIds::LIGHT_SENSITIVITY); - action->setProperty(PROPERTY_KEY_SETTING_GRID, PROPERTY_KEY_TRUE); - - action = mSettingsGrid->addAction(HbIcon("qtg_small_rgb"), hbTrId("txt_cam_button_color_tone"), this, SLOT(launchSetting())); - action->setProperty(PROPERTY_KEY_SETTING_ID, CxeSettingIds::COLOR_TONE); - action->setProperty(PROPERTY_KEY_SETTING_GRID, PROPERTY_KEY_TRUE); - - action = mSettingsGrid->addAction(HbIcon("qtg_mono_white_balance"), hbTrId("txt_cam_button_white_balance"), this, SLOT(launchSetting())); - action->setProperty(PROPERTY_KEY_SETTING_ID, CxeSettingIds::WHITE_BALANCE); - action->setProperty(PROPERTY_KEY_SETTING_GRID, PROPERTY_KEY_TRUE); - - action = mSettingsGrid->addAction(HbIcon("qtg_mono_sharpness"), hbTrId("txt_cam_grid_sharpness"), this, SLOT(launchSliderSetting())); - action->setProperty(PROPERTY_KEY_SETTING_ID, CxeSettingIds::SHARPNESS); - action->setProperty(PROPERTY_KEY_SETTING_GRID, PROPERTY_KEY_TRUE); - - action = mSettingsGrid->addAction(HbIcon("qtg_mono_contrast"), hbTrId("txt_cam_button_contrast"), this, SLOT(launchSliderSetting())); - action->setProperty(PROPERTY_KEY_SETTING_ID, CxeSettingIds::CONTRAST); - action->setProperty(PROPERTY_KEY_SETTING_GRID, PROPERTY_KEY_TRUE); - - action = mSettingsGrid->addAction(HbIcon("qtg_mono_face_tracking"), hbTrId("txt_cam_button_face_tracking"), this, SLOT(launchSetting())); - action->setProperty(PROPERTY_KEY_SETTING_ID, CxeSettingIds::FACE_TRACKING); - action->setProperty(PROPERTY_KEY_SETTING_GRID, PROPERTY_KEY_TRUE); - - connect(mCaptureKeyHandler, SIGNAL(autofocusKeyPressed()), mSettingsGrid, SLOT(close())); - } -} - -/** -* Get if postcapture view should be shown or not. -* Postcapture view may be shown for a predefined time or -* until user dismisses it, or it may be completely disabled. -*/ -bool CxuiStillPrecaptureView::isPostcaptureOn() const -{ - CX_DEBUG_ENTER_FUNCTION(); - if (CxuiServiceProvider::isCameraEmbedded()) { - // always show post capture in embedded mode - CX_DEBUG_EXIT_FUNCTION(); - return true; - } - - // Read the value from settings. Ignoring reading error. - // On error (missing settings) default to "postcapture on". - int showPostcapture(-1); - if(mEngine) { - showPostcapture = mEngine->settings().get(CxeSettingIds::STILL_SHOWCAPTURED, -1); - } - - CX_DEBUG_EXIT_FUNCTION(); - return showPostcapture != 0; // 0 == no postcapture -} - -/*! -* Update the scene mode icon. -* @param sceneId The new scene id. -*/ -void CxuiStillPrecaptureView::updateSceneIcon(const QString& sceneId) -{ - CX_DEBUG_ENTER_FUNCTION(); - - if (mEngine->mode() == Cxe::ImageMode) { - CX_DEBUG(("CxuiStillPrecaptureView - scene: %s", sceneId.toAscii().constData())); - - // No need to update icon, if widgets are not even loaded yet. - // We'll update the icon once the widgets are loaded. - if (mWidgetsLoaded) { - - QString iconObjectName = STILL_PRE_CAPTURE_SCENE_MODE_ACTION; - QString icon = getSettingItemIcon(CxeSettingIds::IMAGE_SCENE, sceneId); - - CX_DEBUG(("CxuiStillPrecaptureView - icon: %s", icon.toAscii().constData())); - - if (mDocumentLoader) { - QObject *obj = mDocumentLoader->findObject(iconObjectName); - CX_ASSERT_ALWAYS(obj); - qobject_cast(obj)->setIcon(HbIcon(icon)); - } - } else { - CX_DEBUG(("CxuiStillPrecaptureView - widgets not loaded yet, ignored!")); - } - } - CX_DEBUG_EXIT_FUNCTION(); -} - -/*! - Update the quality indicator -*/ -void CxuiStillPrecaptureView::updateQualityIcon() -{ - CX_DEBUG_ENTER_FUNCTION(); - - if (mQualityIcon && mEngine) { - QString icon = ""; - int currentValue = mEngine->settings().get(CxeSettingIds::IMAGE_QUALITY, -1); - icon = getSettingItemIcon(CxeSettingIds::IMAGE_QUALITY, currentValue); - - mQualityIcon->setIcon(HbIcon(icon)); - } - - CX_DEBUG_EXIT_FUNCTION(); -} - -void CxuiStillPrecaptureView::handleSnapshot(CxeError::Id error) -{ - CX_DEBUG_ENTER_FUNCTION(); - - if (mPendingAfCanceling) { - mPendingAfCanceling = false; - mEngine->autoFocusControl().cancel(); - } - - if (error == CxeError::None) { - // Enging may emit snapshot events even if we don't need the snapshot. - // Check if postcapture is actually wanted and change view now if so. - if(isPostcaptureOn()) { - emit changeToPostcaptureView(); - if (mSlider) { - mSlider->hide(); - } - } - } else { - emit errorEncountered(error); - } - - CX_DEBUG_EXIT_FUNCTION(); -} - - -/*! - Method for starting focusing which will be followed by capture. - Meant for selftimer purposes. If autofocusing is not supported, capture - will start without focusing. - - \sa capture() - \sa handleAutofocusKeyPressed() - \sa handleCaptureKeyPressed() - \sa setCapturePending() - */ -void CxuiStillPrecaptureView::focusAndCapture() -{ - CX_DEBUG_ENTER_FUNCTION(); - - if (!mEngine->autoFocusControl().supported() || - mEngine->autoFocusControl().isFixedFocusMode(mEngine->autoFocusControl().mode())) { - // autofocus is not supported, so start capturing straight away - capture(); - } else { - setCapturePending(); - // start focusing - // Auto-focus can only work if viewfinder is running - if (mEngine->viewfinderControl().state() == CxeViewfinderControl::Running) { - mEngine->autoFocusControl().start(false); - } - } - - CX_DEBUG_EXIT_FUNCTION(); -} - -void CxuiStillPrecaptureView::capture() -{ - CX_DEBUG_ENTER_FUNCTION(); - mCapturePending = false; - - if (mEngine->mode() == Cxe::ImageMode) { - // do not start capturing, if it is already ongoing - // the user might be repeatedly triggering capture key - if (mEngine->stillCaptureControl().state() == CxeStillCaptureControl::Ready) { - // If focusing in progress, cancel it now. - // Set capture pending and continue once focusing is cancelled. - if(mEngine->autoFocusControl().state() == CxeAutoFocusControl::InProgress) { - mEngine->autoFocusControl().cancel(); - setCapturePending(); - } else { - // Engine uses disk space *estimate* for imagesLeft() so it - // should not cause significant delay / additional shutter lag. - if (mEngine->stillCaptureControl().imagesLeft()) { - mEngine->stillCaptureControl().reset(); //! @todo: Do not delete snapshots before images are really saved - mEngine->stillCaptureControl().capture(); - } else { - // Inform that error was encountered. - // Error manager will show necessary message to user. - emit errorEncountered(CxeError::DiskFull); - } - } - } else { - setCapturePending(); - } - } - - // after capturing check what is the new amount for images left - updateImagesLeftLabel(); - CX_DEBUG_EXIT_FUNCTION(); -} - -void CxuiStillPrecaptureView::setCapturePending() -{ - CX_DEBUG_ENTER_FUNCTION(); - mCapturePending = true; - QTimer::singleShot(CXUI_CAPTURE_PENDING_TIMEOUT, this, SLOT(resetCapturePendingFlag())); - CX_DEBUG_EXIT_FUNCTION(); -} - - -void CxuiStillPrecaptureView::goToVideo() -{ - CX_DEBUG_ENTER_FUNCTION(); - OstTrace0( camerax_performance, DUP1_CXUISTILLPRECAPTUREVIEW_GOTOVIDEO, "msg: e_CX_GO_TO_VIDEO_MODE 1" ); - - hideControls(); - mEngine->initMode(VideoMode); - emit changeToPrecaptureView(); - - CX_DEBUG_EXIT_FUNCTION(); -} - -/*! - CxuiStillPrecaptureView::handleAutoFocusStateChanged - - \sa focusAndCapture() - \sa capture() - \sa handleAutofocusKeyPressed() -*/ -void CxuiStillPrecaptureView::handleAutoFocusStateChanged(CxeAutoFocusControl::State newstate, CxeError::Id error) -{ - CX_DEBUG_ENTER_FUNCTION(); - CxeAutoFocusControl::Mode mode = mEngine->autoFocusControl().mode(); - CX_DEBUG( ("CxuiStillPrecaptureView::handleAutoFocusStateChanged <> error: %d mode: %d state %d", error, mode, - newstate ) ); - - - switch (newstate) { - case CxeAutoFocusControl::Failed: - case CxeAutoFocusControl::Ready: - if (mCapturePending) { - // focus and capture were grouped together, capture straight away - capture(); - } - break; - case CxeAutoFocusControl::Unknown: - // Capture key was pressed, focus has been cancelled, - // continue with capturing. - if(mCapturePending) { - CX_DEBUG(("mCapturePending is true, starting capture now")); - capture(); - } - break; - default: - break; - } - - CX_DEBUG_EXIT_FUNCTION(); -} - - -/*! -* Handle capture key full press. -*/ -void CxuiStillPrecaptureView::handleCaptureKeyPressed() -{ - CX_DEBUG_ENTER_FUNCTION(); - if (mEngine->mode() == Cxe::ImageMode) { - OstTrace0(camerax_performance, CXUISTILLPRECAPTUREVIEW_SHOT_TO_SHOT, "msg: e_CX_SHOT_TO_SHOT 1"); - OstTrace0(camerax_performance, CXUISTILLPRECAPTUREVIEW_SHOT_TO_SNAP, "msg: e_CX_SHOT_TO_SNAPSHOT 1"); - OstTrace0(camerax_performance, CXUISTILLPRECAPTUREVIEW_SHOT_TO_SAVE, "msg: e_CX_SHOT_TO_SAVE 1"); - - menu()->close(); - - // close open dialogs - closeDialogs(); - - if (mSelfTimer && mSelfTimer->isEnabled() ) { - if (mSelfTimer->isOngoing()) { - // dismiss selftimer and capture image - mSelfTimer->cancel(); - capture(); - } else { - // start selftimer if it is enabled and not yet started - mSelfTimer->startTimer(); - } - } else { - // normal capture - capture(); - } - } - CX_DEBUG_EXIT_FUNCTION(); -} - -/*! -* Handle capture key half pressed (aka "autofocus key press"). -*/ -void CxuiStillPrecaptureView::handleAutofocusKeyPressed() -{ - CX_DEBUG_ENTER_FUNCTION(); - OstTrace0( camerax_performance, CXUISTILLPRECAPTUREVIEW_AUTOFOCUS, "msg: e_CX_AUTOFOCUS_LOCK 1" ); - - // Base class handling needs to happen first to keep e.g. settings dialogs handling sane. - CxuiPrecaptureView::handleAutofocusKeyPressed(); - - if (!mEngine->autoFocusControl().supported()) { - CX_DEBUG(("Autofocus not supported, ignoring key press")); - CX_DEBUG_EXIT_FUNCTION(); - return; - } - - // in case of selftimer being enabled, autofocuskey does not start focusing - if (mSelfTimer && mSelfTimer->isEnabled()){ - CX_DEBUG(("Selftimer enabled, ignoring autofocus key press")); - CX_DEBUG_EXIT_FUNCTION(); - return; - } - - // Auto-focus can only work if viewfinder is running - if (mEngine->viewfinderControl().state() == CxeViewfinderControl::Running) { - - mEngine->autoFocusControl().start(); - } - - CX_DEBUG_EXIT_FUNCTION(); -} - -void CxuiStillPrecaptureView::handleAutofocusKeyReleased() -{ - CX_DEBUG_ENTER_FUNCTION(); - - // in case of selftimer being enabled, autofocuskey should not do anything - if (mSelfTimer && mSelfTimer->isEnabled()){ - CX_DEBUG(("Selftimer enabled, ignoring autofocus key release")); - CX_DEBUG_EXIT_FUNCTION(); - return; - } - - if (mEngine->autoFocusControl().supported()) { - // Check that capture is not in progress, or pending. - // Otherwise wouldn't want to cancel the focus. - CxeStillCaptureControl::State state(mEngine->stillCaptureControl().state()); - if (state != CxeStillCaptureControl::Capturing && !mCapturePending) { - mEngine->autoFocusControl().cancel(); - } else { - // set pending AF release - mPendingAfCanceling = true; - } - - } else { - CX_DEBUG(("Autofocus not supported, ignoring key release")); - } - - CX_DEBUG_EXIT_FUNCTION(); -} - -void CxuiStillPrecaptureView::showEvent(QShowEvent *event) -{ - CxuiPrecaptureView::showEvent(event); - - updateImagesLeftLabel(); - updateQualityIcon(); - updateFaceTrackingIcon(); - - // cancel selftimer when returning to precapture - // since selftimer needs to be turned off after capturing an image - // (with selftimer postcapture is always shown) - if (mSelfTimer && mSelfTimer->isEnabled()) { - mSelfTimer->cancel(); - } - - // In case the user presses and holds the auto-focus key (ie. half-press) - // in post-capture view, we need to start auto-focusing when entering - // the still precapture view. - if (event->type() == QEvent::Show && - mCaptureKeyHandler && mCaptureKeyHandler->isAutofocusKeyPressed()) { - - CX_DEBUG(("Still pre-capture coming visible and auto-focus key pressed -> starting AF")); - handleAutofocusKeyPressed(); - } -} - -/*! -* Allow showing UI controls? -*/ -bool CxuiStillPrecaptureView::allowShowControls() const -{ - // show controls when selftimer counter is not active - // and when autofocus key is not being pressed - bool engineOk(mEngine && mEngine->isEngineReady()); - bool selfTimerOk(!mSelfTimer || !mSelfTimer->isOngoing()); - bool keysOk(!mCaptureKeyHandler || !mCaptureKeyHandler->isAutofocusKeyPressed()); - - return engineOk && selfTimerOk && keysOk; -} - -/*! -* Handle change in viewfinder state. -*/ -void CxuiStillPrecaptureView::handleViewfinderStateChanged( - CxeViewfinderControl::State newState, CxeError::Id error) -{ - CX_DEBUG_ENTER_FUNCTION(); - // Call base class to get standby timer and display always visible when needed. - CxuiPrecaptureView::handleVfStateChanged(newState, error); - - if (newState == CxeViewfinderControl::Running) { - - // the toolbar is created when the viewfinder is started the first time - // in order to hide the delay caused by the creation - if(!mWidgetsLoaded) { - loadWidgets(); - } - - if(mMainWindow->currentView() == this && - mCaptureKeyHandler->isAutofocusKeyPressed()) { - // Viewfinder just started and the user is pressing the auto-focus key. - // Start focusing. - - CX_DEBUG(("Viewfinder starting and auto-focus key pressed -> starting AF")); - handleAutofocusKeyPressed(); - } - } - - CX_DEBUG_EXIT_FUNCTION(); -} - -void CxuiStillPrecaptureView::handleStillCaptureStateChanged( - CxeStillCaptureControl::State newState, CxeError::Id /*error*/) -{ - if (newState == CxeStillCaptureControl::Ready) { - OstTrace0(camerax_performance, DUP1_CXUISTILLPRECAPTUREVIEW_SHOT_TO_SHOT, "msg: e_CX_SHOT_TO_SHOT 0"); - - if (mCapturePending) { - CX_DEBUG(("mCapturePending is true, starting capture now")); - capture(); - } - } -} - -/*! - * Signal used to reset mCapturePending after a short timeout. If the image - * cannot be captured within a given time of the key press, it is better to cancel - * the whole operation. - */ -void CxuiStillPrecaptureView::resetCapturePendingFlag() -{ - CX_DEBUG_IN_FUNCTION(); - - mCapturePending = false; -} - -/* - Slot for handling scene mode change - \param scene QVariantMap containing settings related to the new scene mode - */ -void CxuiStillPrecaptureView::handleSceneChanged(const QVariant &newSceneData) -{ - CX_DEBUG_ENTER_FUNCTION(); - if (mEngine->mode() == Cxe::ImageMode) { - - CxeScene scene = newSceneData.toMap(); - // update toolbar scene mode icon - updateSceneIcon(scene[CxeSettingIds::SCENE_ID].toString()); - - // for now, we are only interested in flashmode change - if (scene.contains(CxeSettingIds::FLASH_MODE)) { - CX_DEBUG(("updating flash to: %d", scene[CxeSettingIds::FLASH_MODE].value())); - handleSettingValueChanged(CxeSettingIds::FLASH_MODE, scene[CxeSettingIds::FLASH_MODE]); - } else { - // No flash mode specified within the scene. - // Check from setting model what is it currently. - Cxe::FlashMode flashMode = mEngine->settings().get(CxeSettingIds::FLASH_MODE, Cxe::FlashAuto); - handleSettingValueChanged(CxeSettingIds::FLASH_MODE, QVariant(flashMode)); - } - - // If facetracking is changed, we need to update the indicator icon - if (scene.contains(CxeSettingIds::FACE_TRACKING)) { - handleSettingValueChanged(CxeSettingIds::FACE_TRACKING, scene[CxeSettingIds::FACE_TRACKING]); - } - - } - - CX_DEBUG_EXIT_FUNCTION(); -} - -/*! -* Enter standby mode. -*/ -void CxuiStillPrecaptureView::enterStandby() -{ - CX_DEBUG_ENTER_FUNCTION(); - - if (mSelfTimer && mSelfTimer->isOngoing()) { - // If self-timer is running, stop and reset the delay now. - mSelfTimer->reset(); - } - - // Base class handles releasing camera. - CxuiPrecaptureView::enterStandby(); - - CX_DEBUG_EXIT_FUNCTION(); -} - -/* - Slot for handling setting value changes. Notice that changing the scene mode - does not emit settingValueChanged signal. - \param key CxSettingIds key defining the changed setting - \param newValue QVariant containing the new setting value - - \sa CxuiStillPrecaptureView::handleSceneChanged(CxeScene &scene) - */ -void CxuiStillPrecaptureView::handleSettingValueChanged(const QString& key, QVariant newValue) -{ - CX_DEBUG_ENTER_FUNCTION(); - - if (mEngine->mode() == Cxe::ImageMode) { - - // update images left and image quality icons - if (key == CxeSettingIds::IMAGE_QUALITY) { - // update the quality indicator on screen - updateQualityIcon(); - // update images left when quality values are changed - updateImagesLeftLabel(); - } else if (key == CxeSettingIds::FACE_TRACKING) { - reloadIndicatorWidgets(); - updateFaceTrackingIcon(); - } else if (key == CxeSettingIds::GEOTAGGING) { - reloadIndicatorWidgets(); - } - - // update toolbar flash icon - if (mFlashSetting && key == CxeSettingIds::FLASH_MODE) { - CX_DEBUG((("flash mode: %d"), newValue.toInt())); - QString icon = getSettingItemIcon(key, newValue); - CX_DEBUG((("flash mode icon: %s"), icon.toAscii().constData())) - mFlashSetting->setIcon(HbIcon(icon)); - } - - } - - CX_DEBUG_EXIT_FUNCTION(); -} - - -/*! - Close open dialogs. -*/ -void CxuiStillPrecaptureView::closeDialogs() -{ - - if (mSettingsDialog && mSettingsDialog->isVisible()) { - mSettingsDialog->close(); - } - - if (mSceneModePopup && mSceneModePopup->isVisible()) { - mSceneModePopup->close(); - } - - if (mStillSettingsPopup && mStillSettingsPopup->isVisible()) { - mStillSettingsPopup->close(); - } - - hideSettingsGrid(); -} - - -/*! -*Helper method to create setting dialog -*/ -void CxuiStillPrecaptureView::launchSetting() -{ - CX_DEBUG_ENTER_FUNCTION(); - - QObject *action = sender(); - - if (action) { - QString settingsKey = action->property(PROPERTY_KEY_SETTING_ID).toString(); - CX_DEBUG(("settingsKey=%s", settingsKey.toAscii().constData())); - launchSettingsDialog(action); - // special case to get value changed event to the selftimer class - if (settingsKey == CxeSettingIds::SELF_TIMER) { - // selftimer is not found in settings so set the value now - mSettingsDialogList->setOriginalSelectedItemByValue(mSelfTimer->getTimeout()); - connect(mSettingsDialogList, SIGNAL(valueSelected(int)), - mSelfTimer, SLOT(changeTimeOut(int))); - } - } - - CX_DEBUG_EXIT_FUNCTION(); -} - -/*! - Update the images left counter -*/ -void CxuiStillPrecaptureView::updateImagesLeftLabel() -{ - CX_DEBUG_ENTER_FUNCTION(); - - if (mImagesLeft && mImagesLeftContainer) { - int images = mEngine->stillCaptureControl().imagesLeft(); - - if (images > CXUI_IMAGES_LEFT_LIMIT) { - mImagesLeftContainer->hide(); - } else { - mImagesLeftContainer->show(); - } - - CX_DEBUG(("Images left %d", images)); - mImagesLeft->setPlainText(hbTrId("txt_cam_fullscreen_imagesleft").arg(images)); - } - - CX_DEBUG_EXIT_FUNCTION(); -} - -/*! - Update the face tracking icon -*/ -void CxuiStillPrecaptureView::updateFaceTrackingIcon() -{ - CX_DEBUG_ENTER_FUNCTION(); - if (mFaceTrackingIcon && mEngine) { - QString key = ""; - QString icon = ""; - - key = CxeSettingIds::FACE_TRACKING; - - int currentValue = mEngine->settings().get(key, -1); - icon = getSettingItemIcon(key, currentValue); - - mFaceTrackingIcon->setIcon(HbIcon(icon)); - } - - CX_DEBUG_EXIT_FUNCTION(); -} - -// end of file