diff options
Diffstat (limited to 'MediaBrowser.UI/MainWindow.xaml.cs')
| -rw-r--r-- | MediaBrowser.UI/MainWindow.xaml.cs | 368 |
1 files changed, 368 insertions, 0 deletions
diff --git a/MediaBrowser.UI/MainWindow.xaml.cs b/MediaBrowser.UI/MainWindow.xaml.cs new file mode 100644 index 000000000..07e8e9433 --- /dev/null +++ b/MediaBrowser.UI/MainWindow.xaml.cs @@ -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;
+ }
+ }
+}
|
