76493a68a44d28277922ffdfc27b31794404064e
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / image-view / image-view-impl.cpp
1 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
2
3 // CLASS HEADER
4 #include "image-view-impl.h"
5
6 // EXTERNAL INCLUDES
7 #include <dali/public-api/images/resource-image.h>
8 #include <dali/public-api/object/type-registry.h>
9 #include <dali/devel-api/object/type-registry-helper.h>
10 #include <dali/devel-api/scripting/scripting.h>
11
12 // INTERNAL INCLUDES
13 #include <dali-toolkit/public-api/controls/image-view/image-view.h>
14 #include <dali-toolkit/devel-api/controls/renderer-factory/renderer-factory.h>
15 #include <dali-toolkit/internal/controls/renderers/image/image-renderer.h>
16
17 namespace Dali
18 {
19
20 namespace Toolkit
21 {
22
23 namespace Internal
24 {
25
26 namespace
27 {
28
29 BaseHandle Create()
30 {
31   return Toolkit::ImageView::New();
32 }
33
34 // Setup properties, signals and actions using the type-registry.
35 DALI_TYPE_REGISTRATION_BEGIN( Toolkit::ImageView, Toolkit::Control, Create );
36 DALI_PROPERTY_REGISTRATION( Toolkit, ImageView, "image", MAP, IMAGE )
37 DALI_TYPE_REGISTRATION_END()
38
39 } // anonymous namespace
40
41 using namespace Dali;
42
43 ImageView::ImageView()
44 : Control( ControlBehaviour( ACTOR_BEHAVIOUR_NONE ) )
45 {
46 }
47
48 ImageView::~ImageView()
49 {
50 }
51
52 Toolkit::ImageView ImageView::New()
53 {
54   ImageView* impl = new ImageView();
55
56   Toolkit::ImageView handle = Toolkit::ImageView( *impl );
57
58   // Second-phase init of the implementation
59   // This can only be done after the CustomActor connection has been made...
60   impl->Initialize();
61
62   return handle;
63 }
64
65 /////////////////////////////////////////////////////////////
66
67 void ImageView::SetImage( Image image )
68 {
69   if( mImage != image )
70   {
71     mUrl.clear();
72     mPropertyMap.Clear();
73
74     mImage = image;
75
76     bool newRendererCreated = false;
77     if( mRenderer )
78     {
79       newRendererCreated = Toolkit::RendererFactory::Get().ResetRenderer( mRenderer, image );
80     }
81     else
82     {
83       mRenderer = Toolkit::RendererFactory::Get().GetControlRenderer( image );
84       newRendererCreated = true;
85     }
86
87     //we need to inform any newly created renderers if it is on stage
88     if( newRendererCreated && Self().OnStage() )
89     {
90       CustomActor self = Self();
91       mRenderer.SetOnStage( self );
92     }
93
94     mImageSize = image ? ImageDimensions( image.GetWidth(), image.GetHeight() ) : ImageDimensions( 0, 0 );
95   }
96 }
97
98 void ImageView::SetImage( Property::Map map )
99 {
100   mImage.Reset();
101   mUrl.clear();
102   mPropertyMap = map;
103
104   mRenderer = Toolkit::RendererFactory::Get().GetControlRenderer( mPropertyMap );
105
106   //we need to inform any newly created renderers if it is on stage
107   if( Self().OnStage() )
108   {
109     CustomActor self = Self();
110     mRenderer.SetOnStage( self );
111   }
112
113   int width = 0;
114   Property::Value* widthValue = mPropertyMap.Find( "width" );
115   if( widthValue )
116   {
117     widthValue->Get( width );
118   }
119
120   int height = 0;
121   Property::Value* heightValue = mPropertyMap.Find( "height" );
122   if( heightValue )
123   {
124     heightValue->Get( height );
125   }
126
127   mImageSize = ImageDimensions( width, height );
128 }
129
130 void ImageView::SetImage( const std::string& url )
131 {
132   if( mUrl != url )
133   {
134     mImage.Reset();
135     mPropertyMap.Clear();
136
137     mUrl = url;
138
139     bool newRendererCreated = false;
140     if( mRenderer )
141     {
142       newRendererCreated = Toolkit::RendererFactory::Get().ResetRenderer( mRenderer, mUrl );
143     }
144     else
145     {
146       mRenderer = Toolkit::RendererFactory::Get().GetControlRenderer( mUrl );
147       newRendererCreated = true;
148     }
149
150     //we need to inform any newly created renderers if it is on stage
151     if( newRendererCreated && Self().OnStage() )
152     {
153       CustomActor self = Self();
154       mRenderer.SetOnStage( self );
155     }
156
157     mImageSize = ResourceImage::GetImageSize( mUrl );
158   }
159 }
160
161 Vector3 ImageView::GetNaturalSize()
162 {
163   Vector3 size;
164
165   size.x = mImageSize.GetWidth();
166   size.y = mImageSize.GetHeight();
167   size.z = std::min(size.x, size.y);
168
169   if( size.x > 0 && size.x > 0 )
170   {
171     return size;
172   }
173   else
174   {
175     // if no image then use Control's natural size
176     return Control::GetNaturalSize();
177   }
178 }
179
180 float ImageView::GetHeightForWidth( float width )
181 {
182   if( mImageSize.GetWidth() > 0 && mImageSize.GetHeight() > 0 )
183   {
184     return GetHeightForWidthBase( width );
185   }
186   else
187   {
188     return Control::GetHeightForWidth( width );
189   }
190 }
191
192 float ImageView::GetWidthForHeight( float height )
193 {
194   if( mImageSize.GetWidth() > 0 && mImageSize.GetHeight() > 0 )
195   {
196     return GetWidthForHeightBase( height );
197   }
198   else
199   {
200     return Control::GetWidthForHeight( height );
201   }
202 }
203
204 ///////////////////////////////////////////////////////////
205 //
206 // Private methods
207 //
208
209 void ImageView::OnStageConnection( int depth )
210 {
211   if( mRenderer )
212   {
213     CustomActor self = Self();
214     mRenderer.SetOnStage( self );
215   }
216 }
217
218 ///////////////////////////////////////////////////////////
219 //
220 // Properties
221 //
222
223 void ImageView::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
224 {
225   Toolkit::ImageView imageView = Toolkit::ImageView::DownCast( Dali::BaseHandle( object ) );
226
227   if ( imageView )
228   {
229     switch ( index )
230     {
231       case Toolkit::ImageView::Property::IMAGE:
232       {
233         std::string imageUrl;
234         if( value.Get( imageUrl ) )
235         {
236           ImageView& impl = GetImpl( imageView );
237           impl.SetImage( imageUrl );
238         }
239
240         // if its not a string then get a Property::Map from the property if possible.
241         Property::Map map;
242         if( value.Get( map ) )
243         {
244           ImageView& impl = GetImpl( imageView );
245           impl.SetImage( map );
246         }
247
248         break;
249       }
250     }
251   }
252 }
253
254 Property::Value ImageView::GetProperty( BaseObject* object, Property::Index propertyIndex )
255 {
256   Property::Value value;
257
258   Toolkit::ImageView imageview = Toolkit::ImageView::DownCast( Dali::BaseHandle( object ) );
259
260   if ( imageview )
261   {
262     switch ( propertyIndex )
263     {
264       case Toolkit::ImageView::Property::IMAGE:
265       {
266         ImageView& impl = GetImpl( imageview );
267         if ( !impl.mUrl.empty() )
268         {
269           value = impl.mUrl;
270         }
271         else if( impl.mImage )
272         {
273           Property::Map map;
274           Scripting::CreatePropertyMap( impl.mImage, map );
275           value = map;
276         }
277         else if( !impl.mPropertyMap.Empty() )
278         {
279           value = impl.mPropertyMap;
280         }
281         break;
282       }
283     }
284   }
285
286   return value;
287 }
288
289 } // namespace Internal
290 } // namespace Toolkit
291 } // namespace Dali