photosgallery/slideshow/view/src/shwslideshowvolumecontrol.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 13 Oct 2010 14:32:09 +0300
branchRCL_3
changeset 75 01504893d9cb
parent 60 5b3385a43d68
permissions -rw-r--r--
Revision: 201039 Kit: 201041

/*
* Copyright (c) 2007 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:    Volume control implementation
*
*/




// INCLUDE FILES
#include "shwslideshowvolumecontrol.h"

#include <alf/alfdisplay.h>
#include <alf/alftexture.h>
#include <alf/alfimage.h>
#include <alf/alfimagevisual.h>
#include <alf/alftextvisual.h>

#include <alf/alfgridlayout.h>
#include <alf/alfdecklayout.h>
#include <alf/alfanchorlayout.h>
#include <alf/alfanchorlayout.h>
#include <alf/alfimagebrush.h>
#include <alf/alfroster.h>
#include <alf/alfbrusharray.h>

#include <data_caging_path_literals.hrh>
#include <AknsUtils.h>          // skins
#include <glxicons.mbg>
#include <avkon.mbg>
#include <glxresourceutilities.h>   // for CGlxResourceUtilities

#include <AknUtils.h>
#include <StringLoader.h>

#include <glxlog.h>
#include <glxtracer.h>
#include <shwslideshowview.rsg>

#include "glxuiutility.h"
#include "glxtexturemanager.h"
#include "shwcallback.h"

// CONSTANTS
namespace
    {
    const TInt KShwVolumeControlXOffset = 0;
    _LIT( KIconsFilename, "glxicons.mif" );
    const TInt KShwVolumeControlWidthScaleFactor = 2;
    const TInt KShwVolumeMaxPercent = 100;
    const TInt KShwVolumeTextMaxLineCount = 1;   
    const TReal KControlWidthMultiplier = 0.2;
    const TReal KControlHeightMultiplier = 0.12;
    const TReal KOpacityOpaque = 1.0;
    const TReal KHalfOpacityOpaque = 0.4;
    const TReal KOpacityTransperent = 0.0;
    const TInt KValueGridCols = 2;
    const TInt KValueGridRows = 1;
    }
    
//! NOTE : This implementation does not go with the current Slide Show UI Spec 1.1
// UI specs need to be updated and a fine print needs to pe prepared about the 
// LAF of this control
// In that case the visual positioning can be adjusted by paddin and giving weights

// ======== MEMBER FUNCTIONS ========
// ---------------------------------------------------------------------------
// CShwSlideshowVolumeControl()
// ---------------------------------------------------------------------------
inline CShwSlideshowVolumeControl::CShwSlideshowVolumeControl( CAlfEnv& aEnv,
		CGlxUiUtility& aUtility, TTimeIntervalMicroSeconds32 aInterval)
		: iUtility(aUtility), iInterval(aInterval),iAlfEnv(aEnv)
	{
	}

// ---------------------------------------------------------------------------
// ~CShwSlideshowVolumeControl
// ---------------------------------------------------------------------------
CShwSlideshowVolumeControl::~CShwSlideshowVolumeControl()
	{
	TRACER("CShwSlideshowVolumeControl::~CShwSlideshowVolumeControl");
	GLX_LOG_INFO("CShwSlideshowVolumeControl::~CShwSlideshowVolumeControl" );
	// visuals
	if (iMainVisual)
        {
        iMainVisual->RemoveAndDestroyAllD();
        iMainVisual = NULL;
        }
	// timer
	if ( iTimer )
	    {
	    iTimer->Cancel();
	    }
	delete iTimer;
	}
	
// ---------------------------------------------------------------------------
// NewL
// ---------------------------------------------------------------------------	
CShwSlideshowVolumeControl* CShwSlideshowVolumeControl::NewL(
	CAlfEnv& aEnv,
	CGlxUiUtility& aUtility,
    TTimeIntervalMicroSeconds32 aInterval)
	{
	TRACER("CShwSlideshowVolumeControl::NewL");
	GLX_LOG_INFO("CShwSlideshowVolumeControl::NewL" );
	CShwSlideshowVolumeControl* self = new( ELeave ) 
	    CShwSlideshowVolumeControl( aEnv, aUtility, aInterval );
	CleanupStack::PushL( self );
	self->ConstructL();
	CleanupStack::Pop( self );
	return self;
	}
	
