jellyfin/MediaBrowser.ServerApplication/Controls/ItemUpdateNotification.xaml.cs

256 lines
7.8 KiB
C#

using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace MediaBrowser.ServerApplication.Controls
{
/// <summary>
/// Interaction logic for ItemUpdateNotification.xaml
/// </summary>
public partial class ItemUpdateNotification : UserControl
{
/// <summary>
/// The logger
/// </summary>
private readonly ILogger Logger;
/// <summary>
/// Gets the children changed event args.
/// </summary>
/// <value>The children changed event args.</value>
private BaseItem Item
{
get { return DataContext as BaseItem; }
}
/// <summary>
/// Initializes a new instance of the <see cref="ItemUpdateNotification" /> class.
/// </summary>
public ItemUpdateNotification(ILogger logger)
{
if (logger == null)
{
throw new ArgumentNullException("logger");
}
Logger = logger;
InitializeComponent();
Loaded += ItemUpdateNotification_Loaded;
}
/// <summary>
/// Handles the Loaded event of the ItemUpdateNotification control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="RoutedEventArgs" /> instance containing the event data.</param>
void ItemUpdateNotification_Loaded(object sender, RoutedEventArgs e)
{
DisplayItem(Item);
}
/// <summary>
/// Gets the display name.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="includeParentName">if set to <c>true</c> [include parent name].</param>
/// <returns>System.String.</returns>
internal static string GetDisplayName(BaseItem item, bool includeParentName)
{
var name = item.Name;
if (item.ProductionYear.HasValue && !(item is Episode))
{
name += string.Format(" ({0})", item.ProductionYear);
}
var episode = item as Episode;
if (episode != null)
{
var indexNumbers = new List<int>();
if (episode.Season.IndexNumber.HasValue)
{
indexNumbers.Add(episode.Season.IndexNumber.Value);
}
if (episode.IndexNumber.HasValue)
{
indexNumbers.Add(episode.IndexNumber.Value);
}
var indexNumber = string.Join(".", indexNumbers.ToArray());
name = string.Format("{0} - {1}", indexNumber, name);
if (includeParentName)
{
name = episode.Series.Name + " - " + name;
}
}
if (includeParentName)
{
var season = item as Season;
if (season != null)
{
name = season.Series.Name + " - " + name;
}
}
return name;
}
/// <summary>
/// Displays the parent title.
/// </summary>
/// <param name="item">The item.</param>
private void DisplayParentTitle(BaseItem item)
{
if (!(item is Episode || item is Season))
{
txtParentName.Visibility = Visibility.Collapsed;
imgParentLogo.Visibility = Visibility.Collapsed;
return;
}
var series = item is Episode ? (item as Episode).Series : (item as Season).Series;
var logo = series.GetImage(ImageType.Logo);
if (string.IsNullOrEmpty(logo))
{
imgParentLogo.Visibility = Visibility.Collapsed;
txtParentName.Visibility = Visibility.Visible;
}
else
{
imgParentLogo.Visibility = Visibility.Visible;
txtParentName.Visibility = Visibility.Collapsed;
imgParentLogo.Source = App.Instance.GetBitmapImage(logo);
}
txtParentName.Text = series.Name;
}
/// <summary>
/// Displays the title.
/// </summary>
/// <param name="item">The item.</param>
private void DisplayTitle(BaseItem item)
{
txtName.Text = GetDisplayName(item, false);
}
/// <summary>
/// Displays the item.
/// </summary>
/// <param name="item">The item.</param>
private void DisplayItem(BaseItem item)
{
DisplayParentTitle(item);
DisplayTitle(item);
DisplayRating(item);
var path = MultiItemUpdateNotification.GetImagePath(item);
if (string.IsNullOrEmpty(path))
{
img.Visibility = Visibility.Collapsed;
}
else
{
img.Visibility = Visibility.Visible;
try
{
img.Source = App.Instance.GetBitmapImage(path);
}
catch (FileNotFoundException)
{
Logger.Error("Image file not found {0}", path);
}
}
if (string.IsNullOrEmpty(item.Overview))
{
txtOverview.Visibility = Visibility.Collapsed;
}
else
{
txtOverview.Visibility = Visibility.Visible;
txtOverview.Text = item.Overview;
}
if (item.Taglines == null || item.Taglines.Count == 0)
{
txtTagline.Visibility = Visibility.Collapsed;
}
else
{
txtTagline.Visibility = Visibility.Visible;
txtTagline.Text = item.Taglines[0];
}
if (!item.PremiereDate.HasValue)
{
txtPremeireDate.Visibility = Visibility.Collapsed;
}
else
{
txtPremeireDate.Visibility = Visibility.Visible;
txtPremeireDate.Text = "Premiered " + item.PremiereDate.Value.ToShortDateString();
}
}
/// <summary>
/// Displays the rating.
/// </summary>
/// <param name="item">The item.</param>
private void DisplayRating(BaseItem item)
{
if (!item.CommunityRating.HasValue)
{
pnlRating.Visibility = Visibility.Collapsed;
return;
}
pnlRating.Children.Clear();
pnlRating.Visibility = Visibility.Visible;
var rating = item.CommunityRating.Value;
for (var i = 0; i < 10; i++)
{
Image image;
if (rating < i - 1)
{
image = App.Instance.GetImage(new Uri("../Resources/Images/starEmpty.png", UriKind.Relative));
}
else if (rating < i)
{
image = App.Instance.GetImage(new Uri("../Resources/Images/starHalf.png", UriKind.Relative));
}
else
{
image = App.Instance.GetImage(new Uri("../Resources/Images/starFull.png", UriKind.Relative));
}
RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.Fant);
image.Stretch = Stretch.Uniform;
image.Height = 16;
pnlRating.Children.Add(image);
}
}
}
}