effects-view-example.cpp 9.1 KB
//
// Copyright (c) 2016 Samsung Electronics Co., Ltd.
//
// Licensed under the Flora License, Version 1.0 (the License);
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://floralicense.org/license/
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an AS IS BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

// EXTERNAL INCLUDES

// INTERNAL INCLUDES
#include "shared/view.h"

#include <dali/dali.h>
#include <dali-toolkit/dali-toolkit.h>
#include <dali-toolkit/devel-api/controls/effects-view/effects-view.h>
#include <sstream>

using namespace Dali;
using namespace Dali::Toolkit;

namespace
{
const char* const TITLE( "EffectsView: effect size = " );
const char* TOOLBAR_IMAGE( DEMO_IMAGE_DIR "top-bar.png" );
const char* VIEW_SWAP_IMAGE( DEMO_IMAGE_DIR "icon-change.png" );
const char* VIEW_SWAP_SELECTED_IMAGE( DEMO_IMAGE_DIR "icon-change-selected.png" );
const char* TEST_IMAGE( DEMO_IMAGE_DIR "Kid1.svg" );
} // namespace

// This example illustrates the capabilities of the EffectsView container
//
class EffectsViewApp : public ConnectionTracker
{
public:

  /**
   * Constructor
   */
  EffectsViewApp( Application& application );
  /**
   * Destructor
   */
  ~EffectsViewApp();

private:

  /**
   * Initialisation. This method gets called once the main loop of application is up and running
   */
  void OnAppInitialize( Application& application );

  /**
   * Create a effect view of drop shadow
   *
   * @param[in] type The type of effect to be performed by the EffectView.
   * @param[in] viewSize Size of the effect view
   * @param[in] effectSize The effect size used in image filters.
   */
  EffectsView CreateEffectsView( EffectsView::EffectType type, const Vector2& viewSize, int effectSize );

  /**
   * Animate the effect offset and color properties.
   * @param[in] effectsView The view whose properties to be animated.
   */
  void AnimateEffectProperties( EffectsView& effectsView );

  /**
   * Set title onto the toolbar
   * @param[in] effectSize The effect size value to be indicated on the title
   */
  void SetTitle(int effectSize);

  /**
   * Callback function to change the effect size.
   * @param[in] button The button which triggered the callback.
   */
  bool ChangeEffectSize( Button button );

  /**
   * Main key event handler
   */
  void OnKeyEvent(const KeyEvent& event);

private:
  Application&           mApplication;
  Layer                  mContents;
  Toolkit::Control       mView;
  Toolkit::ToolBar       mToolBar;
  EffectsView            mDropShadowView;
  EffectsView            mEmbossView;
  Toolkit::TextLabel     mTitleActor; ///< The title on the toolbar
  Vector2                mStageSize;
  int                    mEffectSize;
};

EffectsViewApp::EffectsViewApp( Application& application )
: mApplication( application ),
  mEffectSize( 2 )
{
  // Connect to the Application's Init signal
  mApplication.InitSignal().Connect( this, &EffectsViewApp::OnAppInitialize );
}

EffectsViewApp::~EffectsViewApp()
{
  // Nothing to do here;
}

void EffectsViewApp::OnAppInitialize( Application& application )
{
  // The Init signal is received once (only) during the Application lifetime

  Stage stage = Stage::GetCurrent();
  stage.KeyEventSignal().Connect(this, &EffectsViewApp::OnKeyEvent);
  stage.SetBackgroundColor( Color::WHITE );

  mStageSize = stage.GetSize();

  // Creates a default view with a default tool bar.
  // The view is added to the stage.
  mContents = DemoHelper::CreateView( application, mView, mToolBar, "", TOOLBAR_IMAGE, "" );

  // Creates view change button.
  Toolkit::PushButton viewButton = Toolkit::PushButton::New();
  viewButton.SetUnselectedImage( VIEW_SWAP_IMAGE );
  viewButton.SetSelectedImage( VIEW_SWAP_SELECTED_IMAGE );
  // Connects the view change button clicked signal to the OnView method.
  viewButton.ClickedSignal().Connect( this, &EffectsViewApp::ChangeEffectSize );
  mToolBar.AddControl( viewButton, DemoHelper::DEFAULT_VIEW_STYLE.mToolBarButtonPercentage, Toolkit::Alignment::HorizontalRight, DemoHelper::DEFAULT_MODE_SWITCH_PADDING  );

  Vector2 effectsViewSize( mStageSize.width, mStageSize.height * 0.25f );
  mDropShadowView = CreateEffectsView( EffectsView::DROP_SHADOW, effectsViewSize, mEffectSize );
  mDropShadowView.SetParentOrigin( ParentOrigin::CENTER );
  mDropShadowView.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
  mDropShadowView.SetZ( -mStageSize.height * 0.1f );
  mContents.Add( mDropShadowView );

  mEmbossView = CreateEffectsView( EffectsView::EMBOSS, effectsViewSize, mEffectSize );
  mEmbossView.SetParentOrigin( ParentOrigin::CENTER );
  mEmbossView.SetAnchorPoint( AnchorPoint::TOP_CENTER );
  mEmbossView.SetZ( mStageSize.height * 0.1f );
  mContents.Add( mEmbossView );

  SetTitle( mEffectSize );
}


