Refactored ControlRenderer so that derived classes are responsible for the creation...
[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.x > 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   if( mRenderer )
173   {
174     CustomActor self = Self();
175     mRenderer.SetOnStage( self );
176   }
177 }
178
179 void ImageView::OnStageDisconnection()
180 {
181   if( mRenderer )
182   {
183     CustomActor self = Self();
184     mRenderer.SetOffStage( self );
185   }
186 }
187
188
189 ///////////////////////////////////////////////////////////
190 //
191 // Properties
192 //
193
194 void ImageView::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
195 {
196   Toolkit::ImageView imageView = Toolkit::ImageView::DownCast( Dali::BaseHandle( object ) );
197
198   if ( imageView )
199   {
200     switch ( index )
201     {
202       case Toolkit::ImageView::Property::IMAGE:
203       {
204         std::string imageUrl;
205         if( value.Get( imageUrl ) )
206         {
207           ImageView& impl = GetImpl( imageView );
208           impl.SetImage( imageUrl );
209         }
210
211         // if its not a string then get a Property::Map from the property if possible.
212         Property::Map map;
213         if( value.Get( map ) )
214         {
215           ImageView& impl = GetImpl( imageView );
216           impl.SetImage( map );
217         }
218
219         break;
220       }
221     }
222   }
223 }
224
225 Property::Value ImageView::GetProperty( BaseObject* object, Property::Index propertyIndex )
226 {
227   Property::Value value;
228
229   Toolkit::ImageView imageview = Toolkit::ImageView::DownCast( Dali::BaseHandle( object ) );
230
231   if ( imageview )
232   {
233     switch ( propertyIndex )
234     {
235       case Toolkit::ImageView::Property::IMAGE:
236       {
237         ImageView& impl = GetImpl( imageview );
238         if ( !impl.mUrl.empty() )
239         {
240           value = impl.mUrl;
241         }
242         else if( impl.mImage )
243         {
244           Property::Map map;
245           Scripting::CreatePropertyMap( impl.mImage, map );
246           value = map;
247         }
248         else if( !impl.mPropertyMap.Empty() )
249         {
250           value = impl.mPropertyMap;
251         }
252         break;
253       }
254     }
255   }
256
257   return value;
258 }
259
260 } // namespace Internal
261 } // namespace Toolkit
262 } // namespace Dali