X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=examples%2Fimage-view-svg%2Fimage-view-svg-example.cpp;h=d40156e4f30884a858124384ef232de4b9a438b7;hb=1b19fd140ff139b5854a1a62447faf31b175d8f6;hp=12180f2359406a8068c0f17e76861d98986d977d;hpb=fdeaf93571697344be1a2b92d43f6ff1aeaf5b59;p=platform%2Fcore%2Fuifw%2Fdali-demo.git diff --git a/examples/image-view-svg/image-view-svg-example.cpp b/examples/image-view-svg/image-view-svg-example.cpp index 12180f2..d40156e 100644 --- a/examples/image-view-svg/image-view-svg-example.cpp +++ b/examples/image-view-svg/image-view-svg-example.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 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. @@ -16,16 +16,18 @@ */ #include +#include #include using namespace Dali; namespace { +const float MIN_SCALE = 0.6f; const float MAX_SCALE = 6.f; const char* SVG_IMAGES[] = -{ + { DEMO_IMAGE_DIR "Camera.svg", DEMO_IMAGE_DIR "Contacts.svg", DEMO_IMAGE_DIR "Mail.svg", @@ -33,24 +35,23 @@ const char* SVG_IMAGES[] = DEMO_IMAGE_DIR "Phone.svg", DEMO_IMAGE_DIR "Settings.svg", DEMO_IMAGE_DIR "World.svg", - DEMO_IMAGE_DIR "Kid1.svg" -}; -const unsigned int NUM_SVG_IMAGES( sizeof( SVG_IMAGES ) / sizeof( SVG_IMAGES[0] ) ); -} + 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 { public: - - ImageSvgController( Application& application ) - : mApplication( application ), - mScale( 1.f ), - mIndex( 0 ) + ImageSvgController(Application& application) + : mApplication(application), + mScale(1.f), + mIndex(0) { // Connect to the Application's Init signal - mApplication.InitSignal().Connect( this, &ImageSvgController::Create ); + mApplication.InitSignal().Connect(this, &ImageSvgController::Create); } ~ImageSvgController() @@ -58,88 +59,89 @@ public: } // The Init signal is received once (only) during the Application lifetime - void Create( Application& application ) + void Create(Application& application) { - // Get a handle to the stage - Stage stage = Stage::GetCurrent(); - stage.SetBackgroundColor( Color::WHITE ); - Vector2 stageSize = stage.GetSize(); - mActorSize = stageSize/2.f; - - // Hide the indicator bar - application.GetWindow().ShowIndicator( Dali::Window::INVISIBLE ); + // Get a handle to the window + Window window = application.GetWindow(); + window.SetBackgroundColor(Color::WHITE); + Vector2 windowSize = window.GetSize(); + mActorSize = windowSize / 2.f; - stage.KeyEventSignal().Connect(this, &ImageSvgController::OnKeyEvent); + window.KeyEventSignal().Connect(this, &ImageSvgController::OnKeyEvent); // Background, for receiving gestures - mStageBackground = Actor::New(); - mStageBackground.SetAnchorPoint( AnchorPoint::TOP_CENTER ); - mStageBackground.SetParentOrigin( ParentOrigin::TOP_CENTER ); - mStageBackground.SetSize( stageSize.x, stageSize.y ); - stage.Add(mStageBackground); + mWindowBackground = Actor::New(); + mWindowBackground.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_CENTER); + mWindowBackground.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_CENTER); + mWindowBackground.SetProperty(Actor::Property::SIZE, Vector2(windowSize.x, windowSize.y)); + window.Add(mWindowBackground); // Push button, for changing the image set for displaying Toolkit::PushButton changeButton = Toolkit::PushButton::New(); - changeButton.SetLabelText( "Next" ); - changeButton.SetAnchorPoint( AnchorPoint::TOP_RIGHT ); - changeButton.SetParentOrigin( ParentOrigin::TOP_RIGHT ); - stage.Add( changeButton ); - changeButton.ClickedSignal().Connect( this, &ImageSvgController::OnChangeButtonClicked ); + changeButton.SetProperty(Toolkit::Button::Property::LABEL, "Next"); + changeButton.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_RIGHT); + changeButton.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_RIGHT); + window.Add(changeButton); + changeButton.ClickedSignal().Connect(this, &ImageSvgController::OnChangeButtonClicked); // Push button, for resetting the actor size and position Toolkit::PushButton resetButton = Toolkit::PushButton::New(); - resetButton.SetLabelText( "Reset" ); - resetButton.SetAnchorPoint( AnchorPoint::TOP_LEFT ); - resetButton.SetParentOrigin( ParentOrigin::TOP_LEFT ); - stage.Add( resetButton ); - resetButton.ClickedSignal().Connect( this, &ImageSvgController::OnResetButtonClicked ); - - // Create and put imageViews to stage - for( unsigned int i=0; i<4u; i++) + resetButton.SetProperty(Toolkit::Button::Property::LABEL, "Reset"); + resetButton.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT); + resetButton.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT); + window.Add(resetButton); + resetButton.ClickedSignal().Connect(this, &ImageSvgController::OnResetButtonClicked); + + // Create and put imageViews to window + for(unsigned int i = 0; i < NUM_IMAGES_DISPLAYED; i++) { - mSvgActor[i] = Toolkit::ImageView::New(SVG_IMAGES[mIndex+i]); - mSvgActor[i].SetSize( mActorSize ); - stage.Add( mSvgActor[i] ); + mSvgActor[i] = Toolkit::ImageView::New(SVG_IMAGES[mIndex + i]); + mSvgActor[i].SetProperty(Actor::Property::SIZE, mActorSize); + mSvgActor[i].TranslateBy(Vector3(0.0, windowSize.height * 0.05, 0.0f)); + window.Add(mSvgActor[i]); } - mSvgActor[0].SetParentOrigin( ParentOrigin::CENTER ); - mSvgActor[0].SetAnchorPoint( AnchorPoint::BOTTOM_RIGHT ); - mSvgActor[1].SetParentOrigin( ParentOrigin::CENTER ); - mSvgActor[1].SetAnchorPoint( AnchorPoint::BOTTOM_LEFT ); - mSvgActor[2].SetParentOrigin( ParentOrigin::CENTER ); - mSvgActor[2].SetAnchorPoint( AnchorPoint::TOP_RIGHT ); - mSvgActor[3].SetParentOrigin( ParentOrigin::CENTER ); - mSvgActor[3].SetAnchorPoint( AnchorPoint::TOP_LEFT ); + mSvgActor[0].SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); + mSvgActor[0].SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::BOTTOM_RIGHT); + mSvgActor[1].SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); + mSvgActor[1].SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::BOTTOM_LEFT); + mSvgActor[2].SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); + mSvgActor[2].SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_RIGHT); + mSvgActor[3].SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); + mSvgActor[3].SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT); // Connect pan gesture for moving the actors mPanGestureDetector = PanGestureDetector::New(); - mPanGestureDetector.DetectedSignal().Connect( this, &ImageSvgController::OnPanGesture ); - mPanGestureDetector.Attach( mStageBackground ); + mPanGestureDetector.DetectedSignal().Connect(this, &ImageSvgController::OnPanGesture); + mPanGestureDetector.Attach(mWindowBackground); // Connect pinch gesture for resizing the actors mPinchGestureDetector = PinchGestureDetector::New(); - mPinchGestureDetector.Attach( mStageBackground); + mPinchGestureDetector.Attach(mWindowBackground); mPinchGestureDetector.DetectedSignal().Connect(this, &ImageSvgController::OnPinch); + + changeButton.RaiseToTop(); + resetButton.RaiseToTop(); } // Callback of push button, for changing image set - bool OnChangeButtonClicked( Toolkit::Button button ) + 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]); + mSvgActor[i].SetImage(SVG_IMAGES[mIndex + i]); } return true; } // Callback of push button, for resetting image size and position - bool OnResetButtonClicked( Toolkit::Button button ) + 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 ); + mSvgActor[i].SetProperty(Actor::Property::SIZE, mActorSize); + mSvgActor[i].SetProperty(Actor::Property::POSITION, Vector3::ZERO); mScale = 1.f; } @@ -147,13 +149,13 @@ public: } // Callback of pan gesture, for moving the actors - void OnPanGesture( Actor actor, const PanGesture& gesture ) + void OnPanGesture(Actor actor, const PanGesture& gesture) { - if( gesture.state == Gesture::Continuing ) + if(gesture.GetState() == GestureState::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)); + mSvgActor[i].TranslateBy(Vector3(gesture.GetDisplacement())); } } } @@ -161,85 +163,101 @@ public: // Callback of pinch gesture, for resizing the actors void OnPinch(Actor actor, const PinchGesture& gesture) { - if (gesture.state == Gesture::Started) + switch(gesture.GetState()) { - mScaleAtPinchStart = mScale; - } - if( gesture.state == Gesture::Finished ) - { - 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 GestureState::STARTED: + case GestureState::CONTINUING: + { + float scale = std::max(gesture.GetScale(), MIN_SCALE / mScale); + scale = std::min(MAX_SCALE / mScale, scale); + + for(unsigned int i = 0; i < NUM_IMAGES_DISPLAYED; i++) + { + mSvgActor[i].SetProperty(Actor::Property::SCALE, scale); + } + break; + } + + case GestureState::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.GetScale(); + 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].SetProperty(Actor::Property::SIZE, mActorSize * mScale); + mSvgActor[i].SetProperty(Actor::Property::SCALE, 1.0f); + } + break; } + + case GestureState::CANCELLED: + case GestureState::CLEAR: + case GestureState::POSSIBLE: + break; } } /** * Main key event handler */ - void OnKeyEvent(const KeyEvent& event) - { - if(event.state == KeyEvent::Down) - { - if( IsKey( event, Dali::DALI_KEY_ESCAPE) || IsKey( event, Dali::DALI_KEY_BACK) ) - { - mApplication.Quit(); - } - else - { - const char* keyName = event.keyPressedName.c_str(); - if( strcmp(keyName, "Left") == 0 ) - { - mScale /= 1.1f; - for( unsigned int i=0; i<4u; i++) - { - mSvgActor[i].SetSize( mActorSize * mScale); - } - } - else if( strcmp(keyName, "Right") == 0 ) - { - if( mScale < MAX_SCALE ) - { - mScale *= 1.1f; - } - for( unsigned int i=0; i<4u; i++) - { - mSvgActor[i].SetSize( mActorSize * mScale); - } - } - } - } - } + void OnKeyEvent(const KeyEvent& event) + { + if(event.GetState() == KeyEvent::DOWN) + { + if(IsKey(event, Dali::DALI_KEY_ESCAPE) || IsKey(event, Dali::DALI_KEY_BACK)) + { + mApplication.Quit(); + } + else + { + const char* keyName = event.GetKeyName().c_str(); + if(strcmp(keyName, "Left") == 0) + { + if(mScale > MIN_SCALE) + { + mScale /= 1.1f; + } + for(unsigned int i = 0; i < NUM_IMAGES_DISPLAYED; i++) + { + mSvgActor[i].SetProperty(Actor::Property::SIZE, mActorSize * mScale); + } + } + else if(strcmp(keyName, "Right") == 0) + { + if(mScale < MAX_SCALE) + { + mScale *= 1.1f; + } + for(unsigned int i = 0; i < NUM_IMAGES_DISPLAYED; i++) + { + mSvgActor[i].SetProperty(Actor::Property::SIZE, mActorSize * mScale); + } + } + } + } + } private: Application& mApplication; - Actor mStageBackground; + Actor mWindowBackground; PanGestureDetector mPanGestureDetector; PinchGestureDetector mPinchGestureDetector; - Toolkit::ImageView mSvgActor[4]; - Vector2 mActorSize; - float mScale; - float mScaleAtPinchStart; - unsigned int mIndex; + Toolkit::ImageView mSvgActor[4]; + Vector2 mActorSize; + float mScale; + unsigned int mIndex; }; -void RunTest( Application& application ) +int DALI_EXPORT_API main(int argc, char** argv) { - ImageSvgController test( application ); - + Application application = Application::New(&argc, &argv); + 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 ); - return 0; }