2 * Copyright (c) 2019 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dali/dali.h>
20 #include <dali-toolkit/dali-toolkit.h>
23 using namespace Dali::Toolkit;
27 const int NUMBER_OF_PAGES = 9; ///< Number of Pages going across
28 const int ROWS_PER_PAGE = 5; ///< Number of Images going down (rows) within a Page
30 const float DISTANCE_BETWEEN_IMAGES = 6.0f; ///< The distance between the images
32 } // unnamed namespace
35 * An example showing how to create a very simple scroll view
37 class ExampleController : public ConnectionTracker
43 * @param application class, stored as reference
45 ExampleController( Application& application )
46 : mApplication( application )
48 // Connect to the Application's Init and orientation changed signal
49 mApplication.InitSignal().Connect(this, &ExampleController::OnInit);
52 ~ExampleController() = default;
57 * This method gets called once the main loop of application is up and running
59 void OnInit(Application& app)
61 Stage stage = Dali::Stage::GetCurrent();
62 stage.SetBackgroundColor( Color::WHITE );
63 stage.KeyEventSignal().Connect(this, &ExampleController::OnKeyEvent);
65 // Make the scroll view's size a certain percentage of the stage
66 const Vector2 pageSize = stage.GetSize() * 0.75f;
68 // Create a scroll view and set our desired properties
69 ScrollView scrollView = ScrollView::New();
70 scrollView.SetAnchorPoint( AnchorPoint::CENTER );
71 scrollView.SetParentOrigin( ParentOrigin::CENTER );
72 scrollView.SetSize( pageSize );
73 scrollView.SetAxisAutoLock( true );
74 stage.Add( scrollView );
76 // We want to the scroll-view so only one page is shown
77 scrollView.SetProperty( Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_TO_BOUNDING_BOX );
79 // Create rulers for the X and Y domains, we want to disable vertical scrolling but enable horizontal scrolling
80 RulerPtr rulerX = new FixedRuler( pageSize.width ); // Snaps to a multiple of this when flicking
81 RulerPtr rulerY = new DefaultRuler;
82 rulerX->SetDomain( RulerDomain( 0.0f, pageSize.width * NUMBER_OF_PAGES, true ) ); // Set the domain to equal the number of pages used
85 scrollView.SetRulerX( rulerX );
86 scrollView.SetRulerY( rulerY );
89 for( int column = 0, textNumber = 0; column < NUMBER_OF_PAGES; column++ )
91 Actor page = CreatePage( pageSize, textNumber );
92 page.SetPosition( column * pageSize.x, 0.0f );
93 scrollView.Add( page );
96 // Do a little animation from the last page to the first page on load
97 scrollView.ScrollTo( NUMBER_OF_PAGES - 1, 0.0f );
98 scrollView.ScrollTo( 0 );
102 * Creates a page using a source of images.
104 Actor CreatePage( const Vector2& pageSize, int& textNumber )
106 Actor page = Actor::New();
107 page.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
108 page.SetParentOrigin( ParentOrigin::CENTER );
109 page.SetAnchorPoint( AnchorPoint::CENTER );
111 Stage stage = Stage::GetCurrent();
113 // Calculate the number of images going across (columns) within a page, the image size and the size of the text
114 const int imageColumns = round( ROWS_PER_PAGE * ( pageSize.width ) / ( pageSize.height ) );
115 const Vector3 imageSize( ( pageSize.width / imageColumns ) - DISTANCE_BETWEEN_IMAGES,
116 ( pageSize.height / ROWS_PER_PAGE) - DISTANCE_BETWEEN_IMAGES,
118 const float textPixelSize = imageSize.width / 3.0f;
121 for( int row = 0; row < ROWS_PER_PAGE; row++ )
123 for( int column = 0; column < imageColumns; column++ )
125 const Vector3 position( DISTANCE_BETWEEN_IMAGES * 0.5f + ( imageSize.x + DISTANCE_BETWEEN_IMAGES ) * column - pageSize.width * 0.5f,
126 DISTANCE_BETWEEN_IMAGES * 0.5f + ( imageSize.y + DISTANCE_BETWEEN_IMAGES ) * row - pageSize.height * 0.5f,
129 Control item = TextLabel::New( std::to_string( textNumber++ ) );
130 item.SetProperty( Actor::Property::POSITION, position + imageSize * 0.5f );
131 item.SetProperty( Actor::Property::SIZE, imageSize );
132 item.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
133 item.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER );
134 item.SetProperty( TextLabel::Property::TEXT_COLOR, Color::BLACK );
135 item.SetProperty( TextLabel::Property::PIXEL_SIZE, textPixelSize );
136 item.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, HorizontalAlignment::CENTER );
137 item.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, VerticalAlignment::CENTER );
138 item.SetProperty( TextLabel::Property::OUTLINE, Property::Map{ { "width", 2 }, { "color", Color::WHITE } } );
139 item.SetProperty( Control::Property::BACKGROUND, Vector4( Random::Range( 0.0f, 1.0f ), Random::Range( 0.0f, 1.0f ), Random::Range( 0.0f, 1.0f ), 0.7f ) );
148 * Main key event handler
150 void OnKeyEvent(const KeyEvent& event)
152 if(event.state == KeyEvent::Down)
154 if( IsKey( event, Dali::DALI_KEY_ESCAPE) || IsKey( event, Dali::DALI_KEY_BACK) )
162 Application& mApplication; ///< Application instance
165 int DALI_EXPORT_API main(int argc, char **argv)
167 Application app = Application::New(&argc, &argv, DEMO_THEME_PATH);
168 ExampleController test(app);