2 * Copyright (c) 2017 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 "shared/view.h"
20 #include <dali/dali.h>
21 #include <dali-toolkit/dali-toolkit.h>
22 #include <dali-toolkit/devel-api/visuals/image-visual-properties-devel.h>
23 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
30 const char* BACKGROUND_IMAGE( DEMO_IMAGE_DIR "background-gradient.jpg" );
31 const char* TOOLBAR_IMAGE( DEMO_IMAGE_DIR "top-bar.png" );
32 const char* APPLICATION_TITLE( "Image view" );
34 const char* IMAGE_PATH[] = {
35 DEMO_IMAGE_DIR "gallery-small-23.jpg",
36 DEMO_IMAGE_DIR "woodEffect.jpg",
37 DEMO_IMAGE_DIR "heartsframe.9.png",
38 DEMO_IMAGE_DIR "World.svg"
41 const unsigned int NUMBER_OF_IMAGES = 3;
52 unsigned int GetButtonIndex( Toolkit::Button button )
54 std::string buttonName = button.GetName();
55 unsigned int index = 0;
57 if ( buttonName != "")
59 index = std::stoul( buttonName );
66 const unsigned int NUMBER_OF_RESOURCES = sizeof(IMAGE_PATH) / sizeof(char*);
68 std::string EXAMPLE_INSTRUCTIONS = "Instructions: Change button cycles through different image visuals, "
69 "on/off takes the ImageView and it's current visual on or off stage.";
73 class ImageViewController: public ConnectionTracker
77 ImageViewController( Application& application )
78 : mApplication( application ),
79 mCurrentPositionToggle( 0, 0 ),
80 mCurrentPositionImage( 0, 0 )
82 // Connect to the Application's Init signal
83 mApplication.InitSignal().Connect( this, &ImageViewController::Create );
86 ~ImageViewController()
91 void Create( Application& application )
93 // The Init signal is received once (only) during the Application lifetime
95 // Creates a default view with a default tool bar.
96 // The view is added to the stage.
97 mContentLayer = DemoHelper::CreateView( application,
105 // Create a table view to show a pair of buttons above each image.
106 mTable = Toolkit::TableView::New( CellPlacement::NUMBER_OF_ROWS, NUMBER_OF_IMAGES );
107 mTable.SetAnchorPoint( AnchorPoint::CENTER );
108 mTable.SetParentOrigin( ParentOrigin::CENTER );
109 mTable.SetResizePolicy( ResizePolicy::SIZE_RELATIVE_TO_PARENT, Dimension::ALL_DIMENSIONS );
110 Vector3 offset( 0.9f, 0.70f, 0.0f );
111 mTable.SetSizeModeFactor( offset );
112 mTable.SetFitHeight(CellPlacement::TOP_BUTTON);
113 mTable.SetFitHeight(CellPlacement::LOWER_BUTTON);
114 mContentLayer.Add( mTable );
116 Toolkit::TextLabel instructions = Toolkit::TextLabel::New( EXAMPLE_INSTRUCTIONS );
117 instructions.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH );
118 instructions.SetParentOrigin(ParentOrigin::BOTTOM_CENTER);
119 instructions.SetY(-50.0f);
120 instructions.SetProperty( Toolkit::TextLabel::Property::ENABLE_AUTO_SCROLL, true );
121 instructions.SetProperty( Toolkit::TextLabel::Property::AUTO_SCROLL_LOOP_COUNT, 10 );
122 mContentLayer.Add(instructions);
124 for( unsigned int x = 0; x < NUMBER_OF_IMAGES; x++ )
126 Toolkit::PushButton button = Toolkit::PushButton::New();
127 button.SetProperty( Toolkit::Button::Property::LABEL, "on/off" );
128 button.SetParentOrigin( ParentOrigin::TOP_CENTER );
129 button.SetAnchorPoint( AnchorPoint::TOP_CENTER );
130 button.ClickedSignal().Connect( this, &ImageViewController::ToggleImageOnStage );
131 button.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH );
132 button.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::HEIGHT );
133 std::string s = std::to_string(x);
135 mTable.AddChild( button, Toolkit::TableView::CellPosition( CellPlacement::TOP_BUTTON, x ) );
137 Toolkit::PushButton button2 = Toolkit::PushButton::New();
138 button2.SetProperty( Toolkit::Button::Property::LABEL, "Change" );
139 button2.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
140 button2.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
141 button2.ClickedSignal().Connect( this, &ImageViewController::ChangeImageClicked );
142 button2.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH );
143 button2.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::HEIGHT );
144 button2.SetName( s );
145 mTable.AddChild( button2, Toolkit::TableView::CellPosition( CellPlacement::LOWER_BUTTON, x ) );
147 mImageViews[x] = Toolkit::ImageView::New( );
148 Property::Map imagePropertyMap;
149 imagePropertyMap.Insert( Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE );
150 imagePropertyMap.Insert( Toolkit::ImageVisual::Property::URL, IMAGE_PATH[ 0 ] );
151 mImageViews[x].SetProperty(Toolkit::ImageView::Property::IMAGE , imagePropertyMap );
154 mImageViews[x].SetParentOrigin( ParentOrigin::CENTER );
155 mImageViews[x].SetAnchorPoint( AnchorPoint::CENTER );
156 mImageViews[x].SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
157 mTable.AddChild( mImageViews[x], Toolkit::TableView::CellPosition( CellPlacement::IMAGE, x ) );
159 // Set changeable counter and toggle for each ImageView
160 mImageViewImageIndexStatus[x] = true;
161 mImageViewToggleStatus[x] = true;
164 Stage::GetCurrent().KeyEventSignal().Connect(this, &ImageViewController::OnKeyEvent);
169 void ImmediateLoadImage( const char* urlToLoad )
171 Property::Map imagePropertyMap;
172 imagePropertyMap.Insert( Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE );
173 imagePropertyMap.Insert( Toolkit::ImageVisual::Property::URL, urlToLoad );
174 Toolkit::Visual::Base visual = Toolkit::VisualFactory::Get().CreateVisual( imagePropertyMap );
178 bool ToggleImageOnStage( Toolkit::Button button )
180 unsigned int buttonIndex = GetButtonIndex( button );
182 Toolkit::ImageView imageView = mImageViews[ buttonIndex ];
184 if( mImageViewToggleStatus[ buttonIndex ] )
186 imageView.Unparent();
190 mTable.AddChild( imageView, Toolkit::TableView::CellPosition( 2, GetButtonIndex( button ) ) );
193 mImageViewToggleStatus[ buttonIndex ] = !mImageViewToggleStatus[ buttonIndex ];
198 bool ChangeImageClicked( Toolkit::Button button )
200 unsigned int buttonIndex = GetButtonIndex( button );
202 if ( mImageViews[buttonIndex].OnStage() )
204 Property::Map imagePropertyMap;
205 imagePropertyMap.Insert( Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE );
206 imagePropertyMap.Insert( Toolkit::ImageVisual::Property::URL, IMAGE_PATH[ mImageViewImageIndexStatus[buttonIndex] ] );
207 mImageViews[buttonIndex].SetProperty(Toolkit::ImageView::Property::IMAGE , imagePropertyMap );
209 ++mImageViewImageIndexStatus[buttonIndex];
211 if( mImageViewImageIndexStatus[buttonIndex] == NUMBER_OF_RESOURCES )
213 mImageViewImageIndexStatus[buttonIndex] = 0;
220 * Main key event handler
222 void OnKeyEvent(const KeyEvent& event)
224 if(event.state == KeyEvent::Down)
226 if( IsKey( event, DALI_KEY_ESCAPE) || IsKey( event, DALI_KEY_BACK ) )
234 Application& mApplication;
236 Toolkit::Control mView; ///< The View instance.
237 Toolkit::ToolBar mToolBar; ///< The View's Toolbar.
238 Layer mContentLayer; ///< Content layer
239 Toolkit::TableView mTable;
240 Toolkit::ImageView mImageViews[ NUMBER_OF_IMAGES ];
241 bool mImageViewToggleStatus[ NUMBER_OF_IMAGES ];
242 unsigned int mImageViewImageIndexStatus[ NUMBER_OF_IMAGES ];
244 Toolkit::TableView::CellPosition mCurrentPositionToggle;
245 Toolkit::TableView::CellPosition mCurrentPositionImage;
249 int DALI_EXPORT_API main( int argc, char **argv )
251 Application application = Application::New( &argc, &argv, DEMO_THEME_PATH );
252 ImageViewController test( application );
253 application.MainLoop();