From: Paul Wisbey
Date: Mon, 2 Mar 2015 15:41:54 +0000 (+0000)
Subject: Pass Grab handle events to Controller
X-Git-Tag: new_text_0.1~29
X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=65a420a8b5ac8d140f330f222fa0cc668658f6cd
Pass Grab handle events to Controller
Change-Id: I24c369ef7eefa7397e88e897c683536501c62076
---
diff --git a/dali-toolkit/public-api/text/decorator/text-decorator.cpp b/dali-toolkit/public-api/text/decorator/text-decorator.cpp
index ce93854..148fbc8 100644
--- a/dali-toolkit/public-api/text/decorator/text-decorator.cpp
+++ b/dali-toolkit/public-api/text/decorator/text-decorator.cpp
@@ -117,7 +117,9 @@ struct Decorator::Impl : public ConnectionTracker
mActiveSelection( false ),
mCursorBlinkInterval( CURSOR_BLINK_INTERVAL ),
mCursorBlinkDuration(0.0f),
- mCursorBlinkStatus( true )
+ mCursorBlinkStatus( true ),
+ mGrabDisplacementX(0.0f),
+ mGrabDisplacementY(0.0f)
{
}
@@ -197,6 +199,8 @@ struct Decorator::Impl : public ConnectionTracker
#endif
parent.Add( mPrimaryCursor);
}
+
+ mPrimaryCursor.SetPosition( mCursor[PRIMARY_CURSOR].x, mCursor[PRIMARY_CURSOR].y );
}
else if ( mActiveCursor == ACTIVE_CURSOR_BOTH )
{
@@ -393,9 +397,29 @@ struct Decorator::Impl : public ConnectionTracker
void OnPan( Actor actor, const PanGesture& gesture )
{
- if( actor == mGrabHandle )
+ if( actor == mGrabArea )
{
- // TODO
+ if( Gesture::Started == gesture.state )
+ {
+ mGrabDisplacementX = mGrabDisplacementY = 0;
+ }
+
+ mGrabDisplacementX += gesture.displacement.x;
+ mGrabDisplacementY += gesture.displacement.y;
+
+ float x = mCursor[PRIMARY_CURSOR].x + mGrabDisplacementX;
+ float y = mCursor[PRIMARY_CURSOR].y + mCursor[PRIMARY_CURSOR].height*0.5f + mGrabDisplacementY;
+
+ if( Gesture::Started == gesture.state ||
+ Gesture::Continuing == gesture.state )
+ {
+ mObserver.GrabHandleEvent( GRAB_HANDLE_PRESSED, x, y );
+ }
+ else if( Gesture::Finished == gesture.state ||
+ Gesture::Cancelled == gesture.state )
+ {
+ mObserver.GrabHandleEvent( GRAB_HANDLE_RELEASED, x, y );
+ }
}
}
@@ -432,6 +456,8 @@ struct Decorator::Impl : public ConnectionTracker
ImageActor mGrabHandle;
Actor mGrabArea;
+ float mGrabDisplacementX;
+ float mGrabDisplacementY;
SelectionHandleImpl mSelectionHandle[SELECTION_HANDLE_COUNT];
@@ -468,6 +494,10 @@ unsigned int Decorator::GetActiveCursor() const
void Decorator::SetPosition( Cursor cursor, float x, float y, float height )
{
+ // Adjust grab handle displacement
+ mImpl->mGrabDisplacementX -= x - mImpl->mCursor[cursor].x;
+ mImpl->mGrabDisplacementY -= y - mImpl->mCursor[cursor].y;
+
mImpl->mCursor[cursor].x = x;
mImpl->mCursor[cursor].y = y;
mImpl->mCursor[cursor].height = height;
diff --git a/dali-toolkit/public-api/text/decorator/text-decorator.h b/dali-toolkit/public-api/text/decorator/text-decorator.h
index 809be0d..144f0ef 100644
--- a/dali-toolkit/public-api/text/decorator/text-decorator.h
+++ b/dali-toolkit/public-api/text/decorator/text-decorator.h
@@ -113,8 +113,9 @@ public:
*
* @param[in] state The grab handle state.
* @param[in] x The x position relative to the top-left of the parent control.
+ * @param[in] y The y position relative to the top-left of the parent control.
*/
- virtual void GrabHandleEvent( GrabHandleState state, float x ) = 0;
+ virtual void GrabHandleEvent( GrabHandleState state, float x, float y ) = 0;
};
/**
diff --git a/dali-toolkit/public-api/text/text-controller.cpp b/dali-toolkit/public-api/text/text-controller.cpp
index 878272c..58fd536 100644
--- a/dali-toolkit/public-api/text/text-controller.cpp
+++ b/dali-toolkit/public-api/text/text-controller.cpp
@@ -85,8 +85,12 @@ struct Controller::TextInput
EDITING
};
- TextInput( DecoratorPtr decorator )
- : mDecorator( decorator ),
+ TextInput( LogicalModelPtr logicalModel,
+ VisualModelPtr visualModel,
+ DecoratorPtr decorator )
+ : mLogicalModel( logicalModel ),
+ mVisualModel( visualModel ),
+ mDecorator( decorator ),
mState( INACTIVE )
{
}
@@ -146,7 +150,13 @@ struct Controller::TextInput
mDecorator->SetActiveCursor( ACTIVE_CURSOR_PRIMARY );
mDecorator->StartCursorBlink();
mDecorator->SetGrabHandleActive( true );
- mDecorator->SetPosition( PRIMARY_CURSOR, 10, 0, 18 );
+
+ float xPosition = event.p2.mFloat;
+ float yPosition = event.p3.mFloat;
+ float height(0.0f);
+ GetClosestCursorPosition( xPosition, yPosition, height );
+ mDecorator->SetPosition( PRIMARY_CURSOR, xPosition, yPosition, height );
+
mDecoratorUpdated = true;
}
else if( 2u == event.p1.mUint )
@@ -160,11 +170,68 @@ struct Controller::TextInput
void OnGrabHandleEvent( const Event& event )
{
- // TODO
+ unsigned int state = event.p1.mUint;
+
+ if( GRAB_HANDLE_PRESSED == state )
+ {
+ float xPosition = event.p2.mFloat;
+ float yPosition = event.p3.mFloat;
+ float height(0.0f);
+
+ GetClosestCursorPosition( xPosition, yPosition, height );
+
+ mDecorator->SetPosition( PRIMARY_CURSOR, xPosition, yPosition, height );
+ mDecoratorUpdated = true;
+ }
}
- DecoratorPtr mDecorator;
- bool mDecoratorUpdated;
+ void GetClosestCursorPosition( float& x, float& y, float& height )
+ {
+ // TODO - Look at LineRuns first
+
+ Text::Length numberOfGlyphs = mVisualModel->GetNumberOfGlyphs();
+ if( 0 == numberOfGlyphs )
+ {
+ return;
+ }
+
+ Vector glyphs;
+ glyphs.Resize( numberOfGlyphs );
+ mVisualModel->GetGlyphs( &glyphs[0], 0, numberOfGlyphs );
+
+ std::vector positions;
+ positions.resize( numberOfGlyphs );
+ mVisualModel->GetGlyphPositions( &positions[0], 0, numberOfGlyphs );
+
+ unsigned int closestGlyph = 0;
+ float closestDistance = std::numeric_limits::max();
+
+ for( unsigned int i=0; i mEventQueue; ///< The queue of touch events etc.
+
+ bool mDecoratorUpdated;
};
struct Controller::Impl
@@ -242,7 +311,7 @@ void Controller::EnableTextInput( DecoratorPtr decorator )
{
if( !mImpl->mTextInput )
{
- mImpl->mTextInput = new TextInput( decorator );
+ mImpl->mTextInput = new TextInput( mImpl->mLogicalModel, mImpl->mVisualModel, decorator );
}
}
@@ -370,7 +439,7 @@ bool Controller::DoRelayout( const Vector2& size, OperationsMask operations )
if( GET_GLYPH_METRICS & operations )
{
- TextAbstraction::FontClient::Get().GetGlyphMetrics( glyphs.Begin(), glyphs.Count() );
+ mImpl->mFontClient.GetGlyphMetrics( glyphs.Begin(), glyphs.Count() );
}
if( LAYOUT & operations )
@@ -523,15 +592,16 @@ void Controller::TapEvent( unsigned int tapCount, float x, float y )
}
}
-void Controller::GrabHandleEvent( GrabHandleState state, float x )
+void Controller::GrabHandleEvent( GrabHandleState state, float x, float y )
{
DALI_ASSERT_DEBUG( mImpl->mTextInput && "Unexpected GrabHandleEvent" );
if( mImpl->mTextInput )
{
TextInput::Event event( TextInput::GRAB_HANDLE_EVENT );
- event.p1.mInt = state;
+ event.p1.mUint = state;
event.p2.mFloat = x;
+ event.p3.mFloat = y;
mImpl->mTextInput->mEventQueue.push_back( event );
RequestRelayout();
diff --git a/dali-toolkit/public-api/text/text-controller.h b/dali-toolkit/public-api/text/text-controller.h
index 8f67531..8133451 100644
--- a/dali-toolkit/public-api/text/text-controller.h
+++ b/dali-toolkit/public-api/text/text-controller.h
@@ -163,7 +163,7 @@ public:
/**
* @copydoc Dali::Toolkit::Text::Decorator::Observer::GrabHandleEvent()
*/
- virtual void GrabHandleEvent( GrabHandleState state, float x );
+ virtual void GrabHandleEvent( GrabHandleState state, float x, float y );
protected: