Image Policies Example suite
[platform/core/uifw/dali-demo.git] / examples / image-view / image-view-example.cpp
1 /*
2  * Copyright (c) 2017 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 #include <string>
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>
24
25 using namespace Dali;
26
27 namespace
28 {
29
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" );
33
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"
39 };
40
41 const unsigned int NUMBER_OF_IMAGES = 3;
42
43 enum CellPlacement
44 {
45    TOP_BUTTON,
46    LOWER_BUTTON,
47    IMAGE,
48    NUMBER_OF_ROWS
49 };
50
51
52 unsigned int GetButtonIndex( Toolkit::Button button )
53 {
54   std::string buttonName = button.GetName();
55   unsigned int index = 0;
56
57   if ( buttonName != "")
58   {
59     index = std::stoul( buttonName );
60   }
61
62   return index;
63 }
64
65
66 const unsigned int NUMBER_OF_RESOURCES = sizeof(IMAGE_PATH) / sizeof(char*);
67
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.";
70
71 }  // namespace
72
73 class ImageViewController: public ConnectionTracker
74 {
75  public:
76
77   ImageViewController( Application& application )
78     : mApplication( application ),
79       mCurrentPositionToggle( 0, 0 ),
80       mCurrentPositionImage( 0, 0 )
81   {
82     // Connect to the Application's Init signal
83     mApplication.InitSignal().Connect( this, &ImageViewController::Create );
84   }
85
86   ~ImageViewController()
87   {
88     // Nothing to do here
89   }
90
91   void Create( Application& application )
92   {
93     // The Init signal is received once (only) during the Application lifetime
94
95     // Creates a default view with a default tool bar.
96     // The view is added to the stage.
97     mContentLayer = DemoHelper::CreateView( application,
98                                             mView,
99                                             mToolBar,
100                                             BACKGROUND_IMAGE,
101                                             TOOLBAR_IMAGE,
102                                             APPLICATION_TITLE );
103
104
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 );
115
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);
123
124     for( unsigned int x = 0; x < NUMBER_OF_IMAGES; x++ )
125     {
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);
134       button.SetName( s );
135       mTable.AddChild( button, Toolkit::TableView::CellPosition( CellPlacement::TOP_BUTTON, x )  );
136
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 )  );
146
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 );
152
153
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 ) );
158
159       // Set changeable counter and toggle for each ImageView
160       mImageViewImageIndexStatus[x] = true;
161       mImageViewToggleStatus[x] = true;
162     }
163
164     Stage::GetCurrent().KeyEventSignal().Connect(this, &ImageViewController::OnKeyEvent);
165   }
166
167 private:
168
169   void ImmediateLoadImage( const char* urlToLoad )
170   {
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 );
175     visual.Reset();
176   }
177
178   bool ToggleImageOnStage( Toolkit::Button button )
179   {
180     unsigned int buttonIndex = GetButtonIndex( button );
181
182     Toolkit::ImageView imageView =  mImageViews[ buttonIndex ];
183
184     if( mImageViewToggleStatus[ buttonIndex ] )
185     {
186       imageView.Unparent();
187     }
188     else
189     {
190       mTable.AddChild( imageView, Toolkit::TableView::CellPosition( 2, GetButtonIndex( button ) ) );
191     }
192
193     mImageViewToggleStatus[ buttonIndex ] = !mImageViewToggleStatus[ buttonIndex ];
194
195     return true;
196   }
197
198   bool ChangeImageClicked( Toolkit::Button button )
199   {
200     unsigned int buttonIndex = GetButtonIndex( button );
201
202     if (  mImageViews[buttonIndex].OnStage() )
203     {
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 );
208
209       ++mImageViewImageIndexStatus[buttonIndex];
210
211       if( mImageViewImageIndexStatus[buttonIndex] == NUMBER_OF_RESOURCES )
212       {
213         mImageViewImageIndexStatus[buttonIndex] = 0;
214       }
215     }
216     return true;
217   }
218
219   /**
220    * Main key event handler
221    */
222   void OnKeyEvent(const KeyEvent& event)
223   {
224     if(event.state == KeyEvent::Down)
225     {
226       if( IsKey( event, DALI_KEY_ESCAPE) || IsKey( event, DALI_KEY_BACK ) )
227       {
228         mApplication.Quit();
229       }
230     }
231   }
232
233 private:
234   Application&  mApplication;
235
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 ];
243
244   Toolkit::TableView::CellPosition mCurrentPositionToggle;
245   Toolkit::TableView::CellPosition mCurrentPositionImage;
246
247 };
248
249 int DALI_EXPORT_API main( int argc, char **argv )
250 {
251   Application application = Application::New( &argc, &argv, DEMO_THEME_PATH );
252   ImageViewController test( application );
253   application.MainLoop();
254   return 0;
255 }