e47d1cd22bbf045db498c508d359d097cce7445c
[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       ! mUrl.empty()      ||   // If we're changing from a URL type to an Image type
71       ! mPropertyMap.Empty() ) // If we're changing from a property map type to an Image type
72   {
73     mUrl.clear();
74     mPropertyMap.Clear();
75
76     mImage = image;
77
78     Actor self = Self();
79     Toolkit::RendererFactory::Get().ResetRenderer( mRenderer, self, image );
80     mImageSize = image ? ImageDimensions( image.GetWidth(), image.GetHeight() ) : ImageDimensions( 0, 0 );
81
82     RelayoutRequest();
83   }
84 }
85
86 void ImageView::SetImage( Property::Map map )
87 {
88   mUrl.clear();
89   mImage.Reset();
90   mPropertyMap = map;
91
92   Actor self = Self();
93   Toolkit::RendererFactory::Get().ResetRenderer( mRenderer, self, mPropertyMap );
94
95   int width = 0;
96   Property::Value* widthValue = mPropertyMap.Find( "width" );
97   if( widthValue )
98   {
99     widthValue->Get( width );
100   }
101
102   int height = 0;
103   Property::Value* heightValue = mPropertyMap.Find( "height" );
104   if( heightValue )
105   {
106     heightValue->Get( height );
107   }
108
109   mImageSize = ImageDimensions( width, height );
110
111   RelayoutRequest();
112 }
113
114 void ImageView::SetImage( const std::string& url, ImageDimensions size )
115 {
116   if( ( mUrl != url ) ||
117       mImage          ||       // If we're changing from an Image type to a URL type
118       ! mPropertyMap.Empty() ) // If we're changing from a property map type to a URL type
119   {
120     mImage.Reset();
121     mPropertyMap.Clear();
122
123     mUrl = url;
124
125     if( size.GetWidth() == 0u && size.GetHeight() == 0u )
126     {
127       mImageSize = ResourceImage::GetImageSize( mUrl );
128     }
129     else
130     {
131       mImageSize = size;
132     }
133
134     Actor self = Self();
135     Toolkit::RendererFactory::Get().ResetRenderer( mRenderer, self, mUrl, mImageSize );
136
137     RelayoutRequest();
138   }
139 }
140
141 Vector3 ImageView::GetNaturalSize()
142 {
143   Vector3 size;
144
145   size.x = mImageSize.GetWidth();
146   size.y = mImageSize.GetHeight();
147   size.z = std::min(size.x, size.y);
148
149   if( size.x > 0 && size.y > 0 )
150   {
151     return size;
152   }
153   else
154   {
155     // if no image then use Control's natural size
156     return Control::GetNaturalSize();
157   }
158 }
159
160 float ImageView::GetHeightForWidth( float width )
161 {
162   if( mImageSize.GetWidth() > 0 && mImageSize.GetHeight() > 0 )
163   {
164     return GetHeightForWidthBase( width );
165   }
166   else
167   {
168     return Control::GetHeightForWidth( width );
169   }
170 }
171
172 float ImageView::GetWidthForHeight( float height )
173 {
174   if( mImageSize.GetWidth() > 0 && mImageSize.GetHeight() > 0 )
175   {
176     return GetWidthForHeightBase( height );
177   }
178   else
179   {
180     return Control::GetWidthForHeight( height );
181   }
182 }
183
184 ///////////////////////////////////////////////////////////
185 //
186 // Private methods
187 //
188
189 void ImageView::OnStageConnection( int depth )
190 {
191   Control::OnStageConnection( depth );
192
193   if( mRenderer )
194   {
195     CustomActor self = Self();
196     mRenderer.SetOnStage( self );
197   }
198 }
199
200 void ImageView::OnStageDisconnection()
201 {
202   if( mRenderer )
203   {
204     CustomActor self = Self();
205     mRenderer.SetOffStage( self );
206   }
207
208   Control::OnStageDisconnection();
209 }
210
211
212 ///////////////////////////////////////////////////////////
213 //
214 // Properties
215 //
216
217 void ImageView::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
218 {
219   Toolkit::ImageView imageView = Toolkit::ImageView::DownCast( Dali::BaseHandle( object ) );
220
221   if ( imageView )
222   {
223     switch ( index )
224     {
225       case Toolkit::ImageView::Property::IMAGE:
226       {
227         std::string imageUrl;
228         if( value.Get( imageUrl ) )
229         {
230           ImageView& impl = GetImpl( imageView );
231           impl.SetImage( imageUrl, ImageDimensions() );
232         }
233
234         // if its not a string then get a Property::Map from the property if possible.
235         Property::Map map;
236         if( value.Get( map ) )
237         {
238           ImageView& impl = GetImpl( imageView );
239           impl.SetImage( map );
240         }
241
242         break;
243       }
244     }
245   }
246 }
247
248 Property::Value ImageView::GetProperty( BaseObject* object, Property::Index propertyIndex )
249 {
250   Property::Value value;
251
252   Toolkit::ImageView imageview = Toolkit::ImageView::DownCast( Dali::BaseHandle( object ) );
253
254   if ( imageview )
255   {
256     switch ( propertyIndex )
257     {
258       case Toolkit::ImageView::Property::IMAGE:
259       {
260         ImageView& impl = GetImpl( imageview );
261         if ( !impl.mUrl.empty() )
262         {
263           value = impl.mUrl;
264         }
265         else if( impl.mImage )
266         {
267           Property::Map map;
268           Scripting::CreatePropertyMap( impl.mImage, map );
269           value = map;
270         }
271         else if( !impl.mPropertyMap.Empty() )
272         {
273           value = impl.mPropertyMap;
274         }
275         break;
276       }
277     }
278   }
279
280   return value;
281 }
282
283 } // namespace Internal
284 } // namespace Toolkit
285 } // namespace Dali