cba48d1748160ff4db7cd0bd8f5e513f720cde95
[platform/core/uifw/dali-demo.git] / examples / styling / image-channel-control-impl.cpp
1 /*
2  * Copyright (c) 2021 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 #include "image-channel-control-impl.h"
18 #include <dali-toolkit/dali-toolkit.h>
19 #include <dali-toolkit/devel-api/controls/control-devel.h>
20 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
21
22 #include "generated/image-channel-control-frag.h"
23
24 #include <cstdio>
25
26 using namespace Dali; // Needed for macros
27
28 namespace Demo
29 {
30 namespace Internal
31 {
32 namespace
33 {
34
35 Dali::BaseHandle Create()
36 {
37   return Demo::ImageChannelControl::New();
38 }
39
40 DALI_TYPE_REGISTRATION_BEGIN(ImageChannelControl, Dali::Toolkit::Control, Create);
41
42 DALI_PROPERTY_REGISTRATION(Demo, ImageChannelControl, "url", STRING, RESOURCE_URL);
43 DALI_PROPERTY_REGISTRATION(Demo, ImageChannelControl, "redChannel", FLOAT, RED_CHANNEL);
44 DALI_PROPERTY_REGISTRATION(Demo, ImageChannelControl, "greenChannel", FLOAT, GREEN_CHANNEL);
45 DALI_PROPERTY_REGISTRATION(Demo, ImageChannelControl, "blueChannel", FLOAT, BLUE_CHANNEL);
46
47 DALI_PROPERTY_REGISTRATION(Demo, ImageChannelControl, "visibility", BOOLEAN, VISIBILITY);
48 DALI_PROPERTY_REGISTRATION(Demo, ImageChannelControl, "enableVisibilityTransition", ARRAY, ENABLE_VISIBILITY_TRANSITION);
49 DALI_PROPERTY_REGISTRATION(Demo, ImageChannelControl, "disableVisibilityTransition", ARRAY, DISABLE_VISIBILITY_TRANSITION);
50
51 DALI_PROPERTY_REGISTRATION(Demo, ImageChannelControl, "imageVisual", MAP, IMAGE_VISUAL);
52 DALI_TYPE_REGISTRATION_END();
53
54 } // anonymous namespace
55
56 Internal::ImageChannelControl::ImageChannelControl()
57 : Control(ControlBehaviour(CONTROL_BEHAVIOUR_DEFAULT)),
58   mChannels(1.0f, 1.0f, 1.0f),
59   mChannelIndex(Property::INVALID_INDEX),
60   mVisibility(true),
61   mTargetVisibility(true)
62 {
63 }
64
65 Internal::ImageChannelControl::~ImageChannelControl()
66 {
67 }
68
69 Demo::ImageChannelControl Internal::ImageChannelControl::New()
70 {
71   IntrusivePtr<Internal::ImageChannelControl> impl   = new Internal::ImageChannelControl();
72   Demo::ImageChannelControl                   handle = Demo::ImageChannelControl(*impl);
73   impl->Initialize();
74   return handle;
75 }
76
77 void ImageChannelControl::SetImage(const std::string& url)
78 {
79   mUrl = url;
80
81   Actor self = Self();
82
83   Property::Map properties;
84   Property::Map shader;
85   shader[Dali::Toolkit::Visual::Shader::Property::FRAGMENT_SHADER] = Dali::Shader::GetFragmentShaderPrefix() + SHADER_IMAGE_CHANNEL_CONTROL_FRAG.data();
86   properties[Dali::Toolkit::Visual::Property::TYPE]                = Dali::Toolkit::Visual::IMAGE;
87   properties[Dali::Toolkit::Visual::Property::SHADER]              = shader;
88   properties[Dali::Toolkit::ImageVisual::Property::URL]            = url;
89
90   mVisual = Toolkit::VisualFactory::Get().CreateVisual(properties);
91   Toolkit::DevelControl::RegisterVisual(*this, Demo::ImageChannelControl::Property::IMAGE_VISUAL, mVisual);
92   mVisual.SetName("imageVisual");
93
94   RelayoutRequest();
95 }
96
97 void ImageChannelControl::SetVisibility(bool visibility)
98 {
99   printf("ImageChannelControl %s: SetVisibility( %s )\n", Self().GetProperty<std::string>(Dali::Actor::Property::NAME).c_str(), visibility ? "T" : "F");
100
101   if(mAnimation)
102   {
103     mAnimation.Stop();
104     mAnimation.FinishedSignal().Disconnect(this, &ImageChannelControl::OnStateChangeAnimationFinished);
105     OnStateChangeAnimationFinished(mAnimation);
106   }
107
108   if(mVisibility != visibility)
109   {
110     if(mVisibility)
111     {
112       if(mDisableVisibilityTransition.Count() > 0)
113       {
114         mAnimation = Toolkit::DevelControl::CreateTransition(*this, mDisableVisibilityTransition);
115       }
116     }
117     else
118     {
119       if(mEnableVisibilityTransition.Count() > 0)
120       {
121         mAnimation = Toolkit::DevelControl::CreateTransition(*this, mEnableVisibilityTransition);
122       }
123     }
124   }
125
126   if(mAnimation)
127   {
128     mAnimation.FinishedSignal().Connect(this, &ImageChannelControl::OnStateChangeAnimationFinished);
129     mAnimation.Play();
130     mTargetVisibility = visibility;
131   }
132   else
133   {
134     mVisibility = visibility;
135   }
136 }
137
138 void ImageChannelControl::OnStateChangeAnimationFinished(Animation& src)
139 {
140   mVisibility = mTargetVisibility;
141 }
142
143 void ImageChannelControl::OnInitialize()
144 {
145   Actor self    = Self();
146   mChannelIndex = self.RegisterProperty("uChannels", Vector3(1.0f, 1.0f, 1.0f));
147 }
148
149 void ImageChannelControl::OnSceneConnection(int depth)
150 {
151   Control::OnSceneConnection(depth);
152 }
153
154 void ImageChannelControl::OnSceneDisconnection()
155 {
156   Control::OnSceneDisconnection();
157 }
158
159 void ImageChannelControl::OnSizeSet(const Vector3& targetSize)
160 {
161   Control::OnSizeSet(targetSize);
162
163   if(mVisual)
164   {
165     Vector2       size(targetSize);
166     Property::Map transformMap;
167     transformMap
168       .Add(Toolkit::Visual::Transform::Property::OFFSET, Vector2(0.0f, 0.0f))
169       .Add(Toolkit::Visual::Transform::Property::SIZE, Vector2(1.0f, 1.0f))
170       .Add(Toolkit::Visual::Transform::Property::ORIGIN, Toolkit::Align::CENTER)
171       .Add(Toolkit::Visual::Transform::Property::ANCHOR_POINT, Toolkit::Align::CENTER)
172       .Add(Toolkit::Visual::Transform::Property::OFFSET_POLICY, Vector2(Toolkit::Visual::Transform::Policy::RELATIVE, Toolkit::Visual::Transform::Policy::RELATIVE))
173       .Add(Toolkit::Visual::Transform::Property::SIZE_POLICY, Vector2(Toolkit::Visual::Transform::Policy::RELATIVE, Toolkit::Visual::Transform::Policy::RELATIVE));
174
175     mVisual.SetTransformAndSize(transformMap, size);
176   }
177 }
178
179 Vector3 ImageChannelControl::GetNaturalSize()
180 {
181   if(mVisual)
182   {
183     Vector2 naturalSize;
184     mVisual.GetNaturalSize(naturalSize);
185     return Vector3(naturalSize);
186   }
187   return Vector3::ZERO;
188 }
189
190 void ImageChannelControl::OnStyleChange(Toolkit::StyleManager styleManager, StyleChange::Type change)
191 {
192   // Chain up.
193   Control::OnStyleChange(styleManager, change);
194 }
195
196 ///////////////////////////////////////////////////////////
197 //
198 // Properties
199 //
200
201 void ImageChannelControl::SetProperty(BaseObject* object, Property::Index index, const Property::Value& value)
202 {
203   Demo::ImageChannelControl imageChannelControl = Demo::ImageChannelControl::DownCast(Dali::BaseHandle(object));
204
205   if(imageChannelControl)
206   {
207     ImageChannelControl& impl = GetImpl(imageChannelControl);
208     Actor                self = impl.Self();
209     switch(index)
210     {
211       case Demo::ImageChannelControl::Property::RESOURCE_URL:
212       {
213         impl.SetImage(value.Get<std::string>());
214         break;
215       }
216       case Demo::ImageChannelControl::Property::IMAGE_VISUAL:
217       {
218         const Property::Map* map = value.GetMap();
219         if(map)
220         {
221           impl.mVisual = Toolkit::VisualFactory::Get().CreateVisual(*map);
222           Toolkit::DevelControl::RegisterVisual(impl, Demo::ImageChannelControl::Property::IMAGE_VISUAL, impl.mVisual);
223         }
224         break;
225       }
226       case Demo::ImageChannelControl::Property::VISIBILITY:
227       {
228         impl.SetVisibility(value.Get<bool>());
229         break;
230       }
231       case Demo::ImageChannelControl::Property::ENABLE_VISIBILITY_TRANSITION:
232       {
233         if(value.GetType() == Property::ARRAY)
234         {
235           impl.mEnableVisibilityTransition = Toolkit::TransitionData::New(*value.GetArray());
236         }
237         else if(value.GetType() == Property::MAP)
238         {
239           impl.mEnableVisibilityTransition = Toolkit::TransitionData::New(*value.GetMap());
240         }
241         break;
242       }
243       case Demo::ImageChannelControl::Property::DISABLE_VISIBILITY_TRANSITION:
244       {
245         if(value.GetType() == Property::ARRAY)
246         {
247           impl.mDisableVisibilityTransition = Toolkit::TransitionData::New(*value.GetArray());
248         }
249         else if(value.GetType() == Property::MAP)
250         {
251           impl.mDisableVisibilityTransition = Toolkit::TransitionData::New(*value.GetMap());
252         }
253         break;
254       }
255       case Demo::ImageChannelControl::Property::RED_CHANNEL:
256       {
257         impl.mChannels[0] = value.Get<float>();
258         self.SetProperty(impl.mChannelIndex, impl.mChannels);
259         break;
260       }
261       case Demo::ImageChannelControl::Property::GREEN_CHANNEL:
262       {
263         impl.mChannels[1] = value.Get<float>();
264         self.SetProperty(impl.mChannelIndex, impl.mChannels);
265         break;
266       }
267       case Demo::ImageChannelControl::Property::BLUE_CHANNEL:
268       {
269         impl.mChannels[2] = value.Get<float>();
270         self.SetProperty(impl.mChannelIndex, impl.mChannels);
271         break;
272       }
273     }
274   }
275 }
276
277 Property::Value ImageChannelControl::GetProperty(BaseObject* object, Property::Index propertyIndex)
278 {
279   Property::Value value;
280
281   Demo::ImageChannelControl imageChannelControl = Demo::ImageChannelControl::DownCast(Dali::BaseHandle(object));
282
283   if(imageChannelControl)
284   {
285     ImageChannelControl& impl = GetImpl(imageChannelControl);
286     switch(propertyIndex)
287     {
288       case Demo::ImageChannelControl::Property::RED_CHANNEL:
289       {
290         value = impl.mChannels[0];
291         break;
292       }
293       case Demo::ImageChannelControl::Property::GREEN_CHANNEL:
294       {
295         value = impl.mChannels[1];
296         break;
297       }
298       case Demo::ImageChannelControl::Property::BLUE_CHANNEL:
299       {
300         value = impl.mChannels[2];
301         break;
302       }
303       case Demo::ImageChannelControl::Property::VISIBILITY:
304       {
305         value = impl.mVisibility;
306         break;
307       }
308       default:
309         break;
310     }
311   }
312
313   return value;
314 }
315
316 } // namespace Internal
317 } // namespace Demo