Updated demos to use DALi clang-format
[platform/core/uifw/dali-demo.git] / examples / image-view-pixel-area / image-view-pixel-area-example.cpp
1 /*
2  * Copyright (c) 2020 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 <dali-toolkit/dali-toolkit.h>
19
20 #include "shared/view.h"
21
22 using namespace Dali;
23
24 namespace
25 {
26 const char* BIG_TEST_IMAGE(DEMO_IMAGE_DIR "book-landscape-cover.jpg");
27 const char* SMALL_TEST_IMAGE(DEMO_IMAGE_DIR "gallery-large-1.jpg");
28
29 const char* const APPLICATION_TITLE("Pixel Area & Wrap Mode");
30 const char* const TOOLBAR_IMAGE(DEMO_IMAGE_DIR "top-bar.png");
31 const char* const BUTTON_ICON(DEMO_IMAGE_DIR "icon-change.png");
32 const char* const BUTTON_ICON_SELECTED(DEMO_IMAGE_DIR "icon-change-selected.png");
33
34 const Vector4 ORIGINAL_PIXEL_AREA(-0.5f, -0.5f, 2.f, 2.f);
35 } // namespace
36
37 class ImageViewPixelAreaApp : public ConnectionTracker
38 {
39 public:
40   ImageViewPixelAreaApp(Application& application)
41   : mApplication(application),
42     mIndex(0u)
43   {
44     // Connect to the Application's Init signal
45     mApplication.InitSignal().Connect(this, &ImageViewPixelAreaApp::Create);
46   }
47
48   ~ImageViewPixelAreaApp()
49   {
50     // Nothing to do here;
51   }
52
53 private:
54   // The Init signal is received once (only) during the Application lifetime
55   void Create(Application& application)
56   {
57     // Get a handle to the window
58     Window window = application.GetWindow();
59     window.KeyEventSignal().Connect(this, &ImageViewPixelAreaApp::OnKeyEvent);
60
61     Toolkit::ToolBar toolBar;
62     Toolkit::Control background;
63     // Creates a default view with a default tool bar.
64     mContent = DemoHelper::CreateView(application,
65                                       background,
66                                       toolBar,
67                                       "",
68                                       TOOLBAR_IMAGE,
69                                       APPLICATION_TITLE);
70
71     // Add a button to switch the scene. (right of toolbar)
72     Toolkit::PushButton switchButton = Toolkit::PushButton::New();
73     switchButton.SetProperty(Toolkit::Button::Property::UNSELECTED_BACKGROUND_VISUAL, BUTTON_ICON);
74     switchButton.SetProperty(Toolkit::Button::Property::SELECTED_BACKGROUND_VISUAL, BUTTON_ICON_SELECTED);
75     switchButton.ClickedSignal().Connect(this, &ImageViewPixelAreaApp::OnButtonClicked);
76     toolBar.AddControl(switchButton,
77                        DemoHelper::DEFAULT_VIEW_STYLE.mToolBarButtonPercentage,
78                        Toolkit::Alignment::HORIZONTAL_RIGHT,
79                        DemoHelper::DEFAULT_MODE_SWITCH_PADDING);
80
81     // for testing image WITH automatic atlasing
82     visualPropertyMap[0][Toolkit::ImageVisual::Property::URL]            = SMALL_TEST_IMAGE;
83     visualPropertyMap[0][Toolkit::ImageVisual::Property::DESIRED_WIDTH]  = 500;
84     visualPropertyMap[0][Toolkit::ImageVisual::Property::DESIRED_HEIGHT] = 500;
85     visualPropertyMap[0][Toolkit::ImageVisual::Property::WRAP_MODE_U]    = WrapMode::CLAMP_TO_EDGE;
86     visualPropertyMap[0][Toolkit::ImageVisual::Property::WRAP_MODE_V]    = WrapMode::MIRRORED_REPEAT;
87     visualPropertyMap[0][Toolkit::ImageVisual::Property::PIXEL_AREA]     = ORIGINAL_PIXEL_AREA;
88
89     // for testing image WITHOUT automatic atlasing
90     visualPropertyMap[1][Toolkit::ImageVisual::Property::URL]            = BIG_TEST_IMAGE;
91     visualPropertyMap[1][Toolkit::ImageVisual::Property::DESIRED_WIDTH]  = 640;
92     visualPropertyMap[1][Toolkit::ImageVisual::Property::DESIRED_HEIGHT] = 720;
93     visualPropertyMap[1][Toolkit::ImageVisual::Property::WRAP_MODE_U]    = WrapMode::MIRRORED_REPEAT;
94     visualPropertyMap[1][Toolkit::ImageVisual::Property::WRAP_MODE_V]    = WrapMode::REPEAT;
95     visualPropertyMap[1][Toolkit::ImageVisual::Property::PIXEL_AREA]     = ORIGINAL_PIXEL_AREA;
96
97     CreateScene(visualPropertyMap[0]);
98
99     mWrapLabel = Toolkit::TextLabel::New(" Automatic atlasing\n WrapMode: CLAMP_TO_EDGE, MIRRORED_REPEAT");
100     mWrapLabel.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::BOTTOM_CENTER);
101     mWrapLabel.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::BOTTOM_CENTER);
102     mWrapLabel.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH);
103     mWrapLabel.SetProperty(Toolkit::TextLabel::Property::MULTI_LINE, true);
104     mWrapLabel.SetProperty(Toolkit::TextLabel::Property::TEXT_COLOR, Color::WHITE);
105     mContent.Add(mWrapLabel);
106
107     mPixelAreaLabel = Toolkit::TextLabel::New(" Use ImageVisual::Property::PIXEL_AREA\n ");
108     mPixelAreaLabel.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_CENTER);
109     mPixelAreaLabel.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::BOTTOM_CENTER);
110     mPixelAreaLabel.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH);
111     mPixelAreaLabel.SetProperty(Toolkit::TextLabel::Property::MULTI_LINE, true);
112     mPixelAreaLabel.SetProperty(Toolkit::TextLabel::Property::TEXT_COLOR, Color::WHITE);
113     mWrapLabel.Add(mPixelAreaLabel);
114   }
115
116   void CreateScene(const Property::Value& propertyMap)
117   {
118     for(int i = 0; i < 3; i++)
119       for(int j = 0; j < 3; j++)
120       {
121         mImageView[i][j] = Toolkit::ImageView::New();
122         mImageView[i][j].SetProperty(Toolkit::ImageView::Property::IMAGE, propertyMap);
123         mImageView[i][j].SetProperty(Actor::Property::POSITION, Vector2(50.f * (i - 1), 50.f * (j - 1)));
124       }
125
126     mImageView[1][1].SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
127     mImageView[1][1].SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
128     mImageView[1][1].SetProperty(Actor::Property::SCALE, 1.f / 3.f);
129     mContent.Add(mImageView[1][1]);
130
131     mImageView[0][0].SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
132     mImageView[0][0].SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::BOTTOM_RIGHT);
133     mImageView[0][0].SetProperty(Actor::Property::POSITION, Vector2(-50.f, -50.f));
134     mImageView[1][1].Add(mImageView[0][0]);
135
136     mImageView[1][0].SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_CENTER);
137     mImageView[1][0].SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::BOTTOM_CENTER);
138     mImageView[1][1].Add(mImageView[1][0]);
139
140     mImageView[2][0].SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_RIGHT);
141     mImageView[2][0].SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::BOTTOM_LEFT);
142     mImageView[1][1].Add(mImageView[2][0]);
143
144     mImageView[0][1].SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER_LEFT);
145     mImageView[0][1].SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER_RIGHT);
146     mImageView[1][1].Add(mImageView[0][1]);
147
148     mImageView[2][1].SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER_RIGHT);
149     mImageView[2][1].SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER_LEFT);
150     mImageView[1][1].Add(mImageView[2][1]);
151
152     mImageView[0][2].SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::BOTTOM_LEFT);
153     mImageView[0][2].SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_RIGHT);
154     mImageView[1][1].Add(mImageView[0][2]);
155
156     mImageView[1][2].SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::BOTTOM_CENTER);
157     mImageView[1][2].SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_CENTER);
158     mImageView[1][1].Add(mImageView[1][2]);
159
160     mImageView[2][2].SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::BOTTOM_RIGHT);
161     mImageView[2][2].SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
162     mImageView[1][1].Add(mImageView[2][2]);
163   }
164
165   bool OnButtonClicked(Toolkit::Button button)
166   {
167     if(mAnimation)
168     {
169       mAnimation.Stop();
170       mAnimation.Clear();
171     }
172
173     mIndex = (mIndex + 1) % 4;
174     if(mIndex % 2 == 0)
175     {
176       // switch to the other image
177       // set the pixel area to image visual, the pixel area property is registered on the renderer
178       mContent.Remove(mImageView[1][1]);
179       CreateScene(visualPropertyMap[mIndex / 2]);
180       if(mIndex == 0)
181       {
182         mWrapLabel.SetProperty(Toolkit::TextLabel::Property::TEXT, " Automatic atlasing\n WrapMode: CLAMP_TO_EDGE, MIRRORED_REPEAT");
183       }
184       else
185       {
186         mWrapLabel.SetProperty(Toolkit::TextLabel::Property::TEXT, " No atlasing\n WrapMode: MIRRORED_REPEAT, REPEAT");
187       }
188       mPixelAreaLabel.SetProperty(Toolkit::TextLabel::Property::TEXT, " Use ImageVisual::Property::PIXEL_AREA\n ");
189     }
190     else
191     {
192       // animate the pixel area property on image view,
193       // the animatable pixel area property is registered on the actor, which overwrites the property on the renderer
194       mAnimation            = Animation::New(10.f);
195       float relativeSubSize = 0.33;
196       for(int i = 0; i < 3; i++)
197         for(int j = 0; j < 3; j++)
198         {
199           mImageView[i][j].SetProperty(Toolkit::ImageView::Property::PIXEL_AREA, ORIGINAL_PIXEL_AREA);
200           mAnimation.AnimateTo(Property(mImageView[i][j], Toolkit::ImageView::Property::PIXEL_AREA),
201                                Vector4(relativeSubSize * i, relativeSubSize * j, relativeSubSize, relativeSubSize),
202                                AlphaFunction::BOUNCE);
203         }
204       mAnimation.SetLooping(true);
205       mAnimation.Play();
206
207       mPixelAreaLabel.SetProperty(Toolkit::TextLabel::Property::TEXT, " Animate ImageView::Property::PIXEL_AREA \n     (Overwrite the ImageVisual property) ");
208     }
209     return true;
210   }
211
212   void OnKeyEvent(const KeyEvent& event)
213   {
214     if(event.GetState() == KeyEvent::DOWN)
215     {
216       if(IsKey(event, Dali::DALI_KEY_ESCAPE) || IsKey(event, Dali::DALI_KEY_BACK))
217       {
218         mApplication.Quit();
219       }
220     }
221   }
222
223 private:
224   Application&       mApplication;
225   Layer              mContent;
226   Toolkit::ImageView mImageView[3][3];
227   Property::Map      visualPropertyMap[2];
228   Toolkit::TextLabel mWrapLabel;
229   Toolkit::TextLabel mPixelAreaLabel;
230   Animation          mAnimation;
231   unsigned int       mIndex;
232 };
233
234 int DALI_EXPORT_API main(int argc, char** argv)
235 {
236   Application           application = Application::New(&argc, &argv);
237   ImageViewPixelAreaApp test(application);
238   application.MainLoop();
239   return 0;
240 }