EffectsView EffectsViewApp::CreateEffectsView( EffectsView::EffectType type, const Vector2& viewSize, int effectSize  )
{
  Toolkit::EffectsView effectsView = Toolkit::EffectsView::New(type);
  // set control size
   effectsView.SetSize( viewSize.width, viewSize.height );
  // set effect size property
  effectsView.SetProperty( EffectsView::Property::EFFECT_SIZE, effectSize );

  // Create some content
  // text
  std::string text = ( type == EffectsView::DROP_SHADOW) ? "Drop Shadow" : "Emboss";
  TextLabel textActor( TextLabel::New( text ) );
  textActor.SetParentOrigin( ParentOrigin::CENTER_LEFT );
  textActor.SetAnchorPoint( AnchorPoint::CENTER_LEFT );
  textActor.SetSize( viewSize );
  textActor.SetPosition( viewSize.width*0.4f, viewSize.height*0.3f );
  textActor.SetProperty(  TextLabel::Property::POINT_SIZE, DemoHelper::ScalePointSize(14.f) );
  effectsView.Add( textActor );

  // image
  ImageView icon = ImageView::New( TEST_IMAGE );
  icon.SetParentOrigin( ParentOrigin::CENTER_LEFT );
  icon.SetAnchorPoint( AnchorPoint::CENTER_LEFT );
  icon.SetX( viewSize.width*0.1f );
  icon.SetSize( viewSize.height*0.8f, viewSize.height*0.8f );
  effectsView.Add( icon );

  AnimateEffectProperties( effectsView );

  return effectsView;
}

void EffectsViewApp::AnimateEffectProperties( EffectsView& effectsView )
{
  const float animationTime( 5.0f );
  Animation animation( Animation::New(animationTime) );

  animation.AnimateTo( Property( effectsView, EffectsView::Property::EFFECT_OFFSET ), Vector3( 2.f,-2.f, 0.0f), TimePeriod(animationTime * 0.0f, animationTime * 0.2f) );
  animation.AnimateTo( Property( effectsView, EffectsView::Property::EFFECT_OFFSET ), Vector3(-2.f,-2.f, 0.0f), TimePeriod(animationTime * 0.2f, animationTime * 0.2f) );
  animation.AnimateTo( Property( effectsView, EffectsView::Property::EFFECT_OFFSET ), Vector3(-2.f, 2.f, 0.0f), TimePeriod(animationTime * 0.4f, animationTime * 0.2f) );
  animation.AnimateTo( Property( effectsView, EffectsView::Property::EFFECT_OFFSET ), Vector3( 4.f, 4.f, 0.0f), TimePeriod(animationTime * 0.6f, animationTime * 0.2f) );
  animation.AnimateTo( Property( effectsView, EffectsView::Property::EFFECT_OFFSET ), Vector3::ZERO, TimePeriod(animationTime * 0.8f, animationTime * 0.2f) );

  effectsView.SetProperty( EffectsView::Property::EFFECT_COLOR, Color::BLACK );
  animation.AnimateTo( Property( effectsView, EffectsView::Property::EFFECT_COLOR ), Color::BLUE, TimePeriod(animationTime * 0.0f, animationTime * 0.33f) );
  animation.AnimateTo( Property( effectsView, EffectsView::Property::EFFECT_COLOR ), Color::RED, TimePeriod(animationTime * 0.33f, animationTime * 0.33f) );
  animation.AnimateTo( Property( effectsView, EffectsView::Property::EFFECT_COLOR ), Color::BLACK, TimePeriod(animationTime * 0.66f, animationTime * 0.34f));

  animation.SetLooping( true );
  animation.Play();
}

void EffectsViewApp::SetTitle(int effectSize)
{
  std::ostringstream title;
  title<<TITLE<< effectSize;

  if(!mTitleActor)
  {
    mTitleActor = DemoHelper::CreateToolBarLabel( title.str() );
    // Add title to the tool bar.
    mToolBar.AddControl( mTitleActor, DemoHelper::DEFAULT_VIEW_STYLE.mToolBarTitlePercentage, Toolkit::Alignment::HorizontalCenter );
  }
  mTitleActor.SetProperty( Toolkit::TextLabel::Property::TEXT, title.str() );
}

bool EffectsViewApp::ChangeEffectSize( Button button )
{
  mEffectSize = ( mEffectSize+1 )%5;
  mDropShadowView.SetProperty( EffectsView::Property::EFFECT_SIZE, mEffectSize );
  mEmbossView.SetProperty( EffectsView::Property::EFFECT_SIZE, mEffectSize );
  SetTitle( mEffectSize );

  return true;
}


void EffectsViewApp::OnKeyEvent(const KeyEvent& event)
{
  if(event.state == KeyEvent::Down)
  {
    if( IsKey( event, Dali::DALI_KEY_ESCAPE) || IsKey( event, Dali::DALI_KEY_BACK) )
    {
      mApplication.Quit();
    }
  }
}

/*****************************************************************************/

static void RunTest( Application& application )
{
  EffectsViewApp test( application );

  application.MainLoop();
}

/*****************************************************************************/

int main(int argc, char **argv)
{
  Application application = Application::New(&argc, &argv, DEMO_THEME_PATH);

  RunTest(application);

  return 0;
}