-//
-// 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 <dali-toolkit/internal/controls/popup/popup-impl.h>
}
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),
// 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 );
}
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;
}
}
// Add the margins
- float margin( 2.0f * ( POPUP_OUT_MARGIN_WIDTH + mPopupStyle->margin ) );
naturalSize.width += margin;
naturalSize.height += margin;
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() )
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 );
{
switch ( direction )
{
- case Control::Left:
+ case Toolkit::Control::Left:
{
if ( iter == focusableActors.begin() )
{
}
break;
}
- case Control::Right:
+ case Toolkit::Control::Right:
{
if ( iter == focusableActors.end() - 1 )
{
break;
}
- case Control::Up:
+ case Toolkit::Control::Up:
{
if ( *iter == mContent )
{
break;
}
- case Control::Down:
+ case Toolkit::Control::Down:
{
if ( mContent && mContent.IsKeyboardFocusable() )
{