diff -r 61bc0f252b2b -r bac7acad7cb3 camerauis/cameraapp/generic/GsCamcorderPlugin/src/GSCamQualitySettingContainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/camerauis/cameraapp/generic/GsCamcorderPlugin/src/GSCamQualitySettingContainer.cpp Wed Sep 01 12:30:54 2010 +0100 @@ -0,0 +1,703 @@ +/* +* Copyright (c) 2007-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: Implements the quality slider for image and video settings* +*/ + + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // CAknTitlePane +#include +#include + +#include "CamAppUiBase.h" +#include "GSCamQualitySettingContainer.h" +#include "GSCamQualitySettingSlider.h" +#include "CamUtility.h" +#include "camuiconstants.h" +#include "MCamAppController.h" +#include "CamControllerObservers.h" +#include "MCamStaticSettings.h" + +#include "camconfiguration.h" + +// CONSTANTS +const TUint KMaxRemainingImagesShown = 9999; + +_LIT( KRemainingImagesNumberFormat, "%04d" ); + +// MACROS + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CGSCamQualitySettingContainer::CGSCamQualitySettingContainer +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CGSCamQualitySettingContainer::CGSCamQualitySettingContainer( + MCamAppController& aController, + TCamCameraMode aMode, + CCoeControl* aParent ) + : iController( aController ), + iParent( aParent ), + iMode ( aMode ) + { + + } + +// ----------------------------------------------------------------------------- +// CGSCamQualitySettingContainer::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CGSCamQualitySettingContainer::ConstructL() + { + CCamAppUiBase* appUi = static_cast( CCoeEnv::Static()->AppUi() ); + MCamStaticSettings& model = appUi->StaticSettingsModel(); + iController.AddControllerObserverL( this ); + + TCamSettingItemIds settingType = ( ECamControllerVideo == iMode ) + ? ECamSettingItemVideoQuality + : ECamSettingItemPhotoQuality; + + iSlider = CGSCamQualitySettingSlider::NewL( iParent, this, settingType, 0, + &(model.Configuration()) ); + + + iSelectedQuality = model.IntegerSettingValue( settingType ); + + iTimeFormat = ( ECamControllerVideo == iMode ) + ? iEikonEnv->AllocReadResourceL( R_QTN_TIME_DURAT_LONG ) + : KRemainingImagesNumberFormat().AllocL(); + + TFileName resFileName; + CamUtility::ResourceFileName( resFileName ); + TPtrC resname = resFileName; + + // ...phone memory icon + AknIconUtils::CreateIconL( iPhoneIcon, + iPhoneIconMask, + resname, + EMbmCameraappQgn_indi_cam4_memory_phone, + EMbmCameraappQgn_indi_cam4_memory_phone_mask ); + + // ...mmc icon + AknIconUtils::CreateIconL( iMMCIcon, + iMMCIconMask, + resname, + EMbmCameraappQgn_indi_cam4_memory_mmc, + EMbmCameraappQgn_indi_cam4_memory_mmc_mask ); + + // ...mass storage icon + AknIconUtils::CreateIconL( iMassStorageIcon, + iMassStorageIconMask, + resname, + EMbmCameraappQgn_indi_cam4_memory_mass, + EMbmCameraappQgn_indi_cam4_memory_mass_mask ); + + UpdateRemainingTextL(); + } + +// ----------------------------------------------------------------------------- +// CGSCamQualitySettingContainer::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CGSCamQualitySettingContainer* +CGSCamQualitySettingContainer::NewL( MCamAppController& aController, + TCamCameraMode aMode, + CCoeControl* aParent ) + { + CGSCamQualitySettingContainer* self = + new( ELeave ) CGSCamQualitySettingContainer( aController, aMode, aParent ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + + +// ----------------------------------------------------------------------------- +// CGSCamQualitySettingContainer::~CGSCamQualitySettingContainer +// Destructor +// ----------------------------------------------------------------------------- +// +CGSCamQualitySettingContainer::~CGSCamQualitySettingContainer() + { + PRINT( _L("Camera => ~CGSCamQualitySettingContainer") ); + CCamAppUiBase* appUi = static_cast( iEikonEnv->AppUi() ); + if ( appUi ) + { + TInt resId = ( ECamControllerVideo == iMode ) + ? R_CAM_VIDEO_SETTINGS_TITLE_NAME + : R_CAM_PHOTO_SETTINGS_TITLE_NAME; + + TRAP_IGNORE( appUi->SetTitleL( resId ) ); + } + iController.RemoveControllerObserver( this ); + delete iPhoneIcon; + delete iPhoneIconMask; + delete iMMCIcon; + delete iMMCIconMask; + delete iMassStorageIcon; + delete iMassStorageIconMask; + + delete iTimeFormat; + + // delete descriptors from arrays + if ( iTitleArray ) + { + iTitleArray->Reset(); + delete iTitleArray; + } + if ( iDescArray ) + { + iDescArray->Reset(); + delete iDescArray; + } + if ( iCurrentDescLineArray ) + { + iCurrentDescLineArray->Reset(); + delete iCurrentDescLineArray; + } + + iLayoutSettingDescLines.Reset(); + iEnumArray.Reset(); + + delete iSlider; + delete iTextTitle; + delete iTextTopSubtitle; + delete iTextBottomSubtitle; + delete iTextRemainingTitle; + + iSupportedQualitiesArray.Close(); + PRINT( _L("Camera <= ~CGSCamQualitySettingContainer") ); + } + +// ----------------------------------------------------------------------------- +// CGSCamQualitySettingContainer::SelectedQuality +// Returns the quality selected by the slider +// ----------------------------------------------------------------------------- +// +TInt CGSCamQualitySettingContainer::SelectedQuality() const + { + return iSelectedQuality; + } + +// ----------------------------------------------------------------------------- +// CGSCamQualitySettingContainer::ConstructFromResourceL +// Constructs the container from the resource +// ----------------------------------------------------------------------------- +// +void CGSCamQualitySettingContainer::ConstructFromResourceL( TResourceReader& aReader ) + { + CCamAppUiBase* appUi = static_cast( iEikonEnv->AppUi() ); + // set up the container windows here as setting page window + // isn't created until CAknSettingPage::ConstructFromResourceL is called + SetContainerWindowL( *iParent ); + iSlider->SetContainerWindowL( *iParent ); + + // read the texts from the resource file + iTextTitle = aReader.ReadHBufCL(); + appUi->SetTitleL( iTextTitle->Des() ); + iTextTopSubtitle = aReader.ReadHBufCL(); + iTextBottomSubtitle = aReader.ReadHBufCL(); + iTextRemainingTitle = aReader.ReadHBufCL(); + + TCamPsiKey key = ( ECamControllerVideo == iMode ) + ? ECamPsiSupportedVideoQualities + : ECamPsiSupportedStillQualities; + + + iConfiguration = &(appUi->StaticSettingsModel().Configuration()); + iConfiguration->GetPsiIntArrayL( key, iSupportedQualitiesArray ); + + iTitleArray = new( ELeave ) CDesCArrayFlat( 1 ); + iDescArray = new( ELeave ) CDesCArrayFlat( 1 ); + + // read the descriptive text and split the text into 3 lines + ReadInTextArrayL( aReader, *iTitleArray ); + ReadInTextArrayL( aReader, *iDescArray ); + + // Read the setting enums that match with the text arrays. + TInt count = aReader.ReadInt16(); + TInt suppCount = iSupportedQualitiesArray.Count(); + + TInt i = 0; + TInt j = 0; + + for ( i = 0; i < count && j < suppCount ; i++ ) + { + TInt val = aReader.ReadInt16(); + + // check if it's a supported quality level + if ( i == iSupportedQualitiesArray[j] ) + { + if ( ECamControllerVideo == iMode ) + { + User::LeaveIfError( iEnumArray.Append( static_cast( val ) ) ); + } + else + { + User::LeaveIfError( iEnumArray.Append( static_cast( val ) ) ); + } + j++; + } + } + + // TCamImageQualitySetting enum starts with highest quality == 0 + // so convert this to value the slider understands i.e. 0 == lowest + TInt sliderValue = iEnumArray.Count() - 1 - iSelectedQuality; + + iSlider->InitializeL( sliderValue, iTextTopSubtitle, iTextBottomSubtitle ); + + // Set the new range of values + iSlider->SetRange( 0, iEnumArray.Count() - 1 ); + + iCurrentDescLineArray = new( ELeave ) CArrayFixFlat( 3 ); + // Use the layout info from the first line for width and font + TAknLayoutText layout = iLayoutSettingDescLines[0]; + AknTextUtils::WrapToArrayL( ( *iDescArray )[iSelectedQuality], + layout.TextRect().Width(), + *( layout.Font() ), + *iCurrentDescLineArray ); + } + +// ----------------------------------------------------------------------------- +// CGSCamQualitySettingContainer::CountComponentControls +// return the number of component controls +// ----------------------------------------------------------------------------- +// +TInt CGSCamQualitySettingContainer::CountComponentControls() const + { + return 1; // the slider + } + +// ----------------------------------------------------------------------------- +// CGSCamQualitySettingContainer::ComponentControl +// return the control at a given index +// ----------------------------------------------------------------------------- +// +CCoeControl* CGSCamQualitySettingContainer::ComponentControl( TInt /*aIndex*/ ) const + { + return iSlider; + } + +// ----------------------------------------------------------------------------- +// CGSCamQualitySettingContainer::Draw +// Draws the container +// ----------------------------------------------------------------------------- +// +void CGSCamQualitySettingContainer::Draw( const TRect& /*aRect*/ ) const + { + PRINT( _L("Camera => CGSCamQualitySettingContainer::Draw") ); + CWindowGc& gc = SystemGc(); + + // Draw skin background + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + MAknsControlContext* cc = AknsDrawUtils::ControlContext( this ); + AknsDrawUtils::Background( skin, cc, gc, Rect() ); + + // draw the title text + TRgb color; + AknsUtils::GetCachedColor( skin, color, KAknsIIDQsnTextColors, + EAknsCIQsnTextColorsCG6 ); + + // draw the quality description text + DrawQualityTexts( gc, color ); + + // draw the remaining images/remaining video time + iLayoutRemainingTitle.DrawText( gc, iTextRemainingTitle->Des(), ETrue, color ); + + // draw the remaining images/remaining video time + TBufC<40> Buf( iTextRemaining ); + TPtr Pointer = Buf.Des(); + AknTextUtils::LanguageSpecificNumberConversion( Pointer ); + iLayoutRemainingText.DrawText( gc, /*iTextRemaining*/Buf, ETrue, color ); + + // draw the current location icon + DrawStorageIcon( gc ); + + PRINT( _L("Camera <= CGSCamQualitySettingContainer::Draw") ); + } + +// ----------------------------------------------------------------------------- +// CGSCamQualitySettingContainer::SizeChanged +// Handles a change in the size of the control +// ----------------------------------------------------------------------------- +// +void CGSCamQualitySettingContainer::SizeChanged() + { + TRAP_IGNORE( ReadLayoutL() ); + } + +// ----------------------------------------------------------------------------- +// CGSCamQualitySettingContainer::OfferKeyEventL +// Handles key events +// ----------------------------------------------------------------------------- +// +TKeyResponse CGSCamQualitySettingContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + TKeyResponse keyResponse = iSlider->OfferKeyEventL( aKeyEvent, aType ); + if ( keyResponse == EKeyWasConsumed ) + { + ReportEventL( MCoeControlObserver::EEventStateChanged ); + } + return keyResponse; + } + +// ----------------------------------------------------------------------------- +// CGSCamQualitySettingContainer::HandleSettingValueUpdateL +// Handles a change to the setting value of the slider +// ----------------------------------------------------------------------------- +// +void CGSCamQualitySettingContainer::HandleSettingValueUpdateL( TInt aNewValue ) + { + ASSERT ( aNewValue >= 0 && + aNewValue < iEnumArray.Count() ); + + // The slider values range from Max at the top (eg 5) to Min at the bottom (0). + // For quality settings enum (0 is Max, 4 is Min) need to invert this + TInt index = iSlider->MaxValue() - aNewValue; + if ( ECamControllerVideo == iMode ) + { + iSelectedQuality = index; + } + else + { + iSelectedQuality = index; + } + + // remove the old lines + iCurrentDescLineArray->Reset(); + // Use the layout info from the first line for width and font + TAknLayoutText layout = iLayoutSettingDescLines[0]; + AknTextUtils::WrapToArrayL( ( *iDescArray )[iSelectedQuality], + layout.TextRect().Width(), + *( layout.Font() ), + *iCurrentDescLineArray ); + + /* - + // Update the number of images remaining + UpdateRemainingTextL(); + */ + // + + ResetRemainingTextL(); + + // Results in a call to CCamQualitySettingPage::UpdateSettingL() + ReportEventL( MCoeControlObserver::EEventStateChanged ); + + /*ActivateGc(); + Window().Invalidate( iLayoutDescRect.Rect() ); + DeactivateGc();*/ + DrawNow(); + } + +// ----------------------------------------------------------------------------- +// CGSCamQualitySettingContainer::HandleControllerEventL +// Handles a change in the controller +// ----------------------------------------------------------------------------- +// + +void CGSCamQualitySettingContainer::HandleControllerEventL( + TCamControllerEvent aEvent, TInt /*aError*/ ) + + { + PRINT( _L("Camera => CGSCamQualitySettingContainer::HandleControllerEventL") ); + CCamAppUiBase* appUi = static_cast( iEikonEnv->AppUi() ); + TBool redrawNeeded = EFalse; + // If this is a capture complete event, or the image quality or save + // location has changed... + if ( aEvent == ECamEventImageQualityChanged || + aEvent == ECamEventSaveLocationChanged || + aEvent == ECamEventVideoQualityChanged ) + { + UpdateRemainingTextL(); + + if ( aEvent == ECamEventSaveLocationChanged ) + { + /*TCamSettingItemIds storageLocation = ( ECamControllerVideo == iMode) + ? ECamSettingItemVideoMediaStorage + : ECamSettingItemPhotoMediaStorage;*/ + // update location + /*if ( static_cast( iEikonEnv->AppUi() )->IsMMCRemovedNotePending() ) + { + iStorageLocation = static_cast< TCamMediaStorage > + ( iController.IntegerSettingValueUnfiltered( storageLocation ) ); + } + else + { + iStorageLocation = static_cast< TCamMediaStorage > + ( iController.IntegerSettingValue( storageLocation ) ); + }*/ + } + + redrawNeeded = ETrue; + } + else + { + // Other events: no action + } + + + if ( redrawNeeded ) + { + DrawNow(); + } + PRINT( _L("Camera <= CGSCamQualitySettingContainer::HandleControllerEventL") ); + } + + +// ----------------------------------------------------------------------------- +// CGSCamQualitySettingContainer::ReadLayoutL +// Reads the layout information from the resource file +// ----------------------------------------------------------------------------- +// +void CGSCamQualitySettingContainer::ReadLayoutL() + { + TAknLayoutRect settingLayout; + settingLayout.LayoutRect( Rect(), AknLayoutScalable_Apps::main_cam_set_pane( 0 ) ); + TRect settingRect( settingLayout.Rect() ); + + AknLayoutUtils::LayoutControl( iSlider, settingRect, AknLayoutScalable_Apps::main_cset_slider_pane( 2 ) ); + + // set the layouts for the rects + // containing the descriptions + TRect infoboxRect; + iLayoutDescRect.LayoutRect( settingRect, AknLayoutScalable_Apps::main_cset_text_pane( 0 ) ); + infoboxRect = iLayoutDescRect.Rect(); + + // set quality setting title layout + iLayoutSettingTitle.LayoutText( infoboxRect, AknLayoutScalable_Apps::main_cset_text_pane_t1( 0 ) ); + + // set layouts for 3 lines of descriptive text + iLayoutSettingDescLines.Reset(); + TAknLayoutText layout; + layout.LayoutText( infoboxRect, AknLayoutScalable_Apps::main_cset_text_pane_t2( 0 ) ); + User::LeaveIfError( iLayoutSettingDescLines.Append( layout ) ); + layout.LayoutText( infoboxRect, AknLayoutScalable_Apps::main_cset_text_pane_t3( 0 ) ); + User::LeaveIfError( iLayoutSettingDescLines.Append( layout ) ); + layout.LayoutText( infoboxRect, AknLayoutScalable_Apps::main_cset_text_pane_t4( 0 ) ); + User::LeaveIfError( iLayoutSettingDescLines.Append( layout ) ); + + // set remaining text layouts + iLayoutRemainingTitle.LayoutText( infoboxRect, AknLayoutScalable_Apps::main_cset_text_pane_t6( 0 ) ); + iLayoutRemainingText.LayoutText( infoboxRect, AknLayoutScalable_Apps::main_cset_text_pane_t7( 0 ) ); + // read the storage icon layout + iLayoutIcon.LayoutRect( infoboxRect, AknLayoutScalable_Apps::main_cset_text_pane_g1( 0 ) ); + + // set size for different memory type icons + TSize iconSize ( iLayoutIcon.Rect().Size() ); + AknIconUtils::SetSize( iPhoneIcon, iconSize, EAspectRatioPreserved ); + AknIconUtils::SetSize( iMMCIcon, iconSize, EAspectRatioPreserved ); + AknIconUtils::SetSize( iMassStorageIcon, iconSize, EAspectRatioPreserved ); + } + +// ----------------------------------------------------------------------------- +// CGSCamQualitySettingContainer::DrawQualityTexts +// Draws the quality information texts +// ----------------------------------------------------------------------------- +// +void CGSCamQualitySettingContainer::DrawQualityTexts( CWindowGc& aGc, TRgb aColor ) const + { + // Set the brushstyle to ENullBrush in order to not show the + // text background box. Otherwise it would show slightly from + // beneath the shaded background + //aGc.SetBrushStyle( CGraphicsContext::ENullBrush ); + iLayoutSettingTitle.DrawText + ( aGc, ( *iTitleArray )[iSelectedQuality], ETrue, aColor ); + + TInt count = Min( iCurrentDescLineArray->Count(), iLayoutSettingDescLines.Count() ); + + for ( TInt i = 0; i < count; i++ ) + { + if ( i < count ) + { + iLayoutSettingDescLines[i]. + DrawText( aGc, ( *iCurrentDescLineArray )[i], ETrue, aColor ); + } + } + } + +// --------------------------------------------------------- +// CGSCamQualitySettingContainer::DrawStorageIcon +// Draw the icon for the media storage location +// --------------------------------------------------------- +// +void CGSCamQualitySettingContainer::DrawStorageIcon( CWindowGc& aGc ) const + { + TInt key = (ECamControllerVideo == iMode) + ? ECamSettingItemVideoMediaStorage + : ECamSettingItemPhotoMediaStorage; + TCamMediaStorage storageLocation = + static_cast( iController.IntegerSettingValue( key ) ); + CFbsBitmap* icon = NULL; + CFbsBitmap* mask = NULL; + + switch( storageLocation ) + { + case ECamMediaStoragePhone: + { + icon = iPhoneIcon; + mask = iPhoneIconMask; + } + break; + case ECamMediaStorageMassStorage: + { + icon = iMassStorageIcon; + mask = iMassStorageIconMask; + } + break; + case ECamMediaStorageCard: + { + icon = iMMCIcon; + mask = iMMCIconMask; + } + break; + case ECamMediaStorageNone: + default: + { + //TODO: Get icons when none is available + } + break; + } + + iLayoutIcon.DrawImage( aGc, icon, mask ); + } + +// --------------------------------------------------------- +// CGSCamQualitySettingContainer::DrawRemainingText +// Draw the remaining image count/video time +// --------------------------------------------------------- +// +void CGSCamQualitySettingContainer::DrawRemainingText( CWindowGc& aGc ) const + { + // Set the brushstyle to ENullBrush in order to not show the + // text background box. Otherwise it would show slightly from + // beneath the shaded background + aGc.SetBrushStyle( CGraphicsContext::ENullBrush ); + aGc.Clear( iLayoutRemainingText.TextRect() ); + iLayoutRemainingText.DrawText( aGc, iTextRemaining ); + } + +// --------------------------------------------------------- +// CGSCamQualitySettingContainer::UpdateRemainingTextL +// Update the remaining image count/video time remaining +// --------------------------------------------------------- +// +void CGSCamQualitySettingContainer::UpdateRemainingTextL() + { + PRINT( _L("Camera => CGSCamQualitySettingContainer::UpdateRemainingTextL") ); + + if ( ECamControllerVideo == iMode ) + { + // Get the total remaining record time from the controller + TTime time ( iController.RecordTimeRemaining().Int64() ); +/* - + HBufC* timeFormat = + iEikonEnv->AllocReadResourceLC( R_QTN_TIME_DURAT_MIN_SEC_WITH_ZERO ); + time.FormatL( iTextRemaining, *timeFormat ); + CleanupStack::PopAndDestroy( timeFormat ); +*/ +// + + time.FormatL( iTextRemaining, *iTimeFormat ); + } + else + { + // use the stored image resolution to calculated the remaining images + TBool burstActive = static_cast + ( iEikonEnv->AppUi() )->IsBurstEnabled(); + + TInt imagesLeft = iController.ImagesRemaining( ECamMediaStorageCurrent, + burstActive, + iSelectedQuality ); + TInt showLeft = Min( imagesLeft, KMaxRemainingImagesShown ); +// - +// iTextRemaining.Format( KRemainingImagesNumberFormat, showLeft ); +// + + iTextRemaining.Format( *iTimeFormat, showLeft ); + } + + PRINT( _L("Camera <= CGSCamQualitySettingContainer::UpdateRemainingTextL") ); + } + +// --------------------------------------------------------- +// ResetRemainingTextL +// --------------------------------------------------------- +// +void +CGSCamQualitySettingContainer::ResetRemainingTextL() + { + /* mm: Disabled for now. Below code sets to 00:00. + Proposed --:-- for video, no action for image (too fast). + if ( ECamControllerVideo == iMode ) + { + TTime time( TInt64( 0 ) ); + time.FormatL( iTextRemaining, *iTimeFormat ); + } + else + { + } + */ + } + +// --------------------------------------------------------- +// CGSCamQualitySettingContainer::ReadInTextArrayL +// Populate a text array from the resource definition of available +// quality texts using the supported quality values +// --------------------------------------------------------- +// +void CGSCamQualitySettingContainer::ReadInTextArrayL( TResourceReader& aReader, CDesCArrayFlat& aArray ) + { + CDesCArrayFlat* tempArray; + tempArray = aReader.ReadDesC16ArrayL(); + + TInt descCount = tempArray->Count(); + TInt suppCount = iSupportedQualitiesArray.Count(); + + TInt i = 0; + + for ( i = 0; i < suppCount; i++ ) + { + TInt descriptionIndex = + iConfiguration->MapSupportedQualityToQualityDescriptor( + iMode == ECamControllerVideo, + iSupportedQualitiesArray[i] ); + + if ( descriptionIndex >= 0 + && descriptionIndex < descCount ) + { + aArray.AppendL( ( *tempArray )[descriptionIndex] ); + } + } + tempArray->Reset(); + delete tempArray; + tempArray = NULL; + } + +// End of File