videditor/VideoEditorUiComponents/src/VeiSlider.cpp
author Mikael Laine <mikael.laine@ixonos.com>
Fri, 29 Jan 2010 14:08:33 +0200
changeset 0 951a5db380a0
permissions -rw-r--r--
Committing the Video Editor package under the Eclipse Public License

/*
* Copyright (c) 2010 Ixonos Plc.
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the "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:
* Ixonos Plc
*
* Description:  
*
*/


#include "VeiSlider.h"
#include "VeiSlider.pan"
#include "VideoEditorDebugUtils.h"

#include <VideoEditorUiComponents.mbg>
#include <fbs.h>
#include <aknutils.h>
#include <AknIconUtils.h>
#include <eikenv.h>

// CONSTANTS
_LIT(KSliderMifFile, "\\resource\\apps\\VideoEditorUiComponents.mif");

const TInt KTabAspectRatioX = 10;
const TInt KTabAspectRatioY = 24;

//=============================================================================
//
//	class CVeiSlider member functions
//
//=============================================================================

//=============================================================================
EXPORT_C CVeiSlider::~CVeiSlider()
    {
    delete iSliderBg;
	delete iSliderBgMask;
	delete iSliderTab;
	delete iSliderTabMask;
    }

//=============================================================================
CVeiSlider::CVeiSlider()
    {
    // no implementation required
    }

//=============================================================================
TInt CVeiSlider::CountComponentControls() const
    {
    return 0;
    }

//=============================================================================
CCoeControl* CVeiSlider::ComponentControl(TInt /*aIndex*/) const
    {
    return NULL;
    }

// setters

//=============================================================================
EXPORT_C void CVeiSlider::SetMinimum(TInt aValue)
	{
	iMinimumValue = aValue;
	}

//=============================================================================
EXPORT_C void CVeiSlider::SetMaximum(TInt aValue)
	{
	iMaximumValue = aValue;
	}

//=============================================================================
EXPORT_C void CVeiSlider::SetStep(TUint aValue)
	{
	iStep = aValue;
	}

//=============================================================================
EXPORT_C void CVeiSlider::SetStepAmount(TUint8 aValue)
	{
	iNumberOfSteps = aValue;
	
	if(aValue == 0)
		{
		iStep = 0;
		}
	else
		{
		iStep = (iMaximumValue-iMinimumValue) / aValue;
		}
	}

//=============================================================================
EXPORT_C void CVeiSlider::SetPosition(TInt aValue)
	{
	__ASSERT_ALWAYS( aValue >= iMinimumValue, Panic(EVeiSliderPanicIndexUnderflow) );
	__ASSERT_ALWAYS( aValue <= iMaximumValue, Panic(EVeiSliderPanicIndexOverflow) );

	iPosition = aValue;
	}

// getters

//=============================================================================
EXPORT_C TInt CVeiSlider::Minimum() const
	{
	return iMinimumValue;
	}

//=============================================================================
EXPORT_C TInt CVeiSlider::Maximum() const
	{
	return iMaximumValue;
	}

//=============================================================================
EXPORT_C TInt CVeiSlider::Step() const
	{
	return iStep;
	}

//=============================================================================
EXPORT_C TInt CVeiSlider::SliderPosition() const
	{
	return iPosition;
	}

//=============================================================================
EXPORT_C void CVeiSlider::Increment()
	{
	iPosition += iStep;
	if(iPosition > iMaximumValue)
		{
		iPosition = iMaximumValue;
		}
	}

//=============================================================================
EXPORT_C void CVeiSlider::Decrement()
	{
	iPosition -= iStep;
	if(iPosition < iMinimumValue)
		{
		iPosition = iMinimumValue;
		}
	}

//=============================================================================
void CVeiSlider::LoadBitmapL( CFbsBitmap*& aBitmap, CFbsBitmap*& aMask, TInt aBitmapId, TInt aMaskId ) const
	{
    TFileName iconFile( KSliderMifFile );
  
    User::LeaveIfError( CompleteWithAppPath(iconFile) );

    // Get ids for bitmap and mask
    AknIconUtils::CreateIconL(
        aBitmap,
        aMask,
        iconFile,
        aBitmapId,
        aMaskId
        );                
	}


//=============================================================================
//
//	class CVeiVerticalSlider member functions
//
//=============================================================================

//=============================================================================
EXPORT_C CVeiVerticalSlider* CVeiVerticalSlider::NewL(const TRect& aRect, const CCoeControl& aControl)
	{
	CVeiVerticalSlider* self = CVeiVerticalSlider::NewLC(aRect, aControl);
	CleanupStack::Pop(self);
	return self;
	}

//=============================================================================
EXPORT_C CVeiVerticalSlider* CVeiVerticalSlider::NewLC(const TRect& aRect, const CCoeControl& aControl)
    {
    CVeiVerticalSlider* self = new (ELeave) CVeiVerticalSlider;
    CleanupStack::PushL(self);
    self->ConstructL(aRect, aControl);
    return self;
    }

