--- /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 <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