// ---------------------------------------------------------------------------
// ConstructL
// ---------------------------------------------------------------------------
void CShwSlideshowVolumeControl::ConstructL()
    {
    TRACER("CShwSlideshowVolumeControl::ConstructL");
    GLX_LOG_INFO("CShwSlideshowVolumeControl::ConstructL" );
	// Construct the base class.
	CAlfControl::ConstructL(iAlfEnv);
	
	//----------------------- LAYOUT HIERARCHY -------------------------------
	//
	//						 	 ->iBackgroundImageVisual
	//							|
	//							|					  ->iSpeakerImageVisual
	//							|					 |
	// iMainVisual-->iVisualDeck ->iValueGridVisual->
	//							|					 |
	//							|					  ->iPercentTextVisual
	//							|
	//							 ->iMuteImageVisual
	//
	//-------------------------------------------------------------------------
	
    iMainVisual = CAlfAnchorLayout::AddNewL(*this);
    
    iVisualDeck = CAlfDeckLayout::AddNewL(*this,iMainVisual);
    
    iValueGridVisual = CAlfGridLayout::AddNewL(*this,KValueGridCols,
    										KValueGridRows,iVisualDeck);
    
    // The visual elements of the control
    iBackgroundImageVisual = CAlfImageVisual::AddNewL(*this,iVisualDeck);
    iMuteImageVisual = CAlfImageVisual::AddNewL(*this,iVisualDeck);
    iSpeakerImageVisual = CAlfImageVisual::AddNewL(*this,iValueGridVisual);
    iPercentTextVisual = CAlfTextVisual::AddNewL(*this,iValueGridVisual);
    
    // BackGround Visual
    iBackgroundImageVisual->EnableBrushesL();
    iBackgroundImageVisual->SetOpacity( KHalfOpacityOpaque );

	// Get the icon file
	TFileName mifFile( KDC_APP_BITMAP_DIR );
    mifFile.Append( KIconsFilename );
    User::LeaveIfError( CompleteWithAppPath( mifFile ) );
    // Get the texture manager
   	CGlxTextureManager& textureMgr = iUtility.GlxTextureManager();
    // Load the background texture
    
    // Below given icon ID is to be changed once the Capped_element Icon
    // is available in the build
    CAlfTexture& backgroundTexture = textureMgr.CreateIconTextureL
        ( EMbmGlxiconsQgn_graf_adapt_search_bg, mifFile );
    
    // apply an image brush to the visual
    iBrush = CAlfImageBrush::NewL(iAlfEnv, TAlfImage( backgroundTexture ) );
    iBackgroundImageVisual->Brushes()->AppendL( iBrush, EAlfHasOwnership );
	iBackgroundImageVisual->SetScaleMode( CAlfImageVisual::EScaleFitInside );
	// Muted visual
	CAlfTexture& textureMuted = iUtility.GlxTextureManager().CreateIconTextureL
	    ( EMbmGlxiconsQgn_indi_mup_speaker_muted, mifFile );										
	iMuteImageVisual->SetImage( textureMuted );
    iMuteImageVisual->SetScaleMode( CAlfImageVisual::EScaleFitInside );
    
	// Speaker visual
	CAlfTexture& textureSpkr = iUtility.GlxTextureManager().CreateIconTextureL
        ( EMbmGlxiconsQgn_indi_mup_speaker, mifFile );
    iSpeakerImageVisual->SetImage( textureSpkr );
    iSpeakerImageVisual->SetScaleMode( CAlfImageVisual::EScaleFitInside );	
	
	//hide the volume level visualation by default
	iMainVisual->SetOpacity(KOpacityTransperent);

	// Only create the timer if an interval's been specified - 
	// default is to not use one.
	if ( iInterval.Int() != 0 )
		{
        iTimer = CPeriodic::NewL( CActive::EPriorityStandard );
		}
    }

// ---------------------------------------------------------------------------
// SetVolume
// ---------------------------------------------------------------------------
void CShwSlideshowVolumeControl::SetVolume(TInt aVolume, TInt aMaxVolume)
	{
	TRACER("CShwSlideshowVolumeControl::SetVolume");
	// Only allow positive values and
	// ensure that aVolume never exceeds aMaxVolume
	if ( aMaxVolume >= 0 && aVolume >= 0 && aVolume <= aMaxVolume )
		{
		iVolume = aVolume;
		iMaxVolume = aMaxVolume;
		}
	}

// ---------------------------------------------------------------------------
// Refresh
// ---------------------------------------------------------------------------
void CShwSlideshowVolumeControl::RefreshL()
	{
	TRACER("CShwSlideshowVolumeControl::RefreshL");
	if( ShowControlL() )
	    {
	    if ( iTimer )
	        {
	        // Restart the timer
	        iTimer->Cancel();
	        iTimer->Start(iInterval, iInterval, TShwCallBack< 
	                CShwSlideshowVolumeControl, 
	                &CShwSlideshowVolumeControl::TimerCallback> (this));
	        }
	    }
	}
	
