diff -r 000000000000 -r 951a5db380a0 videditor/VideoEditorUiComponents/src/VeiSlider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videditor/VideoEditorUiComponents/src/VeiSlider.cpp Fri Jan 29 14:08:33 2010 +0200 @@ -0,0 +1,429 @@ +/* +* 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 +#include +#include +#include +#include + +// 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