X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Fpopup%2Fpopup-impl.cpp;h=c7dd2e42d16ab3a03aab38f564bf6a3ca600a84b;hp=82746280f409f18483f2e7c23af75256c96bb7e3;hb=ae59f2ed1fd067050fb57465b9623160d995e02e;hpb=ee2676c4dfd4ec5e1cb7078acf2ead93fc4c9051 diff --git a/dali-toolkit/internal/controls/popup/popup-impl.cpp b/dali-toolkit/internal/controls/popup/popup-impl.cpp old mode 100755 new mode 100644 index 8274628..c7dd2e4 --- a/dali-toolkit/internal/controls/popup/popup-impl.cpp +++ b/dali-toolkit/internal/controls/popup/popup-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,9 +28,9 @@ #include #include #include -#include #include #include +#include #include // INTERNAL INCLUDES @@ -38,6 +38,8 @@ #include #include #include +#include +#include #include using namespace Dali; @@ -108,39 +110,40 @@ BaseHandle CreateToast() DALI_TYPE_REGISTRATION_BEGIN( Toolkit::Popup, Toolkit::Control, Create ) // Main content related properties. -DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "title", MAP, TITLE ) -DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "content", MAP, CONTENT ) -DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "footer", MAP, FOOTER ) -DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "displayState", STRING, DISPLAY_STATE ) -DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "touchTransparent", BOOLEAN, TOUCH_TRANSPARENT ) +DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "title", MAP, TITLE ) +DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "content", MAP, CONTENT ) +DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "footer", MAP, FOOTER ) +DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "displayState", STRING, DISPLAY_STATE ) +DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "touchTransparent", BOOLEAN, TOUCH_TRANSPARENT ) // Contextual related properties. -DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "tailVisibility", BOOLEAN, TAIL_VISIBILITY ) -DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "tailPosition", VECTOR3, TAIL_POSITION ) -DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "contextualMode", STRING, CONTEXTUAL_MODE ) +DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "tailVisibility", BOOLEAN, TAIL_VISIBILITY ) +DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "tailPosition", VECTOR3, TAIL_POSITION ) +DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "contextualMode", STRING, CONTEXTUAL_MODE ) // Animation related properties. -DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "animationDuration", FLOAT, ANIMATION_DURATION ) -DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "animationMode", STRING, ANIMATION_MODE ) -DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "entryAnimation", MAP, ENTRY_ANIMATION ) -DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "exitAnimation", MAP, EXIT_ANIMATION ) -DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "autoHideDelay", INTEGER, AUTO_HIDE_DELAY ) +DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "animationDuration", FLOAT, ANIMATION_DURATION ) +DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "animationMode", STRING, ANIMATION_MODE ) +DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "entryAnimation", MAP, ENTRY_ANIMATION ) +DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "exitAnimation", MAP, EXIT_ANIMATION ) +DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "autoHideDelay", INTEGER, AUTO_HIDE_DELAY ) // Style related properties. -DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "backingEnabled", BOOLEAN, BACKING_ENABLED ) -DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "backingColor", VECTOR4, BACKING_COLOR ) -DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "popupBackgroundImage", STRING, POPUP_BACKGROUND_IMAGE ) -DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "tailUpImage", STRING, TAIL_UP_IMAGE ) -DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "tailDownImage", STRING, TAIL_DOWN_IMAGE ) -DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "tailLeftImage", STRING, TAIL_LEFT_IMAGE ) -DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "tailRightImage", STRING, TAIL_RIGHT_IMAGE ) +DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "backingEnabled", BOOLEAN, BACKING_ENABLED ) +DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "backingColor", VECTOR4, BACKING_COLOR ) +DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "popupBackgroundImage", STRING, POPUP_BACKGROUND_IMAGE ) +DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "popupBackgroundBorder", RECTANGLE, POPUP_BACKGROUND_BORDER ) +DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "tailUpImage", STRING, TAIL_UP_IMAGE ) +DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "tailDownImage", STRING, TAIL_DOWN_IMAGE ) +DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "tailLeftImage", STRING, TAIL_LEFT_IMAGE ) +DALI_PROPERTY_REGISTRATION( Toolkit, Popup, "tailRightImage", STRING, TAIL_RIGHT_IMAGE ) // Signals. -DALI_SIGNAL_REGISTRATION( Toolkit, Popup, "touchedOutside", SIGNAL_TOUCHED_OUTSIDE ) -DALI_SIGNAL_REGISTRATION( Toolkit, Popup, "showing", SIGNAL_SHOWING ) -DALI_SIGNAL_REGISTRATION( Toolkit, Popup, "shown", SIGNAL_SHOWN ) -DALI_SIGNAL_REGISTRATION( Toolkit, Popup, "hiding", SIGNAL_HIDING ) -DALI_SIGNAL_REGISTRATION( Toolkit, Popup, "hidden", SIGNAL_HIDDEN ) +DALI_SIGNAL_REGISTRATION( Toolkit, Popup, "touchedOutside", SIGNAL_TOUCHED_OUTSIDE ) +DALI_SIGNAL_REGISTRATION( Toolkit, Popup, "showing", SIGNAL_SHOWING ) +DALI_SIGNAL_REGISTRATION( Toolkit, Popup, "shown", SIGNAL_SHOWN ) +DALI_SIGNAL_REGISTRATION( Toolkit, Popup, "hiding", SIGNAL_HIDING ) +DALI_SIGNAL_REGISTRATION( Toolkit, Popup, "hidden", SIGNAL_HIDDEN ) DALI_TYPE_REGISTRATION_END() @@ -192,7 +195,7 @@ const char* DEFAULT_TAIL_LEFT_IMAGE_PATH = DALI_IMAGE_DIR "popup_tail_lef const char* DEFAULT_TAIL_RIGHT_IMAGE_PATH = DALI_IMAGE_DIR "popup_tail_right.png"; ///< Tail right image. const Vector4 DEFAULT_BACKING_COLOR( 0.0f, 0.0f, 0.0f, 0.5f ); ///< Color of the dimmed backing. -const Vector3 BACKGROUND_OUTER_BORDER( 40.0f, 30.0f, 0.0f ); ///< External border. +const Rect DEFAULT_BACKGROUND_BORDER( 17, 17, 13, 13 ); ///< Default border of the background. const Rect DEFAULT_TITLE_PADDING( 20.0f, 20.0f, 20.0f, 20.0f ); ///< Title padding used on popups with content and/or controls (from Tizen GUI UX). const Rect DEFAULT_TITLE_ONLY_PADDING( 8.0f, 8.0f, 8.0f, 8.0f ); ///< Title padding used on popups with a title only (like toast popups). const Vector3 FOOTER_SIZE( 620.0f, 96.0f,0.0f ); ///< Default size of the bottom control area. @@ -220,7 +223,7 @@ Dali::Toolkit::Popup Popup::New() } Popup::Popup() -: Control( ControlBehaviour( REQUIRES_STYLE_CHANGE_SIGNALS ) ), +: Control( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ), mTouchedOutsideSignal(), mShowingSignal(), mShownSignal(), @@ -252,7 +255,7 @@ Popup::Popup() mBackingEnabled( true ), mBackingColor( DEFAULT_BACKING_COLOR ), mPopupBackgroundImage(), - mBackgroundOuterBorder(), + mBackgroundBorder( DEFAULT_BACKGROUND_BORDER ), mMargin(), mTailUpImage( DEFAULT_TAIL_UP_IMAGE_PATH ), mTailDownImage( DEFAULT_TAIL_DOWN_IMAGE_PATH ), @@ -305,7 +308,7 @@ void Popup::OnInitialize() mPopupLayout = Toolkit::TableView::New( 3, 1 ); // Adds the default background image. - SetPopupBackgroundImage( Toolkit::ImageView::New( ResourceImage::New( DEFAULT_BACKGROUND_IMAGE_PATH ) ) ); + SetPopupBackgroundImage( Toolkit::ImageView::New( DEFAULT_BACKGROUND_IMAGE_PATH ) ); mPopupLayout.SetName( "popupLayoutTable" ); mPopupLayout.SetParentOrigin( ParentOrigin::CENTER ); @@ -568,7 +571,11 @@ void Popup::SetPopupBackgroundImage( Actor image ) // Removes any previous background. if( mPopupBackgroundImage ) { - mPopupContainer.Remove( mPopupBackgroundImage ); + mPopupBackgroundImage.Unparent(); + if( mTailImage ) + { + mTailImage.Unparent(); + } } // Adds new background to the dialog. @@ -581,14 +588,19 @@ void Popup::SetPopupBackgroundImage( Actor image ) mPopupBackgroundImage.TouchSignal().Connect( this, &Popup::OnDialogTouched ); // Set the popup border to be slightly larger than the layout contents. - mPopupBackgroundImage.SetResizePolicy( ResizePolicy::SIZE_FIXED_OFFSET_FROM_PARENT, Dimension::ALL_DIMENSIONS ); - mPopupBackgroundImage.SetSizeModeFactor( BACKGROUND_OUTER_BORDER ); + UpdateBackgroundPositionAndSize(); const bool prevAlter = mAlterAddedChild; mAlterAddedChild = false; mPopupContainer.Add( mPopupBackgroundImage ); + DevelActor::LowerToBottom(mPopupBackgroundImage); mAlterAddedChild = prevAlter; + if( mTailImage ) + { + mPopupBackgroundImage.Add( mTailImage ); + } + mLayoutDirty = true; } @@ -839,38 +851,50 @@ void Popup::LayoutTail() return; } - const Vector3& position = GetTailPosition(); + const Vector3& parentOrigin = GetTailPosition(); + Vector3 position; std::string image; + Vector3 anchorPoint; // depending on position of tail around ParentOrigin, a different tail image is used... - if( position.y < Math::MACHINE_EPSILON_1 ) + if( parentOrigin.y < Math::MACHINE_EPSILON_1 ) { image = mTailUpImage; + anchorPoint = AnchorPoint::BOTTOM_CENTER; + position.y = mBackgroundBorder.top; } - else if( position.y > 1.0f - Math::MACHINE_EPSILON_1 ) + else if( parentOrigin.y > ( 1.0f - Math::MACHINE_EPSILON_1 ) ) { image = mTailDownImage; + anchorPoint = AnchorPoint::TOP_CENTER; + position.y = - mBackgroundBorder.bottom; } - else if( position.x < Math::MACHINE_EPSILON_1 ) + else if( parentOrigin.x < Math::MACHINE_EPSILON_1 ) { image = mTailLeftImage; + anchorPoint = AnchorPoint::CENTER_RIGHT; + position.x = mBackgroundBorder.left; } - else if( position.x > 1.0f - Math::MACHINE_EPSILON_1 ) + else if( parentOrigin.x > ( 1.0f - Math::MACHINE_EPSILON_1 ) ) { image = mTailRightImage; + anchorPoint = AnchorPoint::CENTER_LEFT; + position.x = - mBackgroundBorder.right; } if( !image.empty() ) { // Adds the tail actor. - Image tail = ResourceImage::New( image ); - mTailImage = Toolkit::ImageView::New( tail ); + mTailImage = Toolkit::ImageView::New( image ); mTailImage.SetName( "tailImage" ); - const Vector3 anchorPoint = AnchorPoint::BOTTOM_RIGHT - position; - mTailImage.SetParentOrigin( position ); + mTailImage.SetParentOrigin( parentOrigin ); mTailImage.SetAnchorPoint( anchorPoint ); + mTailImage.SetPosition( position ); - mPopupContainer.Add( mTailImage ); + if( mPopupBackgroundImage ) + { + mPopupBackgroundImage.Add( mTailImage ); + } } } @@ -888,12 +912,13 @@ Toolkit::Popup::ContextualMode Popup::GetContextualMode() const Toolkit::Control Popup::CreateBacking() { Toolkit::Control backing = Control::New(); - backing.SetBackgroundColor( Vector4( mBackingColor.r, mBackingColor.g, mBackingColor.b, 1.0f ) ); + backing.SetProperty( Toolkit::Control::Property::BACKGROUND, + Property::Map().Add( Toolkit::Visual::Property::TYPE, Toolkit::Visual::COLOR ) + .Add( Toolkit::ColorVisual::Property::MIX_COLOR, Vector4( mBackingColor.r, mBackingColor.g, mBackingColor.b, 1.0f ) ) ); backing.SetName( "popupBacking" ); // Must always be positioned top-left of stage, regardless of parent. backing.SetInheritPosition(false); - backing.SetAnchorPoint( AnchorPoint::TOP_LEFT ); // Always the full size of the stage. backing.SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS ); @@ -990,6 +1015,18 @@ void Popup::SetExitAnimationData( const Property::Map& map ) Scripting::NewAnimation( map, mExitAnimationData ); } +void Popup::UpdateBackgroundPositionAndSize() +{ + if( mPopupBackgroundImage ) + { + mPopupBackgroundImage.SetResizePolicy( ResizePolicy::SIZE_FIXED_OFFSET_FROM_PARENT, Dimension::ALL_DIMENSIONS ); + mPopupBackgroundImage.SetSizeModeFactor( Vector3( mBackgroundBorder.left + mBackgroundBorder.right, mBackgroundBorder.top + mBackgroundBorder.bottom, 0.0f ) ); + + // Adjust the position of the background so the transparent areas are set appropriately + mPopupBackgroundImage.SetPosition( ( mBackgroundBorder.right - mBackgroundBorder.left ) * 0.5f, ( mBackgroundBorder.bottom - mBackgroundBorder.top ) * 0.5f ); + } +} + void Popup::SetAutoHideDelay( int delay ) { mAutoHideDelay = delay; @@ -1027,6 +1064,7 @@ void Popup::SetTailUpImage( std::string image ) { mTailUpImage = image; mLayoutDirty = true; + LayoutTail(); } const std::string& Popup::GetTailUpImage() const @@ -1038,6 +1076,7 @@ void Popup::SetTailDownImage( std::string image ) { mTailDownImage = image; mLayoutDirty = true; + LayoutTail(); } const std::string& Popup::GetTailDownImage() const @@ -1049,6 +1088,7 @@ void Popup::SetTailLeftImage( std::string image ) { mTailLeftImage = image; mLayoutDirty = true; + LayoutTail(); } const std::string& Popup::GetTailLeftImage() const @@ -1060,6 +1100,7 @@ void Popup::SetTailRightImage( std::string image ) { mTailRightImage = image; mLayoutDirty = true; + LayoutTail(); } const std::string& Popup::GetTailRightImage() const @@ -1239,12 +1280,33 @@ void Popup::SetProperty( BaseObject* object, Property::Index propertyIndex, cons std::string valueString; if( value.Get( valueString ) ) { - Image image = ResourceImage::New( valueString ); - if( image ) - { - Toolkit::ImageView actor = Toolkit::ImageView::New( image ); - popupImpl.SetPopupBackgroundImage( actor ); - } + Toolkit::ImageView actor = Toolkit::ImageView::New( valueString ); + popupImpl.SetPopupBackgroundImage( actor ); + } + break; + } + case Toolkit::Popup::Property::POPUP_BACKGROUND_BORDER: + { + bool valueUpdated = false; + + Vector4 valueVector4; + if( value.Get( popupImpl.mBackgroundBorder ) ) + { + valueUpdated = true; + } + else if( value.Get( valueVector4 ) ) + { + popupImpl.mBackgroundBorder.left = valueVector4.x; + popupImpl.mBackgroundBorder.right = valueVector4.y; + popupImpl.mBackgroundBorder.bottom = valueVector4.z; + popupImpl.mBackgroundBorder.top = valueVector4.w; + valueUpdated = true; + } + + if( valueUpdated ) + { + popupImpl.LayoutTail(); // Update the tail if required + popupImpl.UpdateBackgroundPositionAndSize(); // Update the background's size and position } break; } @@ -1387,13 +1449,18 @@ Property::Value Popup::GetProperty( BaseObject* object, Property::Index property } case Toolkit::Popup::Property::POPUP_BACKGROUND_IMAGE: { - ResourceImage image = ResourceImage::DownCast( popupImpl.GetPopupBackgroundImage() ); - if( image ) + Toolkit::ImageView imageView = Toolkit::ImageView::DownCast( popupImpl.GetPopupBackgroundImage() ); + if( imageView ) { - value = image.GetUrl(); + value = imageView.GetProperty( Toolkit::ImageView::Property::IMAGE ); } break; } + case Toolkit::Popup::Property::POPUP_BACKGROUND_BORDER: + { + value = popupImpl.mBackgroundBorder; + break; + } case Toolkit::Popup::Property::TAIL_UP_IMAGE: { value = popupImpl.GetTailUpImage(); @@ -1508,16 +1575,14 @@ bool Popup::OnDialogTouched( Actor actor, const TouchData& touch ) void Popup::OnStageConnection( int depth ) { - Control::OnStageConnection( depth ); - mLayoutDirty = true; RelayoutRequest(); + + Control::OnStageConnection( depth ); } void Popup::OnChildAdd( Actor& child ) { - Control::OnChildAdd( child ); - // Re-parent any children added by user to the body layer. if( mAlterAddedChild ) { @@ -1528,6 +1593,8 @@ void Popup::OnChildAdd( Actor& child ) mLayoutDirty = true; RelayoutRequest(); } + + Control::OnChildAdd( child ); } void Popup::LayoutContext( const Vector2& size ) @@ -1882,6 +1949,11 @@ Actor Popup::GetNextKeyboardFocusableActor( Actor currentFocusedActor, Toolkit:: nextFocusableActor = *( endIterator - 1 ); break; } + + default: + { + break; + } } if( !nextFocusableActor )