Decorator to show cursor 38/36138/1
authorAgnelo Vaz <agnelo.vaz@samsung.com>
Mon, 2 Mar 2015 17:08:44 +0000 (17:08 +0000)
committerAgnelo Vaz <agnelo.vaz@samsung.com>
Mon, 2 Mar 2015 17:08:44 +0000 (17:08 +0000)
Change-Id: I178d1f99ccc1246984cada7e0bf15c66435d1b1d
Signed-off-by: Agnelo Vaz <agnelo.vaz@samsung.com>
dali-toolkit/images/decorator-cursor.png [new file with mode: 0644]
dali-toolkit/public-api/text/decorator/text-decorator.cpp
dali-toolkit/public-api/text/text-controller.cpp

diff --git a/dali-toolkit/images/decorator-cursor.png b/dali-toolkit/images/decorator-cursor.png
new file mode 100644 (file)
index 0000000..bbb993f
Binary files /dev/null and b/dali-toolkit/images/decorator-cursor.png differ
index 0503635..ce93854 100644 (file)
@@ -20,6 +20,7 @@
 
 // EXTERNAL INCLUDES
 #include <dali/public-api/actors/actor.h>
 
 // EXTERNAL INCLUDES
 #include <dali/public-api/actors/actor.h>
+#include <dali/public-api/adaptor-framework/timer.h>
 #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/actors/image-actor.h>
 #include <dali/public-api/actors/layer.h>
 #include <dali/public-api/common/constants.h>
@@ -49,10 +50,13 @@ const char* DEFAULT_SELECTION_HANDLE_ONE( DALI_IMAGE_DIR "text-input-selection-h
 const char* DEFAULT_SELECTION_HANDLE_TWO( DALI_IMAGE_DIR "text-input-selection-handle-right.png" );
 //const char* DEFAULT_SELECTION_HANDLE_ONE_PRESSED( DALI_IMAGE_DIR "text-input-selection-handle-left-press.png" );
 //const char* DEFAULT_SELECTION_HANDLE_TWO_PRESSED( DALI_IMAGE_DIR "text-input-selection-handle-right-press.png" );
 const char* DEFAULT_SELECTION_HANDLE_TWO( DALI_IMAGE_DIR "text-input-selection-handle-right.png" );
 //const char* DEFAULT_SELECTION_HANDLE_ONE_PRESSED( DALI_IMAGE_DIR "text-input-selection-handle-left-press.png" );
 //const char* DEFAULT_SELECTION_HANDLE_TWO_PRESSED( DALI_IMAGE_DIR "text-input-selection-handle-right-press.png" );
+const char* DEFAULT_CURSOR_IMAGE( DALI_IMAGE_DIR "decorator-cursor.png");
 
 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 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
+
 } // end of namespace
 
 namespace Dali
 } // end of namespace
 
 namespace Dali
@@ -110,13 +114,21 @@ struct Decorator::Impl : public ConnectionTracker
     mObserver(observer),
     mActiveCursor(ACTIVE_CURSOR_NONE),
     mActiveGrabHandle(false),
     mObserver(observer),
     mActiveCursor(ACTIVE_CURSOR_NONE),
     mActiveGrabHandle(false),
-    mCursorBlinkInterval(0.5f),
-    mCursorBlinkDuration(0.0f)
+    mActiveSelection( false ),
+    mCursorBlinkInterval( CURSOR_BLINK_INTERVAL ),
+    mCursorBlinkDuration(0.0f),
+    mCursorBlinkStatus( true )
   {
   }
 
   {
   }
 
