diff -r f72a12da539e -r 5315654608de idlehomescreen/xmluirendering/uiengine/src/xnscrollablecontroladapter.cpp --- a/idlehomescreen/xmluirendering/uiengine/src/xnscrollablecontroladapter.cpp Thu Dec 17 08:40:49 2009 +0200 +++ b/idlehomescreen/xmluirendering/uiengine/src/xnscrollablecontroladapter.cpp Thu Jan 07 12:39:41 2010 +0200 @@ -36,6 +36,11 @@ _LIT8(KViewportWidth, "viewport-width"); _LIT8(KViewportTop, "viewport-top"); _LIT8(KViewportLeft, "viewport-left"); +_LIT8(KScrollDirection, "scroll-direction"); +_LIT8(KHorizontal, "horizontal"); + +const TInt EVertical( 0 ); +const TInt EHorizontal( 1 ); // ============================ MEMBER FUNCTIONS =============================== @@ -90,6 +95,16 @@ iUiEngine = iNode.Node().UiEngine(); iNode.Node().SetScrollableControl( this ); + + // Default + iDirection = EVertical; + + CXnProperty* prop( iNode.GetPropertyL( KScrollDirection ) ); + + if ( prop && prop->StringValue() == KHorizontal ) + { + iDirection = EHorizontal; + } } // ----------------------------------------------------------------------------- @@ -104,7 +119,9 @@ { return; } - TPoint stylusPos = aPointerEvent.iPosition; + + TPoint stylusPos( aPointerEvent.iPosition ); + switch( aPointerEvent.iType ) { case TPointerEvent::EButton1Down: @@ -118,17 +135,20 @@ } break; case TPointerEvent::EButton1Up: - { - TInt distance = iStartPosition.iY - stylusPos.iY; - TPoint drag( 0, distance ); - iPhysics->StartPhysics( drag, iStartTime ); + { + TInt distanceY( iStartPosition.iY - stylusPos.iY ); + TInt distanceX( iStartPosition.iX - stylusPos.iX ); + + TPoint drag( distanceX, distanceY ); + iPhysics->StartPhysics( drag, iStartTime ); } break; case TPointerEvent::EDrag: { TPoint distanceFromStart( iStartPosition - stylusPos ); - if( Abs( distanceFromStart.iY ) > KOffset ) + if( ( Abs( distanceFromStart.iY ) > KOffset && iDirection == EVertical ) || + ( Abs( distanceFromStart.iX ) > KOffset && iDirection == EHorizontal ) ) { CXnNode* focused( iUiEngine->FocusedNode() ); @@ -142,8 +162,12 @@ } TInt deltaY( iStylusPosition.iY - stylusPos.iY ); + TInt deltaX( iStylusPosition.iX - stylusPos.iX ); + iStylusPosition = stylusPos; - TPoint deltaPoint( 0, deltaY ); + + TPoint deltaPoint( deltaX, deltaY ); + iPhysics->RegisterPanningPosition( deltaPoint ); } break; @@ -161,7 +185,7 @@ // void CXnScrollableControlAdapter::Draw( const TRect& aRect ) const { - CXnControlAdapter::Draw( aRect ); + CXnControlAdapter::Draw( aRect ); } // ----------------------------------------------------------------------------- @@ -248,20 +272,44 @@ // ----------------------------------------------------------------------------- void CXnScrollableControlAdapter::ShowItem( CXnNode& aNode ) { - TRect rect = aNode.MarginRect(); + TRect rect( aNode.MarginRect() ); + if( !iViewPort.Contains( rect.iTl ) || !iViewPort.Contains( rect.iBr ) ) { - TInt delta( 0 ); - if( rect.iTl.iY < iViewPort.iTl.iY ) - { - delta = rect.iTl.iY - iViewPort.iTl.iY; + if ( iDirection == EVertical ) + { + TInt delta( 0 ); + + if( rect.iTl.iY < iViewPort.iTl.iY ) + { + delta = rect.iTl.iY - iViewPort.iTl.iY; + } + else if( rect.iBr.iY > iViewPort.iBr.iY ) + { + delta = rect.iBr.iY - iViewPort.iBr.iY; + } + + TPoint newPosition( iPreviousPosition + TPoint( 0, delta ) ); + + ViewPositionChanged( newPosition, ETrue, 0 ); } - else if( rect.iBr.iY > iViewPort.iBr.iY ) + else { - delta = rect.iBr.iY - iViewPort.iBr.iY; + TInt delta( 0 ); + + if( rect.iTl.iX < iViewPort.iTl.iX ) + { + delta = rect.iTl.iX - iViewPort.iTl.iX; + } + else if( rect.iBr.iX > iViewPort.iBr.iX ) + { + delta = rect.iBr.iX - iViewPort.iBr.iX; + } + + TPoint newPosition( iPreviousPosition + TPoint( delta, 0 ) ); + + ViewPositionChanged( newPosition, ETrue, 0 ); } - TPoint newPosition = iPreviousPosition + TPoint( 0, delta ); - ViewPositionChanged( newPosition, ETrue, 0 ); } } @@ -286,7 +334,17 @@ void CXnScrollableControlAdapter::ViewPositionChanged( const TPoint& aNewPosition, TBool aDrawNow, TUint /*aFlags*/ ) { - TPoint diff = TPoint( 0, aNewPosition.iY - iPreviousPosition.iY ); + TPoint diff; + + if ( iDirection == EVertical ) + { + diff = TPoint( 0, aNewPosition.iY - iPreviousPosition.iY ); + } + else + { + diff = TPoint( aNewPosition.iX - iPreviousPosition.iX, 0 ); + } + iPreviousPosition = aNewPosition; iCurrentPosition += diff; TPoint tmpPos = iNode.Control()->Position(); @@ -341,9 +399,21 @@ return; } TSize viewPortSize = iViewPort.Size(); - TSize totalSize( iNode.MarginRect().Size() ); - iPhysics->InitPhysicsL( totalSize, viewPortSize, EFalse ); - iCurrentPosition = TPoint( 0, viewPortSize.iHeight / 2 ); + TSize totalSize( iNode.Rect().Size() ); + + if ( iDirection == EVertical ) + { + iPhysics->InitPhysicsL( totalSize, viewPortSize, EFalse ); + } + else + { + iPhysics->InitPhysicsL( totalSize, viewPortSize, ETrue ); + } + + + iCurrentPosition = + TPoint( viewPortSize.iWidth / 2, viewPortSize.iHeight / 2 ); + iPreviousPosition = iStartViewPosition = iCurrentPosition; } @@ -358,16 +428,18 @@ TInt top( 0 ); TInt left( 0 ); + CXnNode& node( iNode.Node() ); + // Width CXnProperty* prop = iNode.GetPropertyL( KViewportWidth ); if( prop ) { width = iUiEngine->HorizontalPixelValueL( - prop, iNode.MarginRect().Width() ); + prop, iNode.Rect().Width() ); } if( width == 0 ) { - width = iNode.MarginRect().Width(); + width = node.Parent()->Rect().Width(); } // Height @@ -375,11 +447,11 @@ if( prop ) { height = iUiEngine->VerticalPixelValueL( - prop, iNode.MarginRect().Height() ); + prop, iNode.Rect().Height() ); } if( height == 0 ) { - height = iNode.MarginRect().Height(); + height = node.Parent()->Rect().Height(); } // Top @@ -387,7 +459,7 @@ if( prop ) { top = iUiEngine->VerticalPixelValueL( - prop, iNode.MarginRect().Height() ); + prop, iNode.Rect().Height() ); } // Left @@ -395,10 +467,10 @@ if( prop ) { left = iUiEngine->HorizontalPixelValueL( - prop, iNode.MarginRect().Width() ); + prop, iNode.Rect().Width() ); } - iViewPort = TRect( iNode.MarginRect().iTl, TSize( width, height ) ); + iViewPort = TRect( iNode.Rect().iTl, TSize( width, height ) ); iViewPort.Move( left, top ); }