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