// ---------------------------------------------------------------------------
// Hide
// ---------------------------------------------------------------------------
void CShwSlideshowVolumeControl::Hide()
	{
	TRACER("CShwSlideshowVolumeControl::Hide");
	// Hide our self
	CAlfDisplay* display = iUtility.Display();
	CAlfControlGroup* group = ControlGroup();

	if ( display && group )
		{
		CAlfRoster& roster = display->Roster();
		roster.Hide( *group );
		}	
	}
// ---------------------------------------------------------------------------
// ShowControlL
// ---------------------------------------------------------------------------
TBool CShwSlideshowVolumeControl::ShowControlL()
    {
    TRACER("CShwSlideshowVolumeControl::Refresh");
    TBool retVal = EFalse;
    // Hide and show our self
    CAlfDisplay* display = iUtility.Display();
    CAlfControlGroup* group = ControlGroup();

    if ( display && group )
        {
        CAlfRoster& roster = display->Roster();
        roster.Hide( *group );
        roster.ShowL( *group, KAlfRosterShowAtTop );
        retVal = ETrue;
        }  
    return retVal;  
    }
	
// ---------------------------------------------------------------------------
// TimerCallback
// ---------------------------------------------------------------------------
TInt CShwSlideshowVolumeControl::TimerCallback()
    {
    TRACER("CShwSlideshowVolumeControl::TimerCallback");
    GLX_LOG_ENTRY_EXIT( "CShwSlideshowVolumeControl::TimerCallback" );
    // Timed out so hide ourself
    Hide();
    if ( iTimer )
        {
        // Cancel the timer
        iTimer->Cancel();
        }
    return 0;
    }

// ---------------------------------------------------------------------------
// NotifyControlVisibility
// ---------------------------------------------------------------------------
void CShwSlideshowVolumeControl::NotifyControlVisibility( TBool aIsVisible,
    CAlfDisplay& /*aDisplay*/ )
	{	
	TRACER("CShwSlideshowVolumeControl::NotifyControlVisibility");
    GLX_LOG_ENTRY_EXIT
        ( "CShwSlideshowVolumeControl::NotifyControlVisibility" );
    GLX_LOG_INFO1
        ( "CShwSlideshowVolumeControl, is visible = %d", aIsVisible );
	if ( !aIsVisible )
		{
		RemoveLayoutVisuals();
		RemoveControlVisuals();
		}
	else
		{
		TRAP_IGNORE( SetAndLayoutVisualsL() );
		}
	}

// ---------------------------------------------------------------------------
// RemoveLayoutVisuals
// ---------------------------------------------------------------------------	
void CShwSlideshowVolumeControl::RemoveLayoutVisuals()
    {
    TRACER("CShwSlideshowVolumeControl::RemoveLayoutVisuals");
    GLX_LOG_ENTRY_EXIT( "CShwSlideshowVolumeControl::RemoveLayoutVisuals" );
	//not required for now
    }

// ---------------------------------------------------------------------------
// RemoveControlVisuals
// ---------------------------------------------------------------------------	
void CShwSlideshowVolumeControl::RemoveControlVisuals()
    {
    TRACER("CShwSlideshowVolumeControl::RemoveControlVisuals");
    GLX_LOG_ENTRY_EXIT( "CShwSlideshowVolumeControl::RemoveControlVisuals" );
    // Remove the visuals visibility
    iMainVisual->SetOpacity(KOpacityTransperent);
    }
	
