1 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 #include "image-view-impl.h"
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>
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>
31 return Toolkit::ImageView::New();
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, "resourceUrl", STRING, RESOURCE_URL )
37 DALI_PROPERTY_REGISTRATION( Toolkit, ImageView, "image", MAP, IMAGE )
38 DALI_TYPE_REGISTRATION_END()
40 } // anonymous namespace
44 ImageView::ImageView()
45 : Control( ControlBehaviour( ACTOR_BEHAVIOUR_NONE ) )
49 ImageView::~ImageView()
53 Toolkit::ImageView ImageView::New()
55 ImageView* impl = new ImageView();
57 Toolkit::ImageView handle = Toolkit::ImageView( *impl );
59 // Second-phase init of the implementation
60 // This can only be done after the CustomActor connection has been made...
66 /////////////////////////////////////////////////////////////
68 void ImageView::SetImage( Image image )
70 if( ( mImage != image ) ||
71 ! mUrl.empty() || // If we're changing from a URL type to an Image type
72 ! mPropertyMap.Empty() ) // If we're changing from a property map type to an Image type
80 Toolkit::RendererFactory::Get().ResetRenderer( mRenderer, self, image );
81 mImageSize = image ? ImageDimensions( image.GetWidth(), image.GetHeight() ) : ImageDimensions( 0, 0 );
87 void ImageView::SetImage( Property::Map map )
94 Toolkit::RendererFactory::Get().ResetRenderer( mRenderer, self, mPropertyMap );
96 Property::Value* widthValue = mPropertyMap.Find( "width" );
100 if( widthValue->Get( width ) )
102 mImageSize = ImageDimensions( width, mImageSize.GetHeight() );
106 Property::Value* heightValue = mPropertyMap.Find( "height" );
110 if( heightValue->Get( height ) )
112 mImageSize = ImageDimensions( mImageSize.GetWidth(), height );
119 void ImageView::SetImage( const std::string& url, ImageDimensions size )
121 if( ( mUrl != url ) ||
122 mImage || // If we're changing from an Image type to a URL type
123 ! mPropertyMap.Empty() ) // If we're changing from a property map type to a URL type
126 mPropertyMap.Clear();
130 if( size.GetWidth() == 0u && size.GetHeight() == 0u )
132 mImageSize = ResourceImage::GetImageSize( mUrl );
140 Toolkit::RendererFactory::Get().ResetRenderer( mRenderer, self, mUrl, mImageSize );
146 void ImageView::SetDepthIndex( int depthIndex )
148 mRenderer.SetDepthIndex( depthIndex );
151 Vector3 ImageView::GetNaturalSize()
155 size.x = mImageSize.GetWidth();
156 size.y = mImageSize.GetHeight();
157 size.z = std::min(size.x, size.y);
159 if( size.x > 0 && size.y > 0 )
165 // if no image then use Control's natural size
166 return Control::GetNaturalSize();
170 float ImageView::GetHeightForWidth( float width )
172 if( mImageSize.GetWidth() > 0 && mImageSize.GetHeight() > 0 )
174 return GetHeightForWidthBase( width );
178 return Control::GetHeightForWidth( width );
182 float ImageView::GetWidthForHeight( float height )
184 if( mImageSize.GetWidth() > 0 && mImageSize.GetHeight() > 0 )
186 return GetWidthForHeightBase( height );
190 return Control::GetWidthForHeight( height );
194 ///////////////////////////////////////////////////////////
199 void ImageView::OnStageConnection( int depth )
201 Control::OnStageConnection( depth );
205 CustomActor self = Self();
206 mRenderer.SetOnStage( self );
210 void ImageView::OnStageDisconnection()
214 CustomActor self = Self();
215 mRenderer.SetOffStage( self );
218 Control::OnStageDisconnection();
222 ///////////////////////////////////////////////////////////
227 void ImageView::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
229 Toolkit::ImageView imageView = Toolkit::ImageView::DownCast( Dali::BaseHandle( object ) );
235 case Toolkit::ImageView::Property::RESOURCE_URL:
237 std::string imageUrl;
238 if( value.Get( imageUrl ) )
240 GetImpl( imageView ).SetImage( imageUrl, ImageDimensions() );
245 case Toolkit::ImageView::Property::IMAGE:
247 std::string imageUrl;
248 if( value.Get( imageUrl ) )
250 ImageView& impl = GetImpl( imageView );
251 impl.SetImage( imageUrl, ImageDimensions() );
254 // if its not a string then get a Property::Map from the property if possible.
256 if( value.Get( map ) )
258 ImageView& impl = GetImpl( imageView );
259 impl.SetImage( map );
268 Property::Value ImageView::GetProperty( BaseObject* object, Property::Index propertyIndex )
270 Property::Value value;
272 Toolkit::ImageView imageview = Toolkit::ImageView::DownCast( Dali::BaseHandle( object ) );
276 switch ( propertyIndex )
278 case Toolkit::ImageView::Property::RESOURCE_URL:
280 ImageView& impl = GetImpl( imageview );
281 if ( !impl.mUrl.empty() )
288 case Toolkit::ImageView::Property::IMAGE:
290 ImageView& impl = GetImpl( imageview );
291 if ( !impl.mUrl.empty() )
295 else if( impl.mImage )
298 Scripting::CreatePropertyMap( impl.mImage, map );
301 else if( !impl.mPropertyMap.Empty() )
303 value = impl.mPropertyMap;
313 } // namespace Internal
314 } // namespace Toolkit