Adding Decorator BoundingBox
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / public-api / text / decorator / text-decorator.cpp
index ce93854..0b15b49 100644 (file)
@@ -24,6 +24,7 @@
 #include <dali/public-api/actors/image-actor.h>
 #include <dali/public-api/actors/layer.h>
 #include <dali/public-api/common/constants.h>
+#include <dali/public-api/common/stage.h>
 #include <dali/public-api/events/tap-gesture.h>
 #include <dali/public-api/events/tap-gesture-detector.h>
 #include <dali/public-api/events/pan-gesture.h>
@@ -56,6 +57,7 @@ const Dali::Vector3 DEFAULT_GRAB_HANDLE_RELATIVE_SIZE( 1.5f, 2.0f, 1.0f );
 const Dali::Vector3 DEFAULT_SELECTION_HANDLE_RELATIVE_SIZE( 1.5f, 1.5f, 1.0f );
 
 const std::size_t CURSOR_BLINK_INTERVAL = 500; // Cursor blink interval
+const std::size_t MILLISECONDS = 1000;
 
 } // end of namespace
 
@@ -116,8 +118,11 @@ struct Decorator::Impl : public ConnectionTracker
     mActiveGrabHandle(false),
     mActiveSelection( false ),
     mCursorBlinkInterval( CURSOR_BLINK_INTERVAL ),
-    mCursorBlinkDuration(0.0f),
-    mCursorBlinkStatus( true )
+    mCursorBlinkDuration( 0.0f ),
+    mCursorBlinkStatus( true ),
+    mGrabDisplacementX( 0.0f ),
+    mGrabDisplacementY( 0.0f ),
+    mBoundingBox( Rect<int>() )
   {
   }
 
@@ -197,6 +202,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 +400,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 +459,8 @@ struct Decorator::Impl : public ConnectionTracker
 
   ImageActor mGrabHandle;
   Actor mGrabArea;
+  float mGrabDisplacementX;
+  float mGrabDisplacementY;
 
   SelectionHandleImpl mSelectionHandle[SELECTION_HANDLE_COUNT];
 
@@ -441,7 +470,7 @@ struct Decorator::Impl : public ConnectionTracker
   TapGestureDetector mTapDetector;
   PanGestureDetector mPanGestureDetector;
 
-
+  Rect<int> mBoundingBox;
 };
 
 DecoratorPtr Decorator::New( Internal::Control& parent, Observer& observer )
@@ -449,6 +478,16 @@ DecoratorPtr Decorator::New( Internal::Control& parent, Observer& observer )
   return DecoratorPtr( new Decorator(parent, observer) );
 }
 
+void Decorator::SetBoundingBox( const Rect<int>& boundingBox )
+{
+  mImpl->mBoundingBox = boundingBox;
+}
+
+const Rect<int>& Decorator::GetBoundingBox() const
+{
+  return mImpl->mBoundingBox;
+}
+
 void Decorator::Relayout( const Vector2& size )
 {
   mImpl->Relayout( size );
@@ -468,6 +507,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;
@@ -524,7 +567,7 @@ void Decorator::StopCursorBlink()
 
 void Decorator::SetCursorBlinkInterval( float seconds )
 {
-  mImpl->mCursorBlinkInterval = seconds*1000; // Convert to milliseconds
+  mImpl->mCursorBlinkInterval = seconds*MILLISECONDS; // Convert to milliseconds
 }
 
 float Decorator::GetCursorBlinkInterval() const