//=============================================================================
EXPORT_C CVeiVerticalSlider::~CVeiVerticalSlider()
    {
    }

//=============================================================================
void CVeiVerticalSlider::ConstructL(const TRect& aRect, const CCoeControl& aControl)
	{
	LOG(KVideoEditorLogFile, "CVeiVerticalSlider::ConstructL: in");

	SetContainerWindowL(aControl);

    // Load the bitmaps 
    LoadBitmapL( iSliderBg, iSliderBgMask, EMbmVideoeditoruicomponentsQgn_graf_ied_vslider, EMbmVideoeditoruicomponentsQgn_graf_ied_vslider_mask );
    LoadBitmapL( iSliderTab, iSliderTabMask, EMbmVideoeditoruicomponentsQgn_graf_ied_vtab, EMbmVideoeditoruicomponentsQgn_graf_ied_vtab_mask );

	SetRect(aRect);
	ActivateL();

	LOG(KVideoEditorLogFile, "CVeiVerticalSlider::ConstructL: out");
	}

//=============================================================================
CVeiVerticalSlider::CVeiVerticalSlider()
    {
    // no implementation required
    }

//=============================================================================
void CVeiVerticalSlider::Draw(const TRect& aRect) const
	{
    if ( Minimum() <= Maximum() )
    	{
        TUint height = Maximum() - Minimum(); // height of the slider
        TUint pixelsFromMin = SliderPosition() - Minimum(); // tab position from the beginning
    
        TReal factor = 0.0;
        if (Minimum() < Maximum() )
        	{
            factor = (TReal) pixelsFromMin / height; // tab position from the beginning in percentage
        	}
        TUint sliderTabHeight = iSliderTab->SizeInPixels().iHeight; // slider tab height

        // slider bitmap is actually a bit longer but this resolves the problem
        // where the tab is drawn outside of the slider when in maximum position
        TUint sliderBitmapHeight = iSliderBg->SizeInPixels().iHeight - sliderTabHeight;
    
        TUint tabPositionFromMinInPixels = (TUint) (factor * sliderBitmapHeight + 0.5); // calculate tab position

        // top left coordinate
        const TPoint tl = aRect.iTl;

        CWindowGc& gc = SystemGc();

        // draw actual slider using mask bitmap
        TRect bgRect(TPoint(0,0), iSliderBg->SizeInPixels());
        gc.BitBltMasked(tl, iSliderBg, bgRect, iSliderBgMask, ETrue);

        // draw the tab using mask bitmap
        TRect tabRect(TPoint(0,0), iSliderTab->SizeInPixels());
        gc.BitBltMasked(TPoint(tl.iX, tl.iY+tabPositionFromMinInPixels), iSliderTab, tabRect, iSliderTabMask, ETrue);
    	}
	}

//=============================================================================
void CVeiVerticalSlider::SizeChanged()
	{
	LOG(KVideoEditorLogFile, "CVeiVerticalSlider::SizeChanged: in");

	__ASSERT_ALWAYS( iSliderBg && iSliderTab, Panic(EVeiSliderPanicBitmapsNotLoaded) );

	// Set size for scalable icons - MUST BE CALLED BEFORE ICON IS USABLE
	TSize sliderSize;
	TSize tabSize;

	TInt w = Rect().Width();
	TInt h = Rect().Height();

	// NOTE: this assumes that the slider and the slider tab have the same width.
	// If that is not the case, it should be handled with transparency in the SVG graphic.

	// Set the slider bg to fill the whole rect
	sliderSize.iWidth = w;
	sliderSize.iHeight = h;
	AknIconUtils::SetSize( iSliderBg, sliderSize, EAspectRatioNotPreserved);

	// The slider tab is set to have the same width.
	// The height is calculated from the aspect ratio (set based on the original SVG)
	tabSize.iWidth = w;
	tabSize.iHeight = (TInt)( w * KTabAspectRatioY / KTabAspectRatioX );
	AknIconUtils::SetSize( iSliderTab, tabSize, EAspectRatioNotPreserved);

	LOGFMT4(KVideoEditorLogFile, "CVeiVerticalSlider::SizeChanged: out: sliderSize(%d,%d), tabSize(%d,%d)", sliderSize.iWidth,sliderSize.iHeight,tabSize.iWidth,tabSize.iHeight);
	}

//=============================================================================
TSize CVeiVerticalSlider::MinimumSize()
	{
	LOG(KVideoEditorLogFile, "CVeiVerticalSlider::MinimumSize()");

	return iSliderBg->SizeInPixels();
	}

//=============================================================================
//
//	class CVeiHorizontalSlider member functions
//
//=============================================================================

//=============================================================================
EXPORT_C CVeiHorizontalSlider* CVeiHorizontalSlider::NewL(const TRect& aRect, const CCoeControl& aControl)
	{
	CVeiHorizontalSlider* self = CVeiHorizontalSlider::NewLC(aRect, aControl);
	CleanupStack::Pop(self);
	return self;
	}

