DALi Version 1.0.26
[platform/core/uifw/dali-toolkit.git] / base / dali-toolkit / internal / controls / scrollable / scroll-view / scroll-view-impl.cpp
index e60962f..0d60503 100644 (file)
@@ -61,8 +61,6 @@ const float FLICK_ORTHO_ANGLE_RANGE = 75.0f;
 const unsigned int MAXIMUM_NUMBER_OF_VALUES = 5;                                          ///< Number of values to use for weighted pan calculation.
 const Vector2 DEFAULT_MOUSE_WHEEL_SCROLL_DISTANCE_STEP_PROPORTION = Vector2(0.17f, 0.1f); ///< The step of horizontal scroll distance in the proportion of stage size for each mouse wheel event received.
 const unsigned long MINIMUM_TIME_BETWEEN_DOWN_AND_UP_FOR_RESET( 150u );
-const float DEFAULT_OVERSHOOT_ANIMATION_DURATION = 0.35f;  // time in seconds
-const Vector2 OVERSCROLL_CLAMP(1.0f, 1.0f);                // maximum overscroll allowed in pixels when overshoot indicator is being used
 const float TOUCH_DOWN_TIMER_INTERVAL = 100.0f;
 const float DEFAULT_SCROLL_UPDATE_DISTANCE( 30.0f );                               ///< Default distance to travel in pixels for scroll update signal
 
@@ -729,6 +727,84 @@ void ScrollView::ApplyEffect(Toolkit::ScrollViewEffect effect)
   GetImpl(effect).Attach(self);
 }
 
