From 05c97b7ff1d90ab7f90cb9d6ec5f060c61b46aab Mon Sep 17 00:00:00 2001 From: Agnelo Vaz Date: Mon, 16 Jun 2014 17:02:11 +0100 Subject: [PATCH] TextInput Popup has a tail which points to the TextInput [problem] User may not know the cut and paste popup applies to the current TextInput [solution] Display a tail which points to the TextInput. Change-Id: I712eb34ce00fbf3a02e7fe4bd975fc556b5c97e6 Signed-off-by: Adeel Kazmi --- base/dali-toolkit/images/copypanelLine.png | Bin 154 -> 0 bytes base/dali-toolkit/images/cutCopyPastePopup_bg.png | Bin 4264 -> 0 bytes .../images/popup_bubble_tail_bottom.png | Bin 0 -> 1350 bytes .../images/popup_bubble_tail_bottom_line.png | Bin 0 -> 1399 bytes .../controls/text-input/text-input-impl.cpp | 46 +++++++++-- .../internal/controls/text-input/text-input-impl.h | 17 +++- .../controls/text-input/text-input-popup-impl.cpp | 92 +++++++++++++++++---- .../controls/text-input/text-input-popup-impl.h | 15 ++++ .../public-api/controls/text-input/text-input.h | 3 + 9 files changed, 144 insertions(+), 29 deletions(-) delete mode 100755 base/dali-toolkit/images/copypanelLine.png delete mode 100644 base/dali-toolkit/images/cutCopyPastePopup_bg.png create mode 100755 base/dali-toolkit/images/popup_bubble_tail_bottom.png create mode 100755 base/dali-toolkit/images/popup_bubble_tail_bottom_line.png diff --git a/base/dali-toolkit/images/copypanelLine.png b/base/dali-toolkit/images/copypanelLine.png deleted file mode 100755 index 4a9a10177ada87b052ee843c11f9d2067a19d733..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^OhD|w0V4Oi7>WQX#^NA%Cx&(BWL^R}Y)RhkE)4%c zaKYZ?lYt_f1s;*b3=G`DAk4@xYmNj^kiEpy*OmPaw+O$b-i=;|RG^TQr;B5V#O35G o*RGmgxSX7n00I(A+oV_-yl*g0-0uAT7*G|1r>mdKI;Vst0D^=mLI3~& diff --git a/base/dali-toolkit/images/cutCopyPastePopup_bg.png b/base/dali-toolkit/images/cutCopyPastePopup_bg.png deleted file mode 100644 index b9c6365dfa0ceadc5281c02074ea105b76d40177..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4264 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 KMNUMnLSTY!ArXB5 diff --git a/base/dali-toolkit/images/popup_bubble_tail_bottom.png b/base/dali-toolkit/images/popup_bubble_tail_bottom.png new file mode 100755 index 0000000000000000000000000000000000000000..2ca159317492c4561b3fed9ffd0e757b440965b6 GIT binary patch literal 1350 zcmbVMZA=?w96zZ8hA^uW-4K>%#}XjYUhmpodpA0I++A5SicmU+Zwc4CD?MrNy6bf< zxXn$r(YdjpiIEs}M0DalnE7p)AAGB3L(Om+UzQk!OoGO^5fekA2A={&KahR!a(BU{V)!=)KE-hlD1zkoMNej!s z9~b)Mpe#rO`>)7N2x5vTp&p|r&_;_|+$!X4teJQMq7kI2Ig=2?e%SzFxld6&=*@TE zLxCcB(0$H;Es$X4sIq%dm%9erL*ih+NJ(h(F3^;rAwgU=1dxfx)Fhqppv$~8oaeVO z6fBz<{T_5hR8OD-u$nFdr`2u|Z8#1{(uzBrB#Acy!iE!=4c?>$chF9fCR||kLZLTZ ziqJvMx9SV7JZRJ~5;TUT(`jqkZq@WY45uh6&p{9tXkkeXsD_ZSsL9#_11Bd%T}c>< zrh+`95Y|$L2Zc&kju1}-0&B!-ay3veWLQQ>V7S$W#pC&NEn6pzp!~0lb*+=3frN|& z<)oIp2-GUc5*25AM>2$g&g5h{4j`MbgXyI4~;j`O$2g$I$0@kl44M7#< zf?oytUB%+J#nP-U3x=kLG%Z%BfR3nUXvwIS0Bjct>h~$Cq@|M$`Sh%umXmemfGqiR zEe@9BODpU6xAB|{XIePQ<%Y^}+-+kyA5S#qpnFDQv+C z%um-!A1>CKM^<6S=&&`M7eD_7LGC!<=a^9DdU$bZso7NZ>Yry1_fnVsJ`IX0ZWS$T z0NvqnOQtM$$@|x~M@BcE`tYi^`tID*%KVm&`W>(BEPipw`(vp&eQlcQI+}5j8)Kct zrkM9&b#`R(*RjXEvC`ZR7yQJ`7mIgg#iNTmD{Fo)d2-J6c-dI#mPAGNp~?C2Zm{ck zb4rLjWt2br^%J4Xvu_?5dtvm@;x#idT0FbQ+sH*O9~?gS@q@?iBcAJsNS)@rl{xo` zZ|m7lPF=~K|9(1JH?=7|QC@uKkww(}={;|43*GwJv>=8py(m84jO;HmFVzMQSsTu5 zubb+%Oh!7fcIE^rvh^Q%Sf69Bw`TL7O!9(phh{>5X^xzU;r@KJk40 z&`hwg)A`E1_J)*sv-xJL{#hK%oy)c9UqW@m_it$O#!R`odi?b9vdTF&`bYP~SNO5( z?2XKCS9^8yUS#t}z%;R`Dm6Vh|k1|%Oc%$NbBBuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFsEgPM3hAM`dB6B=jtVb)aX^@765fKFxc2v6eK2Rr0UTq__OB&@Hb09I0xZL0)vRD^GUf^&XRs)DJWv2L<~p`n7AnVzAE zshOFfj)IYap^?4;5Si&3npl~dSs9rtK!Fm_wxX0Ys~{IQs9ivwtx`rwNr9EVetCJh zUb(Seeo?xx^|#0uTKVr7^KE~&-IMVSR9nfZANAQKal@=Hr> zm4GgVcpk{1iHq`zbF$JDTz5Q`N^fZsd*)yF1AWQ8NHOu6e~j`b4ynX z7b6o>LswTLLqkV5XBS6v7gtM1M+-L#CqtMS*z`I%SsI%e8(BJ8nz6xHwrjTAIN0dgc|EB<3Zj!tBii+6&cdfmg4Ub5UwyNq$jCetr%t1q5W|m*f{` z1p9gXIl9uo!OgiH|dPZ zw8s`=o{h}Uw{NpquYPpf{kW&Txew;`Zst6tQ`{eYA} zNf}9|wa87|pin3}C20p&*BK4N;7E@P?{;#fiKHyE$TmKGNmQt(!tVc^79aMC2X7*# zNKO^rq;9zR@XWI-jE$UnA9P8JD1BMK;XB(F6-AX74|(;nHaNx0SKB%6KO?85o;Gjx z+~#Ku^OC>moO-sJW9dOfbDdvn))&7Ox$>`dLUmP6p3U20sd$I!Ufa(3AJj0fXN&yT zyW`r9^;=q5q(yE#^?hfzF7WIh$tx?=3Ya$4>&Gm|5qnEF4eZ* ziDIxcSST$rJwWP8^YSdguC+m7Q>O|VIk}zSkW^Iua=&#Ss|17l() ); break; } + case Toolkit::TextInput::POP_UP_OFFSET_FROM_TEXT_PROPERTY: + { + textInputImpl.SetOffsetFromText( value.Get< Vector4 >() ); + break; + } } } } @@ -5251,6 +5274,11 @@ Property::Value TextInput::GetProperty( BaseObject* object, Property::Index prop value = textInputImpl.mPopUpPanel.GetButtonPriorityPosition( TextInputPopup::ButtonsClipboard ); break; } + case Toolkit::TextInput::POP_UP_OFFSET_FROM_TEXT_PROPERTY: + { + value = textInputImpl.GetOffsetFromText(); + break; + } } } return value; diff --git a/base/dali-toolkit/internal/controls/text-input/text-input-impl.h b/base/dali-toolkit/internal/controls/text-input/text-input-impl.h index 9eb5ee6..e7a4f42 100644 --- a/base/dali-toolkit/internal/controls/text-input/text-input-impl.h +++ b/base/dali-toolkit/internal/controls/text-input/text-input-impl.h @@ -1333,6 +1333,18 @@ public: // Public to allow internal testing. */ void GetTextLayoutInfo(); + /** + * Set the offset for positioning Popup from the TextInput + * @param[in] offset in the order, left, top, right, bottom + */ + void SetOffsetFromText( const Vector4& offset ); + + /** + * Get the offset of the Popup from the TextInput + * @return Vector4 with the offset in the order, left, top, right, bottom + */ + const Vector4& GetOffsetFromText() const; + // Properties /** @@ -1452,10 +1464,11 @@ private: Vector4 mSelectionHandleFlipMargin; Vector4 mBoundingRectangleWorldCoordinates; - Clipboard mClipboard; ///< Handle to clipboard + Clipboard mClipboard; ///< Handle to clipboard // Styling - Vector4 mMaterialColor; // Color of the highlight + Vector4 mMaterialColor; // Color of the highlight + Vector4 mPopupOffsetFromText; // Offset of Popup from the TextInput. bool mOverrideAutomaticAlignment:1; ///< Whether to override the alignment automatically set by the text content (e.g. european LTR or arabic RTL) bool mCursorRTLEnabled:1; ///< Enable state of Alternate RTL Cursor (need to keep track of this as it's not always enabled) diff --git a/base/dali-toolkit/internal/controls/text-input/text-input-popup-impl.cpp b/base/dali-toolkit/internal/controls/text-input/text-input-popup-impl.cpp index 9df837f..bd7132e 100644 --- a/base/dali-toolkit/internal/controls/text-input/text-input-popup-impl.cpp +++ b/base/dali-toolkit/internal/controls/text-input/text-input-popup-impl.cpp @@ -42,7 +42,8 @@ const Vector3 POPUP_BORDER( Vector3(1.0f, 1.0f, 0.0f) ); */ // Popup: Tails -const char* DEFAULT_POPUP_TAIL_BOTTOM( DALI_IMAGE_DIR "00_popup_bubble_tail_bottom.png" ); +const char* DEFAULT_POPUP_TAIL_BOTTOM( DALI_IMAGE_DIR "popup_bubble_tail_bottom.png" ); +const char* DEFAULT_POPUP_TAIL_BOTTOM_OUTLINE( DALI_IMAGE_DIR "popup_bubble_tail_bottom_line.png" ); // Popup: Vertical Constraint // TODO: Remove - this should come from application - it is not possible to get the @@ -69,7 +70,7 @@ const float HIDE_POPUP_ANIMATION_DURATION(0.2f); ///< const float SHOW_POPUP_ANIMATION_DURATION(0.2f); ///< Duration of popup show animation in seconds. const Vector2 DEFAULT_ICON_SIZE( 45.0f, 45.0f ); ///< Default icon size for image in options -const float TEXT_POSITION_OFFSET( -19.0f ); ///< Default offset for text label +const float TEXT_POSITION_OFFSET( -19.0f ); ///< Default offset for text label const float ICON_POSITION_OFFSET( 19.0f ); ///< Default offset for icon const char* DEFAULT_ICON_CLIPBOARD( DALI_IMAGE_DIR "copy_paste_icon_clipboard.png" ); @@ -177,6 +178,35 @@ struct ConfinementConstraint Rect mBoundingRect; ///< Bounding Rect Popup must stay within }; +/** + * Confine actor to the x axis boundaries of reference actor (e.g. Parent) + */ +struct ParentXAxisConstraint +{ + /** + * Confinement constraint constructor. + */ + ParentXAxisConstraint( float handlesMidPoint = 0.0f ) + : mHandlesMidPoint( handlesMidPoint ) + { + } + + float operator()( const float constXPosition, + const PropertyInput& localWidthProperty, + const PropertyInput& anchorPointXProperty ) + { + const float size = localWidthProperty.GetFloat(); + const float anchor = anchorPointXProperty.GetFloat(); + + float newPosition = Clamp( mHandlesMidPoint, constXPosition - size * anchor , constXPosition + size * anchor); + + return newPosition; + } + + float mHandlesMidPoint; +}; + + } // unnamed namespace namespace Dali @@ -202,6 +232,7 @@ const char* const TextInputPopup::OPTION_CLIPBOARD("option-clipboard"); TextInputPopup::TextInputPopup() : mState(StateHidden), mRootActor(Layer::New()), + mPopupTailXPosition( 0.0f ), mContentSize( Vector3::ZERO ), mCutPasteButtonsColor( DEFAULT_POPUP_BACKGROUND ), mCutPasteButtonsPressedColor( DEFAULT_POPUP_BUTTON_PRESSED ), @@ -252,6 +283,15 @@ void TextInputPopup::ApplyConfinementConstraint() mRootActor.ApplyConstraint(constraint); } +void TextInputPopup::ApplyTailConstraint() +{ + mTail.RemoveConstraints(); + Constraint constraint = Constraint::New( Actor::POSITION_X, + LocalSource( Actor::SIZE_WIDTH ), + LocalSource( Actor::ANCHOR_POINT_X ), + ParentXAxisConstraint()); +} + void TextInputPopup::CreateLayer( const Vector2& size ) { mLayer = Layer::New(); @@ -312,6 +352,7 @@ void TextInputPopup::Clear() { if ( mBackground ) { + UnparentAndReset( mTail ); UnparentAndReset( mStencil ); UnparentAndReset( mBackground ); UnparentAndReset( mScrollView ); @@ -365,13 +406,21 @@ void TextInputPopup::CreatePopUpBackground() // Add Tail too. Image tailImage = Image::New( DEFAULT_POPUP_TAIL_BOTTOM ); + Image tailImageOutline = Image::New( DEFAULT_POPUP_TAIL_BOTTOM_OUTLINE ); + + mTailOutline = ImageActor::New ( tailImageOutline ); + mTailOutline.SetParentOrigin( ParentOrigin::CENTER ); + mTailOutline.SetAnchorPoint( AnchorPoint::CENTER ); + mTailOutline.ApplyConstraint( Constraint::New( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) ); mTail = ImageActor::New( tailImage ); mTail.SetParentOrigin( ParentOrigin::BOTTOM_CENTER ); mTail.SetAnchorPoint( AnchorPoint::TOP_CENTER ); - mBackground.Add( mTail ); // TODO: Make tail visible, and positioned in relation to original intended position of popup (i.e. before constrained effects) - mTail.SetVisible(false); + mTail.SetVisible(true); + mTail.SetColor( mCutPasteButtonsColor ); + mTailOutline.SetColor( mBorderColor ); + mTail.Add( mTailOutline); } } @@ -577,15 +626,12 @@ void TextInputPopup::AddOption(const std::string& name, const std::string& capti { i->SetSize( DIVIDER_WIDTH, dividerHeight ); } - - mTail.SetPosition(Vector3(0.0f, -20.0f, 0.0f)); - button.ClickedSignal().Connect( this, &TextInputPopup::OnButtonPressed ); } void TextInputPopup::Hide(bool animate) { - if(mBackground) + if( mRootActor ) { if(mAnimation) { @@ -596,8 +642,8 @@ void TextInputPopup::Hide(bool animate) if(animate) { mAnimation = Animation::New( HIDE_POPUP_ANIMATION_DURATION ); - mAnimation.AnimateTo( Property(mBackground, Actor::SCALE), Vector3::ZERO, AlphaFunctions::EaseOut ); - mAnimation.AnimateTo( Property(mBackground, Actor::COLOR_ALPHA), 0.0f, AlphaFunctions::EaseOut ); + mAnimation.AnimateTo( Property(mRootActor, Actor::SCALE), Vector3::ZERO, AlphaFunctions::EaseOut ); + mAnimation.AnimateTo( Property(mRootActor, Actor::COLOR_ALPHA), 0.0f, AlphaFunctions::EaseOut ); mAnimation.Play(); mAnimation.FinishedSignal().Connect( this, &TextInputPopup::OnHideFinished ); @@ -605,8 +651,8 @@ void TextInputPopup::Hide(bool animate) } else { - mBackground.SetProperty(Actor::SCALE, Vector3::ZERO); - mBackground.SetProperty(Actor::COLOR_ALPHA, 0.0f); + mRootActor.SetProperty(Actor::SCALE, Vector3::ZERO); + mRootActor.SetProperty(Actor::COLOR_ALPHA, 0.0f); mState = StateHidden; } } @@ -614,9 +660,11 @@ void TextInputPopup::Hide(bool animate) void TextInputPopup::Show(bool animate) { - if(mBackground) + if( mRootActor ) { - mBackground.SetSensitive( true ); + mRootActor.SetSensitive( true ); + + mTail.SetPosition(Vector3( mPopupTailXPosition, 0.0f, 0.0f)); if(mAnimation) { @@ -627,8 +675,8 @@ void TextInputPopup::Show(bool animate) if(animate) { mAnimation = Animation::New( SHOW_POPUP_ANIMATION_DURATION ); - mAnimation.AnimateTo( Property(mBackground, Actor::SCALE), Vector3::ONE, AlphaFunctions::EaseOut ); - mAnimation.AnimateTo( Property(mBackground, Actor::COLOR_ALPHA), 1.0f, AlphaFunctions::EaseOut ); + mAnimation.AnimateTo( Property(mRootActor, Actor::SCALE), Vector3::ONE, AlphaFunctions::EaseOut ); + mAnimation.AnimateTo( Property(mRootActor, Actor::COLOR_ALPHA), 1.0f, AlphaFunctions::EaseOut ); mAnimation.Play(); mAnimation.FinishedSignal().Connect( this, &TextInputPopup::OnShowFinished ); @@ -636,8 +684,8 @@ void TextInputPopup::Show(bool animate) } else { - mBackground.SetProperty(Actor::SCALE, Vector3::ONE); - mBackground.SetProperty(Actor::COLOR_ALPHA, 1.0f); + mRootActor.SetProperty(Actor::SCALE, Vector3::ONE); + mRootActor.SetProperty(Actor::COLOR_ALPHA, 1.0f); mState = StateShown; } } @@ -811,6 +859,7 @@ void TextInputPopup::AddPopupOptions() mLayer.Add( mStencil ); mLayer.Add( mScrollView ); mScrollView.Add( mBackground ); + mRootActor.Add( mTail ); Self().Add(mLayer); } @@ -820,6 +869,12 @@ void TextInputPopup::SetPopupBoundary( const Rect& boundingRectangle ) mBoundingRect = boundingRectangle; } +void TextInputPopup::SetTailPosition( const Vector3& position ) +{ + mPopupTailXPosition = position.x; + ApplyTailConstraint(); +} + bool TextInputPopup::OnButtonPressed( Toolkit::Button button ) { mPressedSignal.Emit( button ); @@ -861,3 +916,4 @@ TextInputPopup::ShowFinishedSignalV2& TextInputPopup::ShowFinishedSignal() } // namespace Toolkit } // namespace Dali + diff --git a/base/dali-toolkit/internal/controls/text-input/text-input-popup-impl.h b/base/dali-toolkit/internal/controls/text-input/text-input-popup-impl.h index cd5b2be..3a5a415 100644 --- a/base/dali-toolkit/internal/controls/text-input/text-input-popup-impl.h +++ b/base/dali-toolkit/internal/controls/text-input/text-input-popup-impl.h @@ -260,6 +260,12 @@ public: */ void SetPopupBoundary( const Rect& boundingRectangle ); + /** + * Sets the positon of the PopUp tail relative to TextInput + * @param position Position to set + */ + void SetTailPosition( const Vector3& position ); + private: /** @@ -285,6 +291,11 @@ private: void ApplyConfinementConstraint(); /** + * Applies constraint to keep the Tail attached to Popup + */ + void ApplyTailConstraint(); + + /** * Create a layer to hold the stencil * @param[in] size Size to of layer */ @@ -347,6 +358,10 @@ private: Property::Index mAlternativeOffsetProperty; ///< Property [Vector3] how much to offset the popup if it goes out of the screen ImageActor mBackground; ///< The background popup panel ImageActor mTail; ///< The tail for the popup + ImageActor mTailOutline; ///< The border/outline around the tail + + float mPopupTailXPosition; ///< X position of PopUp tail. + Vector3 mContentSize; ///< Size of Content (i.e. Buttons) ActorContainer mButtonContainer; ///< List of buttons added to popup. ActorContainer mDividerContainer; ///< List of dividers added to popup. diff --git a/capi/dali-toolkit/public-api/controls/text-input/text-input.h b/capi/dali-toolkit/public-api/controls/text-input/text-input.h index df140b3..3768c55 100644 --- a/capi/dali-toolkit/public-api/controls/text-input/text-input.h +++ b/capi/dali-toolkit/public-api/controls/text-input/text-input.h @@ -59,6 +59,9 @@ public: static const Property::Index SELECT_BUTTON_POSITION_PRIORITY_PROPERTY; // Property, name "select-button-position-priority", type unsigned int static const Property::Index SELECT_ALL_BUTTON_POSITION_PRIORITY_PROPERTY; // Property, name "select-all-button-position-priority", type unsigned int static const Property::Index CLIPBOARD_BUTTON_POSITION_PRIORITY_PROPERTY; // Property, name "clipboard-button-position-priority", type unsigned int + + static const Property::Index POP_UP_OFFSET_FROM_TEXT_PROPERTY; // Property, name "popup-offset-from-text", type VECTOR4 + /** @} */ /// @name Signals -- 2.7.4