diff -r 61bc0f252b2b -r bac7acad7cb3 camerauis/cameraapp/generic/src/CamCaptureSetupSlider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/camerauis/cameraapp/generic/src/CamCaptureSetupSlider.cpp Wed Sep 01 12:30:54 2010 +0100 @@ -0,0 +1,1055 @@ +/* +* Copyright (c) 2007-2009 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: Class for showing the EV slider* +*/ + + + +// INCLUDE FILES +#include "CamCaptureSetupSlider.h" +#include "CamPanic.h" // Panic codes +#include "CamUtility.h" +#include "CamAppUi.h" +#include "CamPSI.h" +#include "camconfiguration.h" +#include "CameraUiConfigManager.h" + +#include +#include +#include +#include +#include +#include // For CCoeAppUiBase +#include // For CEikApplication +#include // resource reader +#include +#include +#include + +#include +#include +#include + +// EXTERNAL DATA STRUCTURES + +// EXTERNAL FUNCTION PROTOTYPES + +// CONSTANTS +const TInt KDivisorFactor = 1024; // Avoids using TReal maths, use factor of 2 + +// Contrast slider value indexes +const TInt KContrastPlusInd = 0; +const TInt KContrastMinusInd = 1; +const TInt KContrastIconInd = 2; + +// EV slider value indexes +const TInt KEVPlus20Ind = 0; +const TInt KEVPlus15Ind = 1; +const TInt KEVPlus10Ind = 2; +const TInt KEVPlus05Ind = 3; +const TInt KEV0Ind = 4; +const TInt KEVMinus05Ind = 5; +const TInt KEVMinus10Ind = 6; +const TInt KEVMinus15Ind = 7; +const TInt KEVMinus20Ind = 8; +const TUint32 KToolbarExtensionBgColor = 0x00000000; +const TInt KToolBarExtensionBgAlpha = 0x7F; + + + + +// ============================ MEMBER FUNCTIONS =============================== + +// --------------------------------------------------------- +// CCamSliderLegend::~CCamSliderLegend +// destructor +// --------------------------------------------------------- +// +CCamSliderLegend::~CCamSliderLegend() + { + PRINT( _L("Camera => ~CCamSliderLegend") ); + delete iText; + delete iBitmap; + delete iMask; + PRINT( _L("Camera <= ~CCamSliderLegend") ); + } + +CCamSliderLegend::CCamSliderLegend( TBool aFullySkinned ) +: iFullySkinned( aFullySkinned ) + { + } + +// --------------------------------------------------------- +// CCamSliderLegend::Draw +// Draws the legend +// --------------------------------------------------------- +// +void CCamSliderLegend::Draw( CWindowGc& aGc ) const + { + if ( iItem == ECamSliderLegendItemText ) + { + TRgb color; + if( iFullySkinned ) + { + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + AknsUtils::GetCachedColor( skin, color, KAknsIIDQsnTextColors, + EAknsCIQsnTextColorsCG6 ); + } + else + { + color=KRgbWhite; + } + iPosition.DrawText( aGc, iText->Des(), ETrue, color ); + } + else + { + iIconRect.DrawImage( aGc, iBitmap, iMask ); + } + } + +// --------------------------------------------------------- +// CCamSliderLegend::Rect +// Returns the legend rect +// --------------------------------------------------------- +// +TRect CCamSliderLegend::Rect() const + { + if ( iItem == ECamSliderLegendItemText ) + { + return iPosition.TextRect(); + } + else + { + return iIconRect.Rect(); + } + } + + +// --------------------------------------------------------- +// CCamSliderLegend::ConstructTextL +// Constructs a text element from resources with given layout +// --------------------------------------------------------- +// +void CCamSliderLegend::ConstructTextL( + TResourceReader& aReader, + const TRect& aRect, + const TAknTextComponentLayout& aLayout ) + { + iItem = static_cast( aReader.ReadInt16() ); + if ( iItem == ECamSliderLegendItemText ) + { // must be a text + iPosition.LayoutText( aRect, aLayout ); + iText = aReader.ReadHBufC16L(); + aReader.ReadInt32(); // bitmap + aReader.ReadInt32(); // mask + } + } + +// --------------------------------------------------------- +// CCamSliderLegend::ConstructIconL +// Constructs an icon from resources with given layout +// --------------------------------------------------------- +// +void CCamSliderLegend::ConstructIconL( + TResourceReader& aReader, + const TRect& aRect, + const TAknWindowComponentLayout& aLayout ) + { + iItem = static_cast( aReader.ReadInt16() ); + if ( iItem == ECamSliderLegendItemIcon ) + { // must be an icon + iIconRect.LayoutRect( aRect, aLayout ); + iText = aReader.ReadHBufC16L(); + TInt bitmap = aReader.ReadInt32(); + TInt mask = aReader.ReadInt32(); + + // Create component bitmaps + TFileName resFileName; + CamUtility::ResourceFileName( resFileName ); + TPtrC resname = resFileName; + AknIconUtils::CreateIconL( iBitmap, iMask, resname, bitmap, mask ); + AknIconUtils::SetSize( iBitmap, iIconRect.Rect().Size() ); + } + } + + +// ----------------------------------------------------------------------------- +// CCamCaptureSetupSlider::CCamCaptureSetupSlider +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CCamCaptureSetupSlider::CCamCaptureSetupSlider( MCamSettingValueObserver* aObserver, + TCamSettingItemIds aSettingType, + TInt aSteps, + TBool aFullySkinned ) +: iSettingObserver( aObserver ), iSettingType( aSettingType ), iSteps( aSteps ), iFullySkinned( aFullySkinned ) + { + } + + +/* + * CCamCaptureSetupSlider::InitializeSliderValuesL + */ + +void CCamCaptureSetupSlider::InitializeSliderValuesL() + { + CCameraUiConfigManager* configManager = static_cast + ( iCoeEnv->AppUi() )->AppController().UiConfigManagerPtr(); + TBool configureRunTime = EFalse; + RArray range; + CleanupClosePushL( range ); + + switch ( iSettingType ) + { + case ECamSettingItemDynamicPhotoBrightness: + case ECamSettingItemDynamicVideoBrightness: + case ECamSettingItemUserSceneBrightness: + { + if ( configManager && configManager->IsBrightnessSupported() ) + { + configManager->SupportedBrightnessRangeL( range ); + configureRunTime = ETrue; + } + break; + } + case ECamSettingItemDynamicPhotoContrast: + case ECamSettingItemDynamicVideoContrast: + case ECamSettingItemUserSceneContrast: + { + if ( configManager && configManager->IsContrastSupported() ) + { + configManager->SupportedContrastRangeL( range ); + configureRunTime = ETrue; + } + } + break; + + case ECamSettingItemDynamicPhotoExposure: + case ECamSettingItemDynamicVideoExposure: + case ECamSettingItemUserSceneExposure: + { + // get range of EV values from product specific utility + TCamEvCompRange evRange = + static_cast( + iCoeEnv->AppUi() )->AppController().EvRange(); + + iMaxSliderValue = evRange.iMaxValue * evRange.iStepsPerUnit; + iMinSliderValue = evRange.iMinValue * evRange.iStepsPerUnit; + iNumSliderValues = iMaxSliderValue - iMinSliderValue; + } + break; + + default: + { + } + break; + } + + if ( configureRunTime ) + { + if ( range.Count() > 0 ) + { + iMinSliderValue = range[0]; //min value + iMaxSliderValue = range[1]; // max value + iNumSliderValues = range[range.Count()-1]; // steps + } + } + + CleanupStack::PopAndDestroy( &range ); + + } + +// ----------------------------------------------------------------------------- +// CCamCaptureSetupSlider::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CCamCaptureSetupSlider::ConstructL( const CCoeControl* aParent ) + { + __ASSERT_DEBUG( aParent!=NULL, CamPanic( ECamPanicNullPointer ) ); + + InitializeSliderValuesL(); + + iParentControl = aParent; + SetContainerWindowL( *iParentControl ); + + TFileName resFileName; + CamUtility::ResourceFileName( resFileName ); + TPtrC resname = resFileName; + + // Create component bitmaps + AknIconUtils::CreateIconL( iBitmapShaft, + iBitmapShaftMask, + resname, + EMbmCameraappQgn_graf_nslider_cam4_empty, + EMbmCameraappQgn_graf_nslider_cam4_empty_mask ); + + AknIconUtils::CreateIconL( iBitmapThumb, + iBitmapThumbMask, + resname, + EMbmCameraappQgn_graf_nslider_cam4_marker, + EMbmCameraappQgn_graf_nslider_cam4_marker_mask ); + + AknIconUtils::CreateIconL( iBitmapThumbSelected, + iBitmapThumbSelectedMask, + resname, + EMbmCameraappQgn_graf_nslider_cam4_marker_selected, + EMbmCameraappQgn_graf_nslider_cam4_marker_selected_mask ); + iBitmapThumbCurrent = iBitmapThumb; + iBitmapThumbCurrentMask = iBitmapThumbMask; + } + +// ----------------------------------------------------------------------------- +// CCamCaptureSetupSlider::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CCamCaptureSetupSlider* CCamCaptureSetupSlider::NewL( const CCoeControl* aParent, + MCamSettingValueObserver* aObserver, + TCamSettingItemIds aSettingItem, + TInt aSteps, + TBool aFullySkinned ) + { + CCamCaptureSetupSlider* self = + new( ELeave ) CCamCaptureSetupSlider( aObserver, aSettingItem, aSteps, + aFullySkinned ); + CleanupStack::PushL( self ); + self->ConstructL( aParent ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CCamCaptureSetupSlider::~CCamCaptureSetupSlider +// Destructor +// ----------------------------------------------------------------------------- +// +CCamCaptureSetupSlider::~CCamCaptureSetupSlider() + { + PRINT( _L("Camera => ~CCamCaptureSetupSlider") ); + + // Destroy legend strings + iLegendArray.ResetAndDestroy(); + + delete iBitmapShaft; + delete iBitmapShaftMask; + delete iBitmapThumb; + delete iBitmapThumbMask; + delete iBitmapThumbSelected; + delete iBitmapThumbSelectedMask; + PRINT( _L("Camera <= ~CCamCaptureSetupSlider") ); + } + +// ----------------------------------------------------------------------------- +// CCamCaptureSetupSlider::InitializeL +// Sets up the slider with the initial value +// ----------------------------------------------------------------------------- +// +void CCamCaptureSetupSlider::InitializeL( TInt aValue ) + { + // Check the initial value is valid. If no, leave. + if ( aValue < iMinSliderValue || + aValue > iMaxSliderValue ) + { + User::Leave( KErrArgument ); + } + + iValue = aValue; + } + +// ----------------------------------------------------------------------------- +// CCamCaptureSetupSlider::MinValue +// Returns the minimum slider value +// ----------------------------------------------------------------------------- +// +TInt CCamCaptureSetupSlider::MinValue() const + { + return iMinSliderValue; + } + +// ----------------------------------------------------------------------------- +// CCamCaptureSetupSlider::MaxValue +// Returns the maximum slider value +// ----------------------------------------------------------------------------- +// +TInt CCamCaptureSetupSlider::MaxValue() const + { + return iMaxSliderValue; + } + + +// ----------------------------------------------------------------------------- +// CCamCaptureSetupSlider::SetRange +// Sets the minimum and maximum values of the slider control +// ----------------------------------------------------------------------------- +// +void CCamCaptureSetupSlider::SetRange( TInt aMin, TInt aMax ) + { + ASSERT( aMin < aMax ); + iMinSliderValue = aMin; + iMaxSliderValue = aMax; + iNumSliderValues = iMaxSliderValue; + } + + +// ----------------------------------------------------------------------------- +// CCamCaptureSetupSlider::Draw +// Draws the slider +// ----------------------------------------------------------------------------- +// +void CCamCaptureSetupSlider::Draw( const TRect& /*aRect*/ ) const + { + CWindowGc& gc = SystemGc(); + + if( iFullySkinned ) + { + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + MAknsControlContext *cc = AknsDrawUtils::ControlContext( iParentControl ); + AknsDrawUtils::Background( skin, cc, iParentControl, gc, Rect() ); + } + else + { + gc.SetDrawMode( CGraphicsContext::EDrawModeWriteAlpha ); + gc.SetPenSize( TSize (1,1) ); + gc.SetPenStyle( CGraphicsContext::ENullPen ); + gc.SetPenColor( TRgb( 0x00ffffff, KToolBarExtensionBgAlpha ) ); + gc.SetBrushColor( TRgb( KToolbarExtensionBgColor, KToolBarExtensionBgAlpha ) ); + gc.SetBrushStyle( CGraphicsContext::ESolidBrush ); + gc.DrawRect( Rect() ); + } + + // STEP 1: Draw the legend text + TInt count = iLegendArray.Count(); + TInt i = 0; + for ( i = 0; i < count; i++ ) + { + iLegendArray[i]->Draw( gc ); + } + + CFbsBitmap* shaft = iBitmapShaft; + CFbsBitmap* shaftMask = iBitmapShaftMask; + + // Step 2: Draw the shaft bitmap + if ( shaft ) + { + iShaftLayout.DrawImage( gc, shaft, shaftMask ); + } + + // Step 3: Work out the position of the thumb + TPoint thumbPoint = iThumbPoint; + + // This is the max bitmap offset from the top of the shaft that the thumb can be + TInt maxVOffset = iShaftLayout.Rect().Size().iHeight - iBitmapThumb->SizeInPixels().iHeight; + + // This is the no. of pixels for a "step" + TInt stepInPixels = ( maxVOffset * KDivisorFactor ) / iNumSliderValues; + + // Thumb position = top of shaft + delta + TInt nbrSteps = iMaxSliderValue - iValue; + thumbPoint.iY = iShaftLayout.Rect().iTl.iY + stepInPixels * nbrSteps / KDivisorFactor; + + // Step 4: Blit the thumb bitmap + gc.BitBltMasked( thumbPoint, iBitmapThumbCurrent, iBitmapThumb->SizeInPixels(), iBitmapThumbCurrentMask, ETrue ); + } + + +// --------------------------------------------------------- +// CCamCaptureSetupSlider::SizeChanged +// Calculates the new minimum size +// --------------------------------------------------------- +// +void CCamCaptureSetupSlider::SizeChanged() + { + TRAPD( ignore, ReadLayoutL() ); + if ( ignore ) + { + // Do nothing ( removes build warning ) + } + + // Work out the minimum size + TInt count = iLegendArray.Count(); + + TRect minimumRect; + + // Start min rect as first legend text + if ( count > 0 ) + { + minimumRect = iLegendArray[0]->Rect(); + } + + // Take into account the other legend texts + TInt i; + for ( i = 1; i < count; i++ ) + { + minimumRect.BoundingRect( iLegendArray[i]->Rect() ); + } + + // Take into account the shaft bitmap + minimumRect.BoundingRect( iShaftLayout.Rect() ); + + iMinimumSize = minimumRect.Size(); + } + + +// ----------------------------------------------------------------------------- +// CCamCaptureSetupSlider::OfferKeyEventL +// Allows the user to change the current EV value via key presses. +// ----------------------------------------------------------------------------- +// +TKeyResponse CCamCaptureSetupSlider::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType ) + { + PRINT( _L("CCamCaptureSetupSlider::OfferKeyEventL") ); + if ( aType == EEventKey ) + { + if ( aKeyEvent.iScanCode == EStdKeyUpArrow ) + { + if ( iValue < iMaxSliderValue ) + { + iValue ++; + iSettingObserver->HandleSettingValueUpdateL( iValue ); // Tell observer about change + DrawNow(); + } + + return EKeyWasConsumed; + } + else if ( aKeyEvent.iScanCode == EStdKeyDownArrow ) + { + if ( iValue > iMinSliderValue ) + { + iValue --; + iSettingObserver->HandleSettingValueUpdateL( iValue ); // Tell observer about change + DrawNow(); + } + + return EKeyWasConsumed; + } + else if ( aKeyEvent.iCode == EKeyOK && aKeyEvent.iRepeats == 0 ) + { + return EKeyWasConsumed; + } + // otherwise, do nothing + else + { + // empty statement to remove Lint error + } + } + return EKeyWasNotConsumed; + } + +// --------------------------------------------------------- +// CCamCaptureSetupSlider::MinimumSize +// --------------------------------------------------------- +// +TSize CCamCaptureSetupSlider::MinimumSize() + { + TSize zerosize = TSize( 0, 0 ); + if ( iMinimumSize == zerosize ) + { + SizeChanged(); + } + return iMinimumSize; + } + + +// --------------------------------------------------------- +// CCamCaptureSetupSlider::ReadLayoutL +// --------------------------------------------------------- +// +void CCamCaptureSetupSlider::ReadLayoutL() + { + TRect shaftRect; + TSize shaftSize; + + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, + iLayoutAreaRect ); + + // layout area rectangle contains the area, where components need to be + // drawn to. the container size is the whole screen, but the layouts are + // for the client area. aRect is the container size that might include or + // might not include statuspane area. calculating area self will + // go around the problem + + // We're starting again from scratch, so delete the old legend layouts + iLegendArray.ResetAndDestroy(); + if ( CamUtility::IsNhdDevice() ) + { + TouchLayoutL(); + } + else + { + NonTouchLayoutL(); + } + + AknIconUtils::SetSize( iBitmapThumb, + iThumbLayout.Rect().Size(), EAspectRatioPreserved ); + AknIconUtils::SetSize( iBitmapThumbSelected, + iThumbLayout.Rect().Size(), EAspectRatioPreserved ); + + // set the shaft icon size + shaftRect = iShaftLayout.Rect(); + shaftSize = shaftRect.Size(); + AknIconUtils::SetSize( iBitmapShaft, shaftSize, EAspectRatioNotPreserved ); + + // calculate initial thumb position + iThumbPoint = TPoint( shaftRect.iTl.iX + shaftSize.iWidth/2 - + iBitmapThumb->SizeInPixels().iWidth/2, + shaftRect.iTl.iY + shaftSize.iHeight/2 - + iBitmapThumb->SizeInPixels().iHeight/2 ); + } + +// --------------------------------------------------------- +// CCamCaptureSetupSlider::TouchLayoutL +// --------------------------------------------------------- +// +void CCamCaptureSetupSlider::TouchLayoutL() + { + TRect statusPaneRect; + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EStatusPane, + statusPaneRect ); + iLayoutAreaRect.BoundingRect( statusPaneRect ); + + // Get the slider layout + TAknLayoutRect sliderLayout; + sliderLayout.LayoutRect( iLayoutAreaRect, + AknLayoutScalable_Apps::main_cset_slider_pane( 1 ) ); + TRect sliderRect( sliderLayout.Rect() ); + + // Set the thumb layout and icon size + iThumbLayout.LayoutRect( sliderRect, + AknLayoutScalable_Apps::main_cset_slider_pane_g18( 0 ) ); + + if ( iSettingType == ECamSettingItemDynamicPhotoContrast || + iSettingType == ECamSettingItemDynamicVideoContrast || + iSettingType == ECamSettingItemUserSceneContrast ) + { + // Set the shaft layout and icon size for Contrast slider + iShaftLayout.LayoutRect( sliderRect, + AknLayoutScalable_Apps::cset_slider_pane( 5 ) ); + // set Contrast slider legend layouts + TouchContrastLayoutL( sliderRect ); + } + else + { + // Set the shaft layout and icon size for EV slider + iShaftLayout.LayoutRect( sliderRect, + AknLayoutScalable_Apps::cset_slider_pane( 7 ) ); + // set EV slider legend layouts + TouchEVLayoutL( sliderRect ); + } + } + +// ----------------------------------------------------------------------------- +// CCamCaptureSetupSlider::NonTouchLayout +// ----------------------------------------------------------------------------- +// +void CCamCaptureSetupSlider::NonTouchLayoutL() + { + // Non-touch has a visible title & status panes + TRect titlePaneRect; + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::ETitlePane, + titlePaneRect ); + iLayoutAreaRect.Move( 0, -titlePaneRect.Height() ); + + iThumbLayout.LayoutRect( Rect(), + AknLayoutScalable_Apps::main_cset6_slider_pane_g1( 2 ) ); + + if ( iSettingType == ECamSettingItemDynamicPhotoContrast || + iSettingType == ECamSettingItemDynamicVideoContrast || + iSettingType == ECamSettingItemUserSceneContrast ) + { + // Set the shaft layout for Contrast slider + iShaftLayout.LayoutRect( Rect(), + AknLayoutScalable_Apps::cset6_slider_pane( 5 ) ); + // set Contrast slider legend layouts + NonTouchContrastLayoutL( Rect() ); + } + else + { + // Set the shaft layout for EV slider + iShaftLayout.LayoutRect( Rect(), + AknLayoutScalable_Apps::cset6_slider_pane( 6 ) ); + // set EV slider legend layouts + NonTouchEVLayoutL( Rect() ); + } + } + +// ----------------------------------------------------------------------------- +// CCamCaptureSetupSlider::TouchContrastLayoutL +// ----------------------------------------------------------------------------- +// +void CCamCaptureSetupSlider::TouchContrastLayoutL( const TRect& aParentRect ) + { + TInt resourceId = ROID(R_CAM_CAPTURE_SETUP_SLIDER_CONTRAST_ARRAY_ID); + TResourceReader reader; + iEikonEnv->CreateResourceReaderLC( reader, resourceId ); + + const TInt count = reader.ReadInt16(); + + // Read all EV entries from the resource file and construct them with layout + for ( TInt i = 0; i < count; i++ ) + { + CCamSliderLegend* legend = new ( ELeave ) CCamSliderLegend( iFullySkinned ); + CleanupStack::PushL( legend ); + switch ( i ) + { + case KContrastPlusInd : + { + legend->ConstructTextL( + reader, + aParentRect, + AknLayoutScalable_Apps::main_cset_slider_pane_t14( 5 ) ); + } + break; + case KContrastMinusInd : + { + legend->ConstructTextL( + reader, + aParentRect, + AknLayoutScalable_Apps::main_cset_slider_pane_t15( 5 ) ); + } + break; + case KContrastIconInd : + { + legend->ConstructIconL( + reader, + aParentRect, + AknLayoutScalable_Apps::main_cset_slider_pane_g15( 2 ) ); + } + break; + default: + { + } + break; + } + User::LeaveIfError( iLegendArray.Append( legend ) ); + CleanupStack::Pop( legend ); + } + + CleanupStack::PopAndDestroy(); // reader + } + +// ----------------------------------------------------------------------------- +// CCamCaptureSetupSlider::NonTouchContrastLayoutL +// ----------------------------------------------------------------------------- +// +void CCamCaptureSetupSlider::NonTouchContrastLayoutL( + const TRect& aParentRect ) + { + TInt resourceId = ROID(R_CAM_CAPTURE_SETUP_SLIDER_CONTRAST_ARRAY_ID); + TResourceReader reader; + iEikonEnv->CreateResourceReaderLC( reader, resourceId ); + + const TInt count = reader.ReadInt16(); + + // Read all EV entries from the resource file + // and construct them with layout + for ( TInt i = 0; i < count; i++ ) + { + CCamSliderLegend* legend = new ( ELeave ) CCamSliderLegend; + CleanupStack::PushL( legend ); + switch ( i ) + { + case KContrastPlusInd : + { + legend->ConstructTextL( + reader, + aParentRect, + AknLayoutScalable_Apps::main_cset6_slider_pane_t14( 5 ) ); + } + break; + case KContrastMinusInd : + { + legend->ConstructTextL( + reader, + aParentRect, + AknLayoutScalable_Apps::main_cset6_slider_pane_t15( 5 ) ); + } + break; + case KContrastIconInd : + { + legend->ConstructIconL( + reader, + aParentRect, + AknLayoutScalable_Apps::main_cset6_slider_pane_g15( 2 ) ); + } + break; + default: + { + } + break; + } + User::LeaveIfError( iLegendArray.Append( legend ) ); + CleanupStack::Pop( legend ); + } + + CleanupStack::PopAndDestroy(); // reader + } + +// ----------------------------------------------------------------------------- +// CCamCaptureSetupSlider::TouchEVLayoutL +// ----------------------------------------------------------------------------- +// +void CCamCaptureSetupSlider::TouchEVLayoutL( const TRect& aParentRect ) + { + TInt resourceId = ROID(R_CAM_CAPTURE_SETUP_SLIDER_EV_ARRAY_ID); + TResourceReader reader; + iEikonEnv->CreateResourceReaderLC( reader, resourceId ); + + const TInt count = reader.ReadInt16(); + + // Read all Contrast entries from the resource file + // and construct them with layout + for ( TInt i = 0; i < count; i++ ) + { + CCamSliderLegend* legend = new ( ELeave ) CCamSliderLegend( iFullySkinned ); + CleanupStack::PushL( legend ); + switch ( i ) + { + case KEVPlus20Ind : + { + legend->ConstructTextL( + reader, + aParentRect, + AknLayoutScalable_Apps::main_cset_slider_pane_t1( 6 ) ); + } + break; + case KEVPlus15Ind : + { + legend->ConstructTextL( + reader, + aParentRect, + AknLayoutScalable_Apps::main_cset_slider_pane_t8( 2 ) ); + } + break; + case KEVPlus10Ind : + { + legend->ConstructTextL( + reader, + aParentRect, + AknLayoutScalable_Apps::main_cset_slider_pane_t2( 3 ) ); + } + break; + case KEVPlus05Ind : + { + legend->ConstructTextL( + reader, + aParentRect, + AknLayoutScalable_Apps::main_cset_slider_pane_t9( 2 ) ); + } + break; + case KEV0Ind : + { + legend->ConstructTextL( + reader, + aParentRect, + AknLayoutScalable_Apps::main_cset_slider_pane_t3( 3 ) ); + } + break; + case KEVMinus05Ind : + { + legend->ConstructTextL( + reader, + aParentRect, + AknLayoutScalable_Apps::main_cset_slider_pane_t10( 2 ) ); + } + break; + case KEVMinus10Ind : + { + legend->ConstructTextL( + reader, + aParentRect, + AknLayoutScalable_Apps::main_cset_slider_pane_t4( 3 ) ); + } + break; + case KEVMinus15Ind : + { + legend->ConstructTextL( + reader, + aParentRect, + AknLayoutScalable_Apps::main_cset_slider_pane_t11( 2 ) ); + } + break; + case KEVMinus20Ind : + { + legend->ConstructTextL( + reader, + aParentRect, + AknLayoutScalable_Apps::main_cset_slider_pane_t5( 3 ) ); + } + break; + default: + { + } + break; + } + User::LeaveIfError( iLegendArray.Append( legend ) ); + CleanupStack::Pop( legend ); + } + + CleanupStack::PopAndDestroy(); // reader + } + + + +// ----------------------------------------------------------------------------- +// CCamCaptureSetupSlider::NonTouchEVLayoutL +// ----------------------------------------------------------------------------- +// +void CCamCaptureSetupSlider::NonTouchEVLayoutL( const TRect& aParentRect ) + { + TInt resourceId = ROID(R_CAM_CAPTURE_SETUP_SLIDER_EV_ARRAY_ID); + TResourceReader reader; + iEikonEnv->CreateResourceReaderLC( reader, resourceId ); + + const TInt count = reader.ReadInt16(); + + // Read all Contrast entries from the resource file + // and construct them with layout + for ( TInt i = 0; i < count; i++ ) + { + CCamSliderLegend* legend = new ( ELeave ) CCamSliderLegend; + CleanupStack::PushL( legend ); + switch ( i ) + { + case KEVPlus20Ind : + { + legend->ConstructTextL( reader, aParentRect, + AknLayoutScalable_Apps::main_cset6_slider_pane_t1( 5 ) ); + } + break; + case KEVPlus15Ind : + { + legend->ConstructTextL( reader, aParentRect, + AknLayoutScalable_Apps::main_cset6_slider_pane_t8( 2 ) ); + } + break; + case KEVPlus10Ind : + { + legend->ConstructTextL( reader, aParentRect, + AknLayoutScalable_Apps::main_cset6_slider_pane_t2( 3 ) ); + } + break; + case KEVPlus05Ind : + { + legend->ConstructTextL( reader, aParentRect, + AknLayoutScalable_Apps::main_cset6_slider_pane_t9( 2 ) ); + } + break; + case KEV0Ind : + { + legend->ConstructTextL( reader, aParentRect, + AknLayoutScalable_Apps::main_cset6_slider_pane_t3( 3 ) ); + } + break; + case KEVMinus05Ind : + { + legend->ConstructTextL( reader, aParentRect, + AknLayoutScalable_Apps::main_cset6_slider_pane_t10( 2 ) ); + } + break; + case KEVMinus10Ind : + { + legend->ConstructTextL( reader, aParentRect, + AknLayoutScalable_Apps::main_cset6_slider_pane_t4( 3 ) ); + } + break; + case KEVMinus15Ind : + { + legend->ConstructTextL( reader, aParentRect, + AknLayoutScalable_Apps::main_cset6_slider_pane_t11( 2 ) ); + } + break; + case KEVMinus20Ind : + { + legend->ConstructTextL( reader, aParentRect, + AknLayoutScalable_Apps::main_cset6_slider_pane_t5( 3 ) ); + } + break; + default: + break; + } + User::LeaveIfError( iLegendArray.Append( legend ) ); + CleanupStack::Pop( legend ); + } + + CleanupStack::PopAndDestroy(); // reader + } + +// ----------------------------------------------------------------------------- +// CCamCaptureSetupSlider::HandlePointerEventL +// Handles slider pointer events +// ----------------------------------------------------------------------------- +// +void CCamCaptureSetupSlider::HandlePointerEventL(const TPointerEvent& aPointerEvent) + { + if( !Rect().Contains(aPointerEvent.iPosition) && iBitmapThumbCurrent != iBitmapThumbSelected ) + { + return; + } + CCoeControl::HandlePointerEventL( aPointerEvent ); + + // This is the max bitmap offset from the top of the shaft that the thumb can be + TInt maxVOffset = iShaftLayout.Rect().Size().iHeight - iBitmapThumb->SizeInPixels().iHeight; + + // This is the no. of pixels for a "step" + TInt stepInPixels = ( maxVOffset * KDivisorFactor ) / iNumSliderValues; + + // Calculate new setting value + TInt oldValue = iValue; + TInt deltaY = aPointerEvent.iPosition.iY - iShaftLayout.Rect().iTl.iY; + TInt nbrSteps = deltaY / ( stepInPixels / KDivisorFactor ); + iValue = iMaxSliderValue - nbrSteps; + + if ( iValue < iMinSliderValue ) + { + iValue = iMinSliderValue; + } + + if (iValue > iMaxSliderValue) + { + iValue = iMaxSliderValue; + } + + if ( iValue != oldValue && aPointerEvent.iType == TPointerEvent::EDrag ) + { + MTouchFeedback* feedback = MTouchFeedback::Instance(); + if ( feedback ) + { + feedback->InstantFeedback( ETouchFeedbackSensitive ); + } + } + + if ( aPointerEvent.iType == TPointerEvent::EButton1Down ) + { + // Change thumb marker to selected + iBitmapThumbCurrent = iBitmapThumbSelected; + iBitmapThumbCurrentMask = iBitmapThumbSelectedMask; + } + + if ( aPointerEvent.iType == TPointerEvent::EButton1Up ) + { + // Change thumb marker to normal + iBitmapThumbCurrent = iBitmapThumb; + iBitmapThumbCurrentMask = iBitmapThumbMask; + } + + iSettingObserver->HandleSettingValueUpdateL( iValue ); // Tell observer about change + DrawNow(); + static_cast( iCoeEnv->AppUi() )-> + AppController().StartIdleTimer(); + } + +// End of File +