//=============================================================================
EXPORT_C CVeiHorizontalSlider* CVeiHorizontalSlider::NewLC(const TRect& aRect, const CCoeControl& aControl)
    {
    CVeiHorizontalSlider* self = new (ELeave) CVeiHorizontalSlider;
    CleanupStack::PushL(self);
    self->ConstructL(aRect, aControl);
    return self;
    }

//=============================================================================
EXPORT_C CVeiHorizontalSlider::~CVeiHorizontalSlider()
    {
    }

//=============================================================================
void CVeiHorizontalSlider::ConstructL(const TRect& aRect, const CCoeControl& aControl)
	{
	LOG(KVideoEditorLogFile, "CVeiVerticalSlider::ConstructL: in");

	SetContainerWindowL(aControl);

    // Load the bitmaps 
    LoadBitmapL( iSliderBg, iSliderBgMask, EMbmVideoeditoruicomponentsQgn_graf_ied_hslider, EMbmVideoeditoruicomponentsQgn_graf_ied_hslider_mask );
    LoadBitmapL( iSliderTab, iSliderTabMask, EMbmVideoeditoruicomponentsQgn_graf_ied_htab, EMbmVideoeditoruicomponentsQgn_graf_ied_htab_mask );

	SetRect(aRect);
	ActivateL();

	LOG(KVideoEditorLogFile, "CVeiVerticalSlider::ConstructL: out");
	}

//=============================================================================
CVeiHorizontalSlider::CVeiHorizontalSlider()
    {
    // no implementation required
    }

//=============================================================================
void CVeiHorizontalSlider::Draw(const TRect& aRect) const
	{
    if ( Minimum() <= Maximum() )
    	{
        TUint height = Maximum() - Minimum(); // height of the slider
        TUint pixelsFromMin = SliderPosition() - Minimum(); // tab position from the beginning
    
        TReal factor = 0.0;
        if (Minimum() < Maximum() )
        	{
            factor = (TReal) pixelsFromMin / height; // tab position from the beginning in percentage
        	}
        TUint sliderTabWidth = iSliderTab->SizeInPixels().iWidth; // slider tab width

        // slider bitmap is actually a bit longer but this resolves the problem
        // where the tab is drawn outside of the slider when in maximum position
        TUint sliderBitmapWidth = iSliderBg->SizeInPixels().iWidth - sliderTabWidth;
    
        TUint tabPositionFromMinInPixels = (TUint) (factor * sliderBitmapWidth + 0.5); // calculate tab position

        // top left coordinate
        const TPoint tl = aRect.iTl;

        CWindowGc& gc = SystemGc();

        // draw actual slider using mask bitmap
        TRect bgRect(TPoint(0,0), iSliderBg->SizeInPixels());
        gc.BitBltMasked(tl, iSliderBg, bgRect, iSliderBgMask, ETrue);

        // draw the tab using mask bitmap
        TRect tabRect(TPoint(0,0),iSliderTab->SizeInPixels());
        gc.BitBltMasked(TPoint(tl.iX + tabPositionFromMinInPixels, tl.iY), iSliderTab, tabRect, iSliderTabMask, ETrue);
    	}
	}

//=============================================================================
void CVeiHorizontalSlider::SizeChanged()
	{
	LOG(KVideoEditorLogFile, "CVeiHorizontalSlider::SizeChanged: in");

	__ASSERT_ALWAYS( iSliderBg && iSliderTab, Panic(EVeiSliderPanicBitmapsNotLoaded) );

	// Set size for scalable icons - MUST BE CALLED BEFORE ICON IS USABLE
	TSize sliderSize;
	TSize tabSize;

	TInt w = Rect().Width();
	TInt h = Rect().Height();

	// NOTE: this assumes that the slider and the slider tab have the same height.
	// If that is not the case, it should be handled with transparency in the SVG graphic.

	// Set the slider bg to fill the whole rect.
	sliderSize.iWidth = w;
	sliderSize.iHeight = h;
	AknIconUtils::SetSize( iSliderBg, sliderSize, EAspectRatioNotPreserved);

	// The slider tab is set to have the same height with the bg.
	// The width is calculated from the aspect ratio (set based on the original SVG).
	tabSize.iWidth = (TInt)( h * KTabAspectRatioY / KTabAspectRatioX );
	tabSize.iHeight = h;
	AknIconUtils::SetSize( iSliderTab, tabSize, EAspectRatioNotPreserved);

	LOGFMT4(KVideoEditorLogFile, "CVeiHorizontalSlider::SizeChanged: out: sliderSize(%d,%d), tabSize(%d,%d)", sliderSize.iWidth,sliderSize.iHeight,tabSize.iWidth,tabSize.iHeight);
	}

//=============================================================================
TSize CVeiHorizontalSlider::MinimumSize()
	{
	LOG(KVideoEditorLogFile, "CVeiHorizontalSlider::MinimumSize()");

	return iSliderBg->SizeInPixels();
	}

// End of File