mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-06-29 11:02:14 +01:00
Adding the UI to the same repo. Made some default theme progress
This commit is contained in:
parent
d8c01ded6e
commit
119dfc3ac7
368
MediaBrowser.UI/MainWindow.xaml.cs
Normal file
368
MediaBrowser.UI/MainWindow.xaml.cs
Normal file
@@ -0,0 +1,368 @@
|
||||
using MediaBrowser.Model.DTO;
|
||||
using MediaBrowser.UI.Controller;
|
||||
using MediaBrowser.UI.Controls;
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media.Animation;
|
||||
using System.Windows.Media.Imaging;
|
||||
|
||||
namespace MediaBrowser.UI
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for MainWindow.xaml
|
||||
/// </summary>
|
||||
public partial class MainWindow : Window, INotifyPropertyChanged
|
||||
{
|
||||
private Timer MouseIdleTimer { get; set; }
|
||||
private Timer BackdropTimer { get; set; }
|
||||
private Image BackdropImage { get; set; }
|
||||
private string[] CurrentBackdrops { get; set; }
|
||||
private int CurrentBackdropIndex { get; set; }
|
||||
|
||||
public MainWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
BackButton.Click += BtnApplicationBackClick;
|
||||
ExitButton.Click += ExitButtonClick;
|
||||
ForwardButton.Click += ForwardButtonClick;
|
||||
DragBar.MouseDown += DragableGridMouseDown;
|
||||
Loaded += MainWindowLoaded;
|
||||
}
|
||||
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
|
||||
public void OnPropertyChanged(String info)
|
||||
{
|
||||
if (PropertyChanged != null)
|
||||
{
|
||||
PropertyChanged(this, new PropertyChangedEventArgs(info));
|
||||
}
|
||||
}
|
||||
|
||||
private bool _isMouseIdle = true;
|
||||
public bool IsMouseIdle
|
||||
{
|
||||
get { return _isMouseIdle; }
|
||||
set
|
||||
{
|
||||
_isMouseIdle = value;
|
||||
OnPropertyChanged("IsMouseIdle");
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindowLoaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
DataContext = App.Instance;
|
||||
|
||||
if (App.Instance.ServerConfiguration == null)
|
||||
{
|
||||
App.Instance.PropertyChanged += ApplicationPropertyChanged;
|
||||
}
|
||||
else
|
||||
{
|
||||
LoadInitialPage();
|
||||
}
|
||||
}
|
||||
|
||||
void ForwardButtonClick(object sender, RoutedEventArgs e)
|
||||
{
|
||||
NavigateForward();
|
||||
}
|
||||
|
||||
void ExitButtonClick(object sender, RoutedEventArgs e)
|
||||
{
|
||||
Close();
|
||||
}
|
||||
|
||||
void ApplicationPropertyChanged(object sender, PropertyChangedEventArgs e)
|
||||
{
|
||||
if (e.PropertyName.Equals("ServerConfiguration"))
|
||||
{
|
||||
App.Instance.PropertyChanged -= ApplicationPropertyChanged;
|
||||
LoadInitialPage();
|
||||
}
|
||||
}
|
||||
|
||||
private async void LoadInitialPage()
|
||||
{
|
||||
await App.Instance.LogoutUser().ConfigureAwait(false);
|
||||
}
|
||||
|
||||
private void DragableGridMouseDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
if (e.ClickCount == 2)
|
||||
{
|
||||
WindowState = WindowState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized;
|
||||
}
|
||||
else if (e.LeftButton == MouseButtonState.Pressed)
|
||||
{
|
||||
DragMove();
|
||||
}
|
||||
}
|
||||
|
||||
void BtnApplicationBackClick(object sender, RoutedEventArgs e)
|
||||
{
|
||||
NavigateBack();
|
||||
}
|
||||
|
||||
private Frame PageFrame
|
||||
{
|
||||
get
|
||||
{
|
||||
// Finding the grid that is generated by the ControlTemplate of the Button
|
||||
return TreeHelper.FindChild<Frame>(PageContent, "PageFrame");
|
||||
}
|
||||
}
|
||||
|
||||
public void Navigate(Uri uri)
|
||||
{
|
||||
PageFrame.Navigate(uri);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the backdrop based on an ApiBaseItemWrapper
|
||||
/// </summary>
|
||||
public void SetBackdrops(DtoBaseItem item)
|
||||
{
|
||||
SetBackdrops(UIKernel.Instance.ApiClient.GetBackdropImageUrls(item, null, null, 1920, 1080));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the backdrop based on a list of image files
|
||||
/// </summary>
|
||||
public async void SetBackdrops(string[] backdrops)
|
||||
{
|
||||
// Don't reload the same backdrops
|
||||
if (CurrentBackdrops != null && backdrops.SequenceEqual(CurrentBackdrops))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (BackdropTimer != null)
|
||||
{
|
||||
BackdropTimer.Dispose();
|
||||
}
|
||||
|
||||
BackdropGrid.Children.Clear();
|
||||
|
||||
if (backdrops.Length == 0)
|
||||
{
|
||||
CurrentBackdrops = null;
|
||||
return;
|
||||
}
|
||||
|
||||
CurrentBackdropIndex = GetFirstBackdropIndex();
|
||||
|
||||
Image image = await App.Instance.GetImage(backdrops.ElementAt(CurrentBackdropIndex));
|
||||
image.SetResourceReference(Image.StyleProperty, "BackdropImage");
|
||||
|
||||
BackdropGrid.Children.Add(image);
|
||||
|
||||
CurrentBackdrops = backdrops;
|
||||
BackdropImage = image;
|
||||
|
||||
const int backdropRotationTime = 7000;
|
||||
|
||||
if (backdrops.Count() > 1)
|
||||
{
|
||||
BackdropTimer = new Timer(BackdropTimerCallback, null, backdropRotationTime, backdropRotationTime);
|
||||
}
|
||||
}
|
||||
|
||||
public void ClearBackdrops()
|
||||
{
|
||||
if (BackdropTimer != null)
|
||||
{
|
||||
BackdropTimer.Dispose();
|
||||
}
|
||||
|
||||
BackdropGrid.Children.Clear();
|
||||
|
||||
CurrentBackdrops = null;
|
||||
}
|
||||
|
||||
private void BackdropTimerCallback(object stateInfo)
|
||||
{
|
||||
// Need to do this on the UI thread
|
||||
Application.Current.Dispatcher.InvokeAsync(() =>
|
||||
{
|
||||
var animFadeOut = new Storyboard();
|
||||
animFadeOut.Completed += AnimFadeOutCompleted;
|
||||
|
||||
var fadeOut = new DoubleAnimation();
|
||||
fadeOut.From = 1.0;
|
||||
fadeOut.To = 0.5;
|
||||
fadeOut.Duration = new Duration(TimeSpan.FromSeconds(1));
|
||||
|
||||
animFadeOut.Children.Add(fadeOut);
|
||||
Storyboard.SetTarget(fadeOut, BackdropImage);
|
||||
Storyboard.SetTargetProperty(fadeOut, new PropertyPath(Image.OpacityProperty));
|
||||
|
||||
animFadeOut.Begin(this);
|
||||
});
|
||||
}
|
||||
|
||||
async void AnimFadeOutCompleted(object sender, System.EventArgs e)
|
||||
{
|
||||
if (CurrentBackdrops == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int backdropIndex = GetNextBackdropIndex();
|
||||
|
||||
BitmapImage image = await App.Instance.GetBitmapImage(CurrentBackdrops[backdropIndex]);
|
||||
CurrentBackdropIndex = backdropIndex;
|
||||
|
||||
// Need to do this on the UI thread
|
||||
BackdropImage.Source = image;
|
||||
Storyboard imageFadeIn = new Storyboard();
|
||||
|
||||
DoubleAnimation fadeIn = new DoubleAnimation();
|
||||
|
||||
fadeIn.From = 0.25;
|
||||
fadeIn.To = 1.0;
|
||||
fadeIn.Duration = new Duration(TimeSpan.FromSeconds(1));
|
||||
|
||||
imageFadeIn.Children.Add(fadeIn);
|
||||
Storyboard.SetTarget(fadeIn, BackdropImage);
|
||||
Storyboard.SetTargetProperty(fadeIn, new PropertyPath(Image.OpacityProperty));
|
||||
imageFadeIn.Begin(this);
|
||||
}
|
||||
|
||||
private int GetFirstBackdropIndex()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
private int GetNextBackdropIndex()
|
||||
{
|
||||
if (CurrentBackdropIndex < CurrentBackdrops.Length - 1)
|
||||
{
|
||||
return CurrentBackdropIndex + 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void NavigateBack()
|
||||
{
|
||||
if (PageFrame.NavigationService.CanGoBack)
|
||||
{
|
||||
PageFrame.NavigationService.GoBack();
|
||||
}
|
||||
}
|
||||
|
||||
public void NavigateForward()
|
||||
{
|
||||
if (PageFrame.NavigationService.CanGoForward)
|
||||
{
|
||||
PageFrame.NavigationService.GoForward();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Shows the control bar then starts a timer to hide it
|
||||
/// </summary>
|
||||
private void StartMouseIdleTimer()
|
||||
{
|
||||
IsMouseIdle = false;
|
||||
|
||||
const int duration = 10000;
|
||||
|
||||
// Start the timer if it's null, otherwise reset it
|
||||
if (MouseIdleTimer == null)
|
||||
{
|
||||
MouseIdleTimer = new Timer(MouseIdleTimerCallback, null, duration, Timeout.Infinite);
|
||||
}
|
||||
else
|
||||
{
|
||||
MouseIdleTimer.Change(duration, Timeout.Infinite);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This is the Timer callback method to hide the control bar
|
||||
/// </summary>
|
||||
private void MouseIdleTimerCallback(object stateInfo)
|
||||
{
|
||||
IsMouseIdle = true;
|
||||
|
||||
if (MouseIdleTimer != null)
|
||||
{
|
||||
MouseIdleTimer.Dispose();
|
||||
MouseIdleTimer = null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handles OnMouseMove to show the control box
|
||||
/// </summary>
|
||||
protected override void OnMouseMove(MouseEventArgs e)
|
||||
{
|
||||
base.OnMouseMove(e);
|
||||
|
||||
StartMouseIdleTimer();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handles OnKeyUp to provide keyboard based navigation
|
||||
/// </summary>
|
||||
protected override void OnKeyUp(KeyEventArgs e)
|
||||
{
|
||||
base.OnKeyUp(e);
|
||||
|
||||
if (IsBackPress(e))
|
||||
{
|
||||
NavigateBack();
|
||||
}
|
||||
|
||||
else if (IsForwardPress(e))
|
||||
{
|
||||
NavigateForward();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determines if a keypress should be treated as a backward press
|
||||
/// </summary>
|
||||
private bool IsBackPress(KeyEventArgs e)
|
||||
{
|
||||
if (e.Key == Key.BrowserBack || e.Key == Key.Back)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (e.SystemKey == Key.Left && e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Alt))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determines if a keypress should be treated as a forward press
|
||||
/// </summary>
|
||||
private bool IsForwardPress(KeyEventArgs e)
|
||||
{
|
||||
if (e.Key == Key.BrowserForward)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (e.SystemKey == Key.RightAlt && e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Alt))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user