+  /**
+   * Relayout of the decorations owned by the decorator.
+   * @param[in] size The Size of the UI control the decorater is adding it's decorations to.
+   */
   void Relayout( const Vector2& size )
   {
   void Relayout( const Vector2& size )
   {
+    SetCursors();
+
     // Show or hide the grab handle
     if( mActiveGrabHandle )
     {
     // Show or hide the grab handle
     if( mActiveGrabHandle )
     {
@@ -153,8 +165,81 @@ struct Decorator::Impl : public ConnectionTracker
       UnparentAndReset( mSelectionHandle[ PRIMARY_SELECTION_HANDLE ].actor );
       UnparentAndReset( mSelectionHandle[ SECONDARY_SELECTION_HANDLE ].actor );
     }
       UnparentAndReset( mSelectionHandle[ PRIMARY_SELECTION_HANDLE ].actor );
       UnparentAndReset( mSelectionHandle[ SECONDARY_SELECTION_HANDLE ].actor );
     }
+  }
 
 
-    // TODO
+  /**
+   * Creates a cursor
+   */
+  void CreateCursor( ImageActor& cursor )
+  {
+    if ( !mCursorImage )
+    {
+      mCursorImage = ResourceImage::New( DEFAULT_CURSOR_IMAGE );
+    }
+    cursor = ImageActor::New( mCursorImage );
+    cursor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
+  }
+
+  /**
+   * Add / Remove cursor(s) from parent
+   */
+  void SetCursors()
+  {
+    Actor parent = mParent.Self();
+    /* Create Primary and or Secondary Cursor(s) if active and add to parent */
+    if ( mActiveCursor == ACTIVE_CURSOR_PRIMARY )
+    {
+      if ( !mPrimaryCursor )
+      {
+        CreateCursor( mPrimaryCursor );
+#ifdef DECORATOR_DEBUG
+        mPrimaryCursor.SetName( "PrimaryCursorActor" );
+#endif
+        parent.Add( mPrimaryCursor);
+      }
+    }
+    else if ( mActiveCursor == ACTIVE_CURSOR_BOTH )
+    {
+      if ( !mSecondaryCursor )
+      {
+        CreateCursor( mSecondaryCursor );
+#ifdef DECORATOR_DEBUG
+        mSecondaryCursor.SetName( "SecondaryCursorActor" );
+#endif
+        parent.Add( mSecondaryCursor);
+      }
+    }
+    else
+    {
+      /* ACTIVE_CURSOR_NONE so unparent cursors*/
+      if ( mPrimaryCursor )
+      {
+        UnparentAndReset( mPrimaryCursor );
+      }
+
+      if ( mSecondaryCursor )
+      {
+        UnparentAndReset( mSecondaryCursor );
+      }
+    }
+  }
+
+  bool OnCursorBlinkTimerTick()
+  {
+    // Cursor blinking
+    if ( ACTIVE_CURSOR_PRIMARY )
+    {
+      mPrimaryCursor.SetVisible( mCursorBlinkStatus );
+    }
+    else if ( ACTIVE_CURSOR_BOTH )
+    {
+      mPrimaryCursor.SetVisible( mCursorBlinkStatus );
+      mSecondaryCursor.SetVisible( mCursorBlinkStatus );
+    }
+
+    mCursorBlinkStatus = !mCursorBlinkStatus;
+
+    return true;
   }
 
   void SetupTouchEvents()
   }
 
   void SetupTouchEvents()
@@ -329,7 +414,7 @@ struct Decorator::Impl : public ConnectionTracker
   Internal::Control& mParent;
   Observer& mObserver;
 
   Internal::Control& mParent;
   Observer& mObserver;
 
-  Layer mActiveLayer; ///< Layer for active handles and alike that ensures they are above all else.
+  Layer mActiveLayer; // Layer for active handles and alike that ensures they are above all else.
 
   unsigned int mActiveCursor;
   bool         mActiveGrabHandle;
 
   unsigned int mActiveCursor;
   bool         mActiveGrabHandle;
@@ -337,6 +422,14 @@ struct Decorator::Impl : public ConnectionTracker
 
   CursorImpl mCursor[CURSOR_COUNT];
 
 
   CursorImpl mCursor[CURSOR_COUNT];
 
+  Timer mCursorBlinkTimer; // Timer to signal cursor to blink
+  unsigned int mCursorBlinkInterval;
+  float mCursorBlinkDuration;
+  bool mCursorBlinkStatus; // Flag to switch between blink on and blink off
+
+  ImageActor mPrimaryCursor;
+  ImageActor mSecondaryCursor;
+
   ImageActor mGrabHandle;
   Actor mGrabArea;
 
   ImageActor mGrabHandle;
   Actor mGrabArea;
 
@@ -348,8 +441,7 @@ struct Decorator::Impl : public ConnectionTracker
   TapGestureDetector mTapDetector;
   PanGestureDetector mPanGestureDetector;
 
   TapGestureDetector mTapDetector;
   PanGestureDetector mPanGestureDetector;
 
