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=0d7b93c6f7972b9df01e38c1d0b1f403881ca3c1;hp=8672c4a2f5ea588aafef05bfdae6979d0ef21a15;hb=bf58973c37b31d52707463a1e9cdecdbe91099f6;hpb=5e937a6322849b76d49d5b3f41cb5d91c94acd3e diff --git a/dali-toolkit/internal/controls/popup/popup-impl.cpp b/dali-toolkit/internal/controls/popup/popup-impl.cpp index 8672c4a..0d7b93c 100644 --- a/dali-toolkit/internal/controls/popup/popup-impl.cpp +++ b/dali-toolkit/internal/controls/popup/popup-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 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. @@ -26,9 +26,9 @@ #include #include #include -#include +#include #include -#include +#include #include #include #include @@ -39,7 +39,7 @@ #include #include #include -#include +#include #include #include #include @@ -82,7 +82,7 @@ BaseHandle CreateToast() Toolkit::Popup popup = Toolkit::Popup::New(); // Setup for Toast Popup type. - popup.SetSizeModeFactor( DEFAULT_TOAST_WIDTH_OF_STAGE_RATIO ); + popup.SetProperty( Actor::Property::SIZE_MODE_FACTOR, DEFAULT_TOAST_WIDTH_OF_STAGE_RATIO ); popup.SetResizePolicy( ResizePolicy::SIZE_RELATIVE_TO_PARENT, Dimension::WIDTH ); popup.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::HEIGHT ); popup.SetProperty( Toolkit::Popup::Property::CONTEXTUAL_MODE, Toolkit::Popup::NON_CONTEXTUAL ); @@ -282,7 +282,7 @@ void Popup::OnInitialize() self.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); self.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER ); - self.SetSizeModeFactor( DEFAULT_POPUP_PARENT_RELATIVE_SIZE ); + self.SetProperty( Actor::Property::SIZE_MODE_FACTOR, DEFAULT_POPUP_PARENT_RELATIVE_SIZE ); self.SetResizePolicy( ResizePolicy::SIZE_RELATIVE_TO_PARENT, Dimension::WIDTH ); self.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::HEIGHT ); @@ -325,19 +325,19 @@ void Popup::OnInitialize() mPopupLayout.SetResizePolicy( ResizePolicy::USE_ASSIGNED_SIZE, Dimension::WIDTH ); mPopupLayout.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::HEIGHT ); - mPopupLayout.SetSize( Stage::GetCurrent().GetSize().x * DEFAULT_RELATIVE_PARENT_WIDTH, 0.0f ); + mPopupLayout.SetProperty( Actor::Property::SIZE, Vector2( Stage::GetCurrent().GetSize().x * DEFAULT_RELATIVE_PARENT_WIDTH, 0.0f ) ); mPopupLayout.SetFitHeight( 0 ); // Set row to fit. mPopupLayout.SetFitHeight( 1 ); // Set row to fit. - mPopupLayout.TouchSignal().Connect( this, &Popup::OnDialogTouched ); - mPopupContainer.Add( mPopupLayout ); // Any content after this point which is added to Self() will be re-parented to mContent. mAlterAddedChild = true; SetAsKeyboardFocusGroup( true ); + + SetupTouch(); } Popup::~Popup() @@ -354,14 +354,14 @@ void Popup::LayoutAnimation() case Toolkit::Popup::ZOOM: { // Zoom animations start fully zoomed out. - mPopupContainer.SetScale( Vector3::ZERO ); + mPopupContainer.SetProperty( Actor::Property::SCALE, Vector3::ZERO ); break; } case Toolkit::Popup::FADE: { // Fade animations start transparent. - mPopupContainer.SetProperty( DevelActor::Property::OPACITY, 0.0f ); + mPopupContainer.SetProperty( Actor::Property::OPACITY, 0.0f ); break; } @@ -435,7 +435,7 @@ void Popup::StartTransitionAnimation( bool transitionIn, bool instantaneous /* f } else { - mPopupContainer.SetScale( transitionIn ? Vector3::ONE : Vector3::ZERO ); + mPopupContainer.SetProperty( Actor::Property::SCALE, transitionIn ? Vector3::ONE : Vector3::ZERO ); } break; } @@ -456,7 +456,7 @@ void Popup::StartTransitionAnimation( bool transitionIn, bool instantaneous /* f } else { - mPopupContainer.SetProperty( DevelActor::Property::OPACITY, transitionIn ? 1.0f : 0.0f ); + mPopupContainer.SetProperty( Actor::Property::OPACITY, transitionIn ? 1.0f : 0.0f ); } break; } @@ -593,9 +593,6 @@ void Popup::SetPopupBackgroundImage( Actor image ) mPopupBackgroundImage.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER ); mPopupBackgroundImage.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); - // OnDialogTouched only consumes the event. It prevents the touch event to be caught by the backing. - mPopupBackgroundImage.TouchSignal().Connect( this, &Popup::OnDialogTouched ); - // Set the popup border to be slightly larger than the layout contents. UpdateBackgroundPositionAndSize(); @@ -636,7 +633,7 @@ void Popup::SetTitle( Actor titleActor ) { // Set up padding to give sensible default behaviour // (an application developer can later override this if they wish). - mTitle.SetPadding( DEFAULT_TITLE_PADDING ); + mTitle.SetProperty( Actor::Property::PADDING, DEFAULT_TITLE_PADDING ); mPopupLayout.AddChild( mTitle, Toolkit::TableView::CellPosition( 0, 0 ) ); } @@ -747,16 +744,16 @@ void Popup::SetDisplayState( Toolkit::Popup::DisplayState displayState ) { mPreviousFocusedActor = keyboardFocusManager.GetCurrentFocusActor(); - if( Self().IsKeyboardFocusable() ) + if( Self().GetProperty< bool >( Actor::Property::KEYBOARD_FOCUSABLE ) ) { // Setup the actgor to start focus from. Actor focusActor; - if( mContent && mContent.IsKeyboardFocusable() ) + if( mContent && mContent.GetProperty< bool >( Actor::Property::KEYBOARD_FOCUSABLE ) ) { // If the content is focusable, move the focus to the content. focusActor = mContent; } - else if( mFooter && mFooter.IsKeyboardFocusable() ) + else if( mFooter && mFooter.GetProperty< bool >( Actor::Property::KEYBOARD_FOCUSABLE ) ) { // If the footer is focusable, move the focus to the footer. focusActor = mFooter; @@ -779,7 +776,7 @@ void Popup::SetDisplayState( Toolkit::Popup::DisplayState displayState ) ClearKeyInputFocus(); // Restore the keyboard focus when popup is hidden. - if( mPreviousFocusedActor && mPreviousFocusedActor.IsKeyboardFocusable() ) + if( mPreviousFocusedActor && mPreviousFocusedActor.GetProperty< bool >( Actor::Property::KEYBOARD_FOCUSABLE ) ) { Dali::Toolkit::KeyboardFocusManager keyboardFocusManager = Dali::Toolkit::KeyboardFocusManager::Get(); if( keyboardFocusManager ) @@ -823,11 +820,11 @@ void Popup::LayoutPopup() { if( !mContent && !mFooter ) { - mTitle.SetPadding( DEFAULT_TITLE_ONLY_PADDING ); + mTitle.SetProperty( Actor::Property::PADDING, DEFAULT_TITLE_ONLY_PADDING ); } else { - mTitle.SetPadding( DEFAULT_TITLE_PADDING ); + mTitle.SetProperty( Actor::Property::PADDING, DEFAULT_TITLE_PADDING ); } } @@ -898,7 +895,7 @@ void Popup::LayoutTail() mTailImage.SetProperty( Dali::Actor::Property::NAME, "tailImage" ); mTailImage.SetProperty( Actor::Property::PARENT_ORIGIN, parentOrigin ); mTailImage.SetProperty( Actor::Property::ANCHOR_POINT, anchorPoint ); - mTailImage.SetPosition( position ); + mTailImage.SetProperty( Actor::Property::POSITION, position ); if( mPopupBackgroundImage ) { @@ -931,14 +928,13 @@ Toolkit::Control Popup::CreateBacking() // Always the full size of the stage. backing.SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS ); - backing.SetSize( Stage::GetCurrent().GetSize() ); + backing.SetProperty( Actor::Property::SIZE, Stage::GetCurrent().GetSize() ); // Catch events. backing.SetProperty( Actor::Property::SENSITIVE, true ); // Default to being transparent. backing.SetProperty( Actor::Property::COLOR_ALPHA, 0.0f ); - backing.TouchSignal().Connect( this, &Popup::OnBackingTouched ); backing.WheelEventSignal().Connect( this, &Popup::OnBackingWheelEvent ); return backing; } @@ -1029,10 +1025,10 @@ 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 ) ); + mPopupBackgroundImage.SetProperty( Actor::Property::SIZE_MODE_FACTOR, 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 ); + mPopupBackgroundImage.SetProperty( Actor::Property::POSITION, Vector2( ( mBackgroundBorder.right - mBackgroundBorder.left ) * 0.5f, ( mBackgroundBorder.bottom - mBackgroundBorder.top ) * 0.5f )); } } @@ -1119,7 +1115,11 @@ const std::string& Popup::GetTailRightImage() const void Popup::SetTouchTransparent( bool enabled ) { - mTouchTransparent = enabled; + if( mTouchTransparent != enabled ) + { + mTouchTransparent = enabled; + SetupTouch(); + } } const bool Popup::IsTouchTransparent() const @@ -1532,28 +1532,20 @@ bool Popup::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tra return connected; } -bool Popup::OnBackingTouched( Actor actor, const TouchData& touch ) +bool Popup::OnBackingTouched( Actor actor, const TouchEvent& touch ) { - // Allow events to pass through if touch transparency is enabled. - if( mTouchTransparent ) + // Allow events to pass through if the backing isn't the hit-actor + if( (touch.GetHitActor(0) == actor) && + (touch.GetPointCount() > 0) && + (touch.GetState( 0 ) == PointState::DOWN)) { - return false; - } - - if( touch.GetPointCount() > 0 ) - { - if( touch.GetState( 0 ) == PointState::DOWN ) - { - // Guard against destruction during signal emission. - Toolkit::Popup handle( GetOwner() ); + // Guard against destruction during signal emission. + Toolkit::Popup handle( GetOwner() ); - mTouchedOutsideSignal.Emit(); - } + mTouchedOutsideSignal.Emit(); } - // Block anything behind backing becoming touched. - mLayer.SetTouchConsumed( true ); - return true; + return false; } bool Popup::OnBackingWheelEvent( Actor actor, const WheelEvent& event ) @@ -1564,30 +1556,21 @@ bool Popup::OnBackingWheelEvent( Actor actor, const WheelEvent& event ) return false; } - // Consume wheel event in dimmed backing actor. - mLayer.SetTouchConsumed( true ); return true; } -bool Popup::OnDialogTouched( Actor actor, const TouchData& touch ) +bool Popup::OnDialogTouched( Actor actor, const TouchEvent& touch ) { - // Allow events to pass through if touch transparency is enabled. - if( mTouchTransparent ) - { - return false; - } - - // Consume event (stops backing actor receiving touch events) - mLayer.SetTouchConsumed( true ); - return true; + // Only connecting this so the backing does not become the default hit-actor and inadvertently closes the popup + return false; } -void Popup::OnStageConnection( int depth ) +void Popup::OnSceneConnection( int depth ) { mLayoutDirty = true; RelayoutRequest(); - Control::OnStageConnection( depth ); + Control::OnSceneConnection( depth ); } void Popup::OnChildAdd( Actor& child ) @@ -1687,7 +1670,7 @@ void Popup::LayoutContext( const Vector2& size ) } // Set the final position. - mPopupContainer.SetPosition( newPosition ); + mPopupContainer.SetProperty( Actor::Property::POSITION, newPosition ); } void Popup::OnRelayout( const Vector2& size, RelayoutContainer& container ) @@ -1831,7 +1814,7 @@ void Popup::AddFocusableChildrenRecursive( Actor parent, std::vector< Actor >& f Toolkit::Control control = Toolkit::Control::DownCast( parent ); bool layoutControl = control && GetImplementation( control ).IsKeyboardNavigationSupported(); - if( parent.IsKeyboardFocusable() || layoutControl ) + if( parent.GetProperty< bool >( Actor::Property::KEYBOARD_FOCUSABLE ) || layoutControl ) { focusableActors.push_back( parent ); @@ -1889,12 +1872,12 @@ Actor Popup::GetNextKeyboardFocusableActor( Actor currentFocusedActor, Toolkit:: ( currentFocusedActor && ( ( !mContent || ( currentFocusGroup != mContent ) ) && ( !mFooter || ( currentFocusGroup != mFooter ) ) ) ) ) { // The current focused actor is not within popup. - if( mContent && mContent.IsKeyboardFocusable() ) + if( mContent && mContent.GetProperty< bool >( Actor::Property::KEYBOARD_FOCUSABLE ) ) { // If the content is focusable, move the focus to the content. nextFocusableActor = mContent; } - else if( mFooter && mFooter.IsKeyboardFocusable() ) + else if( mFooter && mFooter.GetProperty< bool >( Actor::Property::KEYBOARD_FOCUSABLE ) ) { // If the footer is focusable, move the focus to the footer. nextFocusableActor = mFooter; @@ -1975,6 +1958,25 @@ Actor Popup::GetNextKeyboardFocusableActor( Actor currentFocusedActor, Toolkit:: return nextFocusableActor; } +void Popup::SetupTouch() +{ + if( ! mTouchTransparent ) + { + // Connect all the signals and set us up to consume all touch events + mBacking.TouchSignal().Connect( this, &Popup::OnBackingTouched ); + mPopupBackgroundImage.TouchSignal().Connect( this, &Popup::OnDialogTouched ); + mPopupLayout.TouchSignal().Connect( this, &Popup::OnDialogTouched ); + mLayer.SetProperty( Layer::Property::CONSUMES_TOUCH, true ); + } + else + { + // We are touch transparent so disconnect all signals and ensure our layer does not consumed all touch events + mBacking.TouchSignal().Disconnect( this, &Popup::OnBackingTouched ); + mPopupBackgroundImage.TouchSignal().Disconnect( this, &Popup::OnDialogTouched ); + mPopupLayout.TouchSignal().Disconnect( this, &Popup::OnDialogTouched ); + mLayer.SetProperty( Layer::Property::CONSUMES_TOUCH, false ); + } +} } // namespace Internal