/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
namespace
{
+const float MIN_SCALE = 0.6f;
const float MAX_SCALE = 6.f;
const char* SVG_IMAGES[] =
DEMO_IMAGE_DIR "Kid1.svg"
};
const unsigned int NUM_SVG_IMAGES( sizeof( SVG_IMAGES ) / sizeof( SVG_IMAGES[0] ) );
-}
+const unsigned int NUM_IMAGES_DISPLAYED = 4u;
+} // unnamed namespace
-// This example shows how to display svg images with ImageView
+// This example shows how to display svg images with ImageView.
//
class ImageSvgController : public ConnectionTracker
{
ImageSvgController( Application& application )
: mApplication( application ),
mScale( 1.f ),
- mScaleAtPinchStart( 1.0f ),
mIndex( 0 )
{
// Connect to the Application's Init signal
changeButton.SetParentOrigin( ParentOrigin::TOP_RIGHT );
stage.Add( changeButton );
changeButton.ClickedSignal().Connect( this, &ImageSvgController::OnChangeButtonClicked );
- changeButton.SetProperty( DevelActor::Property::SIBLING_ORDER, 1 );
// Push button, for resetting the actor size and position
Toolkit::PushButton resetButton = Toolkit::PushButton::New();
resetButton.SetParentOrigin( ParentOrigin::TOP_LEFT );
stage.Add( resetButton );
resetButton.ClickedSignal().Connect( this, &ImageSvgController::OnResetButtonClicked );
- resetButton.SetProperty( DevelActor::Property::SIBLING_ORDER, 1 );
// Create and put imageViews to stage
- for( unsigned int i=0; i<4u; i++)
+ for( unsigned int i = 0; i < NUM_IMAGES_DISPLAYED; i++ )
{
mSvgActor[i] = Toolkit::ImageView::New(SVG_IMAGES[mIndex+i]);
mSvgActor[i].SetSize( mActorSize );
mPinchGestureDetector = PinchGestureDetector::New();
mPinchGestureDetector.Attach( mStageBackground);
mPinchGestureDetector.DetectedSignal().Connect(this, &ImageSvgController::OnPinch);
+
+ changeButton.RaiseToTop();
+ resetButton.RaiseToTop();
}
// Callback of push button, for changing image set
bool OnChangeButtonClicked( Toolkit::Button button )
{
- mIndex = (mIndex+4) % NUM_SVG_IMAGES;
- for( unsigned int i=0; i<4u; i++)
+ mIndex = ( mIndex + NUM_IMAGES_DISPLAYED ) % NUM_SVG_IMAGES;
+ for( unsigned int i = 0; i < NUM_IMAGES_DISPLAYED; i++ )
{
mSvgActor[i].SetImage(SVG_IMAGES[mIndex+i]);
}
// Callback of push button, for resetting image size and position
bool OnResetButtonClicked( Toolkit::Button button )
{
- for( unsigned int i=0; i<4u; i++)
+ for( unsigned int i = 0; i < NUM_IMAGES_DISPLAYED ; i++ )
{
mSvgActor[i].SetSize(mActorSize);
mSvgActor[i].SetPosition( Vector3::ZERO );
{
if( gesture.state == Gesture::Continuing )
{
- for( unsigned int i=0; i<4u; i++)
+ for( unsigned int i = 0; i < NUM_IMAGES_DISPLAYED; i++ )
{
mSvgActor[i].TranslateBy(Vector3(gesture.displacement));
}
// Callback of pinch gesture, for resizing the actors
void OnPinch(Actor actor, const PinchGesture& gesture)
{
- if (gesture.state == Gesture::Started)
- {
- mScaleAtPinchStart = mScale;
- }
- if( gesture.state == Gesture::Finished )
+ switch( gesture.state )
{
- mScale = mScaleAtPinchStart * gesture.scale;
- mScale = mScale > MAX_SCALE ? MAX_SCALE : mScale;
- for( unsigned int i=0; i<4u; i++)
+ // Only scale the image when we start or continue pinching
+
+ case Gesture::Started:
+ case Gesture::Continuing:
+ {
+ float scale = std::max( gesture.scale, MIN_SCALE / mScale );
+ scale = std::min( MAX_SCALE / mScale, scale );
+
+ for( unsigned int i = 0; i < NUM_IMAGES_DISPLAYED; i++ )
+ {
+ mSvgActor[i].SetScale( scale );
+ }
+ break;
+ }
+
+ case Gesture::Finished:
{
- mSvgActor[i].SetSize( mActorSize * mScale);
+ // Resize the image when pinching is complete, this will rasterize the SVG to the new size
+
+ mScale = mScale * gesture.scale;
+ mScale = mScale > MAX_SCALE ? MAX_SCALE : mScale;
+ mScale = mScale < MIN_SCALE ? MIN_SCALE : mScale;
+ for( unsigned int i = 0; i < NUM_IMAGES_DISPLAYED; i++ )
+ {
+ mSvgActor[i].SetSize( mActorSize * mScale );
+ mSvgActor[i].SetScale( 1.0f );
+ }
+ break;
}
+
+ case Gesture::Cancelled:
+ case Gesture::Clear:
+ case Gesture::Possible:
+ break;
}
}
const char* keyName = event.keyPressedName.c_str();
if( strcmp(keyName, "Left") == 0 )
{
- mScale /= 1.1f;
- for( unsigned int i=0; i<4u; i++)
+ if( mScale > MIN_SCALE )
+ {
+ mScale /= 1.1f;
+ }
+ for( unsigned int i = 0; i < NUM_IMAGES_DISPLAYED; i++ )
{
- mSvgActor[i].SetSize( mActorSize * mScale);
+ mSvgActor[i].SetSize( mActorSize * mScale );
}
}
else if( strcmp(keyName, "Right") == 0 )
{
mScale *= 1.1f;
}
- for( unsigned int i=0; i<4u; i++)
+ for( unsigned int i = 0; i < NUM_IMAGES_DISPLAYED; i++ )
{
- mSvgActor[i].SetSize( mActorSize * mScale);
+ mSvgActor[i].SetSize( mActorSize * mScale );
}
}
}
Toolkit::ImageView mSvgActor[4];
Vector2 mActorSize;
float mScale;
- float mScaleAtPinchStart;
unsigned int mIndex;
};
-void RunTest( Application& application )
-{
- ImageSvgController test( application );
-
- application.MainLoop();
-}
-
-// Entry point for Linux & Tizen applications
-//
int DALI_EXPORT_API main( int argc, char **argv )
{
Application application = Application::New( &argc, &argv );
-
- RunTest( application );
-
+ ImageSvgController test( application );
+ application.MainLoop();
return 0;
}