+Toolkit::ScrollViewEffect ScrollView::ApplyEffect(Toolkit::ScrollView::PageEffect effect)
+{
+  Toolkit::ScrollViewEffect scrollEffect;
+  switch(effect)
+  {
+    case Toolkit::ScrollView::PageEffectNone:
+    {
+      break;
+    }
+    case Toolkit::ScrollView::PageEffectOuterCube:
+    {
+      Toolkit::ScrollViewCustomEffect customEffect;
+      scrollEffect = customEffect = Toolkit::ScrollViewCustomEffect::New();
+      Vector2 pageSize = Stage::GetCurrent().GetSize();
+      // set the page translation to the slide off distance, also add an extra value to space the pages, having a smaller spacing on translationOut will allow the spacing to reduce over time
+      // the page moving onto screen will start 50.0f further out (1.0f * 50.0f) and the spacing will reduce as its position reaches the centre (0.0f * 50.0f)
+      // the page moving off screen will slowly build a spacing from 0.0f to 20.0f
+      // the spacing from each page is added together for the final spacing between the two pages.
+      customEffect.SetPageTranslation(Vector3(pageSize.x, pageSize.y, 0) + Vector3(50.0f, 50.0f, 0.0f), Vector3(pageSize.x, pageSize.y, 0) + Vector3(20.0f, 20.0f, 0.0f));
+      customEffect.SetSwingAngleOut(ANGLE_CUSTOM_CUBE_SWING.x, Vector3(0.0f, -1.0f, 0.0f));
+      customEffect.SetSwingAnchor(AnchorPoint::CENTER, AnchorPoint::CENTER_LEFT);
+      customEffect.SetOpacityThreshold(0.7f);
+      break;
+    }
+    case Toolkit::ScrollView::PageEffectDepth:
+    {
+      Toolkit::ScrollViewCustomEffect customEffect;
+      scrollEffect = customEffect = Toolkit::ScrollViewCustomEffect::New();
+      break;
+    }
+    case Toolkit::ScrollView::PageEffectInnerCube:
+    {
+      Toolkit::ScrollViewCustomEffect customEffect;
+      scrollEffect = customEffect = Toolkit::ScrollViewCustomEffect::New();
+      customEffect.SetPageSpacing(Vector2(30.0f, 30.0f));
+      customEffect.SetAngledOriginPageRotation(ANGLE_CUBE_PAGE_ROTATE);
+      customEffect.SetSwingAngle(ANGLE_CUBE_PAGE_ROTATE.x, Vector3(0,-1,0));
+      customEffect.SetOpacityThreshold(0.5f);
+      break;
+    }
+    case Toolkit::ScrollView::PageEffectCarousel:
+    {
+      Toolkit::ScrollViewCustomEffect customEffect;
+      scrollEffect = customEffect = Toolkit::ScrollViewCustomEffect::New();
+      customEffect.SetPageTranslation(Vector3(0,0,0), Vector3(-30, 0, 0));
+      customEffect.SetPageSpacing(Vector2(60.0f, 60.0f));
+      customEffect.SetAngledOriginPageRotation(-ANGLE_CUBE_PAGE_ROTATE);
+      customEffect.SetOpacityThreshold(0.2f, 0.6f);
+      break;
+    }
+    case Toolkit::ScrollView::PageEffectSpiral:
+    {
+      Toolkit::ScrollViewCustomEffect customEffect;
+      scrollEffect = customEffect = Toolkit::ScrollViewCustomEffect::New();
+
+      Vector2 pageSize = Stage::GetCurrent().GetSize();
+      customEffect.SetSwingAngle(-ANGLE_SPIRAL_SWING_IN.x, Vector3(0.0f, -1.0f, 0.0f), ANGLE_SPIRAL_SWING_OUT.x, Vector3(0.0f, -1.0f, 0.0f));
+      //customEffect.SetSwingAngleAlphaFunctionOut(AlphaFunctions::EaseOut);
+      customEffect.SetSwingAnchor(AnchorPoint::CENTER_RIGHT);
+      customEffect.SetPageTranslation(Vector3(pageSize.x, pageSize.y, 0) + Vector3(100.0f, 100.0f, 0.0f), Vector3(pageSize.x, pageSize.y, -pageSize.y * 2.0f) * 0.33f);
+      //customEffect.SetPageTranslateAlphaFunctionOut(AlphaFunctions::EaseOut);
+      customEffect.SetOpacityThreshold(0.75f, 0.6f);
+      customEffect.SetOpacityAlphaFunctionIn(AlphaFunctions::EaseInOut);
+      break;
+    }
+    default:
+    {
+      DALI_ASSERT_DEBUG(0 && "unknown scroll view effect");
+    }
+  }
+  RemoveConstraintsFromChildren();
+  if(scrollEffect)
+  {
+    ApplyEffect(scrollEffect);
+  }
+  return scrollEffect;
+}
+
 void ScrollView::RemoveEffect(Toolkit::ScrollViewEffect effect)
 {
   Dali::Toolkit::ScrollView self = Dali::Toolkit::ScrollView::DownCast(Self());
@@ -1230,7 +1306,7 @@ void ScrollView::ScrollTo(const Vector3& position, float duration,
 void ScrollView::ScrollTo(const Vector3& position, float duration, AlphaFunction alpha,
                 DirectionBias horizontalBias, DirectionBias verticalBias)
 {
-  DALI_LOG_SCROLL_STATE("[0x%X] position[%.2f, %.2f] duration[%.2f]", this, position.x, position.y, duration, int(horizontalBias), int(verticalBias));
+  DALI_LOG_SCROLL_STATE("[0x%X] position[%.2f, %.2f] duration[%.2f], bias[%d, %d]", this, position.x, position.y, duration, int(horizontalBias), int(verticalBias));
   TransformTo(position, duration, alpha, horizontalBias, verticalBias);
 }
 
@@ -1580,7 +1656,12 @@ bool ScrollView::SnapWithVelocity(Vector2 velocity)
       }
     }
   }
-  positionSnap += clampDelta;
+
+  if(IsScrollComponentEnabled(Toolkit::Scrollable::OvershootIndicator))
+  {
+    // Scroll to the end of the overshoot only when overshoot is enabled.
+    positionSnap += clampDelta;
+  }
 
   bool animating = AnimateTo(positionSnap, positionDuration,
                              alphaFunction, false,
@@ -1698,7 +1779,6 @@ void ScrollView::SetOvershootEnabled(bool enabled)
   }
   if( enabled )
   {
-    mMaxOvershoot = OVERSCROLL_CLAMP;
     mOvershootIndicator->AttachToScrollable(*this);
   }
   else