-  float mCursorBlinkInterval;
-  float mCursorBlinkDuration;
+
 };
 
 DecoratorPtr Decorator::New( Internal::Control& parent, Observer& observer )
 };
 
 DecoratorPtr Decorator::New( Internal::Control& parent, Observer& observer )
@@ -362,6 +454,8 @@ void Decorator::Relayout( const Vector2& size )
   mImpl->Relayout( size );
 }
 
   mImpl->Relayout( size );
 }
 
+/** Cursor **/
+
 void Decorator::SetActiveCursor( ActiveCursor activeCursor )
 {
   mImpl->mActiveCursor = activeCursor;
 void Decorator::SetActiveCursor( ActiveCursor activeCursor )
 {
   mImpl->mActiveCursor = activeCursor;
@@ -408,17 +502,29 @@ const Dali::Vector4& Decorator::GetColor( Cursor cursor ) const
 
 void Decorator::StartCursorBlink()
 {
 
 void Decorator::StartCursorBlink()
 {
-  // TODO
+  if ( !mImpl->mCursorBlinkTimer )
+  {
+    mImpl->mCursorBlinkTimer = Timer::New( mImpl->mCursorBlinkInterval );
+    mImpl->mCursorBlinkTimer.TickSignal().Connect( mImpl, &Decorator::Impl::OnCursorBlinkTimerTick );
+  }
+
+  if ( !mImpl->mCursorBlinkTimer.IsRunning() )
+  {
+    mImpl->mCursorBlinkTimer.Start();
+  }
 }
 
 void Decorator::StopCursorBlink()
 {
 }
 
 void Decorator::StopCursorBlink()
 {
-  // TODO
+  if ( mImpl->mCursorBlinkTimer )
+  {
+    mImpl->mCursorBlinkTimer.Stop();
+  }
 }
 
 void Decorator::SetCursorBlinkInterval( float seconds )
 {
 }
 
 void Decorator::SetCursorBlinkInterval( float seconds )
 {
-  mImpl->mCursorBlinkInterval = seconds;
+  mImpl->mCursorBlinkInterval = seconds*1000; // Convert to milliseconds
 }
 
 float Decorator::GetCursorBlinkInterval() const
 }
 
 float Decorator::GetCursorBlinkInterval() const
@@ -436,6 +542,8 @@ float Decorator::GetCursorBlinkDuration() const
   return mImpl->mCursorBlinkDuration;
 }
 
   return mImpl->mCursorBlinkDuration;
 }
 
+/** GrabHandle **/
+
 void Decorator::SetGrabHandleActive( bool active )
 {
   mImpl->mActiveGrabHandle = active;
 void Decorator::SetGrabHandleActive( bool active )
 {
   mImpl->mActiveGrabHandle = active;
@@ -456,6 +564,8 @@ Dali::Image Decorator::GetGrabHandleImage() const
   return mImpl->mGrabHandleImage;
 }
 
   return mImpl->mGrabHandleImage;
 }
 
+/** Selection **/
+
 void Decorator::SetSelectionActive( bool active )
 {
   mImpl->mActiveSelection = active;
 void Decorator::SetSelectionActive( bool active )
 {
   mImpl->mActiveSelection = active;
index 7d0b956..878272c 100644 (file)
@@ -143,8 +143,10 @@ struct Controller::TextInput
     if( 1u == event.p1.mUint )
     {
       mState = TextInput::EDITING;
     if( 1u == event.p1.mUint )
     {
       mState = TextInput::EDITING;
+      mDecorator->SetActiveCursor( ACTIVE_CURSOR_PRIMARY );
+      mDecorator->StartCursorBlink();
       mDecorator->SetGrabHandleActive( true );
       mDecorator->SetGrabHandleActive( true );
-      mDecorator->SetPosition( PRIMARY_CURSOR, 0, 0, 10 );
+      mDecorator->SetPosition( PRIMARY_CURSOR, 10, 0, 18 );
       mDecoratorUpdated = true;
     }
     else if( 2u == event.p1.mUint )
       mDecoratorUpdated = true;
     }
     else if( 2u == event.p1.mUint )