mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-07-10 16:23:06 +01:00
Pushing missing changes
This commit is contained in:
194
MediaBrowser.UI.Controls/TransitionFrame.cs
Normal file
194
MediaBrowser.UI.Controls/TransitionFrame.cs
Normal file
@@ -0,0 +1,194 @@
|
||||
using Microsoft.Expression.Media.Effects;
|
||||
using System;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Animation;
|
||||
|
||||
namespace MediaBrowser.UI.Controls
|
||||
{
|
||||
/// <summary>
|
||||
/// Class TransitionFrame
|
||||
/// </summary>
|
||||
public class TransitionFrame : Frame
|
||||
{
|
||||
/// <summary>
|
||||
/// The _content presenter
|
||||
/// </summary>
|
||||
private ContentPresenter _contentPresenter = null;
|
||||
|
||||
#region DP TransitionType
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the type of the transition.
|
||||
/// </summary>
|
||||
/// <value>The type of the transition.</value>
|
||||
public TransitionEffect TransitionType
|
||||
{
|
||||
get { return (TransitionEffect)GetValue(TransitionTypeProperty); }
|
||||
set { SetValue(TransitionTypeProperty, value); }
|
||||
}
|
||||
|
||||
// Using a DependencyProperty as the backing store for TransitionType. This enables animation, styling, binding, etc...
|
||||
/// <summary>
|
||||
/// The transition type property
|
||||
/// </summary>
|
||||
public static readonly DependencyProperty TransitionTypeProperty =
|
||||
DependencyProperty.Register("TransitionType", typeof(TransitionEffect), typeof(TransitionFrame),
|
||||
new UIPropertyMetadata(new BlindsTransitionEffect()));
|
||||
|
||||
#endregion DP TransitionType
|
||||
|
||||
#region DP Transition Animation
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the transition animation.
|
||||
/// </summary>
|
||||
/// <value>The transition animation.</value>
|
||||
public DoubleAnimation TransitionAnimation
|
||||
{
|
||||
get { return (DoubleAnimation)GetValue(TransitionAnimationProperty); }
|
||||
set { SetValue(TransitionAnimationProperty, value); }
|
||||
}
|
||||
|
||||
// Using a DependencyProperty as the backing store for TransitionAnimation. This enables animation, styling, binding, etc...
|
||||
/// <summary>
|
||||
/// The transition animation property
|
||||
/// </summary>
|
||||
public static readonly DependencyProperty TransitionAnimationProperty =
|
||||
DependencyProperty.Register("TransitionAnimation", typeof(DoubleAnimation), typeof(TransitionFrame), new UIPropertyMetadata(null));
|
||||
|
||||
#endregion DP Transition Animation
|
||||
|
||||
/// <summary>
|
||||
/// Called when the template generation for the visual tree is created.
|
||||
/// </summary>
|
||||
public override void OnApplyTemplate()
|
||||
{
|
||||
// get a reference to the frame's content presenter
|
||||
// this is the element we will fade in and out
|
||||
_contentPresenter = GetTemplateChild("PART_FrameCP") as ContentPresenter;
|
||||
base.OnApplyTemplate();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Animates the content.
|
||||
/// </summary>
|
||||
/// <param name="navigationAction">The navigation action.</param>
|
||||
/// <param name="checkContent">if set to <c>true</c> [check content].</param>
|
||||
/// <param name="isBack">if set to <c>true</c> [is back].</param>
|
||||
private void AnimateContent(Action navigationAction, bool checkContent = true, bool isBack = false)
|
||||
{
|
||||
if (TransitionType == null || (checkContent && Content == null))
|
||||
{
|
||||
CommandBindings.Clear();
|
||||
navigationAction();
|
||||
CommandBindings.Clear();
|
||||
return;
|
||||
}
|
||||
|
||||
var oldContentVisual = this as FrameworkElement;
|
||||
|
||||
_contentPresenter.IsHitTestVisible = false;
|
||||
|
||||
var da = TransitionAnimation.Clone();
|
||||
da.From = 0;
|
||||
da.To = 1;
|
||||
da.FillBehavior = FillBehavior.HoldEnd;
|
||||
|
||||
var transitionEffect = TransitionType.Clone() as TransitionEffect;
|
||||
|
||||
if (isBack)
|
||||
{
|
||||
ReverseDirection(transitionEffect);
|
||||
}
|
||||
|
||||
transitionEffect.OldImage = new VisualBrush(oldContentVisual);
|
||||
transitionEffect.BeginAnimation(TransitionEffect.ProgressProperty, da);
|
||||
|
||||
_contentPresenter.Effect = transitionEffect;
|
||||
_contentPresenter.IsHitTestVisible = true;
|
||||
|
||||
// Remove base class bindings to remote buttons
|
||||
CommandBindings.Clear();
|
||||
|
||||
navigationAction();
|
||||
|
||||
CommandBindings.Clear();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Navigates the with transition.
|
||||
/// </summary>
|
||||
/// <param name="page">The page.</param>
|
||||
public void NavigateWithTransition(Page page)
|
||||
{
|
||||
AnimateContent(() => Navigate(page));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Navigates the with transition.
|
||||
/// </summary>
|
||||
/// <param name="page">The page.</param>
|
||||
public void NavigateWithTransition(Uri page)
|
||||
{
|
||||
AnimateContent(() => Navigate(page));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Goes the back with transition.
|
||||
/// </summary>
|
||||
public void GoBackWithTransition()
|
||||
{
|
||||
if (CanGoBack)
|
||||
{
|
||||
AnimateContent(GoBack, false, true);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Goes the forward with transition.
|
||||
/// </summary>
|
||||
public void GoForwardWithTransition()
|
||||
{
|
||||
if (CanGoForward)
|
||||
{
|
||||
AnimateContent(GoForward, false);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reverses the direction.
|
||||
/// </summary>
|
||||
/// <param name="transitionEffect">The transition effect.</param>
|
||||
private void ReverseDirection(TransitionEffect transitionEffect)
|
||||
{
|
||||
var circleRevealTransitionEffect = transitionEffect as CircleRevealTransitionEffect;
|
||||
|
||||
if (circleRevealTransitionEffect != null)
|
||||
{
|
||||
circleRevealTransitionEffect.Reverse = true;
|
||||
return;
|
||||
}
|
||||
|
||||
var slideInTransitionEffect = transitionEffect as SlideInTransitionEffect;
|
||||
if (slideInTransitionEffect != null)
|
||||
{
|
||||
if (slideInTransitionEffect.SlideDirection == SlideDirection.RightToLeft)
|
||||
{
|
||||
slideInTransitionEffect.SlideDirection = SlideDirection.LeftToRight;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
var wipeTransitionEffect = transitionEffect as WipeTransitionEffect;
|
||||
if (wipeTransitionEffect != null)
|
||||
{
|
||||
if (wipeTransitionEffect.WipeDirection == WipeDirection.RightToLeft)
|
||||
{
|
||||
wipeTransitionEffect.WipeDirection = WipeDirection.LeftToRight;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user