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