X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=base%2Fdali-toolkit%2Finternal%2Fcontrols%2Fpopup%2Fpopup-impl.cpp;h=81e788717923b55bc2e85ba271ae778f4ac2312e;hp=8f1c9ef00a90c295dc0682d12317a1b7fd10b501;hb=d5e3ed5f5b1c8fdba3ae97ead8729620f54b3836;hpb=e58fa784d19a558e35f458ecf6d262a2344beb4f diff --git a/base/dali-toolkit/internal/controls/popup/popup-impl.cpp b/base/dali-toolkit/internal/controls/popup/popup-impl.cpp index 8f1c9ef..81e7887 100755 --- a/base/dali-toolkit/internal/controls/popup/popup-impl.cpp +++ b/base/dali-toolkit/internal/controls/popup/popup-impl.cpp @@ -1,18 +1,19 @@ -// -// Copyright (c) 2014 Samsung Electronics Co., Ltd. -// -// Licensed under the Flora License, Version 1.0 (the License); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://floralicense.org/license/ -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an AS IS BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// +/* + * Copyright (c) 2014 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ #include @@ -169,7 +170,7 @@ Dali::Toolkit::Popup Popup::New() } Popup::Popup(PopupStyle& style) -: ControlImpl(true), +: Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS | REQUIRES_STYLE_CHANGE_SIGNALS ) ), mShowing(false), mState(Toolkit::Popup::POPUP_NONE), // Initially, the popup state should not be set, it's set in OnInitialize mAlterAddedChild(false), @@ -732,16 +733,11 @@ void Popup::OnRelaidOut( Vector2 size, ActorSizeContainer& container ) // Relayout content if( mContent ) { - Vector2 contentSize; - contentSize.width = popupSize.width; - - Toolkit::Control control = Toolkit::Control::DownCast( mContent ); - if( control ) - { - contentSize.height = control.GetHeightForWidth( contentSize.width ); - } - else + // If the content width is greater than popup width then scale it down/wrap text as needed + Vector2 contentSize( RelayoutHelper::GetNaturalSize( mContent ) ); + if( contentSize.width > popupSize.width ) { + contentSize.width = popupSize.width; contentSize.height = RelayoutHelper::GetHeightForWidth( mContent, contentSize.width ); } @@ -826,28 +822,38 @@ bool Popup::OnKeyEvent(const KeyEvent& event) Vector3 Popup::GetNaturalSize() { - Vector3 naturalSize; + float margin = 2.0f * ( POPUP_OUT_MARGIN_WIDTH + mPopupStyle->margin ); + const float maxWidth = Stage::GetCurrent().GetSize().width - margin; - if ( mTitle ) - { - naturalSize += mTitle.GetImplementation().GetNaturalSize(); - naturalSize.height += mPopupStyle->margin; - } + Vector3 naturalSize( 0.0f, 0.0f, 0.0f ); - if( mContent ) + if ( mTitle ) { - Vector3 contentSize; - - Toolkit::Control control = Toolkit::Control::DownCast( mContent ); - if( control ) + Vector3 titleNaturalSize = mTitle.GetImplementation().GetNaturalSize(); + // Buffer to avoid errors. The width of the popup could potentially be the width of the title text. + // It was observed in this case that text wrapping was then inconsistent when seen on device + const float titleBuffer = 0.5f; + titleNaturalSize.width += titleBuffer; + + // As TextView GetNaturalSize does not take wrapping into account, limit the width + // to that of the stage + if( titleNaturalSize.width >= maxWidth) { - contentSize = control.GetImplementation().GetNaturalSize(); + naturalSize.width = maxWidth; + naturalSize.height = mTitle.GetImplementation().GetHeightForWidth( naturalSize.width ); } else { - contentSize = RelayoutHelper::GetNaturalSize( mContent ); + naturalSize += titleNaturalSize; } + naturalSize.height += mPopupStyle->margin; + } + + if( mContent ) + { + Vector3 contentSize = RelayoutHelper::GetNaturalSize( mContent ); + // Choose the biggest width naturalSize.width = std::max( naturalSize.width, contentSize.width ); naturalSize.height += contentSize.height + mPopupStyle->margin; } @@ -858,7 +864,6 @@ Vector3 Popup::GetNaturalSize() } // Add the margins - float margin( 2.0f * ( POPUP_OUT_MARGIN_WIDTH + mPopupStyle->margin ) ); naturalSize.width += margin; naturalSize.height += margin; @@ -878,19 +883,7 @@ float Popup::GetHeightForWidth( float width ) if( mContent ) { - float contentHeight; - - Toolkit::Control control = Toolkit::Control::DownCast( mContent ); - if( control ) - { - contentHeight = control.GetImplementation().GetHeightForWidth( popupWidth ); - } - else - { - contentHeight = RelayoutHelper::GetHeightForWidth( mContent, popupWidth ); - } - - height += contentHeight + mPopupStyle->margin; + height += RelayoutHelper::GetHeightForWidth( mContent, popupWidth ) + mPopupStyle->margin; } if( !mButtons.empty() ) @@ -910,7 +903,7 @@ float Popup::GetWidthForHeight( float height ) return GetNaturalSize().width; } -Actor Popup::GetNextKeyboardFocusableActor(Actor currentFocusedActor, Control::KeyboardFocusNavigationDirection direction, bool loopEnabled) +Actor Popup::GetNextKeyboardFocusableActor(Actor currentFocusedActor, Toolkit::Control::KeyboardFocusNavigationDirection direction, bool loopEnabled) { Actor nextFocusableActor( currentFocusedActor ); @@ -953,7 +946,7 @@ Actor Popup::GetNextKeyboardFocusableActor(Actor currentFocusedActor, Control::K { switch ( direction ) { - case Control::Left: + case Toolkit::Control::Left: { if ( iter == focusableActors.begin() ) { @@ -965,7 +958,7 @@ Actor Popup::GetNextKeyboardFocusableActor(Actor currentFocusedActor, Control::K } break; } - case Control::Right: + case Toolkit::Control::Right: { if ( iter == focusableActors.end() - 1 ) { @@ -978,7 +971,7 @@ Actor Popup::GetNextKeyboardFocusableActor(Actor currentFocusedActor, Control::K break; } - case Control::Up: + case Toolkit::Control::Up: { if ( *iter == mContent ) { @@ -1005,7 +998,7 @@ Actor Popup::GetNextKeyboardFocusableActor(Actor currentFocusedActor, Control::K break; } - case Control::Down: + case Toolkit::Control::Down: { if ( mContent && mContent.IsKeyboardFocusable() ) {