X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali-toolkit%2Futc-Dali-Layouting.cpp;h=29e37262c6252de3b9bb917960e94a326402aacf;hb=f8336fdc865faf2c19fe880252ad3bf1bb0aaee4;hp=5ba721b73c63d68e353152687e6a9f56a7aba097;hpb=5a436526e75ad9bef35e98614a00527fe5586f78;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/automated-tests/src/dali-toolkit/utc-Dali-Layouting.cpp b/automated-tests/src/dali-toolkit/utc-Dali-Layouting.cpp index 5ba721b..29e3726 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-Layouting.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-Layouting.cpp @@ -18,11 +18,15 @@ #include #include #include +#include #include #include #include #include +#include +#include +#include #include <../custom-layout.h> @@ -31,6 +35,15 @@ using namespace Dali; using namespace Toolkit; +void TestLayoutItemOrder( std::vector< Control >& controls, LayoutGroup& layoutGroup ) +{ + for( auto&& iter : controls ) + { + unsigned int siblingOrder = static_cast< unsigned int>( iter.GetProperty< int >( DevelActor::Property::SIBLING_ORDER ) ); + DALI_TEST_EQUALS( layoutGroup.GetChildAt( siblingOrder ), DevelControl::GetLayout( iter ), TEST_LOCATION ); + } +} + void utc_dali_toolkit_layouting_startup(void) { test_return_value = TET_UNDEF; @@ -531,7 +544,6 @@ int UtcDaliLayouting_HboxLayout06(void) END_TEST; } - int UtcDaliLayouting_HboxLayout07(void) { ToolkitTestApplication application; @@ -611,7 +623,6 @@ int UtcDaliLayouting_HboxLayout08(void) Control control1 = CreateLeafControl( 40, 40 ); rootControl.Add( control1 ); - auto hbox = Control::New(); auto hboxLayout = LinearLayout::New(); hboxLayout.SetOrientation( LinearLayout::Orientation::HORIZONTAL ); @@ -641,6 +652,166 @@ int UtcDaliLayouting_HboxLayout08(void) END_TEST; } +namespace +{ +const char* TEST_IMAGE_FILE_NAME = TEST_RESOURCE_DIR "/broken.png"; +} + +int UtcDaliLayouting_HboxLayout_ImageView(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliLayouting_HboxLayout - Use image view for leaf"); + + Stage stage = Stage::GetCurrent(); + auto hbox = Control::New(); + auto hboxLayout = LinearLayout::New(); + DevelControl::SetLayout( hbox, hboxLayout ); + hbox.SetName( "HBox" ); + + std::string url = CreateImageURL( Vector4( 0, 255, 0, 255), ImageDimensions( 100, 100 ) ); + ImageView imageView = CreateImageView( url, ImageDimensions() ); + + hbox.SetParentOrigin( ParentOrigin::CENTER ); + hbox.SetAnchorPoint( AnchorPoint::CENTER ); + hbox.Add( imageView ); + stage.Add( hbox ); + + // Ensure layouting happens + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( imageView.GetProperty( Actor::Property::POSITION ), Vector3( 0.0f, 350.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + DALI_TEST_EQUALS( imageView.GetProperty( Actor::Property::SIZE ), Vector3( 100.0f, 100.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + + url = CreateImageURL( Vector4( 0, 255, 0, 255), ImageDimensions( 200, 200 ) ); + imageView.SetImage( url ); + + // Ensure layouting happenss + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( imageView.GetProperty( Actor::Property::POSITION ), Vector3( 0.0f, 300.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + DALI_TEST_EQUALS( imageView.GetProperty( Actor::Property::SIZE ), Vector3( 200.0f, 200.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + + imageView.SetProperty( Toolkit::LayoutItem::ChildProperty::WIDTH_SPECIFICATION, ChildLayoutData::WRAP_CONTENT ); + imageView.SetProperty( Toolkit::LayoutItem::ChildProperty::HEIGHT_SPECIFICATION, ChildLayoutData::MATCH_PARENT ); + + // Ensure layouting happenss + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( imageView.GetProperty( Actor::Property::POSITION ), Vector3( 0.0f, 0.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + DALI_TEST_EQUALS( imageView.GetProperty( Actor::Property::SIZE ), Vector3( 200.0f, 800.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + + imageView.SetProperty( Toolkit::LayoutItem::ChildProperty::WIDTH_SPECIFICATION, ChildLayoutData::MATCH_PARENT ); + imageView.SetProperty( Toolkit::LayoutItem::ChildProperty::HEIGHT_SPECIFICATION, ChildLayoutData::WRAP_CONTENT ); + + // Ensure layouting happenss + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( imageView.GetProperty( Actor::Property::POSITION ), Vector3( 0.0f, 300.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + DALI_TEST_EQUALS( imageView.GetProperty( Actor::Property::SIZE ), Vector3( 480.0f, 200.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + + imageView.SetProperty( Toolkit::LayoutItem::ChildProperty::WIDTH_SPECIFICATION, ChildLayoutData::WRAP_CONTENT ); + imageView.SetProperty( Toolkit::LayoutItem::ChildProperty::HEIGHT_SPECIFICATION, ChildLayoutData::WRAP_CONTENT ); + + Image image = FrameBufferImage::New( 50, 50, Pixel::RGBA8888 ); + imageView.SetImage( image ); + + // Ensure layouting happenss + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( imageView.GetProperty( Actor::Property::POSITION ), Vector3( 0.0f, 375.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + DALI_TEST_EQUALS( imageView.GetProperty( Actor::Property::SIZE ), Vector3( 50.0f, 50.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + + Property::Map imagePropertyMap; + imagePropertyMap[ Toolkit::Visual::Property::TYPE ] = Toolkit::Visual::IMAGE; + imagePropertyMap[ ImageVisual::Property::URL ] = TEST_IMAGE_FILE_NAME; + imagePropertyMap[ ImageVisual::Property::DESIRED_WIDTH ] = 150; + imagePropertyMap[ ImageVisual::Property::DESIRED_HEIGHT ] = 150; + imageView.SetProperty( Toolkit::ImageView::Property::IMAGE, imagePropertyMap ); + + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + // Ensure layouting happenss + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( imageView.GetProperty( Actor::Property::POSITION ), Vector3( 0.0f, 325.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + DALI_TEST_EQUALS( imageView.GetProperty( Actor::Property::SIZE ), Vector3( 150.0f, 150.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliLayouting_HboxLayout_TextLabel(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliLayouting_HboxLayout - Use text label for leaf"); + + Stage stage = Stage::GetCurrent(); + + auto hbox = Control::New(); + auto hboxLayout = LinearLayout::New(); + DevelControl::SetLayout( hbox, hboxLayout ); + hbox.SetName( "HBox" ); + hbox.SetParentOrigin( ParentOrigin::CENTER ); + hbox.SetAnchorPoint( AnchorPoint::CENTER ); + + std::vector< Control > controls; + TextLabel textLabel = CreateTextLabel( "W" ); + controls.push_back( textLabel ); + hbox.Add( textLabel ); + stage.Add( hbox ); + + // Ensure layouting happens + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( textLabel.GetProperty( Actor::Property::POSITION ), Vector3( 0.0f, 368.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + DALI_TEST_EQUALS( textLabel.GetProperty( Actor::Property::SIZE ), Vector3( 54.0f, 64.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + + textLabel.SetProperty( TextLabel::Property::TEXT, "WWWW" ); + + // Ensure layouting happens + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( controls[0].GetProperty( Actor::Property::POSITION ), Vector3( 0.0f, 368.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + DALI_TEST_EQUALS( controls[0].GetProperty( Actor::Property::SIZE ), Vector3( 216.0f, 64.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + + textLabel.SetProperty( TextLabel::Property::POINT_SIZE, 10.0f ); + + // Ensure layouting happens + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( controls[0].GetProperty( Actor::Property::POSITION ), Vector3( 0.0f, 382.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + DALI_TEST_EQUALS( controls[0].GetProperty( Actor::Property::SIZE ), Vector3( 120.0f, 36.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + + controls[0].SetProperty( Toolkit::LayoutItem::ChildProperty::WIDTH_SPECIFICATION, ChildLayoutData::WRAP_CONTENT ); + controls[0].SetProperty( Toolkit::LayoutItem::ChildProperty::HEIGHT_SPECIFICATION, ChildLayoutData::MATCH_PARENT ); + + // Ensure layouting happens + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( controls[0].GetProperty( Actor::Property::POSITION ), Vector3( 0.0f, 0.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + DALI_TEST_EQUALS( controls[0].GetProperty( Actor::Property::SIZE ), Vector3( 120.0f, 800.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + + controls[0].SetProperty( Toolkit::LayoutItem::ChildProperty::WIDTH_SPECIFICATION, ChildLayoutData::MATCH_PARENT ); + controls[0].SetProperty( Toolkit::LayoutItem::ChildProperty::HEIGHT_SPECIFICATION, ChildLayoutData::WRAP_CONTENT ); + + // Ensure layouting happens + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( controls[0].GetProperty( Actor::Property::POSITION ), Vector3( 0.0f, 382.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + DALI_TEST_EQUALS( controls[0].GetProperty( Actor::Property::SIZE ), Vector3( 480.0f, 36.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + + END_TEST; +} + // Padding tests int UtcDaliLayouting_HboxLayout_Padding01(void) @@ -790,7 +961,7 @@ int UtcDaliLayouting_HboxLayout_Padding02(void) int UtcDaliLayouting_HboxLayout_Padding03(void) { ToolkitTestApplication application; - tet_infoline("UtcDaliLayouting_HboxLayout_Padding03 - Adding Changing padding on a single child"); + tet_infoline("UtcDaliLayouting_HboxLayout_Padding03 - Changing padding on a single child"); Stage stage = Stage::GetCurrent(); auto hbox = Control::New(); @@ -871,6 +1042,227 @@ int UtcDaliLayouting_HboxLayout_Padding03(void) END_TEST; } +int UtcDaliLayouting_HboxLayout_Padding04(void) +{ + ToolkitTestApplication application; + tet_infoline("UtcDaliLayouting_HboxLayout_Padding04 - Adding Padding to the hbox"); + + // Adding padding to the layout should offset the positioning of the children. + + const Extents LAYOUT_PADDING = Extents(5, 10, 20, 2 ); + const Size CONTROL_SIZE = Size( 40, 40 ); + + Stage stage = Stage::GetCurrent(); + // Create a root layout, ideally Dali would have a default layout in the root layer. + // Without this root layer the LinearLayout (or any other layout) will not + // honour WIDTH_SPECIFICATION or HEIGHT_SPECIFICATION settings. + // It uses the default stage size and ideally should have a layout added to it. + auto rootLayoutControl = Control::New(); + rootLayoutControl.SetName( "AbsoluteLayout"); + auto rootLayout = AbsoluteLayout::New(); + DevelControl::SetLayout( rootLayoutControl, rootLayout ); + rootLayoutControl.SetAnchorPoint( AnchorPoint::CENTER ); + rootLayoutControl.SetParentOrigin( ParentOrigin::CENTER ); + stage.Add( rootLayoutControl ); + + auto hbox = Control::New(); + auto hboxLayout = LinearLayout::New(); + hboxLayout.SetOrientation( LinearLayout::Orientation::HORIZONTAL ); + DevelControl::SetLayout( hbox, hboxLayout ); + hbox.SetName( "HBox"); + hbox.SetProperty(Toolkit::Control::Property::PADDING, LAYOUT_PADDING ); + hbox.SetProperty( Toolkit::LayoutItem::ChildProperty::WIDTH_SPECIFICATION, ChildLayoutData::WRAP_CONTENT ); + hbox.SetProperty( Toolkit::LayoutItem::ChildProperty::HEIGHT_SPECIFICATION, ChildLayoutData::WRAP_CONTENT ); + + std::vector< Control > controls; + controls.push_back( CreateLeafControl( CONTROL_SIZE.width, CONTROL_SIZE.height ) ); + controls.push_back( CreateLeafControl( CONTROL_SIZE.width, CONTROL_SIZE.height ) ); + controls.push_back( CreateLeafControl( CONTROL_SIZE.width, CONTROL_SIZE.height ) ); + controls.push_back( CreateLeafControl( CONTROL_SIZE.width, CONTROL_SIZE.height ) ); + + for( auto&& iter : controls ) + { + hbox.Add( iter ); + } + + hbox.SetParentOrigin( ParentOrigin::CENTER ); + hbox.SetAnchorPoint( AnchorPoint::CENTER ); + rootLayoutControl.Add( hbox ); + + // Ensure layouting happens + application.SendNotification(); + application.Render(); + + // Extra update needed to Relayout one more time. Catches any position updates, false positive without this seen. + application.SendNotification(); + + // hbox centers elements vertically, it fills test harness stage, which is 480x800. + // hbox left justifies elements + tet_infoline("Test Child Actor Position"); + + auto controlXPosition=0.0f; + + controlXPosition = LAYOUT_PADDING.start; // First child positioned at offset defined by the padding + DALI_TEST_EQUALS( controls[0].GetProperty( Actor::Property::POSITION ), Vector3( LAYOUT_PADDING.start, + LAYOUT_PADDING.top, + 0.0f ), 0.0001f, TEST_LOCATION ); + + controlXPosition+=CONTROL_SIZE.width; // Second child positioned is the position of the first child + the first child's width. + DALI_TEST_EQUALS( controls[1].GetProperty( Actor::Property::POSITION ), Vector3( controlXPosition, + LAYOUT_PADDING.top, + 0.0f ), + 0.0001f, TEST_LOCATION ); + + controlXPosition+=CONTROL_SIZE.width; // Third child positioned adjacent to second + DALI_TEST_EQUALS( controls[2].GetProperty( Actor::Property::POSITION ), Vector3( controlXPosition, + LAYOUT_PADDING.top, + 0.0f ), 0.0001f, TEST_LOCATION ); + + controlXPosition+=CONTROL_SIZE.width; // Forth passed adjacent to the third + DALI_TEST_EQUALS( controls[3].GetProperty( Actor::Property::POSITION ), Vector3( controlXPosition, + LAYOUT_PADDING.top, + 0.0f ), 0.0001f, TEST_LOCATION ); + + auto totalControlsWidth = CONTROL_SIZE.width * controls.size(); + auto totalControlsHeight = CONTROL_SIZE.height; + + DALI_TEST_EQUALS( hbox.GetProperty( Actor::Property::SIZE ), Vector3( totalControlsWidth + LAYOUT_PADDING.start + LAYOUT_PADDING.end, + totalControlsHeight + LAYOUT_PADDING.top + LAYOUT_PADDING.bottom, + 0.0f ), 0.0001f, TEST_LOCATION ); + + + END_TEST; +} + +int UtcDaliLayouting_HboxLayout_Padding05(void) +{ + ToolkitTestApplication application; + tet_infoline("UtcDaliLayouting_HboxLayout_Padding05 - Changing the hbox Padding"); + + // Adding padding to the layout should offset the positioning of the children. + + const Extents LAYOUT_PADDING = Extents(5, 10, 20, 2 ); + const Size CONTROL_SIZE = Size( 40, 40 ); + + Stage stage = Stage::GetCurrent(); + // Create a root layout, ideally Dali would have a default layout in the root layer. + // Without this root layer the LinearLayout (or any other layout) will not + // honour WIDTH_SPECIFICATION or HEIGHT_SPECIFICATION settings. + // It uses the default stage size and ideally should have a layout added to it. + auto rootLayoutControl = Control::New(); + rootLayoutControl.SetName( "AbsoluteLayout"); + auto rootLayout = AbsoluteLayout::New(); + DevelControl::SetLayout( rootLayoutControl, rootLayout ); + rootLayoutControl.SetAnchorPoint( AnchorPoint::CENTER ); + rootLayoutControl.SetParentOrigin( ParentOrigin::CENTER ); + stage.Add( rootLayoutControl ); + + auto hbox = Control::New(); + auto hboxLayout = LinearLayout::New(); + hboxLayout.SetOrientation( LinearLayout::Orientation::HORIZONTAL ); + DevelControl::SetLayout( hbox, hboxLayout ); + hbox.SetName( "HBox"); + hbox.SetProperty(Toolkit::Control::Property::PADDING, LAYOUT_PADDING ); + hbox.SetProperty( Toolkit::LayoutItem::ChildProperty::WIDTH_SPECIFICATION, ChildLayoutData::WRAP_CONTENT ); + hbox.SetProperty( Toolkit::LayoutItem::ChildProperty::HEIGHT_SPECIFICATION, ChildLayoutData::WRAP_CONTENT ); + + std::vector< Control > controls; + controls.push_back( CreateLeafControl( CONTROL_SIZE.width, CONTROL_SIZE.height ) ); + controls.push_back( CreateLeafControl( CONTROL_SIZE.width, CONTROL_SIZE.height ) ); + controls.push_back( CreateLeafControl( CONTROL_SIZE.width, CONTROL_SIZE.height ) ); + controls.push_back( CreateLeafControl( CONTROL_SIZE.width, CONTROL_SIZE.height ) ); + + for( auto&& iter : controls ) + { + hbox.Add( iter ); + } + + hbox.SetParentOrigin( ParentOrigin::CENTER ); + hbox.SetAnchorPoint( AnchorPoint::CENTER ); + rootLayoutControl.Add( hbox ); + + // Ensure layouting happens + application.SendNotification(); + application.Render(); + + // Extra update needed to Relayout one more time. Catches any position updates, false positive without this seen. + application.SendNotification(); + + // hbox centers elements vertically, it fills test harness stage, which is 480x800. + // hbox left justifies elements + tet_infoline("Test Child Actor Position"); + + auto controlXPosition=0.0f; + + controlXPosition = LAYOUT_PADDING.start; // First child positioned at offset defined by the padding + DALI_TEST_EQUALS( controls[0].GetProperty( Actor::Property::POSITION ), Vector3( LAYOUT_PADDING.start, + LAYOUT_PADDING.top, + 0.0f ), 0.0001f, TEST_LOCATION ); + + controlXPosition+=CONTROL_SIZE.width; // Second child positioned is the position of the first child + the first child's width. + DALI_TEST_EQUALS( controls[1].GetProperty( Actor::Property::POSITION ), Vector3( controlXPosition, + LAYOUT_PADDING.top, + 0.0f ), + 0.0001f, TEST_LOCATION ); + + controlXPosition+=CONTROL_SIZE.width; // Third child positioned adjacent to second + DALI_TEST_EQUALS( controls[2].GetProperty( Actor::Property::POSITION ), Vector3( controlXPosition, + LAYOUT_PADDING.top, + 0.0f ), 0.0001f, TEST_LOCATION ); + + controlXPosition+=CONTROL_SIZE.width; // Forth passed adjacent to the third + DALI_TEST_EQUALS( controls[3].GetProperty( Actor::Property::POSITION ), Vector3( controlXPosition, + LAYOUT_PADDING.top, + 0.0f ), 0.0001f, TEST_LOCATION ); + + auto totalControlsWidth = CONTROL_SIZE.width * controls.size(); + auto totalControlsHeight = CONTROL_SIZE.height; + + DALI_TEST_EQUALS( hbox.GetProperty( Actor::Property::SIZE ), Vector3( totalControlsWidth + LAYOUT_PADDING.start + LAYOUT_PADDING.end, + totalControlsHeight + LAYOUT_PADDING.top + LAYOUT_PADDING.bottom, + 0.0f ), 0.0001f, TEST_LOCATION ); + + // Change layout padding + const Extents NEW_LAYOUT_PADDING = Extents(5, 20, 10, 2 ); + tet_printf( "\nChanging Padding to control at index 1 \n" ); + hbox.SetProperty(Toolkit::Control::Property::PADDING, NEW_LAYOUT_PADDING ); + + // Ensure layouting happens + application.SendNotification(); + application.Render(); + + // Extra update needed to Relayout one more time. Catches any position updates, false positive without this seen. + application.SendNotification(); + + controlXPosition = NEW_LAYOUT_PADDING.start; // First child positioned at offset defined by the padding + DALI_TEST_EQUALS( controls[0].GetProperty( Actor::Property::POSITION ), Vector3( NEW_LAYOUT_PADDING.start, + NEW_LAYOUT_PADDING.top, + 0.0f ), 0.0001f, TEST_LOCATION ); + + controlXPosition+=CONTROL_SIZE.width; // Second child positioned is the position of the first child + the first child's width. + DALI_TEST_EQUALS( controls[1].GetProperty( Actor::Property::POSITION ), Vector3( controlXPosition, + NEW_LAYOUT_PADDING.top, + 0.0f ), + 0.0001f, TEST_LOCATION ); + + controlXPosition+=CONTROL_SIZE.width; // Third child positioned adjacent to second + DALI_TEST_EQUALS( controls[2].GetProperty( Actor::Property::POSITION ), Vector3( controlXPosition, + NEW_LAYOUT_PADDING.top, + 0.0f ), 0.0001f, TEST_LOCATION ); + + controlXPosition+=CONTROL_SIZE.width; // Forth passed adjacent to the third + DALI_TEST_EQUALS( controls[3].GetProperty( Actor::Property::POSITION ), Vector3( controlXPosition, + NEW_LAYOUT_PADDING.top, + 0.0f ), 0.0001f, TEST_LOCATION ); + totalControlsWidth = CONTROL_SIZE.width * controls.size(); + totalControlsHeight = CONTROL_SIZE.height; + + DALI_TEST_EQUALS( hbox.GetProperty( Actor::Property::SIZE ), Vector3( totalControlsWidth + NEW_LAYOUT_PADDING.start + NEW_LAYOUT_PADDING.end, + totalControlsHeight + NEW_LAYOUT_PADDING.top + NEW_LAYOUT_PADDING.bottom, + 0.0f ), 0.0001f, TEST_LOCATION ); + END_TEST; +} + // Margin Tests int UtcDaliLayouting_HboxLayout_Margin01(void) @@ -1129,6 +1521,95 @@ int UtcDaliLayouting_VboxLayout03(void) END_TEST; } +int UtcDaliLayouting_VboxLayout_Padding(void) +{ + ToolkitTestApplication application; + tet_infoline("UtcDaliLayouting_VboxLayout_Padding - Adding Padding to the vbox"); + + // Adding padding to the layout should offset the positioning of the children. + + const Extents LAYOUT_PADDING = Extents(5, 10, 20, 2 ); + const Size CONTROL_SIZE = Size( 40, 40 ); + + Stage stage = Stage::GetCurrent(); + // Create a root layout, ideally Dali would have a default layout in the root layer. + // Without this root layer the LinearLayout (or any other layout) will not + // honour WIDTH_SPECIFICATION or HEIGHT_SPECIFICATION settings. + // It uses the default stage size and ideally should have a layout added to it. + auto rootLayoutControl = Control::New(); + rootLayoutControl.SetName( "AbsoluteLayout"); + auto rootLayout = AbsoluteLayout::New(); + DevelControl::SetLayout( rootLayoutControl, rootLayout ); + rootLayoutControl.SetAnchorPoint( AnchorPoint::CENTER ); + rootLayoutControl.SetParentOrigin( ParentOrigin::CENTER ); + stage.Add( rootLayoutControl ); + + auto vbox = Control::New(); + auto vboxLayout = LinearLayout::New(); + vboxLayout.SetOrientation( LinearLayout::Orientation::VERTICAL ); + DevelControl::SetLayout( vbox, vboxLayout ); + vbox.SetName( "VBox"); + vbox.SetProperty( Toolkit::Control::Property::PADDING, LAYOUT_PADDING ); + vbox.SetProperty( Toolkit::LayoutItem::ChildProperty::WIDTH_SPECIFICATION, ChildLayoutData::WRAP_CONTENT ); + vbox.SetProperty( Toolkit::LayoutItem::ChildProperty::HEIGHT_SPECIFICATION, ChildLayoutData::WRAP_CONTENT ); + + std::vector< Control > controls; + controls.push_back( CreateLeafControl( CONTROL_SIZE.width, CONTROL_SIZE.height ) ); + controls.push_back( CreateLeafControl( CONTROL_SIZE.width, CONTROL_SIZE.height ) ); + controls.push_back( CreateLeafControl( CONTROL_SIZE.width, CONTROL_SIZE.height ) ); + controls.push_back( CreateLeafControl( CONTROL_SIZE.width, CONTROL_SIZE.height ) ); + + for( auto&& iter : controls ) + { + vbox.Add( iter ); + } + + vbox.SetParentOrigin( ParentOrigin::CENTER ); + vbox.SetAnchorPoint( AnchorPoint::CENTER ); + rootLayoutControl.Add( vbox ); + + // Ensure layouting happens + application.SendNotification(); + application.Render(); + + // Extra update needed to Relayout one more time. Catches any position updates, false positive without this seen. + application.SendNotification(); + + // vbox centers elements horizontally, it fills test harness stage, which is 480x800. + tet_infoline("Test Child Actor Position"); + + auto controlYPosition = 0.0f; + + controlYPosition = LAYOUT_PADDING.top; // First child positioned at offset defined by the padding + DALI_TEST_EQUALS( controls[0].GetProperty( Actor::Property::POSITION ), Vector3( LAYOUT_PADDING.start, + LAYOUT_PADDING.top, + 0.0f ), 0.0001f, TEST_LOCATION ); + + controlYPosition += CONTROL_SIZE.height; // Second child positioned is the position of the first child + the first child's height. + DALI_TEST_EQUALS( controls[1].GetProperty( Actor::Property::POSITION ), Vector3( LAYOUT_PADDING.start, + controlYPosition, + 0.0f ), + 0.0001f, TEST_LOCATION ); + + controlYPosition += CONTROL_SIZE.height; // Third child positioned adjacent to second + DALI_TEST_EQUALS( controls[2].GetProperty( Actor::Property::POSITION ), Vector3( LAYOUT_PADDING.start, + controlYPosition, + 0.0f ), 0.0001f, TEST_LOCATION ); + + controlYPosition += CONTROL_SIZE.height; // Forth passed adjacent to the third + DALI_TEST_EQUALS( controls[3].GetProperty( Actor::Property::POSITION ), Vector3( LAYOUT_PADDING.start, + controlYPosition, + 0.0f ), 0.0001f, TEST_LOCATION ); + + auto totalControlsWidth = CONTROL_SIZE.width; + auto totalControlsHeight = CONTROL_SIZE.height * controls.size(); + + DALI_TEST_EQUALS( vbox.GetProperty( Actor::Property::SIZE ), Vector3( totalControlsWidth + LAYOUT_PADDING.start + LAYOUT_PADDING.end, + totalControlsHeight + LAYOUT_PADDING.top + LAYOUT_PADDING.bottom, + 0.0f ), 0.0001f, TEST_LOCATION ); + + END_TEST; +} int UtcDaliLayouting_RelayoutOnChildOrderChanged(void) @@ -1226,3 +1707,324 @@ int UtcDaliLayouting_HboxLayout_TargetSize(void) END_TEST; } + +int UtcDaliLayouting_RemoveLayout01(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliLayouting_RemoveLayout"); + + Stage stage = Stage::GetCurrent(); + + auto rootControl = Control::New(); + auto absoluteLayout = AbsoluteLayout::New(); + DevelControl::SetLayout( rootControl, absoluteLayout ); + rootControl.SetName( "AbsoluteLayout" ); + stage.Add( rootControl ); + + auto hbox = Control::New(); + auto hboxLayout = LinearLayout::New(); + hboxLayout.SetOrientation( LinearLayout::Orientation::HORIZONTAL ); + DevelControl::SetLayout( hbox, hboxLayout ); + hbox.SetName( "HBox" ); + + std::vector< Control > controls; + controls.push_back( CreateLeafControl( 40, 40 ) ); + controls.push_back( CreateLeafControl( 60, 40 ) ); + + for( auto&& iter : controls ) + { + hbox.Add( iter ); + } + hbox.SetParentOrigin( ParentOrigin::CENTER ); + hbox.SetAnchorPoint( AnchorPoint::CENTER ); + rootControl.Add( hbox ); + + tet_infoline("Layout as normal"); + application.SendNotification(); + application.Render(); + + tet_infoline("Set an empty layout on hbox container"); + LinearLayout emptyLayout; + DevelControl::SetLayout( hbox, emptyLayout ); + + tet_infoline("Run another layout"); + application.SendNotification(); + application.Render(); + + tet_infoline("Check leaf controls haven't moved"); + + DALI_TEST_EQUALS( controls[0].GetProperty( Actor::Property::POSITION ), Vector3( 0.0f, 0.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + DALI_TEST_EQUALS( controls[1].GetProperty( Actor::Property::POSITION ), Vector3( 40.0f, 0.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + + DALI_TEST_EQUALS( controls[0].GetProperty( Actor::Property::SIZE ), Vector3( 40.0f, 40.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + DALI_TEST_EQUALS( controls[1].GetProperty( Actor::Property::SIZE ), Vector3( 60.0f, 40.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliLayouting_LayoutChildren01(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliLayouting_LayoutChildren01"); + + Stage stage = Stage::GetCurrent(); + + auto rootControl = Control::New(); + auto absoluteLayout = AbsoluteLayout::New(); + DevelControl::SetLayout( rootControl, absoluteLayout ); + stage.Add( rootControl ); + + auto hbox = Control::New(); + auto hboxLayout = LinearLayout::New(); + DevelControl::SetLayout( hbox, hboxLayout ); + rootControl.Add( hbox ); + + DALI_TEST_EQUALS( absoluteLayout.GetChildCount(), 1, TEST_LOCATION ); + + tet_infoline("Test removal by setting empty layout to child container" ); + DevelControl::SetLayout( hbox, LayoutItem{} ); + + DALI_TEST_EQUALS( absoluteLayout.GetChildCount(), 0, TEST_LOCATION ); + + auto& hboxImpl = GetImplementation( hboxLayout ); + Handle empty; + DALI_TEST_EQUALS( hboxLayout.GetOwner(), empty, TEST_LOCATION ); + DALI_TEST_EQUALS( (void*)hboxImpl.GetParent(), (void*)nullptr, TEST_LOCATION ); + + // For coverage + hboxImpl.SetLayoutRequested(); + + END_TEST; +} + +int UtcDaliLayouting_LayoutChildren02(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliLayouting_LayoutChildren02"); + + Stage stage = Stage::GetCurrent(); + + auto rootControl = Control::New(); + auto absoluteLayout = AbsoluteLayout::New(); + DevelControl::SetLayout( rootControl, absoluteLayout ); + stage.Add( rootControl ); + + auto hbox = Control::New(); + auto hboxLayout = LinearLayout::New(); + DevelControl::SetLayout( hbox, hboxLayout ); + rootControl.Add( hbox ); + + DALI_TEST_EQUALS( absoluteLayout.GetChildCount(), 1, TEST_LOCATION ); + + tet_infoline("Test removal by removing child actor from parent container" ); + hbox.Unparent(); + + DALI_TEST_EQUALS( absoluteLayout.GetChildCount(), 0, TEST_LOCATION ); + + auto& hboxImpl = GetImplementation( hboxLayout ); + tet_infoline("Test child actor still has hbox layout " ); + DALI_TEST_EQUALS( (bool)hboxLayout.GetOwner(), true, TEST_LOCATION ); + + tet_infoline("Test hbox layout has no parent " ); + DALI_TEST_EQUALS( (void*)hboxImpl.GetParent(), (void*)nullptr, TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliLayouting_LayoutChildren03(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliLayouting_LayoutChildren02"); + + Stage stage = Stage::GetCurrent(); + + auto rootControl = Control::New(); + auto absoluteLayout = AbsoluteLayout::New(); + DevelControl::SetLayout( rootControl, absoluteLayout ); + stage.Add( rootControl ); + + auto hbox = Control::New(); + auto hboxLayout = LinearLayout::New(); + DevelControl::SetLayout( hbox, hboxLayout ); + rootControl.Add( hbox ); + + DALI_TEST_EQUALS( absoluteLayout.GetChildCount(), 1, TEST_LOCATION ); + + tet_infoline("Test removal by removing child layout from parent layout" ); + absoluteLayout.Remove( hboxLayout ); + + DALI_TEST_EQUALS( absoluteLayout.GetChildCount(), 0, TEST_LOCATION ); + + auto& hboxImpl = GetImplementation( hboxLayout ); + + tet_infoline("Check child actor has orphaned layout (Moving child keeps old layout)"); + DALI_TEST_EQUALS( hboxLayout.GetOwner(), hbox, TEST_LOCATION ); + DALI_TEST_EQUALS( DevelControl::GetLayout(hbox), hboxLayout, TEST_LOCATION ); + + tet_infoline("Check orphaned layout has no parent"); + DALI_TEST_EQUALS( (void*)hboxImpl.GetParent(), (void*)nullptr, TEST_LOCATION ); + + END_TEST; +} + + +int UtcDaliLayouting_LayoutChildren04(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliLayouting_LayoutChildren03"); + + Stage stage = Stage::GetCurrent(); + + auto rootControl = Control::New(); + auto absoluteLayout = AbsoluteLayout::New(); + DevelControl::SetLayout( rootControl, absoluteLayout ); + stage.Add( rootControl ); + + auto hbox = Control::New(); + tet_infoline("Test unparenting by adding child with no layout to parent (should auto-generate LayoutItem) "); + auto hboxLayout = LinearLayout::New(); + rootControl.Add( hbox ); + + DALI_TEST_EQUALS( absoluteLayout.GetChildCount(), 1, TEST_LOCATION ); + + tet_infoline("Then setting a layout on the child container"); + DevelControl::SetLayout( hbox, hboxLayout ); + + DALI_TEST_EQUALS( absoluteLayout.GetChildCount(), 1, TEST_LOCATION ); + + auto& hboxImpl = GetImplementation( hboxLayout ); + auto& absImpl = GetImplementation( absoluteLayout ); + DALI_TEST_EQUALS( hboxLayout.GetOwner(), Handle(hbox), TEST_LOCATION ); + DALI_TEST_EQUALS( hboxImpl.GetParent(), (Dali::Toolkit::Internal::LayoutParent*)&absImpl, TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliLayouting_SetLayoutOrder01(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliLayouting_SetLayoutOrder01 - Call SetLayout after adding the control to the root layout"); + + Stage stage = Stage::GetCurrent(); + + auto rootControl = Control::New(); + auto absoluteLayout = AbsoluteLayout::New(); + DevelControl::SetLayout( rootControl, absoluteLayout ); + rootControl.SetName( "AbsoluteLayout" ); + stage.Add( rootControl ); + + tet_infoline(" UtcDaliLayouting_SetLayoutOrder - Creating control"); + auto hbox = Control::New(); + auto hboxLayout = LinearLayout::New(); + hbox.SetName( "HBox"); + + tet_infoline(" UtcDaliLayouting_SetLayoutOrder - Add control to root layout"); + rootControl.Add( hbox ); + + tet_infoline(" UtcDaliLayouting_SetLayoutOrder - Set layout to control AFTER control added to root"); + DevelControl::SetLayout( hbox, hboxLayout ); + + // Add a Child control + std::vector< Control > controls; + controls.push_back( CreateLeafControl( 100, 100 ) ); // Single control + for( auto&& iter : controls ) + { + hbox.Add( iter ); + } + + // Ensure layouting happens + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( controls[0].GetProperty( Actor::Property::SIZE ), Vector3( 100.0f, 100.0f, 0.0f ), 0.0001f, TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliLayouting_SetLayoutOrder02(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliLayouting_SetLayoutOrder02 - Test the layout item order and the control order"); + + Stage stage = Stage::GetCurrent(); + + auto rootControl = Control::New(); + auto absoluteLayout = AbsoluteLayout::New(); + DevelControl::SetLayout( rootControl, absoluteLayout ); + rootControl.SetName( "AbsoluteLayout" ); + stage.Add( rootControl ); + + auto hbox = Control::New(); + auto hboxLayout = LinearLayout::New(); + hbox.SetName( "HBox"); + + rootControl.Add( hbox ); + + DevelControl::SetLayout( hbox, hboxLayout ); + + // Add child controls + std::vector< Control > controls; + controls.push_back( CreateLeafControl( 100, 100 ) ); // 0 + controls.push_back( CreateLeafControl( 100, 100 ) ); // 1 + controls.push_back( CreateLeafControl( 100, 100 ) ); // 2 + + for( auto&& iter : controls ) + { + hbox.Add( iter ); + } + + // Ensure layouting happens + application.SendNotification(); + application.Render(); + + TestLayoutItemOrder( controls, hboxLayout ); + + tet_infoline("RaiseToTop"); + + controls[0].RaiseToTop(); // 1 2 0 + + TestLayoutItemOrder( controls, hboxLayout ); + + tet_infoline("LowerToBottom"); + + controls[2].LowerToBottom(); // 2 1 0 + + TestLayoutItemOrder( controls, hboxLayout ); + + tet_infoline("Remove / Add"); + + hbox.Remove( controls[2] ); // 1 0 + hbox.Add( controls[2] ); // 1 0 2 + + TestLayoutItemOrder( controls, hboxLayout ); + + tet_infoline("SetLayout"); + + auto vboxLayout = LinearLayout::New(); + DevelControl::SetLayout( controls[0], vboxLayout ); + + TestLayoutItemOrder( controls, hboxLayout ); + + tet_infoline("Raise"); + + controls[0].Raise(); // 1 2 0 + + TestLayoutItemOrder( controls, hboxLayout ); + + tet_infoline("Lower"); + + controls[2].Lower(); // 2 1 0 + + TestLayoutItemOrder( controls, hboxLayout ); + + tet_infoline("SetLayout again"); + + auto vboxLayout1 = LinearLayout::New(); + DevelControl::SetLayout( controls[2], vboxLayout1 ); + + TestLayoutItemOrder( controls, hboxLayout ); + + DevelControl::SetLayout( controls[2], vboxLayout ); + + END_TEST; +}