PageRenderTime 54ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 1ms

/JMMClient/JMMClient/UserControls/AnimeSeries.xaml.cs

https://bitbucket.org/gibwar/jmm-test
C# | 1339 lines | 1031 code | 263 blank | 45 comment | 180 complexity | fbd5c6f095f10a26baa257867ed754b5 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using System.Windows.Data;
  8. using System.Windows.Documents;
  9. using System.Windows.Input;
  10. using System.Windows.Media;
  11. using System.Windows.Media.Imaging;
  12. using System.Windows.Navigation;
  13. using System.Windows.Shapes;
  14. using System.ComponentModel;
  15. using NLog;
  16. using JMMClient.ViewModel;
  17. using System.Diagnostics;
  18. using JMMClient.Forms;
  19. namespace JMMClient.UserControls
  20. {
  21. /// <summary>
  22. /// Interaction logic for AnimeSeries.xaml
  23. /// </summary>
  24. public partial class AnimeSeries : UserControl
  25. {
  26. private static Logger logger = LogManager.GetCurrentClassLogger();
  27. private ContextMenu playlistMenu;
  28. public static readonly DependencyProperty AllPostersProperty = DependencyProperty.Register("AllPosters",
  29. typeof(List<PosterContainer>), typeof(AnimeSeries), new UIPropertyMetadata(null, null));
  30. public List<PosterContainer> AllPosters
  31. {
  32. get { return (List<PosterContainer>)GetValue(AllPostersProperty); }
  33. set { SetValue(AllPostersProperty, value); }
  34. }
  35. public static readonly DependencyProperty AllFanartsProperty = DependencyProperty.Register("AllFanarts",
  36. typeof(List<FanartContainer>), typeof(AnimeSeries), new UIPropertyMetadata(null, null));
  37. public List<FanartContainer> AllFanarts
  38. {
  39. get { return (List<FanartContainer>)GetValue(AllFanartsProperty); }
  40. set { SetValue(AllFanartsProperty, value); }
  41. }
  42. public static readonly DependencyProperty SeriesTvDBWideBannersProperty = DependencyProperty.Register("SeriesTvDBWideBanners",
  43. typeof(List<TvDB_ImageWideBannerVM>), typeof(AnimeSeries), new UIPropertyMetadata(null, null));
  44. public List<TvDB_ImageWideBannerVM> SeriesTvDBWideBanners
  45. {
  46. get { return (List<TvDB_ImageWideBannerVM>)GetValue(SeriesTvDBWideBannersProperty); }
  47. set { SetValue(SeriesTvDBWideBannersProperty, value); }
  48. }
  49. public static readonly DependencyProperty ImageListBoxWidthProperty = DependencyProperty.Register("ImageListBoxWidth",
  50. typeof(double), typeof(AnimeSeries), new UIPropertyMetadata((double)300, null));
  51. public double ImageListBoxWidth
  52. {
  53. get { return (double)GetValue(ImageListBoxWidthProperty); }
  54. set { SetValue(ImageListBoxWidthProperty, value); }
  55. }
  56. public static readonly DependencyProperty ImageListBoxWidthFullProperty = DependencyProperty.Register("ImageListBoxWidthFull",
  57. typeof(double), typeof(AnimeSeries), new UIPropertyMetadata((double)300, null));
  58. public double ImageListBoxWidthFull
  59. {
  60. get { return (double)GetValue(ImageListBoxWidthFullProperty); }
  61. set { SetValue(ImageListBoxWidthFullProperty, value); }
  62. }
  63. public static readonly DependencyProperty SeriesPos_TvDBLinksProperty = DependencyProperty.Register("SeriesPos_TvDBLinks",
  64. typeof(int), typeof(AnimeSeries), new UIPropertyMetadata((int)6, null));
  65. public int SeriesPos_TvDBLinks
  66. {
  67. get { return (int)GetValue(SeriesPos_TvDBLinksProperty); }
  68. set { SetValue(SeriesPos_TvDBLinksProperty, value); }
  69. }
  70. public static readonly DependencyProperty SeriesPos_PlayNextEpisodeProperty = DependencyProperty.Register("SeriesPos_PlayNextEpisode",
  71. typeof(int), typeof(AnimeSeries), new UIPropertyMetadata((int)6, null));
  72. public int SeriesPos_PlayNextEpisode
  73. {
  74. get { return (int)GetValue(SeriesPos_PlayNextEpisodeProperty); }
  75. set { SetValue(SeriesPos_PlayNextEpisodeProperty, value); }
  76. }
  77. public static readonly DependencyProperty SeriesPos_FileSummaryProperty = DependencyProperty.Register("SeriesPos_FileSummary",
  78. typeof(int), typeof(AnimeSeries), new UIPropertyMetadata((int)6, null));
  79. public int SeriesPos_FileSummary
  80. {
  81. get { return (int)GetValue(SeriesPos_FileSummaryProperty); }
  82. set { SetValue(SeriesPos_FileSummaryProperty, value); }
  83. }
  84. public static readonly DependencyProperty SeriesPos_CategoriesProperty = DependencyProperty.Register("SeriesPos_Categories",
  85. typeof(int), typeof(AnimeSeries), new UIPropertyMetadata((int)6, null));
  86. public int SeriesPos_Categories
  87. {
  88. get { return (int)GetValue(SeriesPos_CategoriesProperty); }
  89. set { SetValue(SeriesPos_CategoriesProperty, value); }
  90. }
  91. public static readonly DependencyProperty SeriesPos_TitlesProperty = DependencyProperty.Register("SeriesPos_Titles",
  92. typeof(int), typeof(AnimeSeries), new UIPropertyMetadata((int)6, null));
  93. public int SeriesPos_Titles
  94. {
  95. get { return (int)GetValue(SeriesPos_TitlesProperty); }
  96. set { SetValue(SeriesPos_TitlesProperty, value); }
  97. }
  98. public static readonly DependencyProperty SeriesPos_TagsProperty = DependencyProperty.Register("SeriesPos_Tags",
  99. typeof(int), typeof(AnimeSeries), new UIPropertyMetadata((int)6, null));
  100. public int SeriesPos_Tags
  101. {
  102. get { return (int)GetValue(SeriesPos_TagsProperty); }
  103. set { SetValue(SeriesPos_TagsProperty, value); }
  104. }
  105. public static readonly DependencyProperty TruncatedDescriptionProperty = DependencyProperty.Register("TruncatedDescription",
  106. typeof(bool), typeof(AnimeSeries), new UIPropertyMetadata(true, null));
  107. public bool TruncatedDescription
  108. {
  109. get { return (bool)GetValue(TruncatedDescriptionProperty); }
  110. set { SetValue(TruncatedDescriptionProperty, value); }
  111. }
  112. public static readonly DependencyProperty FullDescriptionProperty = DependencyProperty.Register("FullDescription",
  113. typeof(bool), typeof(AnimeSeries), new UIPropertyMetadata(false, null));
  114. public bool FullDescription
  115. {
  116. get { return (bool)GetValue(FullDescriptionProperty); }
  117. set { SetValue(FullDescriptionProperty, value); }
  118. }
  119. public static readonly DependencyProperty PreviousOverrideNameProperty = DependencyProperty.Register("PreviousOverrideName",
  120. typeof(string), typeof(AnimeSeries), new UIPropertyMetadata("", null));
  121. public string PreviousOverrideName
  122. {
  123. get { return (string)GetValue(PreviousOverrideNameProperty); }
  124. set { SetValue(PreviousOverrideNameProperty, value); }
  125. }
  126. public AnimeSeries()
  127. {
  128. InitializeComponent();
  129. playlistMenu = new ContextMenu();
  130. cRating.OnRatingValueChangedEvent += new RatingControl.RatingValueChangedHandler(cRating_OnRatingValueChangedEvent);
  131. this.Loaded += new RoutedEventHandler(AnimeSeries_Loaded);
  132. btnAnimeGroupShow.Click += new RoutedEventHandler(btnAnimeGroupShow_Click);
  133. btnFileSummary.Click += new RoutedEventHandler(btnFileSummary_Click);
  134. btnTvDBLinks.Click += new RoutedEventHandler(btnTvDBLinks_Click);
  135. //btnPlayNextEpisode.Click += new RoutedEventHandler(btnPlayNextEpisode_Click);
  136. btnGetRelMissingInfo.Click += new RoutedEventHandler(btnGetRelMissingInfo_Click);
  137. btnGetSimMissingInfo.Click += new RoutedEventHandler(btnGetSimMissingInfo_Click);
  138. this.DataContextChanged += new DependencyPropertyChangedEventHandler(AnimeSeries_DataContextChanged);
  139. tabContainer.SelectionChanged += new SelectionChangedEventHandler(tabContainer_SelectionChanged);
  140. btnUpdateAniDBInfo.Click += new RoutedEventHandler(btnUpdateAniDBInfo_Click);
  141. this.LayoutUpdated += new EventHandler(AnimeSeries_LayoutUpdated);
  142. btnEditSeries.Click += new RoutedEventHandler(btnEditSeries_Click);
  143. btnEditSeriesFinish.Click += new RoutedEventHandler(btnEditSeriesFinish_Click);
  144. btnAnimeTitles.Click += new RoutedEventHandler(btnAnimeTitles_Click);
  145. btnAnimeTags.Click += new RoutedEventHandler(btnAnimeTags_Click);
  146. btnAnimeCategories.Click += new RoutedEventHandler(btnAnimeCategories_Click);
  147. btnPlaylistAdd.ContextMenu = playlistMenu;
  148. btnPlaylistAdd.Click += new RoutedEventHandler(btnPlaylistAdd_Click);
  149. /*SeriesPos_PlayNextEpisode = JMMServerVM.Instance.SeriesPos_PlayNextEpisode;
  150. SeriesPos_TvDBLinks = JMMServerVM.Instance.SeriesPos_TvDBLinks;
  151. SeriesPos_FileSummary = JMMServerVM.Instance.SeriesPos_FileSummary;
  152. SeriesPos_Categories = JMMServerVM.Instance.SeriesPos_Categories;
  153. SeriesPos_Titles = JMMServerVM.Instance.SeriesPos_Titles;
  154. SeriesPos_Tags = JMMServerVM.Instance.SeriesPos_Tags;*/
  155. btnRandomEpisode.Click += new RoutedEventHandler(btnRandomEpisode_Click);
  156. chkSerNameOverride.Click += new RoutedEventHandler(chkSerNameOverride_Click);
  157. btnSelectOverrideName.Click += new RoutedEventHandler(btnSelectOverrideName_Click);
  158. MainWindow.videoHandler.VideoWatchedEvent += new Utilities.VideoHandler.VideoWatchedEventHandler(videoHandler_VideoWatchedEvent);
  159. SetSeriesWidgetOrder();
  160. }
  161. void videoHandler_VideoWatchedEvent(Utilities.VideoWatchedEventArgs ev)
  162. {
  163. if (MainWindow.CurrentMainTabIndex == MainWindow.TAB_MAIN_Collection || MainWindow.CurrentMainTabIndex == MainWindow.TAB_MAIN_Pinned)
  164. ShowNextEpisode();
  165. }
  166. void btnSelectOverrideName_Click(object sender, RoutedEventArgs e)
  167. {
  168. try
  169. {
  170. Window wdw = Window.GetWindow(this);
  171. wdw.Cursor = Cursors.Wait;
  172. AnimeSeriesVM ser = this.DataContext as AnimeSeriesVM;
  173. if (ser == null) return;
  174. SelectAniDBTitleForm frm = new SelectAniDBTitleForm();
  175. frm.Owner = wdw;
  176. frm.Init(ser.AniDB_Anime.Detail.AnimeTitles);
  177. wdw.Cursor = Cursors.Arrow;
  178. bool? result = frm.ShowDialog();
  179. if (result.Value)
  180. {
  181. // update info
  182. txtSeriesName.Text = frm.SelectedTitle;
  183. }
  184. }
  185. catch (Exception ex)
  186. {
  187. Utils.ShowErrorMessage(ex);
  188. }
  189. }
  190. void chkSerNameOverride_Click(object sender, RoutedEventArgs e)
  191. {
  192. AnimeSeriesVM ser = this.DataContext as AnimeSeriesVM;
  193. if (ser == null) return;
  194. ser.IsSeriesNameOverridden = chkSerNameOverride.IsChecked.Value;
  195. ser.IsSeriesNameNotOverridden = !chkSerNameOverride.IsChecked.Value;
  196. EvaluateEditing();
  197. }
  198. private void EvaluateEditing()
  199. {
  200. AnimeSeriesVM ser = this.DataContext as AnimeSeriesVM;
  201. if (ser == null) return;
  202. if (ser.IsSeriesNameOverridden)
  203. {
  204. txtSeriesName.Text = ser.SeriesNameOverride;
  205. txtSeriesName.IsEnabled = true;
  206. chkSerNameOverride.IsChecked = true;
  207. btnSelectOverrideName.IsEnabled = true;
  208. }
  209. else
  210. {
  211. txtSeriesName.Text = ser.SeriesName;
  212. txtSeriesName.IsEnabled = false;
  213. chkSerNameOverride.IsChecked = false;
  214. btnSelectOverrideName.IsEnabled = false;
  215. }
  216. }
  217. void btnRandomEpisode_Click(object sender, RoutedEventArgs e)
  218. {
  219. AnimeSeriesVM ser = this.DataContext as AnimeSeriesVM;
  220. if (ser == null) return;
  221. MainWindow mainwdw = (MainWindow)Window.GetWindow(this);
  222. RandomEpisodeForm frm = new RandomEpisodeForm();
  223. frm.Owner = Window.GetWindow(this); ;
  224. frm.Init(RandomSeriesEpisodeLevel.Series, ser);
  225. bool? result = frm.ShowDialog();
  226. }
  227. void btnPlaylistAdd_Click(object sender, RoutedEventArgs e)
  228. {
  229. try
  230. {
  231. List<JMMServerBinary.Contract_Playlist> rawPlaylists = JMMServerVM.Instance.clientBinaryHTTP.GetAllPlaylists();
  232. PlaylistMenuCommand cmd = null;
  233. // get all playlists
  234. playlistMenu.Items.Clear();
  235. MenuItem itemSeries = new MenuItem();
  236. itemSeries.Header = "Add Series";
  237. itemSeries.Click += new RoutedEventHandler(playlistMenuItem_Click);
  238. playlistMenu.Items.Add(itemSeries);
  239. Separator sep = new Separator();
  240. MenuItem itemSeriesNew = new MenuItem();
  241. itemSeriesNew.Header = "New Playlist";
  242. itemSeriesNew.Click += new RoutedEventHandler(playlistMenuItem_Click);
  243. cmd = new PlaylistMenuCommand(PlaylistItemType.Series, -1); // new playlist
  244. itemSeriesNew.CommandParameter = cmd;
  245. itemSeries.Items.Add(itemSeriesNew);
  246. itemSeries.Items.Add(sep);
  247. foreach (JMMServerBinary.Contract_Playlist contract in rawPlaylists)
  248. {
  249. MenuItem itemSeriesPL = new MenuItem();
  250. itemSeriesPL.Header = contract.PlaylistName;
  251. itemSeriesPL.Click += new RoutedEventHandler(playlistMenuItem_Click);
  252. cmd = new PlaylistMenuCommand(PlaylistItemType.Series, contract.PlaylistID.Value);
  253. itemSeriesPL.CommandParameter = cmd;
  254. itemSeries.Items.Add(itemSeriesPL);
  255. }
  256. MenuItem itemAllEpisodes = new MenuItem();
  257. itemAllEpisodes.Header = "Add All Episodes";
  258. playlistMenu.Items.Add(itemAllEpisodes);
  259. Separator sep2 = new Separator();
  260. MenuItem itemAllEpisodesNew = new MenuItem();
  261. itemAllEpisodesNew.Header = "New Playlist";
  262. itemAllEpisodesNew.Click += new RoutedEventHandler(playlistMenuItem_Click);
  263. cmd = new PlaylistMenuCommand(PlaylistItemType.AllEpisodes, -1); // new playlist
  264. itemAllEpisodesNew.CommandParameter = cmd;
  265. itemAllEpisodes.Items.Add(itemAllEpisodesNew);
  266. itemAllEpisodes.Items.Add(sep2);
  267. foreach (JMMServerBinary.Contract_Playlist contract in rawPlaylists)
  268. {
  269. MenuItem itemSeriesPL = new MenuItem();
  270. itemSeriesPL.Header = contract.PlaylistName;
  271. itemSeriesPL.Click += new RoutedEventHandler(playlistMenuItem_Click);
  272. cmd = new PlaylistMenuCommand(PlaylistItemType.AllEpisodes, contract.PlaylistID.Value);
  273. itemSeriesPL.CommandParameter = cmd;
  274. itemAllEpisodes.Items.Add(itemSeriesPL);
  275. }
  276. MenuItem itemUnwatchedEpisodes = new MenuItem();
  277. itemUnwatchedEpisodes.Header = "Add Unwatched Episodes";
  278. playlistMenu.Items.Add(itemUnwatchedEpisodes);
  279. Separator sep3 = new Separator();
  280. MenuItem itemUnwatchedEpisodesNew = new MenuItem();
  281. itemUnwatchedEpisodesNew.Header = "New Playlist";
  282. itemUnwatchedEpisodesNew.Click += new RoutedEventHandler(playlistMenuItem_Click);
  283. cmd = new PlaylistMenuCommand(PlaylistItemType.UnwatchedEpisodes, -1); // new playlist
  284. itemUnwatchedEpisodesNew.CommandParameter = cmd;
  285. itemUnwatchedEpisodes.Items.Add(itemUnwatchedEpisodesNew);
  286. itemUnwatchedEpisodes.Items.Add(sep3);
  287. foreach (JMMServerBinary.Contract_Playlist contract in rawPlaylists)
  288. {
  289. MenuItem itemSeriesPL = new MenuItem();
  290. itemSeriesPL.Header = contract.PlaylistName;
  291. itemSeriesPL.Click += new RoutedEventHandler(playlistMenuItem_Click);
  292. cmd = new PlaylistMenuCommand(PlaylistItemType.UnwatchedEpisodes, contract.PlaylistID.Value);
  293. itemSeriesPL.CommandParameter = cmd;
  294. itemUnwatchedEpisodes.Items.Add(itemSeriesPL);
  295. }
  296. playlistMenu.PlacementTarget = this;
  297. playlistMenu.IsOpen = true;
  298. }
  299. catch (Exception ex)
  300. {
  301. Utils.ShowErrorMessage(ex);
  302. }
  303. }
  304. void playlistMenuItem_Click(object sender, RoutedEventArgs e)
  305. {
  306. try
  307. {
  308. MenuItem item = e.Source as MenuItem;
  309. MenuItem itemSender = sender as MenuItem;
  310. if (item == null || itemSender == null) return;
  311. if (!item.Header.ToString().Equals(itemSender.Header.ToString())) return;
  312. if (item != null && item.CommandParameter != null)
  313. {
  314. PlaylistMenuCommand cmd = item.CommandParameter as PlaylistMenuCommand;
  315. Debug.Write("Playlist Menu: " + cmd.ToString() + Environment.NewLine);
  316. AnimeSeriesVM ser = this.DataContext as AnimeSeriesVM;
  317. if (ser == null) return;
  318. // get the playlist
  319. PlaylistVM pl = null;
  320. if (cmd.PlaylistID < 0)
  321. {
  322. pl = PlaylistHelperVM.CreatePlaylist(Window.GetWindow(this));
  323. if (pl == null) return;
  324. }
  325. else
  326. {
  327. JMMServerBinary.Contract_Playlist plContract = JMMServerVM.Instance.clientBinaryHTTP.GetPlaylist(cmd.PlaylistID);
  328. if (plContract == null)
  329. {
  330. MessageBox.Show("Could not find playlist", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
  331. return;
  332. }
  333. pl = new PlaylistVM(plContract);
  334. }
  335. this.Cursor = Cursors.Wait;
  336. // get the items to add to the playlist
  337. if (cmd.AddType == PlaylistItemType.Series)
  338. {
  339. pl.AddSeries(ser.AnimeSeriesID.Value);
  340. }
  341. else
  342. {
  343. List<AnimeEpisodeVM> eps = ser.AllEpisodes;
  344. List<SortPropOrFieldAndDirection> sortCriteria = new List<SortPropOrFieldAndDirection>();
  345. sortCriteria.Add(new SortPropOrFieldAndDirection("EpisodeType", false, JMMClient.SortType.eInteger));
  346. sortCriteria.Add(new SortPropOrFieldAndDirection("EpisodeNumber", false, JMMClient.SortType.eInteger));
  347. sortCriteria.Add(new SortPropOrFieldAndDirection("AniDB_AirDateWithDefault", false, JMMClient.SortType.eDateTime));
  348. eps = Sorting.MultiSort<AnimeEpisodeVM>(eps, sortCriteria);
  349. if (cmd.AddType == PlaylistItemType.AllEpisodes)
  350. {
  351. foreach (AnimeEpisodeVM ep in eps)
  352. {
  353. if (ep.EpisodeTypeEnum == EpisodeType.Episode || ep.EpisodeTypeEnum == EpisodeType.Special)
  354. pl.AddEpisode(ep.AnimeEpisodeID);
  355. }
  356. }
  357. if (cmd.AddType == PlaylistItemType.UnwatchedEpisodes)
  358. {
  359. foreach (AnimeEpisodeVM ep in eps)
  360. {
  361. if (!ep.Watched && (ep.EpisodeTypeEnum == EpisodeType.Episode || ep.EpisodeTypeEnum == EpisodeType.Special))
  362. pl.AddEpisode(ep.AnimeEpisodeID);
  363. }
  364. }
  365. }
  366. pl.Save();
  367. PlaylistHelperVM.Instance.RefreshData();
  368. this.Cursor = Cursors.Arrow;
  369. }
  370. }
  371. catch (Exception ex)
  372. {
  373. Utils.ShowErrorMessage(ex);
  374. }
  375. }
  376. private void Handle_Click(object sender, MouseButtonEventArgs e)
  377. {
  378. string tag = ((TextBlock)sender).Tag.ToString();
  379. if (tag.Equals("txtDescription", StringComparison.InvariantCultureIgnoreCase))
  380. {
  381. TruncatedDescription = !TruncatedDescription;
  382. FullDescription = !FullDescription;
  383. }
  384. }
  385. void btnGetSimMissingInfo_Click(object sender, RoutedEventArgs e)
  386. {
  387. ucSimilarAnime.GetMissingSimilarData();
  388. }
  389. void btnGetRelMissingInfo_Click(object sender, RoutedEventArgs e)
  390. {
  391. ucRelatedAnime.GetMissingSimilarData();
  392. }
  393. void btnEditSeriesFinish_Click(object sender, RoutedEventArgs e)
  394. {
  395. AnimeSeriesVM ser = this.DataContext as AnimeSeriesVM;
  396. if (ser == null) return;
  397. ser.IsBeingEdited = false;
  398. ser.IsReadOnly = true;
  399. if (ser.IsSeriesNameOverridden && string.IsNullOrEmpty(txtSeriesName.Text))
  400. {
  401. ser.IsSeriesNameOverridden = false;
  402. ser.IsSeriesNameNotOverridden = true;
  403. }
  404. string oldName = "";
  405. if (!string.IsNullOrEmpty(ser.SeriesNameOverride))
  406. oldName = ser.SeriesNameOverride;
  407. string newName = txtSeriesName.Text.Trim();
  408. if (!ser.IsSeriesNameOverridden)
  409. newName = "";
  410. if (!oldName.Equals(newName))
  411. {
  412. // override name has changes so lets save to db
  413. ser.SeriesNameOverride = newName;
  414. ser.Save();
  415. // prompt to change parent group name
  416. MessageBoxResult res = MessageBox.Show("Do you also want to rename the parent group?",
  417. "Confirm", MessageBoxButton.YesNo, MessageBoxImage.Question);
  418. if (res == MessageBoxResult.Yes)
  419. {
  420. AnimeGroupVM thisGrp = MainListHelperVM.Instance.AllGroupsDictionary[ser.AnimeGroupID];
  421. if (thisGrp != null)
  422. {
  423. thisGrp.GroupName = newName;
  424. thisGrp.SortName = newName;
  425. thisGrp.Save();
  426. }
  427. }
  428. }
  429. ser.SetSeriesNames();
  430. //MainListHelperVM.Instance.RefreshGroupsSeriesData();
  431. EvaluateEditing();
  432. }
  433. void btnEditSeries_Click(object sender, RoutedEventArgs e)
  434. {
  435. AnimeSeriesVM ser = this.DataContext as AnimeSeriesVM;
  436. if (ser == null) return;
  437. if (string.IsNullOrEmpty(ser.SeriesNameOverride))
  438. PreviousOverrideName = "";
  439. else
  440. PreviousOverrideName = ser.SeriesNameOverride;
  441. ser.IsBeingEdited = true;
  442. ser.IsReadOnly = false;
  443. }
  444. private void SetSeriesWidgetOrder()
  445. {
  446. SeriesPos_PlayNextEpisode = UserSettingsVM.Instance.GetSeriesWidgetPosition(SeriesWidgets.PlayNextEpisode) + 4;
  447. SeriesPos_TvDBLinks = UserSettingsVM.Instance.GetSeriesWidgetPosition(SeriesWidgets.TvDBLinks) + 4;
  448. SeriesPos_FileSummary = UserSettingsVM.Instance.GetSeriesWidgetPosition(SeriesWidgets.FileSummary) + 4;
  449. SeriesPos_Categories = UserSettingsVM.Instance.GetSeriesWidgetPosition(SeriesWidgets.Categories) + 4;
  450. SeriesPos_Titles = UserSettingsVM.Instance.GetSeriesWidgetPosition(SeriesWidgets.Titles) + 4;
  451. SeriesPos_Tags = UserSettingsVM.Instance.GetSeriesWidgetPosition(SeriesWidgets.Tags) + 4;
  452. }
  453. void AnimeSeries_LayoutUpdated(object sender, EventArgs e)
  454. {
  455. }
  456. private void CommandBinding_MoveUpWidget(object sender, ExecutedRoutedEventArgs e)
  457. {
  458. object obj = e.Parameter;
  459. if (obj == null) return;
  460. SeriesWidgets swid = (SeriesWidgets)int.Parse(obj.ToString());
  461. UserSettingsVM.Instance.MoveUpSeriesWidget(swid);
  462. SetSeriesWidgetOrder();
  463. }
  464. private void CommandBinding_MoveDownWidget(object sender, ExecutedRoutedEventArgs e)
  465. {
  466. object obj = e.Parameter;
  467. if (obj == null) return;
  468. SeriesWidgets swid = (SeriesWidgets)int.Parse(obj.ToString());
  469. UserSettingsVM.Instance.MoveDownSeriesWidget(swid);
  470. SetSeriesWidgetOrder();
  471. }
  472. private void CommandBinding_ViewImage(object sender, ExecutedRoutedEventArgs e)
  473. {
  474. object obj = e.Parameter;
  475. if (obj == null) return;
  476. try
  477. {
  478. if (obj.GetType() == typeof(PosterContainer))
  479. {
  480. PosterContainer poster = (PosterContainer)obj;
  481. Utils.OpenFile(poster.FullImagePath);
  482. }
  483. if (obj.GetType() == typeof(FanartContainer))
  484. {
  485. FanartContainer fanart = (FanartContainer)obj;
  486. Utils.OpenFile(fanart.FullImagePath);
  487. }
  488. /*
  489. if (obj.GetType() == typeof(TvDB_ImagePosterVM))
  490. {
  491. TvDB_ImagePosterVM poster = (TvDB_ImagePosterVM)obj;
  492. Utils.OpenFile(poster.FullImagePath);
  493. }
  494. if (obj.GetType() == typeof(TvDB_ImageFanartVM))
  495. {
  496. TvDB_ImageFanartVM fanart = (TvDB_ImageFanartVM)obj;
  497. Utils.OpenFile(fanart.FullImagePath);
  498. }*/
  499. if (obj.GetType() == typeof(TvDB_ImageWideBannerVM))
  500. {
  501. TvDB_ImageWideBannerVM banner = (TvDB_ImageWideBannerVM)obj;
  502. Utils.OpenFile(banner.FullImagePath);
  503. }
  504. }
  505. catch (Exception ex)
  506. {
  507. Utils.ShowErrorMessage(ex);
  508. }
  509. }
  510. private void CommandBinding_DisableImage(object sender, ExecutedRoutedEventArgs e)
  511. {
  512. object obj = e.Parameter;
  513. if (obj == null) return;
  514. EnableDisableImage(false, obj);
  515. }
  516. private void CommandBinding_EnableImage(object sender, ExecutedRoutedEventArgs e)
  517. {
  518. object obj = e.Parameter;
  519. if (obj == null) return;
  520. EnableDisableImage(true, obj);
  521. }
  522. private void EnableDisableImage(bool enabled, object img)
  523. {
  524. if (!JMMServerVM.Instance.ServerOnline) return;
  525. try
  526. {
  527. AnimeSeriesVM ser = this.DataContext as AnimeSeriesVM;
  528. if (ser == null) return;
  529. this.Cursor = Cursors.Wait;
  530. string res = "";
  531. // NOTE if we are disabling an image we should also make sure it is not the default
  532. if (img.GetType() == typeof(PosterContainer))
  533. {
  534. PosterContainer poster = (PosterContainer)img;
  535. if (!enabled && poster.IsImageDefault)
  536. SetDefaultImage(false, img, false);
  537. switch (poster.ImageType)
  538. {
  539. case ImageEntityType.TvDB_Cover:
  540. TvDB_ImagePosterVM tvPoster = poster.PosterObject as TvDB_ImagePosterVM;
  541. res = JMMServerVM.Instance.clientBinaryHTTP.EnableDisableImage(enabled, tvPoster.TvDB_ImagePosterID, (int)ImageEntityType.TvDB_Cover);
  542. tvPoster.Enabled = enabled ? 1 : 0;
  543. tvPoster.IsImageEnabled = enabled;
  544. tvPoster.IsImageDisabled = !enabled;
  545. break;
  546. case ImageEntityType.Trakt_Poster:
  547. Trakt_ImagePosterVM traktPoster = poster.PosterObject as Trakt_ImagePosterVM;
  548. res = JMMServerVM.Instance.clientBinaryHTTP.EnableDisableImage(enabled, traktPoster.Trakt_ImagePosterID, (int)ImageEntityType.Trakt_Poster);
  549. traktPoster.Enabled = enabled ? 1 : 0;
  550. traktPoster.IsImageEnabled = enabled;
  551. traktPoster.IsImageDisabled = !enabled;
  552. break;
  553. case ImageEntityType.AniDB_Cover:
  554. AniDB_AnimeVM anime = poster.PosterObject as AniDB_AnimeVM;
  555. res = JMMServerVM.Instance.clientBinaryHTTP.EnableDisableImage(enabled, anime.AnimeID,(int)ImageEntityType.AniDB_Cover);
  556. anime.ImageEnabled = enabled ? 1 : 0;
  557. anime.IsImageEnabled = enabled;
  558. anime.IsImageDisabled = !enabled;
  559. break;
  560. case ImageEntityType.MovieDB_Poster:
  561. MovieDB_PosterVM moviePoster = poster.PosterObject as MovieDB_PosterVM;
  562. res = JMMServerVM.Instance.clientBinaryHTTP.EnableDisableImage(enabled, moviePoster.MovieDB_PosterID, (int)ImageEntityType.MovieDB_Poster);
  563. moviePoster.Enabled = enabled ? 1 : 0;
  564. moviePoster.IsImageEnabled = enabled;
  565. moviePoster.IsImageDisabled = !enabled;
  566. break;
  567. }
  568. poster.IsImageEnabled = enabled;
  569. poster.IsImageDisabled = !enabled;
  570. }
  571. if (img.GetType() == typeof(FanartContainer))
  572. {
  573. FanartContainer fanart = (FanartContainer)img;
  574. if (!enabled && fanart.IsImageDefault)
  575. SetDefaultImage(false, img, false);
  576. switch (fanart.ImageType)
  577. {
  578. case ImageEntityType.TvDB_FanArt:
  579. TvDB_ImageFanartVM tvFanart = fanart.FanartObject as TvDB_ImageFanartVM;
  580. res = JMMServerVM.Instance.clientBinaryHTTP.EnableDisableImage(enabled, tvFanart.TvDB_ImageFanartID, (int)ImageEntityType.TvDB_FanArt);
  581. tvFanart.Enabled = enabled ? 1 : 0;
  582. tvFanart.IsImageEnabled = enabled;
  583. tvFanart.IsImageDisabled = !enabled;
  584. break;
  585. case ImageEntityType.Trakt_Fanart:
  586. Trakt_ImageFanartVM traktFanart = fanart.FanartObject as Trakt_ImageFanartVM;
  587. res = JMMServerVM.Instance.clientBinaryHTTP.EnableDisableImage(enabled, traktFanart.Trakt_ImageFanartID, (int)ImageEntityType.Trakt_Fanart);
  588. traktFanart.Enabled = enabled ? 1 : 0;
  589. traktFanart.IsImageEnabled = enabled;
  590. traktFanart.IsImageDisabled = !enabled;
  591. break;
  592. case ImageEntityType.MovieDB_FanArt:
  593. MovieDB_FanartVM movieFanart = fanart.FanartObject as MovieDB_FanartVM;
  594. res = JMMServerVM.Instance.clientBinaryHTTP.EnableDisableImage(enabled, movieFanart.MovieDB_FanartID, (int)ImageEntityType.MovieDB_FanArt);
  595. movieFanart.Enabled = enabled ? 1 : 0;
  596. movieFanart.IsImageEnabled = enabled;
  597. movieFanart.IsImageDisabled = !enabled;
  598. break;
  599. }
  600. fanart.IsImageEnabled = enabled;
  601. fanart.IsImageDisabled = !enabled;
  602. }
  603. if (img.GetType() == typeof(TvDB_ImageWideBannerVM))
  604. {
  605. TvDB_ImageWideBannerVM banner = (TvDB_ImageWideBannerVM)img;
  606. if (!enabled && banner.IsImageDefault)
  607. SetDefaultImage(false, img, false);
  608. res = JMMServerVM.Instance.clientBinaryHTTP.EnableDisableImage(enabled, banner.TvDB_ImageWideBannerID, (int)ImageEntityType.TvDB_Banner);
  609. banner.Enabled = enabled ? 1 : 0;
  610. banner.IsImageEnabled = enabled;
  611. banner.IsImageDisabled = !enabled;
  612. }
  613. if (res.Length > 0)
  614. {
  615. MessageBox.Show(res, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
  616. }
  617. else
  618. {
  619. MainListHelperVM.Instance.UpdateHeirarchy(ser);
  620. MainListHelperVM.Instance.UpdateAnime(ser.AniDB_ID);
  621. RefreshImagesData();
  622. }
  623. }
  624. catch (Exception ex)
  625. {
  626. Utils.ShowErrorMessage(ex);
  627. }
  628. finally
  629. {
  630. this.Cursor = Cursors.Arrow;
  631. }
  632. }
  633. private void CommandBinding_SetDefaultImageON(object sender, ExecutedRoutedEventArgs e)
  634. {
  635. object obj = e.Parameter;
  636. if (obj == null) return;
  637. SetDefaultImage(true, obj, true);
  638. }
  639. private void CommandBinding_SetDefaultImageOFF(object sender, ExecutedRoutedEventArgs e)
  640. {
  641. object obj = e.Parameter;
  642. if (obj == null) return;
  643. SetDefaultImage(false, obj, true);
  644. }
  645. private void SetDefaultImage(bool isDefault, object img, bool refreshData)
  646. {
  647. if (!JMMServerVM.Instance.ServerOnline) return;
  648. try
  649. {
  650. AnimeSeriesVM ser = this.DataContext as AnimeSeriesVM;
  651. if (ser == null) return;
  652. this.Cursor = Cursors.Wait;
  653. string res = "";
  654. string disabledMessage = "Cannot set a disabled image as the default";
  655. if (img.GetType() == typeof(PosterContainer))
  656. {
  657. PosterContainer poster = (PosterContainer)img;
  658. if (isDefault && poster.IsImageDisabled)
  659. {
  660. MessageBox.Show(disabledMessage, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
  661. return;
  662. }
  663. switch (poster.ImageType)
  664. {
  665. case ImageEntityType.TvDB_Cover:
  666. TvDB_ImagePosterVM tvPoster = poster.PosterObject as TvDB_ImagePosterVM;
  667. res = JMMServerVM.Instance.clientBinaryHTTP.SetDefaultImage(isDefault, ser.AniDB_ID,
  668. tvPoster.TvDB_ImagePosterID, (int)ImageEntityType.TvDB_Cover, (int)ImageSizeType.Poster);
  669. tvPoster.IsImageDefault = isDefault;
  670. tvPoster.IsImageNotDefault = !isDefault;
  671. break;
  672. case ImageEntityType.Trakt_Poster:
  673. Trakt_ImagePosterVM traktPoster = poster.PosterObject as Trakt_ImagePosterVM;
  674. res = JMMServerVM.Instance.clientBinaryHTTP.SetDefaultImage(isDefault, ser.AniDB_ID,
  675. traktPoster.Trakt_ImagePosterID, (int)ImageEntityType.Trakt_Poster, (int)ImageSizeType.Poster);
  676. traktPoster.IsImageDefault = isDefault;
  677. traktPoster.IsImageNotDefault = !isDefault;
  678. break;
  679. case ImageEntityType.AniDB_Cover:
  680. AniDB_AnimeVM anime = poster.PosterObject as AniDB_AnimeVM;
  681. res = JMMServerVM.Instance.clientBinaryHTTP.SetDefaultImage(isDefault, ser.AniDB_ID,
  682. anime.AnimeID, (int)ImageEntityType.AniDB_Cover, (int)ImageSizeType.Poster);
  683. anime.IsImageDefault = isDefault;
  684. anime.IsImageNotDefault = !isDefault;
  685. break;
  686. case ImageEntityType.MovieDB_Poster:
  687. MovieDB_PosterVM moviePoster = poster.PosterObject as MovieDB_PosterVM;
  688. res = JMMServerVM.Instance.clientBinaryHTTP.SetDefaultImage(isDefault, ser.AniDB_ID,
  689. moviePoster.MovieDB_PosterID, (int)ImageEntityType.MovieDB_Poster, (int)ImageSizeType.Poster);
  690. moviePoster.IsImageDefault = isDefault;
  691. moviePoster.IsImageNotDefault = !isDefault;
  692. break;
  693. }
  694. poster.IsImageDefault = isDefault;
  695. poster.IsImageNotDefault = !isDefault;
  696. }
  697. if (img.GetType() == typeof(FanartContainer))
  698. {
  699. FanartContainer fanart = (FanartContainer)img;
  700. if (isDefault && fanart.IsImageDisabled)
  701. {
  702. MessageBox.Show(disabledMessage, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
  703. return;
  704. }
  705. switch (fanart.ImageType)
  706. {
  707. case ImageEntityType.TvDB_FanArt:
  708. TvDB_ImageFanartVM tvFanart = fanart.FanartObject as TvDB_ImageFanartVM;
  709. res = JMMServerVM.Instance.clientBinaryHTTP.SetDefaultImage(isDefault, ser.AniDB_ID,
  710. tvFanart.TvDB_ImageFanartID, (int)ImageEntityType.TvDB_FanArt, (int)ImageSizeType.Fanart);
  711. tvFanart.IsImageDefault = isDefault;
  712. tvFanart.IsImageNotDefault = !isDefault;
  713. break;
  714. case ImageEntityType.Trakt_Fanart:
  715. Trakt_ImageFanartVM traktFanart = fanart.FanartObject as Trakt_ImageFanartVM;
  716. res = JMMServerVM.Instance.clientBinaryHTTP.SetDefaultImage(isDefault, ser.AniDB_ID,
  717. traktFanart.Trakt_ImageFanartID, (int)ImageEntityType.Trakt_Fanart, (int)ImageSizeType.Fanart);
  718. traktFanart.IsImageDefault = isDefault;
  719. traktFanart.IsImageNotDefault = !isDefault;
  720. break;
  721. case ImageEntityType.MovieDB_FanArt:
  722. MovieDB_FanartVM movieFanart = fanart.FanartObject as MovieDB_FanartVM;
  723. res = JMMServerVM.Instance.clientBinaryHTTP.SetDefaultImage(isDefault, ser.AniDB_ID,
  724. movieFanart.MovieDB_FanartID, (int)ImageEntityType.MovieDB_FanArt, (int)ImageSizeType.Fanart);
  725. movieFanart.IsImageDefault = isDefault;
  726. movieFanart.IsImageNotDefault = !isDefault;
  727. break;
  728. }
  729. fanart.IsImageDefault = isDefault;
  730. fanart.IsImageNotDefault = !isDefault;
  731. }
  732. if (img.GetType() == typeof(TvDB_ImageWideBannerVM))
  733. {
  734. TvDB_ImageWideBannerVM banner = (TvDB_ImageWideBannerVM)img;
  735. if (isDefault && banner.IsImageDisabled)
  736. {
  737. MessageBox.Show(disabledMessage, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
  738. return;
  739. }
  740. res = JMMServerVM.Instance.clientBinaryHTTP.SetDefaultImage(isDefault, ser.AniDB_ID,
  741. banner.TvDB_ImageWideBannerID, (int)ImageEntityType.TvDB_Banner, (int)ImageSizeType.WideBanner);
  742. banner.IsImageDefault = isDefault;
  743. banner.IsImageNotDefault = !isDefault;
  744. }
  745. if (res.Length > 0)
  746. {
  747. MessageBox.Show(res, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
  748. }
  749. else
  750. {
  751. if (refreshData)
  752. {
  753. MainListHelperVM.Instance.UpdateHeirarchy(ser);
  754. MainListHelperVM.Instance.UpdateAnime(ser.AniDB_ID);
  755. RefreshImagesData();
  756. }
  757. }
  758. }
  759. catch (Exception ex)
  760. {
  761. Utils.ShowErrorMessage(ex);
  762. }
  763. finally
  764. {
  765. this.Cursor = Cursors.Arrow;
  766. }
  767. }
  768. void btnUpdateAniDBInfo_Click(object sender, RoutedEventArgs e)
  769. {
  770. AnimeSeriesVM ser = this.DataContext as AnimeSeriesVM;
  771. if (ser == null) return;
  772. try
  773. {
  774. this.Cursor = Cursors.Wait;
  775. JMMServerVM.Instance.clientBinaryHTTP.UpdateAnimeData(ser.AniDB_ID);
  776. // refresh the data
  777. MainListHelperVM.Instance.UpdateHeirarchy(ser);
  778. }
  779. catch (Exception ex)
  780. {
  781. Utils.ShowErrorMessage(ex);
  782. }
  783. finally
  784. {
  785. this.Cursor = Cursors.Arrow;
  786. }
  787. }
  788. void tabContainer_SelectionChanged(object sender, SelectionChangedEventArgs e)
  789. {
  790. if (e.Source is TabControl)
  791. {
  792. TabControl tab = e.Source as TabControl;
  793. if (tab.SelectedIndex == 1) // episodes
  794. {
  795. this.Cursor = Cursors.Wait;
  796. epListMain.PopulateToolbars();
  797. this.Cursor = Cursors.Arrow;
  798. }
  799. else if (tab.SelectedIndex == 2) // images
  800. {
  801. RefreshImagesData();
  802. }
  803. else if (tab.SelectedIndex == 3) // related and similar
  804. {
  805. this.Cursor = Cursors.Wait;
  806. ucSimilarAnime.RefreshData();
  807. ucRelatedAnime.RefreshData();
  808. this.Cursor = Cursors.Arrow;
  809. }
  810. else if (tab.SelectedIndex == 4) // trakt shouts
  811. {
  812. this.Cursor = Cursors.Wait;
  813. ucTraktShouts.RefreshShouts();
  814. this.Cursor = Cursors.Arrow;
  815. }
  816. }
  817. }
  818. private void RefreshImagesData()
  819. {
  820. this.Cursor = Cursors.Wait;
  821. try
  822. {
  823. AniDB_AnimeCrossRefsVM AniDB_AnimeCrossRefs = null;
  824. SeriesTvDBWideBanners = null;
  825. AllPosters = null;
  826. AllFanarts = null;
  827. AnimeSeriesVM ser = this.DataContext as AnimeSeriesVM;
  828. if (ser == null) return;
  829. JMMServerBinary.Contract_AniDB_AnimeCrossRefs xrefDetails = JMMServerVM.Instance.clientBinaryHTTP.GetCrossRefDetails(ser.AniDB_ID);
  830. if (xrefDetails == null) return;
  831. AniDB_AnimeCrossRefs = new AniDB_AnimeCrossRefsVM();
  832. AniDB_AnimeCrossRefs.Populate(xrefDetails);
  833. SeriesTvDBWideBanners = AniDB_AnimeCrossRefs.TvDBImageWideBanners;
  834. AniDB_AnimeCrossRefs.AllPosters.Insert(0, new PosterContainer(ImageEntityType.AniDB_Cover, ser.AniDB_Anime));
  835. AllPosters = AniDB_AnimeCrossRefs.AllPosters;
  836. AllFanarts = AniDB_AnimeCrossRefs.AllFanarts;
  837. }
  838. catch (Exception ex)
  839. {
  840. Utils.ShowErrorMessage(ex);
  841. }
  842. finally
  843. {
  844. this.Cursor = Cursors.Arrow;
  845. }
  846. }
  847. void btnTvDBLinks_Click(object sender, RoutedEventArgs e)
  848. {
  849. UserSettingsVM.Instance.SeriesTvDBLinksExpanded = !UserSettingsVM.Instance.SeriesTvDBLinksExpanded;
  850. ShowTvDBLinks();
  851. }
  852. void btnAnimeTitles_Click(object sender, RoutedEventArgs e)
  853. {
  854. UserSettingsVM.Instance.TitlesExpanded = !UserSettingsVM.Instance.TitlesExpanded;
  855. }
  856. void btnAnimeTags_Click(object sender, RoutedEventArgs e)
  857. {
  858. UserSettingsVM.Instance.TagsExpanded = !UserSettingsVM.Instance.TagsExpanded;
  859. }
  860. void btnAnimeCategories_Click(object sender, RoutedEventArgs e)
  861. {
  862. UserSettingsVM.Instance.CategoriesExpanded = !UserSettingsVM.Instance.CategoriesExpanded;
  863. }
  864. /*void btnPlayNextEpisode_Click(object sender, RoutedEventArgs e)
  865. {
  866. UserSettingsVM.Instance.SeriesNextEpisodeExpanded = !UserSettingsVM.Instance.SeriesNextEpisodeExpanded;
  867. ShowNextEpisode();
  868. }*/
  869. private void CommandBinding_RefreshSeries(object sender, ExecutedRoutedEventArgs e)
  870. {
  871. AnimeSeriesVM ser = this.DataContext as AnimeSeriesVM;
  872. if (ser == null) return;
  873. ser.RefreshBase();
  874. LoadSeries();
  875. }
  876. private void LoadSeries()
  877. {
  878. this.Cursor = Cursors.Wait;
  879. AnimeSeriesVM ser = this.DataContext as AnimeSeriesVM;
  880. if (ser == null) return;
  881. FullDescription = false;
  882. TruncatedDescription = true;
  883. ShowFileSummary();
  884. ShowTvDBLinks();
  885. ShowNextEpisode();
  886. ser.PopulateIsFave();
  887. epListMain.DataContext = ser;
  888. ucSimilarAnime.DataContext = ser;
  889. ucRelatedAnime.DataContext = ser;
  890. ucTraktShouts.DataContext = ser;
  891. if (tabContainer.SelectedIndex == 1) // episodes
  892. {
  893. epListMain.PopulateToolbars();
  894. }
  895. else if (tabContainer.SelectedIndex == 2) // images
  896. {
  897. RefreshImagesData();
  898. }
  899. else if (tabContainer.SelectedIndex == 3) // related and similar
  900. {
  901. this.Cursor = Cursors.Wait;
  902. ucSimilarAnime.RefreshData();
  903. ucRelatedAnime.RefreshData();
  904. this.Cursor = Cursors.Arrow;
  905. }
  906. else if (tabContainer.SelectedIndex == 4) // trakt shouts
  907. {
  908. this.Cursor = Cursors.Wait;
  909. ucTraktShouts.RefreshShouts();
  910. this.Cursor = Cursors.Arrow;
  911. }
  912. cboVoteType.Items.Clear();
  913. cboVoteType.Items.Add(Properties.Resources.VoteTypeAnimeTemporary);
  914. if (ser.AniDB_Anime.FinishedAiring)
  915. cboVoteType.Items.Add(Properties.Resources.VoteTypeAnimePermanent);
  916. if (ser.AniDB_Anime.FinishedAiring && ser.AllFilesWatched)
  917. cboVoteType.SelectedIndex = 1;
  918. else
  919. cboVoteType.SelectedIndex = 0;
  920. EvaluateEditing();
  921. this.Cursor = Cursors.Arrow;
  922. }
  923. void AnimeSeries_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
  924. {
  925. LoadSeries();
  926. }
  927. void btnFileSummary_Click(object sender, RoutedEventArgs e)
  928. {
  929. UserSettingsVM.Instance.SeriesFileSummaryExpanded = !UserSettingsVM.Instance.SeriesFileSummaryExpanded;
  930. ShowFileSummary();
  931. }
  932. private void ShowFileSummary()
  933. {
  934. if (UserSettingsVM.Instance.SeriesFileSummaryExpanded)
  935. {
  936. AnimeSeriesVM ser = this.DataContext as AnimeSeriesVM;
  937. if (ser == null) return;
  938. ucFileSummary.DataContext = ser.AniDB_Anime;
  939. }
  940. }
  941. private void ShowTvDBLinks()
  942. {
  943. if (UserSettingsVM.Instance.SeriesTvDBLinksExpanded)
  944. {
  945. AnimeSeriesVM ser = this.DataContext as AnimeSeriesVM;
  946. if (ser == null) return;
  947. ucTvDBLinks.DataContext = ser.AniDB_Anime;
  948. }
  949. }
  950. private void ShowNextEpisode()
  951. {
  952. AnimeSeriesVM ser = this.DataContext as AnimeSeriesVM;
  953. if (ser == null) return;
  954. JMMServerBinary.Contract_AnimeEpisode ep = JMMServerVM.Instance.clientBinaryHTTP.GetNextUnwatchedEpisode(ser.AnimeSeriesID.Value,
  955. JMMServerVM.Instance.CurrentUser.JMMUserID.Value);
  956. if (ep != null)
  957. {
  958. AnimeEpisodeVM aniep = new AnimeEpisodeVM(ep);
  959. aniep.SetTvDBInfo();
  960. ucNextEpisode.DataContext = aniep;
  961. }
  962. else
  963. {
  964. ucNextEpisode.EpisodeExists = false;
  965. ucNextEpisode.EpisodeMissing = true;
  966. ucNextEpisode.DataContext = null;
  967. }
  968. }
  969. void btnAnimeGroupShow_Click(object sender, RoutedEventArgs e)
  970. {
  971. UserSettingsVM.Instance.SeriesGroupExpanded = !UserSettingsVM.Instance.SeriesGroupExpanded;
  972. }
  973. void AnimeSeries_Loaded(object sender, RoutedEventArgs e)
  974. {
  975. }
  976. void cRating_OnRatingValueChangedEvent(RatingValueEventArgs ev)
  977. {
  978. AnimeSeriesVM ser = this.DataContext as AnimeSeriesVM;
  979. if (ser == null) return;
  980. try
  981. {
  982. decimal rating = (decimal)ev.RatingValue;
  983. int voteType = 1;
  984. if (cboVoteType.SelectedItem.ToString() == Properties.Resources.VoteTypeAnimeTemporary) voteType = 2;
  985. if (cboVoteType.SelectedItem.ToString() == Properties.Resources.VoteTypeAnimePermanent) voteType = 1;
  986. JMMServerVM.Instance.VoteAnime(ser.AniDB_ID, rating, voteType);
  987. // refresh the data
  988. //ser.RefreshBase();
  989. //ser.AniDB_Anime.Detail.RefreshBase();
  990. MainListHelperVM.Instance.UpdateHeirarchy(ser);
  991. }
  992. catch (Exception ex)
  993. {
  994. Utils.ShowErrorMessage(ex);
  995. }
  996. }
  997. /// <summary>
  998. /// This event bubbles up from PlayEpisodeControl
  999. /// </summary>
  1000. /// <param name="sender"></param>
  1001. /// <param name="e"></param>
  1002. private void CommandBinding_ToggleWatchedStatus(object sender, ExecutedRoutedEventArgs e)
  1003. {
  1004. object obj = e.Parameter;
  1005. if (obj == null) return;
  1006. this.Cursor = Cursors.Wait;
  1007. try
  1008. {
  1009. Window parentWindow = Window.GetWindow(this);
  1010. AnimeSeriesVM serTemp = null;
  1011. bool newStatus = false;
  1012. if (obj.GetType() == typeof(VideoDetailedVM))
  1013. {
  1014. VideoDetailedVM vid = obj as VideoDetailedVM;
  1015. newStatus = !vid.Watched;
  1016. JMMServerVM.Instance.clientBinaryHTTP.ToggleWatchedStatusOnVideo(vid.VideoLocalID, newStatus, JMMServerVM.Instance.CurrentUser.JMMUserID.Value);
  1017. MainListHelperVM.Instance.UpdateHeirarchy(vid);
  1018. serTemp = MainListHelperVM.Instance.GetSeriesForVideo(vid.VideoLocalID);
  1019. }
  1020. if (obj.GetType() == typeof(AnimeEpisodeVM))
  1021. {
  1022. AnimeEpisodeVM ep = obj as AnimeEpisodeVM;
  1023. newStatus = !ep.Watched;
  1024. JMMServerBinary.Contract_ToggleWatchedStatusOnEpisode_Response response = JMMServerVM.Instance.clientBinaryHTTP.ToggleWatchedStatusOnEpisode(ep.AnimeEpisodeID,
  1025. newStatus, JMMServerVM.Instance.CurrentUser.JMMUserID.Value);
  1026. if (!string.IsNullOrEmpty(response.ErrorMessage))
  1027. {
  1028. MessageBox.Show(response.ErrorMessage, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
  1029. return;
  1030. }
  1031. MainListHelperVM.Instance.UpdateHeirarchy(response.AnimeEpisode);
  1032. serTemp = MainListHelperVM.Instance.GetSeriesForEpisode(ep);
  1033. }
  1034. ShowNextEpisode();
  1035. if (newStatus == true && serTemp != null)
  1036. {
  1037. Utils.PromptToRateSeries(serTemp, parentWindow);
  1038. }
  1039. }
  1040. catch (Exception ex)
  1041. {
  1042. Utils.ShowErrorMessage(ex);
  1043. }
  1044. finally
  1045. {
  1046. this.Cursor = Cursors.Arrow;
  1047. }
  1048. }
  1049. }
  1050. public class PlaylistMenuCommand
  1051. {
  1052. public PlaylistItemType AddType { get; set; }
  1053. public int PlaylistID { get; set; }
  1054. public PlaylistMenuCommand()
  1055. {
  1056. }
  1057. public PlaylistMenuCommand(PlaylistItemType addType, int playlistID)
  1058. {
  1059. AddType = addType;
  1060. PlaylistID = playlistID;
  1061. }
  1062. public override string ToString()
  1063. {
  1064. return string.Format("{0} - {1}", AddType, PlaylistID);
  1065. }
  1066. }
  1067. public enum PlaylistItemType
  1068. {
  1069. Series = 1,
  1070. AllEpisodes = 2,
  1071. UnwatchedEpisodes = 3,
  1072. SingleEpisode = 4
  1073. }
  1074. }