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