// ---------------------------------------------------------------------------
// SetAndLayoutVisualsL
// ---------------------------------------------------------------------------	
void CShwSlideshowVolumeControl::SetAndLayoutVisualsL()
    {
    TRACER("CShwSlideshowVolumeControl::SetAndLayoutVisualsL");
    GLX_LOG_ENTRY_EXIT( "CShwSlideshowVolumeControl::SetAndLayoutVisualsL" );

	iMainVisual->SetFlag(EAlfVisualFlagManualSize);
    iMainVisual->SetFlag(EAlfVisualFlagManualPosition);
	//calculate control size
	iControlSize  = iUtility.DisplaySize();
	iControlSize.iHeight *= KControlHeightMultiplier;
	iControlSize.iWidth *= KControlWidthMultiplier;
	//set the control size
	iMainVisual->SetSize(iControlSize);
	
	//calculate the control position
	TInt xPos = ( iUtility.DisplaySize().iWidth - iControlSize.iWidth )
		    / KShwVolumeControlWidthScaleFactor;
	TAlfRealPoint pos( xPos, KShwVolumeControlXOffset );
	iMainVisual->SetPos(pos);
	
	//set the anchors
	User::LeaveIfError( iMainVisual->SetRelativeAnchorRect(
  	0, EAlfAnchorOriginLeft, EAlfAnchorOriginTop, TAlfRealPoint(),
	 EAlfAnchorOriginRight, EAlfAnchorOriginBottom, TAlfRealPoint() ) );
	//update the child visuals
	 iMainVisual->UpdateChildrenLayout();
	 iVisualDeck->UpdateChildrenLayout();
	 iValueGridVisual->UpdateChildrenLayout();
	 
    // Other visuals' layout depends on the volume
    TInt volume = CurrentVolumeAsPercentage();
    
    if (volume == 0)
        {
        // volume = 0% 
        // show muted icon (no %age value)
        SetMuteVisualVisibility();
        }
    else
        {
        // 0 < volume <= 100% 
        // show speaker and %age
        SetValueVisualVisibilityL( volume );
        }
    }

// ---------------------------------------------------------------------------
// SetMuteVisualVisibility
// ---------------------------------------------------------------------------
void CShwSlideshowVolumeControl::SetMuteVisualVisibility()
    {
    TRACER("CShwSlideshowVolumeControl::SetMuteVisualVisibilitys");
    GLX_LOG_ENTRY_EXIT( "CShwSlideshowVolumeControl::SetMuteVisualVisibility" );

	// set the mute visual's visibility to 1 and the value visual to 0
    iValueGridVisual->SetOpacity(KOpacityTransperent);
    iMuteImageVisual->SetOpacity(KOpacityOpaque);
    iMainVisual->SetOpacity(KOpacityOpaque);
    }

// ---------------------------------------------------------------------------
// SetValueVisualVisibilityL
// ---------------------------------------------------------------------------
void CShwSlideshowVolumeControl::SetValueVisualVisibilityL(TInt aVolume)
    {
    TRACER("CShwSlideshowVolumeControl::SetValueVisualVisibilityL");
    GLX_LOG_ENTRY_EXIT( "CShwSlideshowVolumeControl::SetValueVisualVisibilityL" );
   	
   	// update the percentage visual
   	iPercentTextVisual->SetStyle( EAlfTextStyleSmall, EAlfBackgroundTypeDark );
    iPercentTextVisual->SetMaxLineCount( KShwVolumeTextMaxLineCount );
    iPercentTextVisual->SetWrapping( CAlfTextVisual::ELineWrapTruncate );
   
    // Load the localised string
    HBufC* text = StringLoader::LoadLC( R_SHW_VOLUME_PERCENTAGE, aVolume );
    TPtr ptr = text->Des();
    AknTextUtils::LanguageSpecificNumberConversion( ptr );

    iPercentTextVisual->SetTextL( *text );
    iPercentTextVisual->SetColor(KRgbBlack);
    
    CleanupStack::PopAndDestroy( text );

    iPercentTextVisual->EnableShadow(EFalse);    
    iPercentTextVisual->MoveToFront();
    
    // set the value grid visual's visibility to 1 and the mute visual to 0
    iMuteImageVisual->SetOpacity(KOpacityTransperent);
    iValueGridVisual->SetOpacity(KOpacityOpaque);
    // Text and speaker icon should come top on background
    // so making first in layout's visual list.
    iValueGridVisual->MoveToFront();
    iMainVisual->SetOpacity(KOpacityOpaque);
    }

// ---------------------------------------------------------------------------
// CurrentVolumeAsPercentage()
// ---------------------------------------------------------------------------
TInt CShwSlideshowVolumeControl::CurrentVolumeAsPercentage()
	{
	TRACER("CShwSlideshowVolumeControl::CurrentVolumeAsPercentage");
	GLX_LOG_ENTRY_EXIT("CShwSlideshowVolumeControl::CurrentVolumeAsPercentage");
	TInt retVal = iVolume;

	// guard against any undefined numbers
	if ( iVolume > 0 && iMaxVolume > 0 )
		{
		TReal numerator( iVolume );
		TReal denominator( iMaxVolume );
		TReal working = ( numerator / denominator ) * KShwVolumeMaxPercent;
		retVal = TInt( working );
		}
	else if ( iVolume == iMaxVolume )
		{
		retVal = KShwVolumeMaxPercent;
		}
	return retVal;
	}
// End of File