PageRenderTime 114ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 1ms

/JMMClient/JMMClient/MainWindow.xaml.cs

https://bitbucket.org/gibwar/jmm-test
C# | 3308 lines | 2545 code | 566 blank | 197 comment | 549 complexity | 1d0fff68e2c0e7591296e3fa34dfcf96 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 System.Diagnostics;
  16. using System.Globalization;
  17. using System.Threading;
  18. using System.Resources;
  19. using JMMClient.Properties;
  20. using JMMClient.ViewModel;
  21. using Infralution.Localization.Wpf;
  22. using System.Configuration;
  23. using JMMClient.ImageDownload;
  24. using System.Windows.Threading;
  25. using System.ServiceModel;
  26. using JMMClient.Forms;
  27. using System.IO;
  28. using NLog;
  29. using System.Collections.ObjectModel;
  30. using JMMClient.UserControls;
  31. using JMMClient.Downloads;
  32. using JMMClient.Utilities;
  33. namespace JMMClient
  34. {
  35. /// <summary>
  36. /// Interaction logic for MainWindow.xaml
  37. /// </summary>
  38. public partial class MainWindow : Window
  39. {
  40. private static Logger logger = LogManager.GetCurrentClassLogger();
  41. public static readonly int TAB_MAIN_Dashboard = 0;
  42. public static readonly int TAB_MAIN_Collection = 1;
  43. public static readonly int TAB_MAIN_Playlists = 2;
  44. public static readonly int TAB_MAIN_Bookmarks = 3;
  45. public static readonly int TAB_MAIN_Server = 4;
  46. public static readonly int TAB_MAIN_FileManger = 5;
  47. public static readonly int TAB_MAIN_Settings = 6;
  48. public static readonly int TAB_MAIN_Pinned = 7;
  49. public static readonly int TAB_MAIN_Downloads = 8;
  50. public static readonly int TAB_MAIN_Search = 9;
  51. public static int CurrentMainTabIndex = TAB_MAIN_Dashboard;
  52. private static readonly int TAB_FileManger_Unrecognised = 0;
  53. private static readonly int TAB_FileManger_Ignored = 1;
  54. private static readonly int TAB_FileManger_ManuallyLinked = 2;
  55. private static readonly int TAB_FileManger_DuplicateFiles = 3;
  56. private static readonly int TAB_FileManger_MultipleFiles = 4;
  57. private static readonly int TAB_FileManger_MissingMyList = 5;
  58. private static readonly int TAB_FileManger_SeriesNoFiles = 6;
  59. private static readonly int TAB_FileManger_MissingEps = 7;
  60. private static readonly int TAB_FileManger_IgnoredAnime = 8;
  61. private static readonly int TAB_FileManger_Avdump = 9;
  62. private static readonly int TAB_FileManger_FileSearch = 10;
  63. private static readonly int TAB_FileManger_Rename = 11;
  64. private static readonly int TAB_FileManger_UpdateData = 12;
  65. private static readonly int TAB_FileManger_Rankings = 13;
  66. public static readonly int TAB_Settings_Essential = 0;
  67. public static readonly int TAB_Settings_AniDB = 1;
  68. public static readonly int TAB_Settings_TvDB = 2;
  69. public static readonly int TAB_Settings_WebCache = 3;
  70. public static readonly int TAB_Settings_Display = 4;
  71. private static System.Timers.Timer postStartTimer = null;
  72. private int lastFileManagerTab = TAB_FileManger_Unrecognised;
  73. public static GroupFilterVM groupFilterVM = null;
  74. public static List<UserCulture> userLanguages = new List<UserCulture>();
  75. public static ImageDownloader imageHelper = null;
  76. private AnimeGroupVM groupBeforeChanges = null;
  77. private GroupFilterVM groupFilterBeforeChanges = null;
  78. BackgroundWorker showChildWrappersWorker = new BackgroundWorker();
  79. BackgroundWorker refreshGroupsWorker = new BackgroundWorker();
  80. BackgroundWorker downloadImagesWorker = new BackgroundWorker();
  81. BackgroundWorker toggleStatusWorker = new BackgroundWorker();
  82. BackgroundWorker moveSeriesWorker = new BackgroundWorker();
  83. BackgroundWorker showDashboardWorker = new BackgroundWorker();
  84. public static VideoHandler videoHandler = new VideoHandler();
  85. public MainWindow()
  86. {
  87. try
  88. {
  89. InitializeComponent();
  90. }
  91. catch(Exception ex)
  92. {
  93. File.WriteAllText(@"C:\jmmerror.txt", ex.ToString());
  94. }
  95. try
  96. {
  97. UnhandledExceptionManager.AddHandler();
  98. //AppSettings.DebugSettingsToLog();
  99. lbGroupsSeries.MouseDoubleClick += new MouseButtonEventHandler(lbGroupsSeries_MouseDoubleClick);
  100. lbGroupsSeries.SelectionChanged += new SelectionChangedEventHandler(lbGroupsSeries_SelectionChanged);
  101. this.grdMain.LayoutUpdated += new EventHandler(grdMain_LayoutUpdated);
  102. this.LayoutUpdated += new EventHandler(MainWindow_LayoutUpdated);
  103. lbPlaylists.SelectionChanged += new SelectionChangedEventHandler(lbPlaylists_SelectionChanged);
  104. showChildWrappersWorker.DoWork += new DoWorkEventHandler(showChildWrappersWorker_DoWork);
  105. showChildWrappersWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(showChildWrappersWorker_RunWorkerCompleted);
  106. downloadImagesWorker.DoWork += new DoWorkEventHandler(downloadImagesWorker_DoWork);
  107. refreshGroupsWorker.DoWork += new DoWorkEventHandler(refreshGroupsWorker_DoWork);
  108. refreshGroupsWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(refreshGroupsWorker_RunWorkerCompleted);
  109. toggleStatusWorker.DoWork += new DoWorkEventHandler(toggleStatusWorker_DoWork);
  110. toggleStatusWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(toggleStatusWorker_RunWorkerCompleted);
  111. moveSeriesWorker.DoWork += new DoWorkEventHandler(moveSeriesWorker_DoWork);
  112. moveSeriesWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(moveSeriesWorker_RunWorkerCompleted);
  113. txtGroupSearch.TextChanged += new TextChangedEventHandler(txtGroupSearch_TextChanged);
  114. showDashboardWorker.DoWork += new DoWorkEventHandler(showDashboardWorker_DoWork);
  115. showDashboardWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(showDashboardWorker_RunWorkerCompleted);
  116. MainListHelperVM.Instance.ViewGroups.Filter = GroupSearchFilter;
  117. cboLanguages.SelectionChanged += new SelectionChangedEventHandler(cboLanguages_SelectionChanged);
  118. if (MainListHelperVM.Instance.SeriesSearchTextBox == null) MainListHelperVM.Instance.SeriesSearchTextBox = seriesSearch.txtSeriesSearch;
  119. //grdSplitEps.DragCompleted += new System.Windows.Controls.Primitives.DragCompletedEventHandler(grdSplitEps_DragCompleted);
  120. imageHelper = new ImageDownloader();
  121. imageHelper.Init();
  122. videoHandler.Init();
  123. //videoHandler.HandleFileChange(AppSettings.MPCFolder + "\\mpc-hc.ini");
  124. InitCulture();
  125. imageHelper.QueueUpdateEvent += new ImageDownloader.QueueUpdateEventHandler(imageHelper_QueueUpdateEvent);
  126. cboGroupSort.Items.Clear();
  127. foreach (string sType in GroupFilterHelper.GetAllSortTypes())
  128. cboGroupSort.Items.Add(sType);
  129. cboGroupSort.SelectedIndex = 0;
  130. btnToolbarSort.Click += new RoutedEventHandler(btnToolbarSort_Click);
  131. tabControl1.SelectionChanged += new SelectionChangedEventHandler(tabControl1_SelectionChanged);
  132. tabFileManager.SelectionChanged += new SelectionChangedEventHandler(tabFileManager_SelectionChanged);
  133. tabSettingsChild.SelectionChanged += new SelectionChangedEventHandler(tabSettingsChild_SelectionChanged);
  134. this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
  135. this.StateChanged += new EventHandler(MainWindow_StateChanged);
  136. // Have commented this out because it is no good when Desktop and Server are sharing
  137. // the same base image path
  138. //DeleteAvatarImages();
  139. this.AddHandler(CloseableTabItem.CloseTabEvent, new RoutedEventHandler(this.CloseTab));
  140. btnUpdateMediaInfo.Click += new RoutedEventHandler(btnUpdateMediaInfo_Click);
  141. btnAbout.Click += new RoutedEventHandler(btnAbout_Click);
  142. btnClearHasherQueue.Click += new RoutedEventHandler(btnClearHasherQueue_Click);
  143. btnClearGeneralQueue.Click += new RoutedEventHandler(btnClearGeneralQueue_Click);
  144. btnClearServerImageQueue.Click += new RoutedEventHandler(btnClearServerImageQueue_Click);
  145. JMMServerVM.Instance.BaseImagePath = Utils.GetBaseImagesPath();
  146. // timer for automatic updates
  147. postStartTimer = new System.Timers.Timer();
  148. postStartTimer.AutoReset = false;
  149. postStartTimer.Interval = 5 * 1000; // 15 seconds
  150. postStartTimer.Elapsed += new System.Timers.ElapsedEventHandler(postStartTimer_Elapsed);
  151. btnSwitchUser.Click += new RoutedEventHandler(btnSwitchUser_Click);
  152. //videoHandler.HandleFileChange(@"C:\Program Files (x86)\Combined Community Codec Pack\MPC\mpc-hc.ini");
  153. MainWindow.videoHandler.VideoWatchedEvent += new VideoHandler.VideoWatchedEventHandler(videoHandler_VideoWatchedEvent);
  154. if (AppSettings.DashboardType == DashboardType.Normal)
  155. dash.Visibility = System.Windows.Visibility.Visible;
  156. else
  157. dashMetro.Visibility = System.Windows.Visibility.Visible;
  158. UserSettingsVM.Instance.SetDashMetro_Image_Width();
  159. }
  160. catch (Exception ex)
  161. {
  162. logger.ErrorException(ex.ToString(), ex);
  163. }
  164. }
  165. void btnSwitchUser_Click(object sender, RoutedEventArgs e)
  166. {
  167. // authenticate user
  168. if (JMMServerVM.Instance.ServerOnline)
  169. {
  170. if (JMMServerVM.Instance.AuthenticateUser())
  171. {
  172. MainListHelperVM.Instance.ClearData();
  173. MainListHelperVM.Instance.ShowChildWrappers(null);
  174. RecentAdditionsType addType = RecentAdditionsType.Episode;
  175. if (dash.cboDashRecentAdditionsType.SelectedIndex == 0) addType = RecentAdditionsType.Episode;
  176. if (dash.cboDashRecentAdditionsType.SelectedIndex == 1) addType = RecentAdditionsType.Series;
  177. RefreshOptions opt = new RefreshOptions();
  178. opt.TraktScrobbles = dash.togTraktScrobbles.IsChecked.Value;
  179. opt.TraktShouts = dash.togTraktShouts.IsChecked.Value;
  180. opt.RecentAdditionType = addType;
  181. opt.RefreshRecentAdditions = true;
  182. opt.RefreshContinueWatching = true;
  183. opt.RefreshOtherWidgets = true;
  184. showDashboardWorker.RunWorkerAsync(opt);
  185. tabControl1.SelectedIndex = TAB_MAIN_Dashboard;
  186. }
  187. }
  188. }
  189. void videoHandler_VideoWatchedEvent(VideoWatchedEventArgs ev)
  190. {
  191. if (tabControl1.SelectedIndex == TAB_MAIN_Collection || tabControl1.SelectedIndex == TAB_MAIN_Pinned)
  192. {
  193. //RefreshView();
  194. }
  195. }
  196. void btnClearServerImageQueue_Click(object sender, RoutedEventArgs e)
  197. {
  198. try
  199. {
  200. this.Cursor = Cursors.Wait;
  201. JMMServerVM.Instance.clientBinaryHTTP.ClearImagesQueue();
  202. }
  203. catch (Exception ex)
  204. {
  205. Utils.ShowErrorMessage(ex);
  206. }
  207. this.Cursor = Cursors.Arrow;
  208. }
  209. void btnClearGeneralQueue_Click(object sender, RoutedEventArgs e)
  210. {
  211. try
  212. {
  213. this.Cursor = Cursors.Wait;
  214. JMMServerVM.Instance.clientBinaryHTTP.ClearGeneralQueue();
  215. }
  216. catch (Exception ex)
  217. {
  218. Utils.ShowErrorMessage(ex);
  219. }
  220. this.Cursor = Cursors.Arrow;
  221. }
  222. void btnClearHasherQueue_Click(object sender, RoutedEventArgs e)
  223. {
  224. try
  225. {
  226. this.Cursor = Cursors.Wait;
  227. JMMServerVM.Instance.clientBinaryHTTP.ClearHasherQueue();
  228. }
  229. catch (Exception ex)
  230. {
  231. Utils.ShowErrorMessage(ex);
  232. }
  233. this.Cursor = Cursors.Arrow;
  234. }
  235. void btnAbout_Click(object sender, RoutedEventArgs e)
  236. {
  237. AboutForm frm = new AboutForm();
  238. frm.Owner = this;
  239. frm.ShowDialog();
  240. }
  241. void btnUpdateMediaInfo_Click(object sender, RoutedEventArgs e)
  242. {
  243. try
  244. {
  245. JMMServerVM.Instance.clientBinaryHTTP.RefreshAllMediaInfo();
  246. MessageBox.Show("Process is Running", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
  247. }
  248. catch (Exception ex)
  249. {
  250. Utils.ShowErrorMessage(ex);
  251. }
  252. }
  253. private void DeleteAvatarImages()
  254. {
  255. try
  256. {
  257. string path = Utils.GetTraktImagePath_Avatars();
  258. if (!Directory.Exists(path)) return;
  259. string[] imageFiles = Directory.GetFiles(path, "*.jpg");
  260. foreach (string filename in imageFiles)
  261. File.Delete(filename);
  262. }
  263. catch { }
  264. }
  265. private void CloseTab(object source, RoutedEventArgs args)
  266. {
  267. System.Windows.Controls.TabItem tabItem = args.Source as System.Windows.Controls.TabItem;
  268. if (tabItem != null)
  269. {
  270. System.Windows.Controls.TabControl tabControl = tabItem.Parent as System.Windows.Controls.TabControl;
  271. if (tabControl != null)
  272. tabControl.Items.Remove(tabItem);
  273. }
  274. }
  275. void MainWindow_StateChanged(object sender, EventArgs e)
  276. {
  277. //if (this.WindowState == System.Windows.WindowState.Minimized) this.Hide();
  278. if (this.WindowState == System.Windows.WindowState.Normal || this.WindowState == System.Windows.WindowState.Maximized)
  279. AppSettings.DefaultWindowState = this.WindowState;
  280. }
  281. void MainWindow_Loaded(object sender, RoutedEventArgs e)
  282. {
  283. //this.WindowState = AppSettings.DefaultWindowState;
  284. if (AppSettings.WindowFullScreen)
  285. SetWindowFullscreen();
  286. else
  287. SetWindowNormal();
  288. Utils.ClearAutoUpdateCache();
  289. // validate settings
  290. JMMServerVM.Instance.Test();
  291. bool loggedIn = false;
  292. if (JMMServerVM.Instance.ServerOnline)
  293. loggedIn = JMMServerVM.Instance.LoginAsLastUser();
  294. if (!loggedIn)
  295. {
  296. // authenticate user
  297. if (JMMServerVM.Instance.ServerOnline && !JMMServerVM.Instance.AuthenticateUser())
  298. {
  299. this.Close();
  300. return;
  301. }
  302. }
  303. if (JMMServerVM.Instance.ServerOnline)
  304. {
  305. tabControl1.SelectedIndex = TAB_MAIN_Dashboard;
  306. DisplayMainTab(TAB_MAIN_Dashboard);
  307. DownloadAllImages();
  308. }
  309. else
  310. tabControl1.SelectedIndex = TAB_MAIN_Settings;
  311. System.Reflection.Assembly a = System.Reflection.Assembly.GetExecutingAssembly();
  312. if (a != null)
  313. {
  314. JMMServerVM.Instance.ApplicationVersion = Utils.GetApplicationVersion(a);
  315. }
  316. UTorrentHelperVM.Instance.ValidateCredentials();
  317. postStartTimer.Start();
  318. }
  319. void postStartTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
  320. {
  321. postStartTimer.Stop();
  322. UTorrentHelperVM.Instance.Init();
  323. System.Windows.Application.Current.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (Action)delegate()
  324. {
  325. automaticUpdater.ForceCheckForUpdate(true);
  326. });
  327. if (JMMServerVM.Instance.ServerOnline)
  328. DownloadAllImages();
  329. }
  330. void MainWindow_LayoutUpdated(object sender, EventArgs e)
  331. {
  332. // Why am I doing this?
  333. // Basically there is weird problem if you try and set the content control's width to the exact
  334. // ViewportWidth of the parent scroller.
  335. // On some resolutions, when you maximise the window it will cause UI glitches
  336. // By setting it slightly less than the max width, these problems go away
  337. try
  338. {
  339. //Debug.Print("Scroller width = {0}", Scroller.ActualWidth);
  340. //Debug.Print("Scroller ViewportWidth = {0}", Scroller.ViewportWidth);
  341. double tempWidth = ccDetail.ActualWidth - 8;
  342. double tempHeight = ccDetail.ActualHeight - 8;
  343. if (tempWidth > 0)
  344. {
  345. MainListHelperVM.Instance.MainScrollerWidth = tempWidth;
  346. }
  347. tempWidth = tabControl1.ActualWidth - 20;
  348. //tempWidth = tabControl1.ActualWidth - 300;
  349. if (tempWidth > 0)
  350. MainListHelperVM.Instance.FullScrollerWidth = tempWidth;
  351. tempHeight = tabControl1.ActualHeight - 50;
  352. if (tempHeight > 0)
  353. MainListHelperVM.Instance.FullScrollerHeight = tempHeight;
  354. tempWidth = ScrollerPlaylist.ViewportWidth - 8;
  355. if (tempWidth > 0)
  356. MainListHelperVM.Instance.PlaylistScrollerWidth = tempWidth;
  357. tempWidth = tabcDownloads.ActualWidth - 130;
  358. if (tempWidth > 0)
  359. MainListHelperVM.Instance.DownloadRecScrollerWidth = tempWidth;
  360. }
  361. catch (Exception ex)
  362. {
  363. logger.ErrorException(ex.ToString(), ex);
  364. }
  365. }
  366. void tabFileManager_SelectionChanged(object sender, SelectionChangedEventArgs e)
  367. {
  368. try
  369. {
  370. if (e.Source is System.Windows.Controls.TabControl)
  371. {
  372. System.Windows.Controls.TabControl tab = e.Source as System.Windows.Controls.TabControl;
  373. this.Cursor = Cursors.Wait;
  374. if (tab.SelectedIndex == TAB_FileManger_Unrecognised)
  375. {
  376. if (unRecVids.UnrecognisedFiles.Count == 0) unRecVids.RefreshUnrecognisedFiles();
  377. if (unRecVids.AllSeries.Count == 0) unRecVids.RefreshSeries();
  378. lastFileManagerTab = TAB_FileManger_Unrecognised;
  379. }
  380. if (tab.SelectedIndex == TAB_FileManger_Ignored)
  381. {
  382. if (ignoredFiles.IgnoredFilesCollection.Count == 0) ignoredFiles.RefreshIgnoredFiles();
  383. lastFileManagerTab = TAB_FileManger_Ignored;
  384. }
  385. if (tab.SelectedIndex == TAB_FileManger_ManuallyLinked)
  386. {
  387. if (linkedFiles.ManuallyLinkedFiles.Count == 0) linkedFiles.RefreshLinkedFiles();
  388. lastFileManagerTab = TAB_FileManger_ManuallyLinked;
  389. }
  390. if (tab.SelectedIndex == TAB_FileManger_DuplicateFiles)
  391. {
  392. if (duplicateFiles.DuplicateFilesCollection.Count == 0) duplicateFiles.RefreshDuplicateFiles();
  393. lastFileManagerTab = TAB_FileManger_DuplicateFiles;
  394. }
  395. if (tab.SelectedIndex == TAB_FileManger_MultipleFiles)
  396. {
  397. //if (multipleFiles.CurrentEpisodes.Count == 0) multipleFiles.RefreshMultipleFiles();
  398. lastFileManagerTab = TAB_FileManger_MultipleFiles;
  399. }
  400. if (tab.SelectedIndex == TAB_FileManger_Rename)
  401. {
  402. if (fileRenaming.RenameScripts.Count == 0) fileRenaming.RefreshScripts();
  403. lastFileManagerTab = TAB_FileManger_Rename;
  404. }
  405. if (tab.SelectedIndex == TAB_FileManger_Rankings)
  406. {
  407. if (rankings.AllAnime.Count == 0) rankings.Init();
  408. lastFileManagerTab = TAB_FileManger_Rankings;
  409. }
  410. this.Cursor = Cursors.Arrow;
  411. }
  412. }
  413. catch (Exception ex)
  414. {
  415. Utils.ShowErrorMessage(ex);
  416. }
  417. }
  418. void showDashboardWorker_DoWork(object sender, DoWorkEventArgs e)
  419. {
  420. RefreshOptions opt = e.Argument as RefreshOptions;
  421. DashboardVM.Instance.RefreshData(opt.TraktScrobbles, opt.TraktShouts, opt.RefreshContinueWatching, opt.RefreshRecentAdditions,
  422. opt.RefreshOtherWidgets, opt.RecentAdditionType);
  423. }
  424. void showDashboardWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  425. {
  426. this.Cursor = Cursors.Arrow;
  427. tabControl1.IsEnabled = true;
  428. }
  429. private void DisplayMainTab(int tabIndex)
  430. {
  431. try
  432. {
  433. CurrentMainTabIndex = tabIndex;
  434. if (tabIndex == TAB_MAIN_Dashboard)
  435. {
  436. if (dash.Visibility == System.Windows.Visibility.Visible)
  437. {
  438. if (DashboardVM.Instance.EpsWatchNext_Recent.Count == 0 && DashboardVM.Instance.SeriesMissingEps.Count == 0
  439. && DashboardVM.Instance.MiniCalendar.Count == 0 && DashboardVM.Instance.RecommendationsWatch.Count == 0
  440. && DashboardVM.Instance.RecommendationsDownload.Count == 0)
  441. {
  442. tabControl1.IsEnabled = false;
  443. this.Cursor = Cursors.Wait;
  444. RecentAdditionsType addType = RecentAdditionsType.Episode;
  445. if (dash.cboDashRecentAdditionsType.SelectedIndex == 0) addType = RecentAdditionsType.Episode;
  446. if (dash.cboDashRecentAdditionsType.SelectedIndex == 1) addType = RecentAdditionsType.Series;
  447. RefreshOptions opt = new RefreshOptions();
  448. opt.TraktScrobbles = dash.togTraktScrobbles.IsChecked.Value;
  449. opt.TraktShouts = dash.togTraktShouts.IsChecked.Value;
  450. opt.RecentAdditionType = addType;
  451. opt.RefreshRecentAdditions = true;
  452. opt.RefreshContinueWatching = true;
  453. opt.RefreshOtherWidgets = true;
  454. showDashboardWorker.RunWorkerAsync(opt);
  455. }
  456. }
  457. else
  458. {
  459. if (DashboardMetroVM.Instance.ContinueWatching.Count == 0)
  460. dashMetro.RefreshAllData();
  461. }
  462. }
  463. if (tabIndex == TAB_MAIN_Collection)
  464. {
  465. if (MainListHelperVM.Instance.AllGroups.Count == 0)
  466. {
  467. MainListHelperVM.Instance.RefreshGroupsSeriesData();
  468. }
  469. if (MainListHelperVM.Instance.CurrentWrapper == null && lbGroupsSeries.Items.Count == 0)
  470. {
  471. MainListHelperVM.Instance.SearchTextBox = txtGroupSearch;
  472. MainListHelperVM.Instance.CurrentGroupFilter = MainListHelperVM.Instance.AllGroupFilter;
  473. MainListHelperVM.Instance.ShowChildWrappers(MainListHelperVM.Instance.CurrentWrapper);
  474. lbGroupsSeries.SelectedIndex = 0;
  475. }
  476. }
  477. if (tabIndex == TAB_MAIN_FileManger)
  478. {
  479. if (unRecVids.UnrecognisedFiles.Count == 0) unRecVids.RefreshUnrecognisedFiles();
  480. }
  481. if (tabIndex == TAB_MAIN_Playlists)
  482. {
  483. if (PlaylistHelperVM.Instance.Playlists == null || PlaylistHelperVM.Instance.Playlists.Count == 0) PlaylistHelperVM.Instance.RefreshData();
  484. if (lbPlaylists.Items.Count > 0 && lbPlaylists.SelectedIndex < 0)
  485. lbPlaylists.SelectedIndex = 0;
  486. }
  487. if (tabIndex == TAB_MAIN_Bookmarks)
  488. {
  489. if (MainListHelperVM.Instance.BookmarkedAnime == null || MainListHelperVM.Instance.BookmarkedAnime.Count == 0) MainListHelperVM.Instance.RefreshBookmarkedAnime();
  490. if (ucBookmarks.lbBookmarks.Items.Count > 0)
  491. ucBookmarks.lbBookmarks.SelectedIndex = 0;
  492. }
  493. if (tabIndex == TAB_MAIN_Search)
  494. {
  495. if (MainListHelperVM.Instance.AllSeries == null || MainListHelperVM.Instance.AllSeries.Count == 0) MainListHelperVM.Instance.RefreshGroupsSeriesData();
  496. }
  497. if (tabIndex == TAB_MAIN_Server)
  498. {
  499. if (JMMServerVM.Instance.ImportFolders.Count == 0) JMMServerVM.Instance.RefreshImportFolders();
  500. }
  501. if (tabIndex == TAB_MAIN_Settings)
  502. {
  503. if (JMMServerVM.Instance.ImportFolders.Count == 0) JMMServerVM.Instance.RefreshImportFolders();
  504. if (JMMServerVM.Instance.SelectedLanguages.Count == 0) JMMServerVM.Instance.RefreshNamingLanguages();
  505. if (JMMServerVM.Instance.AllUsers.Count == 0) JMMServerVM.Instance.RefreshAllUsers();
  506. if (JMMServerVM.Instance.AllCategories.Count == 0) JMMServerVM.Instance.RefreshAllCategories();
  507. }
  508. if (tabIndex == TAB_MAIN_Downloads)
  509. {
  510. if (UserSettingsVM.Instance.SelectedTorrentSources.Count == 0 || UserSettingsVM.Instance.UnselectedTorrentSources.Count == 0)
  511. UserSettingsVM.Instance.RefreshTorrentSources();
  512. }
  513. }
  514. catch (Exception ex)
  515. {
  516. Utils.ShowErrorMessage(ex);
  517. tabControl1.IsEnabled = true;
  518. }
  519. }
  520. void tabControl1_SelectionChanged(object sender, SelectionChangedEventArgs e)
  521. {
  522. try
  523. {
  524. SetColours();
  525. //if (!this.IsLoaded || !JMMServerVM.Instance.UserAuthenticated) return;
  526. if (!JMMServerVM.Instance.UserAuthenticated) return;
  527. TabControl tab = e.Source as TabControl;
  528. if (tab == null) return;
  529. if (!tab.Name.Equals("tabControl1", StringComparison.InvariantCultureIgnoreCase)) return;
  530. DisplayMainTab(tabControl1.SelectedIndex);
  531. }
  532. catch (Exception ex)
  533. {
  534. Utils.ShowErrorMessage(ex);
  535. tabControl1.IsEnabled = true;
  536. }
  537. }
  538. void tabSettingsChild_SelectionChanged(object sender, SelectionChangedEventArgs e)
  539. {
  540. try
  541. {
  542. if (e.Source is System.Windows.Controls.TabControl)
  543. {
  544. System.Windows.Controls.TabControl tab = e.Source as System.Windows.Controls.TabControl;
  545. if (tab.SelectedIndex == TAB_Settings_Display)
  546. {
  547. if (JMMServerVM.Instance.SelectedLanguages.Count == 0) JMMServerVM.Instance.RefreshNamingLanguages();
  548. }
  549. }
  550. }
  551. catch (Exception ex)
  552. {
  553. Utils.ShowErrorMessage(ex);
  554. }
  555. }
  556. void btnToolbarSort_Click(object sender, RoutedEventArgs e)
  557. {
  558. MainListHelperVM.Instance.ViewGroups.SortDescriptions.Clear();
  559. GroupFilterSorting sortType = GroupFilterHelper.GetEnumForText_Sorting(cboGroupSort.SelectedItem.ToString());
  560. MainListHelperVM.Instance.ViewGroups.SortDescriptions.Add(GroupFilterHelper.GetSortDescription(sortType, GroupFilterSortDirection.Asc));
  561. }
  562. void imageHelper_QueueUpdateEvent(QueueUpdateEventArgs ev)
  563. {
  564. try
  565. {
  566. this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new System.Windows.Forms.MethodInvoker(delegate()
  567. {
  568. tbImageDownloadQueueStatus.Text = ev.queueCount.ToString();
  569. }));
  570. }
  571. catch (Exception ex)
  572. {
  573. Utils.ShowErrorMessage(ex);
  574. }
  575. }
  576. void cboLanguages_SelectionChanged(object sender, SelectionChangedEventArgs e)
  577. {
  578. SetCulture();
  579. }
  580. private void InitCulture()
  581. {
  582. try
  583. {
  584. string currentCulture = AppSettings.Culture;
  585. cboLanguages.ItemsSource = UserCulture.SupportedLanguages;
  586. for (int i = 0; i < cboLanguages.Items.Count; i++)
  587. {
  588. UserCulture ul = cboLanguages.Items[i] as UserCulture;
  589. if (ul.Culture.Trim().ToUpper() == currentCulture.Trim().ToUpper())
  590. {
  591. cboLanguages.SelectedIndex = i;
  592. break;
  593. }
  594. }
  595. if (cboLanguages.SelectedIndex < 0)
  596. cboLanguages.SelectedIndex = 0;
  597. }
  598. catch (Exception ex)
  599. {
  600. Utils.ShowErrorMessage(ex);
  601. }
  602. }
  603. private void SetCulture()
  604. {
  605. if (cboLanguages.SelectedItem == null) return;
  606. UserCulture ul = cboLanguages.SelectedItem as UserCulture;
  607. try
  608. {
  609. CultureInfo ci = new CultureInfo(ul.Culture);
  610. CultureManager.UICulture = ci;
  611. AppSettings.Culture = ul.Culture;
  612. }
  613. catch (Exception ex)
  614. {
  615. Utils.ShowErrorMessage(ex);
  616. }
  617. }
  618. void txtGroupSearch_TextChanged(object sender, TextChangedEventArgs e)
  619. {
  620. try
  621. {
  622. SetDetailBinding(null);
  623. // move to all groups
  624. if (MainListHelperVM.Instance.CurrentWrapper == null)
  625. MainListHelperVM.Instance.ShowAllGroups();
  626. MainListHelperVM.Instance.ViewGroups.Refresh();
  627. }
  628. catch (Exception ex)
  629. {
  630. Utils.ShowErrorMessage(ex);
  631. }
  632. }
  633. private bool GroupSearchFilter(object obj)
  634. {
  635. MainListWrapper grp = obj as MainListWrapper;
  636. if (grp == null) return true;
  637. if (obj.GetType() != typeof(AnimeGroupVM) && obj.GetType() != typeof(AnimeSeriesVM))
  638. return true;
  639. // first evaluate the group filter
  640. // if the group doesn't match the group filter we won't continue
  641. if (obj.GetType() == typeof(AnimeGroupVM))
  642. {
  643. AnimeGroupVM grpvm = obj as AnimeGroupVM;
  644. //if (!GroupSearchFilterHelper.EvaluateGroupFilter(MainListHelperVM.Instance.CurrentGroupFilter, grpvm)) return false;
  645. return GroupSearchFilterHelper.EvaluateGroupTextSearch(grpvm, txtGroupSearch.Text);
  646. }
  647. if (obj.GetType() == typeof(AnimeSeriesVM))
  648. {
  649. AnimeSeriesVM ser = obj as AnimeSeriesVM;
  650. //if (!GroupSearchFilterHelper.EvaluateGroupFilter(MainListHelperVM.Instance.CurrentGroupFilter, ser)) return false;
  651. return GroupSearchFilterHelper.EvaluateSeriesTextSearch(ser, txtGroupSearch.Text);
  652. }
  653. return true;
  654. }
  655. void refreshGroupsWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  656. {
  657. showChildWrappersWorker.RunWorkerAsync(MainListHelperVM.Instance.CurrentWrapper);
  658. }
  659. void refreshGroupsWorker_DoWork(object sender, DoWorkEventArgs e)
  660. {
  661. try
  662. {
  663. MainListHelperVM.Instance.RefreshGroupsSeriesData();
  664. DownloadAllImages();
  665. }
  666. catch (Exception ex)
  667. {
  668. Utils.ShowErrorMessage(ex);
  669. }
  670. }
  671. void showChildWrappersWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  672. {
  673. try
  674. {
  675. EnableDisableGroupControls(true);
  676. if (lbGroupsSeries.Items.Count > 0)
  677. {
  678. HighlightMainListItem();
  679. }
  680. else
  681. SetDetailBinding(null);
  682. }
  683. catch (Exception ex)
  684. {
  685. Utils.ShowErrorMessage(ex);
  686. }
  687. }
  688. void showChildWrappersWorker_DoWork(object sender, DoWorkEventArgs e)
  689. {
  690. try
  691. {
  692. MainListHelperVM.Instance.ShowChildWrappers(e.Argument as MainListWrapper);
  693. }
  694. catch (Exception ex)
  695. {
  696. Utils.ShowErrorMessage(ex);
  697. }
  698. }
  699. void toggleStatusWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  700. {
  701. EnableDisableGroupControls(true);
  702. this.Cursor = Cursors.Arrow;
  703. }
  704. void toggleStatusWorker_DoWork(object sender, DoWorkEventArgs e)
  705. {
  706. try
  707. {
  708. object obj = e.Argument;
  709. AnimeSeriesVM ser = null;
  710. bool newStatus = false;
  711. if (obj.GetType() == typeof(VideoDetailedVM))
  712. {
  713. VideoDetailedVM vid = obj as VideoDetailedVM;
  714. newStatus = !vid.Watched;
  715. JMMServerVM.Instance.clientBinaryHTTP.ToggleWatchedStatusOnVideo(vid.VideoLocalID, newStatus, JMMServerVM.Instance.CurrentUser.JMMUserID.Value);
  716. MainListHelperVM.Instance.UpdateHeirarchy(vid);
  717. ser = MainListHelperVM.Instance.GetSeriesForVideo(vid.VideoLocalID);
  718. }
  719. if (obj.GetType() == typeof(AnimeEpisodeVM))
  720. {
  721. AnimeEpisodeVM ep = obj as AnimeEpisodeVM;
  722. newStatus = !ep.Watched;
  723. JMMServerBinary.Contract_ToggleWatchedStatusOnEpisode_Response response = JMMServerVM.Instance.clientBinaryHTTP.ToggleWatchedStatusOnEpisode(ep.AnimeEpisodeID,
  724. newStatus, JMMServerVM.Instance.CurrentUser.JMMUserID.Value);
  725. if (!string.IsNullOrEmpty(response.ErrorMessage))
  726. {
  727. MessageBox.Show(response.ErrorMessage, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
  728. return;
  729. }
  730. MainListHelperVM.Instance.UpdateHeirarchy(response.AnimeEpisode);
  731. ser = MainListHelperVM.Instance.GetSeriesForEpisode(ep);
  732. }
  733. if (newStatus == true && ser != null)
  734. {
  735. Utils.PromptToRateSeries(ser, this);
  736. }
  737. }
  738. catch (Exception ex)
  739. {
  740. Utils.ShowErrorMessage(ex);
  741. }
  742. }
  743. void moveSeriesWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  744. {
  745. EnableDisableGroupControls(true);
  746. SetDetailBinding(null);
  747. MainListHelperVM.Instance.RefreshGroupsSeriesData();
  748. MainListHelperVM.Instance.ShowChildWrappers(MainListHelperVM.Instance.CurrentWrapper);
  749. this.Cursor = Cursors.Arrow;
  750. MainListHelperVM.Instance.ViewGroups.Refresh();
  751. showChildWrappersWorker.RunWorkerAsync(MainListHelperVM.Instance.CurrentWrapper);
  752. }
  753. void moveSeriesWorker_DoWork(object sender, DoWorkEventArgs e)
  754. {
  755. try
  756. {
  757. object obj = e.Argument;
  758. if (obj.GetType() != typeof(MoveSeriesDetails)) return;
  759. MoveSeriesDetails request = obj as MoveSeriesDetails;
  760. DateTime start = DateTime.Now;
  761. //request.UpdatedSeries.Save();
  762. JMMServerBinary.Contract_AnimeSeries_SaveResponse response =
  763. JMMServerVM.Instance.clientBinaryHTTP.MoveSeries(request.UpdatedSeries.AnimeSeriesID.Value, request.UpdatedSeries.AnimeGroupID,
  764. JMMServerVM.Instance.CurrentUser.JMMUserID.Value);
  765. if (!string.IsNullOrEmpty(response.ErrorMessage))
  766. {
  767. this.Cursor = Cursors.Arrow;
  768. MessageBox.Show(response.ErrorMessage);
  769. return;
  770. }
  771. else
  772. {
  773. request.UpdatedSeries.Populate(response.AnimeSeries);
  774. }
  775. // update all the attached groups
  776. /*Dictionary<int, JMMServerBinary.Contract_AnimeGroup> grpsDict = new Dictionary<int, JMMServerBinary.Contract_AnimeGroup>();
  777. List<JMMServerBinary.Contract_AnimeGroup> grps = JMMServerVM.Instance.clientBinaryHTTP.GetAllGroupsAboveGroupInclusive(request.UpdatedSeries.AnimeGroupID,
  778. JMMServerVM.Instance.CurrentUser.JMMUserID.Value);
  779. List<JMMServerBinary.Contract_AnimeGroup> grpsOld = JMMServerVM.Instance.clientBinaryHTTP.GetAllGroupsAboveGroupInclusive(request.OldAnimeGroupID,
  780. JMMServerVM.Instance.CurrentUser.JMMUserID.Value);
  781. foreach (JMMServerBinary.Contract_AnimeGroup tempGrp in grps)
  782. grpsDict[tempGrp.AnimeGroupID] = tempGrp;
  783. foreach (JMMServerBinary.Contract_AnimeGroup tempGrp in grpsOld)
  784. grpsDict[tempGrp.AnimeGroupID] = tempGrp;
  785. foreach (AnimeGroupVM grp in MainListHelperVM.Instance.AllGroups)
  786. {
  787. if (grpsDict.ContainsKey(grp.AnimeGroupID.Value))
  788. {
  789. grp.Populate(grpsDict[grp.AnimeGroupID.Value]);
  790. }
  791. }
  792. TimeSpan ts = DateTime.Now - start;
  793. Console.Write(ts.TotalMilliseconds);*/
  794. }
  795. catch (Exception ex)
  796. {
  797. Utils.ShowErrorMessage(ex);
  798. }
  799. }
  800. private void DownloadAllImages()
  801. {
  802. //if (!downloadImagesWorker.IsBusy)
  803. // downloadImagesWorker.RunWorkerAsync();
  804. }
  805. void downloadImagesWorker_DoWork(object sender, DoWorkEventArgs e)
  806. {
  807. // 1. Download posters from AniDB
  808. List<JMMServerBinary.Contract_AniDBAnime> contracts = JMMServerVM.Instance.clientBinaryHTTP.GetAllAnime();
  809. int i = 0;
  810. foreach (JMMServerBinary.Contract_AniDBAnime anime in contracts)
  811. {
  812. //Thread.Sleep(5); // don't use too many resources
  813. imageHelper.DownloadAniDBCover(new AniDB_AnimeVM(anime), false);
  814. i++;
  815. //if (i == 80) break;
  816. }
  817. // 2. Download posters from TvDB
  818. List<JMMServerBinary.Contract_TvDB_ImagePoster> posters = JMMServerVM.Instance.clientBinaryHTTP.GetAllTvDBPosters(null);
  819. foreach (JMMServerBinary.Contract_TvDB_ImagePoster poster in posters)
  820. {
  821. //Thread.Sleep(5); // don't use too many resources
  822. imageHelper.DownloadTvDBPoster(new TvDB_ImagePosterVM(poster), false);
  823. }
  824. // 2a. Download posters from MovieDB
  825. List<JMMServerBinary.Contract_MovieDB_Poster> moviePosters = JMMServerVM.Instance.clientBinaryHTTP.GetAllMovieDBPosters(null);
  826. foreach (JMMServerBinary.Contract_MovieDB_Poster poster in moviePosters)
  827. {
  828. //Thread.Sleep(5); // don't use too many resources
  829. imageHelper.DownloadMovieDBPoster(new MovieDB_PosterVM(poster), false);
  830. }
  831. // 3. Download wide banners from TvDB
  832. List<JMMServerBinary.Contract_TvDB_ImageWideBanner> banners = JMMServerVM.Instance.clientBinaryHTTP.GetAllTvDBWideBanners(null);
  833. foreach (JMMServerBinary.Contract_TvDB_ImageWideBanner banner in banners)
  834. {
  835. //Thread.Sleep(5); // don't use too many resources
  836. imageHelper.DownloadTvDBWideBanner(new TvDB_ImageWideBannerVM(banner), false);
  837. }
  838. // 4. Download fanart from TvDB
  839. List<JMMServerBinary.Contract_TvDB_ImageFanart> fanarts = JMMServerVM.Instance.clientBinaryHTTP.GetAllTvDBFanart(null);
  840. foreach (JMMServerBinary.Contract_TvDB_ImageFanart fanart in fanarts)
  841. {
  842. //Thread.Sleep(5); // don't use too many resources
  843. imageHelper.DownloadTvDBFanart(new TvDB_ImageFanartVM(fanart), false);
  844. }
  845. // 4a. Download fanart from MovieDB
  846. List<JMMServerBinary.Contract_MovieDB_Fanart> movieFanarts = JMMServerVM.Instance.clientBinaryHTTP.GetAllMovieDBFanart(null);
  847. foreach (JMMServerBinary.Contract_MovieDB_Fanart fanart in movieFanarts)
  848. {
  849. //Thread.Sleep(5); // don't use too many resources
  850. imageHelper.DownloadMovieDBFanart(new MovieDB_FanartVM(fanart), false);
  851. }
  852. // 5. Download episode images from TvDB
  853. List<JMMServerBinary.Contract_TvDB_Episode> eps = JMMServerVM.Instance.clientBinaryHTTP.GetAllTvDBEpisodes(null);
  854. foreach (JMMServerBinary.Contract_TvDB_Episode episode in eps)
  855. {
  856. //Thread.Sleep(5); // don't use too many resources
  857. imageHelper.DownloadTvDBEpisode(new TvDB_EpisodeVM(episode), false);
  858. }
  859. // 6. Download posters from Trakt
  860. List<JMMServerBinary.Contract_Trakt_ImagePoster> traktPosters = JMMServerVM.Instance.clientBinaryHTTP.GetAllTraktPosters(null);
  861. foreach (JMMServerBinary.Contract_Trakt_ImagePoster traktposter in traktPosters)
  862. {
  863. //Thread.Sleep(5); // don't use too many resources
  864. if (string.IsNullOrEmpty(traktposter.ImageURL)) continue;
  865. imageHelper.DownloadTraktPoster(new Trakt_ImagePosterVM(traktposter), false);
  866. }
  867. // 7. Download fanart from Trakt
  868. List<JMMServerBinary.Contract_Trakt_ImageFanart> traktFanarts = JMMServerVM.Instance.clientBinaryHTTP.GetAllTraktFanart(null);
  869. foreach (JMMServerBinary.Contract_Trakt_ImageFanart traktFanart in traktFanarts)
  870. {
  871. //Thread.Sleep(5); // don't use too many resources
  872. if (string.IsNullOrEmpty(traktFanart.ImageURL)) continue;
  873. imageHelper.DownloadTraktFanart(new Trakt_ImageFanartVM(traktFanart), false);
  874. }
  875. // 8. Download episode images from Trakt
  876. List<JMMServerBinary.Contract_Trakt_Episode> traktEpisodes = JMMServerVM.Instance.clientBinaryHTTP.GetAllTraktEpisodes(null);
  877. foreach (JMMServerBinary.Contract_Trakt_Episode traktEp in traktEpisodes)
  878. {
  879. //Thread.Sleep(5); // don't use too many resources
  880. if (string.IsNullOrEmpty(traktEp.EpisodeImage)) continue;
  881. // special case for trak episodes
  882. // Trakt will return the fanart image when no episode image exists, but we don't want this
  883. int pos = traktEp.EpisodeImage.IndexOf(@"episodes/");
  884. if (pos <= 0) continue;
  885. //logger.Trace("Episode image: {0} - {1}/{2}", traktEp.Trakt_ShowID, traktEp.Season, traktEp.EpisodeNumber);
  886. imageHelper.DownloadTraktEpisode(new Trakt_EpisodeVM(traktEp), false);
  887. }
  888. }
  889. private void RefreshView()
  890. {
  891. if (!JMMServerVM.Instance.ServerOnline) return;
  892. EnableDisableGroupControls(false);
  893. try
  894. {
  895. this.Cursor = Cursors.Wait;
  896. // we are look at all the group filters
  897. if (MainListHelperVM.Instance.CurrentWrapper == null)
  898. {
  899. MainListHelperVM.Instance.SearchTextBox = txtGroupSearch;
  900. MainListHelperVM.Instance.CurrentGroupFilter = MainListHelperVM.Instance.AllGroupFilter;
  901. //refreshGroupsWorker.RunWorkerAsync(null);
  902. MainListHelperVM.Instance.RefreshGroupsSeriesData();
  903. DownloadAllImages();
  904. MainListHelperVM.Instance.ShowChildWrappers(MainListHelperVM.Instance.CurrentWrapper);
  905. }
  906. // we are inside one of the group filters, groups or series
  907. if (MainListHelperVM.Instance.CurrentWrapper != null)
  908. {
  909. // refresh the groups and series data
  910. refreshGroupsWorker.RunWorkerAsync(null);
  911. // refresh the episodes
  912. if (lbGroupsSeries.SelectedItem is AnimeSeriesVM)
  913. {
  914. AnimeSeriesVM ser = lbGroupsSeries.SelectedItem as AnimeSeriesVM;
  915. ser.RefreshEpisodes();
  916. }
  917. }
  918. }
  919. catch (Exception ex)
  920. {
  921. Utils.ShowErrorMessage(ex);
  922. EnableDisableGroupControls(true);
  923. }
  924. finally
  925. {
  926. this.Cursor = Cursors.Arrow;
  927. EnableDisableGroupControls(true);
  928. }
  929. }
  930. #region Command Bindings
  931. private void CommandBinding_EditTraktCredentials(object sender, ExecutedRoutedEventArgs e)
  932. {
  933. tabControl1.SelectedIndex = TAB_MAIN_Settings;
  934. tabSettingsChild.SelectedIndex = TAB_Settings_TvDB;
  935. }
  936. public void ShowPinnedFileAvDump(VideoLocalVM vid)
  937. {
  938. try
  939. {
  940. foreach (AVDumpVM dumpTemp in MainListHelperVM.Instance.AVDumpFiles)
  941. {
  942. if (dumpTemp.FullPath == vid.FullPath) return;
  943. }
  944. AVDumpVM dump = new AVDumpVM(vid);
  945. MainListHelperVM.Instance.AVDumpFiles.Add(dump);
  946. tabControl1.SelectedIndex = TAB_MAIN_FileManger;
  947. tabFileManager.SelectedIndex = TAB_FileManger_Avdump;
  948. }
  949. catch (Exception ex)
  950. {
  951. Utils.ShowErrorMessage(ex);
  952. }
  953. }
  954. public void ShowPinnedSeries(AnimeSeriesVM series)
  955. {
  956. this.Cursor = Cursors.Wait;
  957. CloseableTabItem cti = new CloseableTabItem();
  958. //TabItem cti = new TabItem();
  959. cti.Header = series.SeriesName;
  960. //AnimeSeries_Hulu seriesControl = new AnimeSeries_Hulu();
  961. AnimeSeries seriesControl = new AnimeSeries();
  962. seriesControl.DataContext = series;
  963. cti.Content = seriesControl;
  964. tabPinned.Items.Add(cti);
  965. tabControl1.SelectedIndex = TAB_MAIN_Pinned;
  966. tabPinned.SelectedIndex = tabPinned.Items.Count - 1;
  967. this.Cursor = Cursors.Arrow;
  968. }
  969. /*public void ToggleDashMetroStyle()
  970. {
  971. if (dash.Visibility == System.Windows.Visibility.Collapsed)
  972. {
  973. dash.Visibility = System.Windows.Visibility.Visible;
  974. dashMetro.Visibility = System.Windows.Visibility.Collapsed;
  975. DisplayMainTab(TAB_MAIN_Dashboard);
  976. AppSettings.DashboardType = DashboardType.Normal;
  977. }
  978. else
  979. {
  980. dash.Visibility = System.Windows.Visibility.Collapsed;
  981. dashMetro.Visibility = System.Windows.Visibility.Visible;
  982. DisplayMainTab(TAB_MAIN_Dashboard);
  983. AppSettings.DashboardType = DashboardType.Metro;
  984. }
  985. SetColours();
  986. }*/
  987. private void SetColours()
  988. {
  989. if (tabControl1.SelectedIndex == TAB_MAIN_Dashboard)
  990. {
  991. if (dash.Visibility == System.Windows.Visibility.Visible)
  992. {
  993. tabControl1.Background = new SolidColorBrush(Colors.Transparent);
  994. }
  995. else
  996. {
  997. var bc = new BrushConverter();
  998. tabControl1.Background = (Brush)bc.ConvertFrom("#F1F1F1");
  999. //tabControl1.Background = new SolidColorBrush(Colors.LightGray);
  1000. }
  1001. }
  1002. else
  1003. tabControl1.Background = new SolidColorBrush(Colors.Transparent);
  1004. }
  1005. public void ShowDashMetroView(MetroViews viewType, object data)
  1006. {
  1007. tileContinueWatching.Visibility = System.Windows.Visibility.Collapsed;
  1008. dash.Visibility = System.Windows.Visibility.Collapsed;
  1009. dashMetro.Visibility = System.Windows.Visibility.Collapsed;
  1010. switch (viewType)
  1011. {
  1012. case MetroViews.MainNormal:
  1013. dash.Visibility = System.Windows.Visibility.Visible;
  1014. DisplayMainTab(TAB_MAIN_Dashboard);
  1015. AppSettings.DashboardType = DashboardType.Normal;
  1016. break;
  1017. case MetroViews.MainMetro:
  1018. dashMetro.Visibility = System.Windows.Visibility.Visible;
  1019. DisplayMainTab(TAB_MAIN_Dashboard);
  1020. AppSettings.DashboardType = DashboardType.Metro;
  1021. break;
  1022. case MetroViews.ContinueWatching:
  1023. tileContinueWatching.Visibility = System.Windows.Visibility.Visible;
  1024. tileContinueWatching.DataContext = data;
  1025. break;
  1026. }
  1027. SetColours();
  1028. }
  1029. public void ShowDashMetroView(MetroViews viewType)
  1030. {
  1031. ShowDashMetroView(viewType, null);
  1032. }
  1033. private void CommandBinding_CreateSeriesFromAnime(object sender, ExecutedRoutedEventArgs e)
  1034. {
  1035. object obj = e.Parameter;
  1036. if (obj == null) return;
  1037. try
  1038. {
  1039. if (obj.GetType() == typeof(AniDB_AnimeVM) || obj.GetType() == typeof(AniDB_Anime_SimilarVM))
  1040. {
  1041. AniDB_AnimeVM anime = null;
  1042. if (obj.GetType() == typeof(AniDB_AnimeVM))
  1043. anime = (AniDB_AnimeVM)obj;
  1044. if (obj.GetType() == typeof(AniDB_Anime_SimilarVM))
  1045. anime = ((AniDB_Anime_SimilarVM)obj).AniDB_Anime;
  1046. // check if a series already exists
  1047. bool seriesExists = JMMServerVM.Instance.clientBinaryHTTP.GetSeriesExistingForAnime(anime.AnimeID);
  1048. if (seriesExists)
  1049. {
  1050. MessageBox.Show(Properties.Resources.ERROR_SeriesExists, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
  1051. return;
  1052. }
  1053. NewSeries frmNewSeries = new NewSeries();
  1054. frmNewSeries.Owner = this;
  1055. frmNewSeries.Init(anime, anime.FormattedTitle);
  1056. bool? result = frmNewSeries.ShowDialog();
  1057. if (result.HasValue && result.Value == true)
  1058. {
  1059. }
  1060. }
  1061. else
  1062. {
  1063. NewSeries frm = new NewSeries();
  1064. frm.Owner = this;
  1065. frm.Init(0, "");
  1066. bool? result = frm.ShowDialog();
  1067. if (result.HasValue && result.Value == true)
  1068. {
  1069. }
  1070. }
  1071. }
  1072. catch (Exception ex)
  1073. {
  1074. Utils.ShowErrorMessage(ex);
  1075. }
  1076. }
  1077. private void CommandBinding_AvdumpFile(object sender, ExecutedRoutedEventArgs e)
  1078. {
  1079. try
  1080. {
  1081. Window parentWindow = Window.GetWindow(this);
  1082. object obj = e.Parameter;
  1083. if (obj == null) return;
  1084. if (obj.GetType() == typeof(VideoLocalVM))
  1085. {
  1086. VideoLocalVM vid = obj as VideoLocalVM;
  1087. foreach (AVDumpVM dumpTemp in MainListHelperVM.Instance.AVDumpFiles)
  1088. {
  1089. if (dumpTemp.FullPath == vid.FullPath) return;
  1090. }
  1091. AVDumpVM dump = new AVDumpVM(vid);
  1092. MainListHelperVM.Instance.AVDumpFiles.Add(dump);
  1093. }
  1094. if (obj.GetType() == typeof(MultipleVideos))
  1095. {
  1096. MultipleVideos mv = obj as MultipleVideos;
  1097. foreach (VideoLocalVM vid in mv.VideoLocals)
  1098. {
  1099. bool alreadyExists = false;
  1100. foreach (AVDumpVM dumpTemp in MainListHelperVM.Instance.AVDumpFiles)
  1101. {
  1102. if (dumpTemp.FullPath == vid.FullPath)
  1103. {
  1104. alreadyExists = true;
  1105. break;
  1106. }
  1107. }
  1108. if (alreadyExists) continue;
  1109. AVDumpVM dump = new AVDumpVM(vid);
  1110. MainListHelperVM.Instance.AVDumpFiles.Add(dump);
  1111. }
  1112. }
  1113. tabControl1.SelectedIndex = TAB_MAIN_FileManger;
  1114. tabFileManager.SelectedIndex = TAB_FileManger_Avdump;
  1115. }
  1116. catch (Exception ex)
  1117. {
  1118. Utils.ShowErrorMessage(ex);
  1119. }
  1120. }
  1121. private void CommandBinding_BookmarkAnime(object sender, ExecutedRoutedEventArgs e)
  1122. {
  1123. Window parentWindow = Window.GetWindow(this);
  1124. object obj = e.Parameter;
  1125. if (obj == null) return;
  1126. try
  1127. {
  1128. if (obj.GetType() == typeof(RecommendationVM))
  1129. {
  1130. RecommendationVM rec = obj as RecommendationVM;
  1131. if (rec == null) return;
  1132. BookmarkedAnimeVM bookmark = new BookmarkedAnimeVM();
  1133. bookmark.AnimeID = rec.RecommendedAnimeID;
  1134. bookmark.Downloading = 0;
  1135. bookmark.Notes = "";
  1136. bookmark.Priority = 1;
  1137. if (bookmark.Save())
  1138. MainListHelperVM.Instance.RefreshBookmarkedAnime();
  1139. }
  1140. if (obj.GetType() == typeof(MissingEpisodeVM))
  1141. {
  1142. MissingEpisodeVM rec = obj as MissingEpisodeVM;
  1143. if (rec == null) return;
  1144. BookmarkedAnimeVM bookmark = new BookmarkedAnimeVM();
  1145. bookmark.AnimeID = rec.AnimeID;
  1146. bookmark.Downloading = 0;
  1147. bookmark.Notes = "";
  1148. bookmark.Priority = 1;
  1149. if (bookmark.Save())
  1150. MainListHelperVM.Instance.RefreshBookmarkedAnime();
  1151. }
  1152. if (obj.GetType() == typeof(AniDB_AnimeVM))
  1153. {
  1154. AniDB_AnimeVM rec = obj as AniDB_AnimeVM;
  1155. if (rec == null) return;
  1156. BookmarkedAnimeVM bookmark = new BookmarkedAnimeVM();
  1157. bookmark.AnimeID = rec.AnimeID;
  1158. bookmark.Downloading = 0;
  1159. bookmark.Notes = "";
  1160. bookmark.Priority = 1;
  1161. if (bookmark.Save())
  1162. MainListHelperVM.Instance.RefreshBookmarkedAnime();
  1163. }
  1164. if (obj.GetType() == typeof(AniDB_Anime_SimilarVM))
  1165. {
  1166. AniDB_Anime_SimilarVM sim = (AniDB_Anime_SimilarVM)obj;
  1167. BookmarkedAnimeVM bookmark = new BookmarkedAnimeVM();
  1168. bookmark.AnimeID = sim.SimilarAnimeID;
  1169. bookmark.Downloading = 0;
  1170. bookmark.Notes = "";
  1171. bookmark.Priority = 1;
  1172. if (bookmark.Save())
  1173. MainListHelperVM.Instance.RefreshBookmarkedAnime();
  1174. }
  1175. if (obj.GetType() == typeof(AniDB_Anime_RelationVM))
  1176. {
  1177. AniDB_Anime_RelationVM rel = (AniDB_Anime_RelationVM)obj;
  1178. BookmarkedAnimeVM bookmark = new BookmarkedAnimeVM();
  1179. bookmark.AnimeID = rel.RelatedAnimeID;
  1180. bookmark.Downloading = 0;
  1181. bookmark.Notes = "";
  1182. bookmark.Priority = 1;
  1183. if (bookmark.Save())
  1184. MainListHelperVM.Instance.RefreshBookmarkedAnime();
  1185. }
  1186. }
  1187. catch (Exception ex)
  1188. {
  1189. Utils.ShowErrorMessage(ex);
  1190. }
  1191. }
  1192. private void CommandBinding_RefreshBookmarks(object sender, ExecutedRoutedEventArgs e)
  1193. {
  1194. Window parentWindow = Window.GetWindow(this);
  1195. try
  1196. {
  1197. MainListHelperVM.Instance.RefreshBookmarkedAnime();
  1198. }
  1199. catch (Exception ex)
  1200. {
  1201. Utils.ShowErrorMessage(ex);
  1202. }
  1203. }
  1204. public void ShowTorrentSearch(DownloadSearchCriteria crit)
  1205. {
  1206. this.Cursor = Cursors.Wait;
  1207. tabControl1.SelectedIndex = TAB_MAIN_Downloads;
  1208. tabcDownloads.SelectedIndex = 1;
  1209. ucTorrentSearch.PerformSearch(crit);
  1210. this.Cursor = Cursors.Arrow;
  1211. }
  1212. private void CommandBinding_ShowTorrentSearch(object sender, ExecutedRoutedEventArgs e)
  1213. {
  1214. //object obj = lbGroupsSeries.SelectedItem;
  1215. object obj = e.Parameter;
  1216. if (obj == null) return;
  1217. try
  1218. {
  1219. if (obj.GetType() == typeof(AnimeEpisodeVM))
  1220. {
  1221. AnimeEpisodeVM ep = (AnimeEpisodeVM)obj;
  1222. DownloadSearchCriteria crit = new DownloadSearchCriteria(DownloadSearchType.Episode, ep);
  1223. ShowTorrentSearch(crit);
  1224. }
  1225. if (obj.GetType() == typeof(MissingEpisodeVM))
  1226. {
  1227. MissingEpisodeVM rec = obj as MissingEpisodeVM;
  1228. if (rec == null) return;
  1229. JMMServerBinary.Contract_AnimeEpisode contract = JMMServerVM.Instance.clientBinaryHTTP.GetEpisodeByAniDBEpisodeID(rec.EpisodeID,
  1230. JMMServerVM.Instance.CurrentUser.JMMUserID.Value);
  1231. if (contract != null)
  1232. {
  1233. DownloadSearchCriteria crit = new DownloadSearchCriteria(DownloadSearchType.Episode, new AnimeEpisodeVM(contract));
  1234. ShowTorrentSearch(crit);
  1235. }
  1236. }
  1237. /*if (obj.GetType() == typeof(MissingFileVM))
  1238. {
  1239. MissingFileVM mis = (MissingFileVM)obj;
  1240. ShowPinnedSeries(mis.AnimeSeries);
  1241. }*/
  1242. if (obj.GetType() == typeof(RecommendationVM))
  1243. {
  1244. RecommendationVM rec = obj as RecommendationVM;
  1245. if (rec == null) return;
  1246. DownloadSearchCriteria crit = new DownloadSearchCriteria(DownloadSearchType.Series, rec.Recommended_AniDB_Anime);
  1247. ShowTorrentSearch(crit);
  1248. }
  1249. if (obj.GetType() == typeof(AniDB_AnimeVM))
  1250. {
  1251. AniDB_AnimeVM anime = (AniDB_AnimeVM)obj;
  1252. DownloadSearchCriteria crit = new DownloadSearchCriteria(DownloadSearchType.Series, anime);
  1253. ShowTorrentSearch(crit);
  1254. }
  1255. if (obj.GetType() == typeof(AnimeSeriesVM))
  1256. {
  1257. AnimeSeriesVM ser = (AnimeSeriesVM)obj;
  1258. DownloadSearchCriteria crit = new DownloadSearchCriteria(DownloadSearchType.Series, ser.AniDB_Anime);
  1259. ShowTorrentSearch(crit);
  1260. }
  1261. if (obj.GetType() == typeof(AniDB_Anime_SimilarVM))
  1262. {
  1263. AniDB_Anime_SimilarVM sim = (AniDB_Anime_SimilarVM)obj;
  1264. DownloadSearchCriteria crit = new DownloadSearchCriteria(DownloadSearchType.Series, sim.AniDB_Anime);
  1265. ShowTorrentSearch(crit);
  1266. }
  1267. if (obj.GetType() == typeof(AniDB_Anime_RelationVM))
  1268. {
  1269. AniDB_Anime_RelationVM rel = (AniDB_Anime_RelationVM)obj;
  1270. DownloadSearchCriteria crit = new DownloadSearchCriteria(DownloadSearchType.Series, rel.AniDB_Anime);
  1271. ShowTorrentSearch(crit);
  1272. }
  1273. if (obj.GetType() == typeof(BookmarkedAnimeVM))
  1274. {
  1275. BookmarkedAnimeVM ba = (BookmarkedAnimeVM)obj;
  1276. DownloadSearchCriteria crit = new DownloadSearchCriteria(DownloadSearchType.Series, ba.AniDB_Anime);
  1277. ShowTorrentSearch(crit);
  1278. }
  1279. }
  1280. catch (Exception ex)
  1281. {
  1282. Utils.ShowErrorMessage(ex);
  1283. }
  1284. }
  1285. private void CommandBinding_ShowPinnedSeries(object sender, ExecutedRoutedEventArgs e)
  1286. {
  1287. //object obj = lbGroupsSeries.SelectedItem;
  1288. object obj = e.Parameter;
  1289. if (obj == null) return;
  1290. try
  1291. {
  1292. if (obj.GetType() == typeof(AnimeEpisodeVM))
  1293. {
  1294. AnimeEpisodeVM ep = (AnimeEpisodeVM)obj;
  1295. if (MainListHelperVM.Instance.AllSeriesDictionary.ContainsKey(ep.AnimeSeriesID))
  1296. {
  1297. ShowPinnedSeries(MainListHelperVM.Instance.AllSeriesDictionary[ep.AnimeSeriesID]);
  1298. }
  1299. }
  1300. if (obj.GetType() == typeof(AnimeSeriesVM))
  1301. {
  1302. AnimeSeriesVM ser = (AnimeSeriesVM)obj;
  1303. ShowPinnedSeries(ser);
  1304. }
  1305. if (obj.GetType() == typeof(AniDB_Anime_SimilarVM))
  1306. {
  1307. AniDB_Anime_SimilarVM sim = (AniDB_Anime_SimilarVM)obj;
  1308. ShowPinnedSeries(sim.AnimeSeries);
  1309. }
  1310. if (obj.GetType() == typeof(AniDB_Anime_RelationVM))
  1311. {
  1312. AniDB_Anime_RelationVM rel = (AniDB_Anime_RelationVM)obj;
  1313. ShowPinnedSeries(rel.AnimeSeries);
  1314. }
  1315. if (obj.GetType() == typeof(RecommendationVM))
  1316. {
  1317. RecommendationVM rec = (RecommendationVM)obj;
  1318. ShowPinnedSeries(rec.Recommended_AnimeSeries);
  1319. }
  1320. if (obj.GetType() == typeof(MissingFileVM))
  1321. {
  1322. MissingFileVM mis = (MissingFileVM)obj;
  1323. ShowPinnedSeries(mis.AnimeSeries);
  1324. }
  1325. if (obj.GetType() == typeof(MissingEpisodeVM))
  1326. {
  1327. MissingEpisodeVM misEp = (MissingEpisodeVM)obj;
  1328. ShowPinnedSeries(misEp.AnimeSeries);
  1329. }
  1330. if (obj.GetType() == typeof(PlaylistItemVM))
  1331. {
  1332. PlaylistItemVM pli = (PlaylistItemVM)obj;
  1333. if (pli.ItemType == PlaylistItemType.AnimeSeries)
  1334. ShowPinnedSeries(pli.PlaylistItem as AnimeSeriesVM);
  1335. if (pli.ItemType == PlaylistItemType.Episode)
  1336. {
  1337. AnimeEpisodeVM ep = pli.PlaylistItem as AnimeEpisodeVM;
  1338. if (MainListHelperVM.Instance.AllSeriesDictionary.ContainsKey(ep.AnimeSeriesID))
  1339. ShowPinnedSeries(MainListHelperVM.Instance.AllSeriesDictionary[ep.AnimeSeriesID]);
  1340. }
  1341. }
  1342. if (obj.GetType() == typeof(Trakt_ActivityScrobbleVM))
  1343. {
  1344. Trakt_ActivityScrobbleVM scrobble = (Trakt_ActivityScrobbleVM)obj;
  1345. if (!scrobble.Episode.AnimeSeriesID.HasValue) return;
  1346. JMMServerBinary.Contract_AnimeSeries contract = JMMServerVM.Instance.clientBinaryHTTP.GetSeries(scrobble.Episode.AnimeSeriesID.Value,
  1347. JMMServerVM.Instance.CurrentUser.JMMUserID.Value);
  1348. if (contract == null) return;
  1349. AnimeSeriesVM ser = new AnimeSeriesVM(contract);
  1350. ShowPinnedSeries(ser);
  1351. }
  1352. if (obj.GetType() == typeof(Trakt_ActivityShoutEpisodeVM))
  1353. {
  1354. Trakt_ActivityShoutEpisodeVM shoutEpisode = (Trakt_ActivityShoutEpisodeVM)obj;
  1355. if (!shoutEpisode.Shout.AnimeSeriesID.HasValue) return;
  1356. JMMServerBinary.Contract_AnimeSeries contract = JMMServerVM.Instance.clientBinaryHTTP.GetSeries(shoutEpisode.Shout.AnimeSeriesID.Value,
  1357. JMMServerVM.Instance.CurrentUser.JMMUserID.Value);
  1358. if (contract == null) return;
  1359. AnimeSeriesVM ser = new AnimeSeriesVM(contract);
  1360. ShowPinnedSeries(ser);
  1361. }
  1362. if (obj.GetType() == typeof(Trakt_ActivityShoutShowVM))
  1363. {
  1364. Trakt_ActivityShoutShowVM shoutShow = (Trakt_ActivityShoutShowVM)obj;
  1365. if (!shoutShow.Shout.AnimeSeriesID.HasValue) return;
  1366. JMMServerBinary.Contract_AnimeSeries contract = JMMServerVM.Instance.clientBinaryHTTP.GetSeries(shoutShow.Shout.AnimeSeriesID.Value,
  1367. JMMServerVM.Instance.CurrentUser.JMMUserID.Value);
  1368. if (contract == null) return;
  1369. AnimeSeriesVM ser = new AnimeSeriesVM(contract);
  1370. ShowPinnedSeries(ser);
  1371. }
  1372. if (obj.GetType() == typeof(AnimeSearchVM))
  1373. {
  1374. AnimeSearchVM search = (AnimeSearchVM)obj;
  1375. if (!search.AnimeSeriesID.HasValue) return;
  1376. JMMServerBinary.Contract_AnimeSeries contract = JMMServerVM.Instance.clientBinaryHTTP.GetSeries(search.AnimeSeriesID.Value,
  1377. JMMServerVM.Instance.CurrentUser.JMMUserID.Value);
  1378. if (contract == null) return;
  1379. AnimeSeriesVM ser = new AnimeSeriesVM(contract);
  1380. ShowPinnedSeries(ser);
  1381. }
  1382. }
  1383. catch (Exception ex)
  1384. {
  1385. Utils.ShowErrorMessage(ex);
  1386. }
  1387. }
  1388. private void CommandBinding_Refresh(object sender, ExecutedRoutedEventArgs e)
  1389. {
  1390. RefreshView();
  1391. }
  1392. private void CommandBinding_Search(object sender, ExecutedRoutedEventArgs e)
  1393. {
  1394. try
  1395. {
  1396. // move to all groups
  1397. MainListHelperVM.Instance.ShowAllGroups();
  1398. if (e.Parameter is AnimeCategoryVM)
  1399. {
  1400. AnimeCategoryVM obj = e.Parameter as AnimeCategoryVM;
  1401. txtGroupSearch.Text = obj.CategoryName;
  1402. }
  1403. if (e.Parameter is AnimeTagVM)
  1404. {
  1405. AnimeTagVM obj = e.Parameter as AnimeTagVM;
  1406. txtGroupSearch.Text = obj.TagName;
  1407. }
  1408. tabControl1.SelectedIndex = TAB_MAIN_Collection;
  1409. HighlightMainListItem();
  1410. }
  1411. catch (Exception ex)
  1412. {
  1413. Utils.ShowErrorMessage(ex);
  1414. }
  1415. }
  1416. private void CommandBinding_Back(object sender, ExecutedRoutedEventArgs e)
  1417. {
  1418. try
  1419. {
  1420. MainListHelperVM.Instance.MoveBackUpHeirarchy();
  1421. HighlightMainListItem();
  1422. }
  1423. catch (Exception ex)
  1424. {
  1425. Utils.ShowErrorMessage(ex);
  1426. }
  1427. }
  1428. private void CommandBinding_Edit(object sender, ExecutedRoutedEventArgs e)
  1429. {
  1430. //object obj = lbGroupsSeries.SelectedItem;
  1431. object obj = e.Parameter;
  1432. if (obj == null) return;
  1433. try
  1434. {
  1435. if (obj.GetType() == typeof(AnimeGroupVM))
  1436. {
  1437. AnimeGroupVM grp = (AnimeGroupVM)obj;
  1438. if (grp.AnimeGroupID.HasValue)
  1439. {
  1440. groupBeforeChanges = new AnimeGroupVM();
  1441. Cloner.Clone(grp, groupBeforeChanges);
  1442. }
  1443. grp.IsReadOnly = false;
  1444. grp.IsBeingEdited = true;
  1445. }
  1446. if (obj.GetType() == typeof(GroupFilterVM))
  1447. {
  1448. GroupFilterVM gf = (GroupFilterVM)obj;
  1449. if (gf.GroupFilterID.HasValue)
  1450. {
  1451. groupFilterBeforeChanges = new GroupFilterVM();
  1452. groupFilterBeforeChanges.FilterName = gf.FilterName;
  1453. groupFilterBeforeChanges.BaseCondition = gf.BaseCondition;
  1454. groupFilterBeforeChanges.ApplyToSeries = gf.ApplyToSeries;
  1455. groupFilterBeforeChanges.FilterConditions = new ObservableCollection<GroupFilterConditionVM>();
  1456. groupFilterBeforeChanges.SortCriteriaList = new ObservableCollection<GroupFilterSortingCriteria>();
  1457. foreach (GroupFilterConditionVM gfc_cur in gf.FilterConditions)
  1458. {
  1459. GroupFilterConditionVM gfc = new GroupFilterConditionVM();
  1460. gfc.ConditionOperator = gfc_cur.ConditionOperator;
  1461. gfc.ConditionParameter = gfc_cur.ConditionParameter;
  1462. gfc.ConditionType = gfc_cur.ConditionType;
  1463. gfc.GroupFilterConditionID = gfc_cur.GroupFilterConditionID;
  1464. gfc.GroupFilterID = gfc_cur.GroupFilterID;
  1465. groupFilterBeforeChanges.FilterConditions.Add(gfc);
  1466. }
  1467. foreach (GroupFilterSortingCriteria gfcs_cur in gf.SortCriteriaList)
  1468. {
  1469. GroupFilterSortingCriteria gfsc = new GroupFilterSortingCriteria();
  1470. gfsc.GroupFilterID = gfcs_cur.GroupFilterID;
  1471. gfsc.SortDirection = gfcs_cur.SortDirection;
  1472. gfsc.SortType = gfcs_cur.SortType;
  1473. groupFilterBeforeChanges.SortCriteriaList.Add(gfsc);
  1474. }
  1475. //Cloner.Clone(gf, groupFilterBeforeChanges);
  1476. }
  1477. gf.IsLocked = false;
  1478. gf.IsBeingEdited = true;
  1479. groupFilterVM = gf;
  1480. MainListHelperVM.Instance.ViewGroupsForms.Filter = GroupFilter_GroupSearch;
  1481. MainListHelperVM.Instance.SetGroupFilterSortingOnForms(gf);
  1482. }
  1483. if (obj.GetType() == typeof(AnimeSeriesVM))
  1484. {
  1485. }
  1486. }
  1487. catch (Exception ex)
  1488. {
  1489. Utils.ShowErrorMessage(ex);
  1490. }
  1491. EnableDisableGroupControls(false);
  1492. }
  1493. private void CommandBinding_Save(object sender, ExecutedRoutedEventArgs e)
  1494. {
  1495. object obj = e.Parameter;
  1496. if (obj == null) return;
  1497. try
  1498. {
  1499. if (obj.GetType() == typeof(AnimeGroupVM))
  1500. {
  1501. AnimeGroupVM grp = (AnimeGroupVM)obj;
  1502. bool isnew = !grp.AnimeGroupID.HasValue;
  1503. if (grp.Validate())
  1504. {
  1505. grp.IsReadOnly = true;
  1506. grp.IsBeingEdited = false;
  1507. if (grp.Save() && isnew)
  1508. {
  1509. MainListHelperVM.Instance.AllGroups.Add(grp);
  1510. MainListHelperVM.Instance.AllGroupsDictionary[grp.AnimeGroupID.Value] = grp;
  1511. MainListHelperVM.Instance.ViewGroups.Refresh();
  1512. MainListHelperVM.Instance.LastAnimeGroupID = grp.AnimeGroupID.Value;
  1513. if (!grp.AnimeGroupParentID.HasValue)
  1514. {
  1515. // move to all groups
  1516. // only if it is a top level group
  1517. MainListHelperVM.Instance.ShowAllGroups();
  1518. HighlightMainListItem();
  1519. }
  1520. else
  1521. {
  1522. AnimeGroupVM parentGroup = grp.ParentGroup;
  1523. if (parentGroup != null)
  1524. showChildWrappersWorker.RunWorkerAsync(parentGroup);
  1525. }
  1526. }
  1527. }
  1528. //BindingExpression be = ccDetail.GetBindingExpression(ContentControl.ContentProperty);
  1529. //be.UpdateSource();
  1530. }
  1531. if (obj.GetType() == typeof(GroupFilterVM))
  1532. {
  1533. GroupFilterVM gf = (GroupFilterVM)obj;
  1534. bool isnew = !gf.GroupFilterID.HasValue;
  1535. if (gf.Validate())
  1536. {
  1537. gf.IsLocked = true;
  1538. gf.IsBeingEdited = false;
  1539. if (gf.Save() && isnew)
  1540. {
  1541. MainListHelperVM.Instance.AllGroupFilters.Add(gf);
  1542. MainListHelperVM.Instance.LastGroupFilterID = gf.GroupFilterID.Value;
  1543. showChildWrappersWorker.RunWorkerAsync(null);
  1544. }
  1545. //showChildWrappersWorker.RunWorkerAsync(null);
  1546. }
  1547. }
  1548. }
  1549. catch (Exception ex)
  1550. {
  1551. Utils.ShowErrorMessage(ex);
  1552. }
  1553. EnableDisableGroupControls(true);
  1554. }
  1555. private void CommandBinding_ScanFolder(object sender, ExecutedRoutedEventArgs e)
  1556. {
  1557. object obj = e.Parameter;
  1558. if (obj == null) return;
  1559. try
  1560. {
  1561. if (obj.GetType() == typeof(ImportFolderVM))
  1562. {
  1563. ImportFolderVM fldr = (ImportFolderVM)obj;
  1564. JMMServerVM.Instance.clientBinaryHTTP.ScanFolder(fldr.ImportFolderID.Value);
  1565. MessageBox.Show("Process is Running", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
  1566. }
  1567. }
  1568. catch (Exception ex)
  1569. {
  1570. Utils.ShowErrorMessage(ex);
  1571. }
  1572. }
  1573. private void CommandBinding_Delete(object sender, ExecutedRoutedEventArgs e)
  1574. {
  1575. object obj = e.Parameter;
  1576. if (obj == null) return;
  1577. EnableDisableGroupControls(false);
  1578. try
  1579. {
  1580. if (obj.GetType() == typeof(GroupFilterVM))
  1581. {
  1582. GroupFilterVM gf = (GroupFilterVM)obj;
  1583. MessageBoxResult res = MessageBox.Show(string.Format("Are you sure you want to delete the Group Filter: {0}", gf.FilterName),
  1584. "Confirm", MessageBoxButton.YesNo, MessageBoxImage.Question);
  1585. if (res == MessageBoxResult.Yes)
  1586. {
  1587. // remove from group list
  1588. gf.Delete();
  1589. // lets try and find where we are in the list so we can highlight that item
  1590. // when deleting a a group, we should always have it highlighted
  1591. // in the main list on the left
  1592. int idx = lbGroupsSeries.SelectedIndex;
  1593. if (idx >= 0)
  1594. {
  1595. if (idx > 0)
  1596. {
  1597. // we will move to the item above the item being deleted
  1598. idx = idx - 1;
  1599. }
  1600. // otherwise just move to the first item
  1601. lbGroupsSeries.SelectedIndex = idx;
  1602. lbGroupsSeries.Focus();
  1603. lbGroupsSeries.ScrollIntoView(lbGroupsSeries.Items[idx]);
  1604. }
  1605. // find the group filter
  1606. int pos = -1;
  1607. int i = 0;
  1608. foreach (MainListWrapper wrapper in MainListHelperVM.Instance.CurrentWrapperList)
  1609. {
  1610. if (wrapper is GroupFilterVM)
  1611. {
  1612. GroupFilterVM gfTemp = wrapper as GroupFilterVM;
  1613. if (gfTemp.GroupFilterID.HasValue && gf.GroupFilterID.Value == gfTemp.GroupFilterID.Value)
  1614. {
  1615. pos = i;
  1616. break;
  1617. }
  1618. }
  1619. i++;
  1620. }
  1621. // remove from group filter list
  1622. MainListHelperVM.Instance.AllGroupFilters.Remove(gf);
  1623. // remove from current wrapper list
  1624. if (pos >= 0)
  1625. {
  1626. MainListHelperVM.Instance.CurrentWrapperList.RemoveAt(pos);
  1627. //MainListHelperVM.Instance.ViewGroups.Refresh();
  1628. }
  1629. }
  1630. }
  1631. }
  1632. catch (Exception ex)
  1633. {
  1634. Utils.ShowErrorMessage(ex);
  1635. }
  1636. EnableDisableGroupControls(true);
  1637. }
  1638. private void CommandBinding_Cancel(object sender, ExecutedRoutedEventArgs e)
  1639. {
  1640. object obj = e.Parameter;
  1641. if (obj == null) return;
  1642. try
  1643. {
  1644. if (obj.GetType() == typeof(AnimeGroupVM))
  1645. {
  1646. AnimeGroupVM grp = (AnimeGroupVM)obj;
  1647. grp.IsReadOnly = true;
  1648. grp.IsBeingEdited = false;
  1649. // copy all editable properties
  1650. if (grp.AnimeGroupID.HasValue) // an existing group
  1651. {
  1652. grp.GroupName = groupBeforeChanges.GroupName;
  1653. grp.IsFave = groupBeforeChanges.IsFave;
  1654. //grp.AnimeGroupParentID = groupBeforeChanges.AnimeGroupParentID;
  1655. grp.Description = groupBeforeChanges.Description;
  1656. grp.SortName = groupBeforeChanges.SortName;
  1657. MainListHelperVM.Instance.ViewGroups.Refresh();
  1658. EnableDisableGroupControls(true);
  1659. MainListHelperVM.Instance.LastAnimeGroupID = grp.AnimeGroupID.Value;
  1660. HighlightMainListItem();
  1661. }
  1662. else
  1663. {
  1664. HighlightMainListItem();
  1665. SetDetailBinding(null);
  1666. }
  1667. }
  1668. if (obj.GetType() == typeof(GroupFilterVM))
  1669. {
  1670. GroupFilterVM gf = (GroupFilterVM)obj;
  1671. gf.IsLocked = true;
  1672. gf.IsBeingEdited = false;
  1673. // copy all editable properties
  1674. if (gf.GroupFilterID.HasValue) // an existing group filter
  1675. {
  1676. gf.FilterName = groupFilterBeforeChanges.FilterName;
  1677. gf.ApplyToSeries = groupFilterBeforeChanges.ApplyToSeries;
  1678. gf.BaseCondition = groupFilterBeforeChanges.BaseCondition;
  1679. gf.FilterConditions.Clear();
  1680. gf.SortCriteriaList.Clear();
  1681. foreach (GroupFilterConditionVM gfc_old in groupFilterBeforeChanges.FilterConditions)
  1682. {
  1683. GroupFilterConditionVM gfc = new GroupFilterConditionVM();
  1684. gfc.ConditionOperator = gfc_old.ConditionOperator;
  1685. gfc.ConditionParameter = gfc_old.ConditionParameter;
  1686. gfc.ConditionType = gfc_old.ConditionType;
  1687. gfc.GroupFilterConditionID = gfc_old.GroupFilterConditionID;
  1688. gfc.GroupFilterID = gfc_old.GroupFilterID;
  1689. gf.FilterConditions.Add(gfc);
  1690. }
  1691. foreach (GroupFilterSortingCriteria gfsc_old in groupFilterBeforeChanges.SortCriteriaList)
  1692. {
  1693. GroupFilterSortingCriteria gfsc = new GroupFilterSortingCriteria();
  1694. gfsc.GroupFilterID = gfsc_old.GroupFilterID;
  1695. gfsc.SortDirection = gfsc_old.SortDirection;
  1696. gfsc.SortType = gfsc_old.SortType;
  1697. gf.SortCriteriaList.Add(gfsc);
  1698. }
  1699. MainListHelperVM.Instance.LastGroupFilterID = gf.GroupFilterID.Value;
  1700. }
  1701. else
  1702. {
  1703. SetDetailBinding(null);
  1704. }
  1705. EnableDisableGroupControls(true);
  1706. HighlightMainListItem();
  1707. }
  1708. if (obj.GetType() == typeof(AnimeSeriesVM))
  1709. {
  1710. }
  1711. }
  1712. catch (Exception ex)
  1713. {
  1714. Utils.ShowErrorMessage(ex);
  1715. }
  1716. }
  1717. private void CommandBinding_NewGroupFilter(object sender, ExecutedRoutedEventArgs e)
  1718. {
  1719. try
  1720. {
  1721. GroupFilterVM gfNew = new GroupFilterVM();
  1722. gfNew.AllowEditing = true;
  1723. gfNew.IsBeingEdited = true;
  1724. gfNew.IsLocked = false;
  1725. gfNew.FilterName = "New Filter";
  1726. gfNew.ApplyToSeries = 0;
  1727. gfNew.BaseCondition = (int)GroupFilterBaseCondition.Include;
  1728. gfNew.FilterConditions = new ObservableCollection<GroupFilterConditionVM>();
  1729. MainListHelperVM.Instance.AllGroupFilters.Add(gfNew);
  1730. groupFilterVM = gfNew;
  1731. MainListHelperVM.Instance.ViewGroupsForms.Filter = GroupFilter_GroupSearch;
  1732. MainListHelperVM.Instance.SetGroupFilterSortingOnForms(gfNew);
  1733. SetDetailBinding(gfNew);
  1734. }
  1735. catch (Exception ex)
  1736. {
  1737. Utils.ShowErrorMessage(ex);
  1738. }
  1739. }
  1740. private void CommandBinding_DeleteFilterCondition(object sender, ExecutedRoutedEventArgs e)
  1741. {
  1742. object obj = e.Parameter;
  1743. if (obj == null) return;
  1744. try
  1745. {
  1746. if (obj.GetType() == typeof(GroupFilterConditionVM))
  1747. {
  1748. GroupFilterConditionVM gfc = (GroupFilterConditionVM)obj;
  1749. MessageBoxResult res = MessageBox.Show(string.Format("Are you sure you want to delete the Filter Condition: {0}", gfc.NiceDescription),
  1750. "Confirm", MessageBoxButton.YesNo, MessageBoxImage.Question);
  1751. if (res == MessageBoxResult.Yes)
  1752. {
  1753. // remove from group list
  1754. //gfc.Delete();
  1755. // fund the GroupFilter
  1756. foreach (GroupFilterVM gf in MainListHelperVM.Instance.AllGroupFilters)
  1757. {
  1758. if (!gf.AllowEditing) continue; // all filter
  1759. if (gf.GroupFilterID == gfc.GroupFilterID)
  1760. {
  1761. int pos = -1;
  1762. for (int i = 0; i < gf.FilterConditions.Count; i++)
  1763. {
  1764. if (gfc.ConditionOperator == gf.FilterConditions[i].ConditionOperator &&
  1765. gfc.ConditionParameter == gf.FilterConditions[i].ConditionParameter &&
  1766. gfc.ConditionType == gf.FilterConditions[i].ConditionType)
  1767. {
  1768. pos = i;
  1769. break;
  1770. }
  1771. }
  1772. if (pos >= 0)
  1773. gf.FilterConditions.RemoveAt(pos);
  1774. groupFilterVM = gf;
  1775. MainListHelperVM.Instance.ViewGroupsForms.Filter = GroupFilter_GroupSearch;
  1776. MainListHelperVM.Instance.SetGroupFilterSortingOnForms(gf);
  1777. }
  1778. }
  1779. }
  1780. }
  1781. }
  1782. catch (Exception ex)
  1783. {
  1784. Utils.ShowErrorMessage(ex);
  1785. }
  1786. }
  1787. private void CommandBinding_NewFilterCondition(object sender, ExecutedRoutedEventArgs e)
  1788. {
  1789. try
  1790. {
  1791. object obj = e.Parameter;
  1792. if (obj == null) return;
  1793. GroupFilterVM gf = (GroupFilterVM)obj;
  1794. GroupFilterConditionVM gfc = new GroupFilterConditionVM();
  1795. GroupFilterConditionForm frm = new GroupFilterConditionForm();
  1796. frm.Owner = this;
  1797. frm.Init(gf, gfc);
  1798. bool? result = frm.ShowDialog();
  1799. if (result.HasValue && result.Value == true)
  1800. {
  1801. gf.FilterConditions.Add(gfc);
  1802. groupFilterVM = gf;
  1803. MainListHelperVM.Instance.ViewGroupsForms.Filter = GroupFilter_GroupSearch;
  1804. MainListHelperVM.Instance.SetGroupFilterSortingOnForms(gf);
  1805. }
  1806. }
  1807. catch (Exception ex)
  1808. {
  1809. Utils.ShowErrorMessage(ex);
  1810. }
  1811. }
  1812. private void CommandBinding_NewFilterSorting(object sender, ExecutedRoutedEventArgs e)
  1813. {
  1814. try
  1815. {
  1816. object obj = e.Parameter;
  1817. if (obj == null) return;
  1818. GroupFilterVM gf = (GroupFilterVM)obj;
  1819. GroupFilterSortingCriteria gfsc = new GroupFilterSortingCriteria();
  1820. GroupFilterSortingForm frm = new GroupFilterSortingForm();
  1821. frm.Owner = this;
  1822. frm.Init(gf, gfsc);
  1823. bool? result = frm.ShowDialog();
  1824. if (result.HasValue && result.Value == true)
  1825. {
  1826. gf.SortCriteriaList.Add(gfsc);
  1827. groupFilterVM = gf;
  1828. MainListHelperVM.Instance.ViewGroupsForms.Filter = GroupFilter_GroupSearch;
  1829. MainListHelperVM.Instance.SetGroupFilterSortingOnForms(gf);
  1830. }
  1831. }
  1832. catch (Exception ex)
  1833. {
  1834. Utils.ShowErrorMessage(ex);
  1835. }
  1836. }
  1837. private void CommandBinding_MoveUpFilterSort(object sender, ExecutedRoutedEventArgs e)
  1838. {
  1839. object obj = e.Parameter;
  1840. if (obj == null) return;
  1841. try
  1842. {
  1843. if (obj.GetType() == typeof(GroupFilterSortingCriteria))
  1844. {
  1845. GroupFilterSortingCriteria gfsc = (GroupFilterSortingCriteria)obj;
  1846. GroupFilterSortMoveUpDown(gfsc, 1);
  1847. }
  1848. }
  1849. catch (Exception ex)
  1850. {
  1851. Utils.ShowErrorMessage(ex);
  1852. }
  1853. }
  1854. private void CommandBinding_MoveDownFilterSort(object sender, ExecutedRoutedEventArgs e)
  1855. {
  1856. object obj = e.Parameter;
  1857. if (obj == null) return;
  1858. try
  1859. {
  1860. if (obj.GetType() == typeof(GroupFilterSortingCriteria))
  1861. {
  1862. GroupFilterSortingCriteria gfsc = (GroupFilterSortingCriteria)obj;
  1863. GroupFilterSortMoveUpDown(gfsc, 2);
  1864. }
  1865. }
  1866. catch (Exception ex)
  1867. {
  1868. Utils.ShowErrorMessage(ex);
  1869. }
  1870. }
  1871. /// <summary>
  1872. /// Moves group sorting up and down
  1873. /// </summary>
  1874. /// <param name="gfsc"></param>
  1875. /// <param name="direction">1 = up, 2 = down</param>
  1876. private void GroupFilterSortMoveUpDown(GroupFilterSortingCriteria gfsc, int direction)
  1877. {
  1878. // find the sorting condition
  1879. foreach (GroupFilterVM gf in MainListHelperVM.Instance.AllGroupFilters)
  1880. {
  1881. if (!gf.AllowEditing) continue; // all filter
  1882. if (gf.GroupFilterID == gfsc.GroupFilterID)
  1883. {
  1884. int pos = -1;
  1885. for (int i = 0; i < gf.SortCriteriaList.Count; i++)
  1886. {
  1887. if (gfsc.SortType == gf.SortCriteriaList[i].SortType)
  1888. {
  1889. pos = i;
  1890. break;
  1891. }
  1892. }
  1893. if (direction == 1) // up
  1894. {
  1895. if (pos > 0)
  1896. {
  1897. gf.SortCriteriaList.Move(pos, pos - 1);
  1898. groupFilterVM = gf;
  1899. MainListHelperVM.Instance.ViewGroupsForms.Filter = GroupFilter_GroupSearch;
  1900. MainListHelperVM.Instance.SetGroupFilterSortingOnForms(gf);
  1901. }
  1902. }
  1903. else
  1904. {
  1905. if (pos + 1 < gf.SortCriteriaList.Count)
  1906. {
  1907. gf.SortCriteriaList.Move(pos, pos + 1);
  1908. groupFilterVM = gf;
  1909. MainListHelperVM.Instance.ViewGroupsForms.Filter = GroupFilter_GroupSearch;
  1910. MainListHelperVM.Instance.SetGroupFilterSortingOnForms(gf);
  1911. }
  1912. }
  1913. }
  1914. }
  1915. }
  1916. private void CommandBinding_DeleteFilterSort(object sender, ExecutedRoutedEventArgs e)
  1917. {
  1918. object obj = e.Parameter;
  1919. if (obj == null) return;
  1920. try
  1921. {
  1922. if (obj.GetType() == typeof(GroupFilterSortingCriteria))
  1923. {
  1924. GroupFilterSortingCriteria gfsc = (GroupFilterSortingCriteria)obj;
  1925. MessageBoxResult res = MessageBox.Show(string.Format("Are you sure you want to delete the sorting?"),
  1926. "Confirm", MessageBoxButton.YesNo, MessageBoxImage.Question);
  1927. if (res == MessageBoxResult.Yes)
  1928. {
  1929. // find the sorting condition
  1930. foreach (GroupFilterVM gf in MainListHelperVM.Instance.AllGroupFilters)
  1931. {
  1932. if (!gf.AllowEditing) continue; // all filter
  1933. if (gf.GroupFilterID == gfsc.GroupFilterID)
  1934. {
  1935. int pos = -1;
  1936. for (int i = 0; i < gf.SortCriteriaList.Count; i++)
  1937. {
  1938. if (gfsc.SortType == gf.SortCriteriaList[i].SortType)
  1939. {
  1940. pos = i;
  1941. break;
  1942. }
  1943. }
  1944. if (pos >= 0)
  1945. gf.SortCriteriaList.RemoveAt(pos);
  1946. groupFilterVM = gf;
  1947. MainListHelperVM.Instance.ViewGroupsForms.Filter = GroupFilter_GroupSearch;
  1948. MainListHelperVM.Instance.SetGroupFilterSortingOnForms(gf);
  1949. }
  1950. }
  1951. }
  1952. }
  1953. }
  1954. catch (Exception ex)
  1955. {
  1956. Utils.ShowErrorMessage(ex);
  1957. }
  1958. }
  1959. private void CommandBinding_NewGroup(object sender, ExecutedRoutedEventArgs e)
  1960. {
  1961. try
  1962. {
  1963. AnimeGroupVM grpNew = new AnimeGroupVM();
  1964. grpNew.IsReadOnly = false;
  1965. grpNew.IsBeingEdited = true;
  1966. SetDetailBinding(grpNew);
  1967. }
  1968. catch (Exception ex)
  1969. {
  1970. Utils.ShowErrorMessage(ex);
  1971. }
  1972. }
  1973. private void CommandBinding_DeleteGroup(object sender, ExecutedRoutedEventArgs e)
  1974. {
  1975. EnableDisableGroupControls(false);
  1976. try
  1977. {
  1978. AnimeGroupVM grp = e.Parameter as AnimeGroupVM;
  1979. if (grp == null) return;
  1980. DeleteSeriesGroupForm frm = new DeleteSeriesGroupForm();
  1981. frm.Owner = this;
  1982. bool? result = frm.ShowDialog();
  1983. if (result.HasValue && result.Value == true)
  1984. {
  1985. bool deleteFiles = frm.DeleteFiles;
  1986. this.Cursor = Cursors.Wait;
  1987. JMMServerVM.Instance.clientBinaryHTTP.DeleteAnimeGroup(grp.AnimeGroupID.Value, deleteFiles);
  1988. MainListHelperVM.Instance.RefreshGroupsSeriesData();
  1989. MainListHelperVM.Instance.ShowChildWrappers(MainListHelperVM.Instance.CurrentWrapper);
  1990. SetDetailBinding(null);
  1991. this.Cursor = Cursors.Arrow;
  1992. }
  1993. }
  1994. catch (Exception ex)
  1995. {
  1996. Utils.ShowErrorMessage(ex);
  1997. }
  1998. EnableDisableGroupControls(true);
  1999. }
  2000. private void CommandBinding_ViewGroup(object sender, ExecutedRoutedEventArgs e)
  2001. {
  2002. try
  2003. {
  2004. AnimeGroupVM grp = e.Parameter as AnimeGroupVM;
  2005. if (grp == null) return;
  2006. SetDetailBinding(grp);
  2007. //DisplayMainTab(TAB_MAIN_Collection);
  2008. tabControl1.SelectedIndex = TAB_MAIN_Collection;
  2009. }
  2010. catch (Exception ex)
  2011. {
  2012. Utils.ShowErrorMessage(ex);
  2013. }
  2014. }
  2015. private void CommandBinding_AddSubGroup(object sender, ExecutedRoutedEventArgs e)
  2016. {
  2017. AnimeGroupVM grp = e.Parameter as AnimeGroupVM;
  2018. if (grp == null) return;
  2019. try
  2020. {
  2021. AnimeGroupVM grpNew = new AnimeGroupVM();
  2022. grpNew.IsReadOnly = false;
  2023. grpNew.IsBeingEdited = true;
  2024. grpNew.AnimeGroupParentID = grp.AnimeGroupID.Value;
  2025. SetDetailBinding(grpNew);
  2026. }
  2027. catch (Exception ex)
  2028. {
  2029. Utils.ShowErrorMessage(ex);
  2030. }
  2031. }
  2032. private void CommandBinding_AddPlaylist(object sender, ExecutedRoutedEventArgs e)
  2033. {
  2034. PlaylistHelperVM.CreatePlaylist(this);
  2035. }
  2036. private void CommandBinding_DeletePlaylist(object sender, ExecutedRoutedEventArgs e)
  2037. {
  2038. PlaylistVM pl = e.Parameter as PlaylistVM;
  2039. if (pl == null) return;
  2040. try
  2041. {
  2042. MessageBoxResult res = MessageBox.Show(string.Format("Are you sure you want to delete the playlist: {0}", pl.PlaylistName),
  2043. "Confirm", MessageBoxButton.YesNo, MessageBoxImage.Question);
  2044. if (res == MessageBoxResult.Yes)
  2045. {
  2046. this.Cursor = Cursors.Wait;
  2047. if (pl.PlaylistID.HasValue)
  2048. {
  2049. string msg = JMMServerVM.Instance.clientBinaryHTTP.DeletePlaylist(pl.PlaylistID.Value);
  2050. if (!string.IsNullOrEmpty(msg))
  2051. Utils.ShowErrorMessage(msg);
  2052. }
  2053. SetDetailBindingPlaylist(null);
  2054. // refresh data
  2055. PlaylistHelperVM.Instance.RefreshData();
  2056. if (lbPlaylists.Items.Count > 0)
  2057. lbPlaylists.SelectedIndex = 0;
  2058. this.Cursor = Cursors.Arrow;
  2059. }
  2060. }
  2061. catch (Exception ex)
  2062. {
  2063. Utils.ShowErrorMessage(ex);
  2064. }
  2065. }
  2066. private void CommandBinding_DeletePlaylistItem(object sender, ExecutedRoutedEventArgs e)
  2067. {
  2068. try
  2069. {
  2070. PlaylistItemVM pli = e.Parameter as PlaylistItemVM;
  2071. if (pli == null) return;
  2072. this.Cursor = Cursors.Wait;
  2073. // get the playlist
  2074. JMMServerBinary.Contract_Playlist plContract = JMMServerVM.Instance.clientBinaryHTTP.GetPlaylist(pli.PlaylistID);
  2075. if (plContract == null)
  2076. {
  2077. this.Cursor = Cursors.Arrow;
  2078. MessageBox.Show("Could not find playlist", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
  2079. return;
  2080. }
  2081. PlaylistVM pl = new PlaylistVM(plContract);
  2082. if (pli.ItemType == PlaylistItemType.AnimeSeries)
  2083. {
  2084. AnimeSeriesVM ser = pli.PlaylistItem as AnimeSeriesVM;
  2085. pl.RemoveSeries(ser.AnimeSeriesID.Value);
  2086. }
  2087. if (pli.ItemType == PlaylistItemType.Episode)
  2088. {
  2089. AnimeEpisodeVM ep = pli.PlaylistItem as AnimeEpisodeVM;
  2090. pl.RemoveEpisode(ep.AnimeEpisodeID);
  2091. }
  2092. pl.Save();
  2093. plContract = JMMServerVM.Instance.clientBinaryHTTP.GetPlaylist(pli.PlaylistID);
  2094. // refresh data
  2095. if (lbPlaylists.Items.Count > 0)
  2096. {
  2097. // get the current playlist
  2098. PlaylistVM selPL = lbPlaylists.SelectedItem as PlaylistVM;
  2099. if (selPL != null && plContract != null && selPL.PlaylistID == plContract.PlaylistID)
  2100. {
  2101. selPL.Populate(plContract);
  2102. selPL.PopulatePlaylistObjects();
  2103. PlaylistHelperVM.Instance.OnPlaylistModified(new PlaylistModifiedEventArgs(plContract.PlaylistID.Value));
  2104. }
  2105. else
  2106. {
  2107. PlaylistHelperVM.Instance.RefreshData();
  2108. }
  2109. }
  2110. this.Cursor = Cursors.Arrow;
  2111. }
  2112. catch (Exception ex)
  2113. {
  2114. this.Cursor = Cursors.Arrow;
  2115. Utils.ShowErrorMessage(ex);
  2116. }
  2117. }
  2118. private void CommandBinding_RefreshPlaylist(object sender, ExecutedRoutedEventArgs e)
  2119. {
  2120. try
  2121. {
  2122. // refresh data
  2123. PlaylistHelperVM.Instance.RefreshData();
  2124. if (lbPlaylists.Items.Count > 0)
  2125. lbPlaylists.SelectedIndex = 0;
  2126. }
  2127. catch (Exception ex)
  2128. {
  2129. Utils.ShowErrorMessage(ex);
  2130. }
  2131. }
  2132. private void CommandBinding_IncrementSeriesImageSize(object sender, ExecutedRoutedEventArgs e)
  2133. {
  2134. UserSettingsVM.Instance.SeriesGroup_Image_Height = UserSettingsVM.Instance.SeriesGroup_Image_Height + 10;
  2135. }
  2136. private void CommandBinding_DecrementSeriesImageSize(object sender, ExecutedRoutedEventArgs e)
  2137. {
  2138. UserSettingsVM.Instance.SeriesGroup_Image_Height = UserSettingsVM.Instance.SeriesGroup_Image_Height - 10;
  2139. }
  2140. private void CommandBinding_NewSeries(object sender, ExecutedRoutedEventArgs e)
  2141. {
  2142. }
  2143. private void CommandBinding_DeleteSeries(object sender, ExecutedRoutedEventArgs e)
  2144. {
  2145. AnimeSeriesVM ser = e.Parameter as AnimeSeriesVM;
  2146. if (ser == null) return;
  2147. try
  2148. {
  2149. DeleteSeriesGroupForm frm = new DeleteSeriesGroupForm();
  2150. frm.Owner = this;
  2151. bool? result = frm.ShowDialog();
  2152. if (result.HasValue && result.Value == true)
  2153. {
  2154. this.Cursor = Cursors.Wait;
  2155. JMMServerVM.Instance.clientBinaryHTTP.DeleteAnimeSeries(ser.AnimeSeriesID.Value, frm.DeleteFiles, frm.DeleteGroups);
  2156. MainListHelperVM.Instance.RefreshGroupsSeriesData();
  2157. MainListHelperVM.Instance.ShowChildWrappers(MainListHelperVM.Instance.CurrentWrapper);
  2158. SetDetailBinding(null);
  2159. this.Cursor = Cursors.Arrow;
  2160. }
  2161. }
  2162. catch (Exception ex)
  2163. {
  2164. Utils.ShowErrorMessage(ex);
  2165. }
  2166. finally
  2167. {
  2168. this.Cursor = Cursors.Arrow;
  2169. }
  2170. }
  2171. private void CommandBinding_MoveSeries(object sender, ExecutedRoutedEventArgs e)
  2172. {
  2173. AnimeSeriesVM ser = e.Parameter as AnimeSeriesVM;
  2174. if (ser == null) return;
  2175. try
  2176. {
  2177. MoveSeries frm = new MoveSeries();
  2178. frm.Owner = this;
  2179. frm.Init(ser);
  2180. bool? result = frm.ShowDialog();
  2181. if (result.HasValue && result.Value == true)
  2182. {
  2183. AnimeGroupVM grpSelected = frm.SelectedGroup;
  2184. if (grpSelected == null) return;
  2185. MoveSeriesDetails request = new MoveSeriesDetails();
  2186. request.OldAnimeGroupID = ser.AnimeGroupID;
  2187. ser.AnimeGroupID = grpSelected.AnimeGroupID.Value;
  2188. request.UpdatedSeries = ser;
  2189. this.Cursor = Cursors.Wait;
  2190. EnableDisableGroupControls(false);
  2191. moveSeriesWorker.RunWorkerAsync(request);
  2192. }
  2193. }
  2194. catch (Exception ex)
  2195. {
  2196. Utils.ShowErrorMessage(ex);
  2197. }
  2198. }
  2199. private void CommandBinding_ClearSearch(object sender, ExecutedRoutedEventArgs e)
  2200. {
  2201. txtGroupSearch.Text = "";
  2202. HighlightMainListItem();
  2203. }
  2204. private void CommandBinding_RunImport(object sender, ExecutedRoutedEventArgs e)
  2205. {
  2206. try
  2207. {
  2208. JMMServerVM.Instance.RunImport();
  2209. MessageBox.Show("Import is Running", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
  2210. }
  2211. catch (Exception ex)
  2212. {
  2213. Utils.ShowErrorMessage(ex);
  2214. }
  2215. }
  2216. private void CommandBinding_RemoveMissingFiles(object sender, ExecutedRoutedEventArgs e)
  2217. {
  2218. try
  2219. {
  2220. MessageBoxResult res = MessageBox.Show(string.Format("Are you sure you want run this process?"),
  2221. "Confirm", MessageBoxButton.YesNo, MessageBoxImage.Question);
  2222. if (res == MessageBoxResult.Yes)
  2223. {
  2224. JMMServerVM.Instance.RemoveMissingFiles();
  2225. MessageBox.Show("Process is Running", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
  2226. }
  2227. }
  2228. catch (Exception ex)
  2229. {
  2230. Utils.ShowErrorMessage(ex);
  2231. }
  2232. }
  2233. private void CommandBinding_SyncMyList(object sender, ExecutedRoutedEventArgs e)
  2234. {
  2235. try
  2236. {
  2237. JMMServerVM.Instance.SyncMyList();
  2238. MessageBox.Show("Process is Running", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
  2239. }
  2240. catch (Exception ex)
  2241. {
  2242. Utils.ShowErrorMessage(ex);
  2243. }
  2244. }
  2245. private void CommandBinding_SyncVotes(object sender, ExecutedRoutedEventArgs e)
  2246. {
  2247. try
  2248. {
  2249. JMMServerVM.Instance.SyncVotes();
  2250. MessageBox.Show("Process is Running", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
  2251. }
  2252. catch (Exception ex)
  2253. {
  2254. Utils.ShowErrorMessage(ex);
  2255. }
  2256. }
  2257. private void CommandBinding_SyncMALUp(object sender, ExecutedRoutedEventArgs e)
  2258. {
  2259. try
  2260. {
  2261. JMMServerVM.Instance.clientBinaryHTTP.SyncMALUpload();
  2262. MessageBox.Show("Process is Queued", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
  2263. }
  2264. catch (Exception ex)
  2265. {
  2266. Utils.ShowErrorMessage(ex);
  2267. }
  2268. }
  2269. private void CommandBinding_SyncMALDown(object sender, ExecutedRoutedEventArgs e)
  2270. {
  2271. try
  2272. {
  2273. JMMServerVM.Instance.clientBinaryHTTP.SyncMALDownload();
  2274. MessageBox.Show("Process is Queued", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
  2275. }
  2276. catch (Exception ex)
  2277. {
  2278. Utils.ShowErrorMessage(ex);
  2279. }
  2280. }
  2281. private void CommandBinding_RevokeVote(object sender, ExecutedRoutedEventArgs e)
  2282. {
  2283. AnimeSeriesVM ser = e.Parameter as AnimeSeriesVM;
  2284. if (ser == null) return;
  2285. try
  2286. {
  2287. JMMServerVM.Instance.RevokeVote(ser.AniDB_ID);
  2288. // refresh the data
  2289. //ser.RefreshBase();
  2290. //ser.AniDB_Anime.Detail.RefreshBase();
  2291. MainListHelperVM.Instance.UpdateHeirarchy(ser);
  2292. //SetDetailBinding(null);
  2293. //SetDetailBinding(ser);
  2294. }
  2295. catch (Exception ex)
  2296. {
  2297. Utils.ShowErrorMessage(ex);
  2298. }
  2299. }
  2300. private void CommandBinding_ToggleWatchedStatus(object sender, ExecutedRoutedEventArgs e)
  2301. {
  2302. object obj = e.Parameter;
  2303. if (obj == null) return;
  2304. this.Cursor = Cursors.Wait;
  2305. EnableDisableGroupControls(false);
  2306. toggleStatusWorker.RunWorkerAsync(obj);
  2307. }
  2308. private void CommandBinding_BreadCrumbSelect(object sender, ExecutedRoutedEventArgs e)
  2309. {
  2310. try
  2311. {
  2312. // switching back to the top view (show all filters)
  2313. if (e.Parameter == null)
  2314. {
  2315. MainListHelperVM.Instance.ShowChildWrappers(null);
  2316. }
  2317. if (e.Parameter is MainListWrapper)
  2318. {
  2319. MainListHelperVM.Instance.ShowChildWrappers(e.Parameter as MainListWrapper);
  2320. }
  2321. HighlightMainListItem();
  2322. }
  2323. catch (Exception ex)
  2324. {
  2325. Utils.ShowErrorMessage(ex);
  2326. }
  2327. }
  2328. private void CommandBinding_ToggleFave(object sender, ExecutedRoutedEventArgs e)
  2329. {
  2330. object obj = e.Parameter;
  2331. if (obj == null) return;
  2332. if (obj.GetType() == typeof(AnimeGroupVM))
  2333. {
  2334. AnimeGroupVM grp = (AnimeGroupVM)obj;
  2335. grp.IsFave = grp.IsFave == 1 ? 0 : 1;
  2336. // the user can toggle the fave without going into edit mode
  2337. if (grp.IsReadOnly)
  2338. grp.Save();
  2339. //BindingExpression be = ccDetail.GetBindingExpression(ContentControl.ContentProperty);
  2340. //be.UpdateSource();
  2341. }
  2342. if (obj.GetType() == typeof(AnimeSeriesVM))
  2343. {
  2344. AnimeSeriesVM ser = (AnimeSeriesVM)obj;
  2345. AnimeGroupVM grp = ser.TopLevelAnimeGroup;
  2346. if (grp == null) return;
  2347. grp.IsFave = grp.IsFave == 1 ? 0 : 1;
  2348. grp.Save();
  2349. ser.PopulateIsFave();
  2350. MainListHelperVM.Instance.UpdateHeirarchy(ser);
  2351. }
  2352. }
  2353. private void CommandBinding_ToggleExpandTags(object sender, ExecutedRoutedEventArgs e)
  2354. {
  2355. UserSettingsVM.Instance.TagsExpanded = !UserSettingsVM.Instance.TagsExpanded;
  2356. }
  2357. private void CommandBinding_ToggleExpandTitles(object sender, ExecutedRoutedEventArgs e)
  2358. {
  2359. UserSettingsVM.Instance.TitlesExpanded = !UserSettingsVM.Instance.TitlesExpanded;
  2360. }
  2361. private void SetWindowFullscreen()
  2362. {
  2363. this.WindowState = System.Windows.WindowState.Normal;
  2364. this.WindowStyle = System.Windows.WindowStyle.None;
  2365. //this.Topmost = true;
  2366. this.WindowState = System.Windows.WindowState.Maximized;
  2367. }
  2368. private void CommandBinding_WindowFullScreen(object sender, ExecutedRoutedEventArgs e)
  2369. {
  2370. UserSettingsVM.Instance.WindowFullScreen = true;
  2371. UserSettingsVM.Instance.WindowNormal = false;
  2372. SetWindowFullscreen();
  2373. }
  2374. private void SetWindowNormal()
  2375. {
  2376. this.WindowState = AppSettings.DefaultWindowState;
  2377. this.WindowStyle = System.Windows.WindowStyle.SingleBorderWindow;
  2378. }
  2379. private void CommandBinding_WindowNormal(object sender, ExecutedRoutedEventArgs e)
  2380. {
  2381. UserSettingsVM.Instance.WindowFullScreen = false;
  2382. UserSettingsVM.Instance.WindowNormal = true;
  2383. SetWindowNormal();
  2384. }
  2385. private void CommandBinding_WindowClose(object sender, ExecutedRoutedEventArgs e)
  2386. {
  2387. this.Close();
  2388. }
  2389. private void CommandBinding_WindowMinimize(object sender, ExecutedRoutedEventArgs e)
  2390. {
  2391. this.WindowState = System.Windows.WindowState.Minimized;
  2392. }
  2393. #region Server Queue Actions
  2394. private void CommandBinding_HasherQueuePause(object sender, ExecutedRoutedEventArgs e)
  2395. {
  2396. try
  2397. {
  2398. JMMServerVM.Instance.clientBinaryHTTP.SetCommandProcessorHasherPaused(true);
  2399. }
  2400. catch (Exception ex)
  2401. {
  2402. Utils.ShowErrorMessage(ex);
  2403. }
  2404. }
  2405. private void CommandBinding_HasherQueueResume(object sender, ExecutedRoutedEventArgs e)
  2406. {
  2407. try
  2408. {
  2409. JMMServerVM.Instance.clientBinaryHTTP.SetCommandProcessorHasherPaused(false);
  2410. }
  2411. catch (Exception ex)
  2412. {
  2413. Utils.ShowErrorMessage(ex);
  2414. }
  2415. }
  2416. private void CommandBinding_GeneralQueuePause(object sender, ExecutedRoutedEventArgs e)
  2417. {
  2418. try
  2419. {
  2420. JMMServerVM.Instance.clientBinaryHTTP.SetCommandProcessorGeneralPaused(true);
  2421. }
  2422. catch (Exception ex)
  2423. {
  2424. Utils.ShowErrorMessage(ex);
  2425. }
  2426. }
  2427. private void CommandBinding_GeneralQueueResume(object sender, ExecutedRoutedEventArgs e)
  2428. {
  2429. try
  2430. {
  2431. JMMServerVM.Instance.clientBinaryHTTP.SetCommandProcessorGeneralPaused(false);
  2432. }
  2433. catch (Exception ex)
  2434. {
  2435. Utils.ShowErrorMessage(ex);
  2436. }
  2437. }
  2438. private void CommandBinding_ServerImageQueuePause(object sender, ExecutedRoutedEventArgs e)
  2439. {
  2440. try
  2441. {
  2442. JMMServerVM.Instance.clientBinaryHTTP.SetCommandProcessorImagesPaused(true);
  2443. }
  2444. catch (Exception ex)
  2445. {
  2446. Utils.ShowErrorMessage(ex);
  2447. }
  2448. }
  2449. private void CommandBinding_ServerImageQueueResume(object sender, ExecutedRoutedEventArgs e)
  2450. {
  2451. try
  2452. {
  2453. JMMServerVM.Instance.clientBinaryHTTP.SetCommandProcessorImagesPaused(false);
  2454. }
  2455. catch (Exception ex)
  2456. {
  2457. Utils.ShowErrorMessage(ex);
  2458. }
  2459. }
  2460. #endregion
  2461. #endregion
  2462. public bool GroupFilter_GroupSearch(object obj)
  2463. {
  2464. AnimeGroupVM grpvm = obj as AnimeGroupVM;
  2465. if (grpvm == null) return false;
  2466. return GroupSearchFilterHelper.EvaluateGroupFilter(groupFilterVM, grpvm);
  2467. }
  2468. void lbPlaylists_SelectionChanged(object sender, SelectionChangedEventArgs e)
  2469. {
  2470. try
  2471. {
  2472. SetDetailBindingPlaylist(null);
  2473. System.Windows.Controls.ListBox lb = (System.Windows.Controls.ListBox)sender;
  2474. object obj = lb.SelectedItem;
  2475. if (obj == null) return;
  2476. if (obj.GetType() == typeof(PlaylistVM))
  2477. {
  2478. this.Cursor = Cursors.Wait;
  2479. PlaylistVM pl = obj as PlaylistVM;
  2480. pl.PopulatePlaylistObjects();
  2481. //series.RefreshBase();
  2482. //MainListHelperVM.Instance.LastAnimeSeriesID = series.AnimeSeriesID.Value;
  2483. //MainListHelperVM.Instance.CurrentSeries = series;
  2484. }
  2485. SetDetailBindingPlaylist(obj);
  2486. this.Cursor = Cursors.Arrow;
  2487. }
  2488. catch (Exception ex)
  2489. {
  2490. Utils.ShowErrorMessage(ex);
  2491. }
  2492. }
  2493. void lbGroupsSeries_SelectionChanged(object sender, SelectionChangedEventArgs e)
  2494. {
  2495. try
  2496. {
  2497. //epListMain.DataContext = null;
  2498. System.Windows.Controls.ListBox lb = (System.Windows.Controls.ListBox)sender;
  2499. object obj = lb.SelectedItem;
  2500. if (obj == null) return;
  2501. if (obj.GetType() == typeof(AnimeSeriesVM))
  2502. {
  2503. AnimeSeriesVM series = obj as AnimeSeriesVM;
  2504. series.RefreshBase();
  2505. MainListHelperVM.Instance.LastAnimeSeriesID = series.AnimeSeriesID.Value;
  2506. MainListHelperVM.Instance.CurrentSeries = series;
  2507. }
  2508. if (obj.GetType() == typeof(AnimeGroupVM))
  2509. {
  2510. AnimeGroupVM grp = obj as AnimeGroupVM;
  2511. MainListHelperVM.Instance.LastAnimeGroupID = grp.AnimeGroupID.Value;
  2512. if (MainListHelperVM.Instance.LastGroupFilterID != 0 && lbGroupsSeries.SelectedItem != null)
  2513. MainListHelperVM.Instance.LastGroupForGF[MainListHelperVM.Instance.LastGroupFilterID] = lbGroupsSeries.SelectedIndex;
  2514. }
  2515. if (obj.GetType() == typeof(GroupFilterVM))
  2516. {
  2517. GroupFilterVM gf = obj as GroupFilterVM;
  2518. MainListHelperVM.Instance.LastGroupFilterID = gf.GroupFilterID.Value;
  2519. groupFilterVM = gf;
  2520. MainListHelperVM.Instance.ViewGroupsForms.Filter = GroupFilter_GroupSearch;
  2521. MainListHelperVM.Instance.SetGroupFilterSortingOnForms(gf);
  2522. }
  2523. //SetDetailBinding(MainListHelperVM.Instance.AllGroups[0]);
  2524. SetDetailBinding(obj);
  2525. if (obj.GetType() == typeof(AnimeSeriesVM))
  2526. {
  2527. AnimeSeriesVM series = obj as AnimeSeriesVM;
  2528. //epListMain.DataContext = series;
  2529. }
  2530. }
  2531. catch (Exception ex)
  2532. {
  2533. Utils.ShowErrorMessage(ex);
  2534. }
  2535. }
  2536. public void ShowChildrenForCurrentGroup(AnimeSeriesVM ser)
  2537. {
  2538. if (lbGroupsSeries.SelectedItem == null) return;
  2539. if (lbGroupsSeries.SelectedItem is MainListWrapper)
  2540. {
  2541. // this is the last supported drill down
  2542. if (lbGroupsSeries.SelectedItem.GetType() == typeof(AnimeSeriesVM)) return;
  2543. MainListHelperVM.Instance.LastAnimeSeriesID = ser.AnimeSeriesID.Value;
  2544. EnableDisableGroupControls(false);
  2545. showChildWrappersWorker.RunWorkerAsync(lbGroupsSeries.SelectedItem);
  2546. }
  2547. }
  2548. void lbGroupsSeries_MouseDoubleClick(object sender, MouseButtonEventArgs e)
  2549. {
  2550. try
  2551. {
  2552. if (lbGroupsSeries.SelectedItem == null) return;
  2553. if (lbGroupsSeries.SelectedItem is MainListWrapper)
  2554. {
  2555. //SetDetailBinding(null);
  2556. // this is the last supported drill down
  2557. if (lbGroupsSeries.SelectedItem.GetType() == typeof(AnimeSeriesVM)) return;
  2558. EnableDisableGroupControls(false);
  2559. showChildWrappersWorker.RunWorkerAsync(lbGroupsSeries.SelectedItem);
  2560. }
  2561. }
  2562. catch (Exception ex)
  2563. {
  2564. Utils.ShowErrorMessage(ex.ToString());
  2565. }
  2566. }
  2567. private void HighlightMainListItem()
  2568. {
  2569. try
  2570. {
  2571. int wrapperID = 0;
  2572. if (MainListHelperVM.Instance.CurrentWrapper == null)
  2573. wrapperID = MainListHelperVM.Instance.LastGroupFilterID;
  2574. else if (MainListHelperVM.Instance.CurrentWrapper is GroupFilterVM)
  2575. wrapperID = MainListHelperVM.Instance.LastAnimeGroupID;
  2576. else if (MainListHelperVM.Instance.CurrentWrapper is AnimeGroupVM)
  2577. wrapperID = MainListHelperVM.Instance.LastAnimeSeriesID;
  2578. if (wrapperID == 0)
  2579. {
  2580. if (lbGroupsSeries.Items != null && lbGroupsSeries.Items.Count > 0)
  2581. {
  2582. lbGroupsSeries.SelectedIndex = 0;
  2583. lbGroupsSeries.Focus();
  2584. }
  2585. }
  2586. else
  2587. {
  2588. if (MainListHelperVM.Instance.CurrentWrapper is GroupFilterVM)
  2589. {
  2590. // if we are looking at a list of groups
  2591. // move to the next item
  2592. if (MainListHelperVM.Instance.LastGroupFilterID != 0
  2593. && MainListHelperVM.Instance.LastGroupForGF.ContainsKey(MainListHelperVM.Instance.LastGroupFilterID))
  2594. {
  2595. int lastSelIndex = MainListHelperVM.Instance.LastGroupForGF[MainListHelperVM.Instance.LastGroupFilterID];
  2596. if (lastSelIndex < lbGroupsSeries.Items.Count)
  2597. {
  2598. lbGroupsSeries.SelectedItem = lbGroupsSeries.Items[lastSelIndex];
  2599. lbGroupsSeries.Focus();
  2600. lbGroupsSeries.ScrollIntoView(lbGroupsSeries.Items[lastSelIndex]);
  2601. SetDetailBinding(lbGroupsSeries.SelectedItem);
  2602. }
  2603. else
  2604. {
  2605. // move to the previous item
  2606. if (lastSelIndex - 1 <= lbGroupsSeries.Items.Count)
  2607. {
  2608. if (lastSelIndex > 0)
  2609. {
  2610. lbGroupsSeries.SelectedItem = lbGroupsSeries.Items[lastSelIndex - 1];
  2611. lbGroupsSeries.Focus();
  2612. lbGroupsSeries.ScrollIntoView(lbGroupsSeries.Items[lastSelIndex - 1]);
  2613. SetDetailBinding(lbGroupsSeries.SelectedItem);
  2614. }
  2615. }
  2616. }
  2617. }
  2618. return;
  2619. }
  2620. else
  2621. {
  2622. foreach (var lbItem in lbGroupsSeries.Items)
  2623. {
  2624. if (lbItem is GroupFilterVM)
  2625. {
  2626. GroupFilterVM gf = lbItem as GroupFilterVM;
  2627. if (gf.GroupFilterID == wrapperID)
  2628. {
  2629. lbGroupsSeries.SelectedItem = lbItem;
  2630. lbGroupsSeries.Focus();
  2631. lbGroupsSeries.ScrollIntoView(lbItem);
  2632. SetDetailBinding(gf);
  2633. return;
  2634. }
  2635. }
  2636. /*if (lbItem is AnimeGroupVM)
  2637. {
  2638. AnimeGroupVM ag = lbItem as AnimeGroupVM;
  2639. if (ag.AnimeGroupID == wrapperID)
  2640. {
  2641. lbGroupsSeries.SelectedItem = lbItem;
  2642. lbGroupsSeries.Focus();
  2643. lbGroupsSeries.ScrollIntoView(lbItem);
  2644. SetDetailBinding(ag);
  2645. return;
  2646. }
  2647. }*/
  2648. if (lbItem is AnimeSeriesVM)
  2649. {
  2650. AnimeSeriesVM series = lbItem as AnimeSeriesVM;
  2651. if (series.AnimeSeriesID == wrapperID)
  2652. {
  2653. lbGroupsSeries.SelectedItem = lbItem;
  2654. lbGroupsSeries.Focus();
  2655. lbGroupsSeries.ScrollIntoView(lbItem);
  2656. SetDetailBinding(series);
  2657. return;
  2658. }
  2659. }
  2660. if (lbItem is AnimeEpisodeVM)
  2661. {
  2662. AnimeEpisodeVM ep = lbItem as AnimeEpisodeVM;
  2663. if (ep.AnimeEpisodeID == wrapperID)
  2664. {
  2665. lbGroupsSeries.SelectedItem = lbItem;
  2666. lbGroupsSeries.Focus();
  2667. lbGroupsSeries.ScrollIntoView(lbItem);
  2668. return;
  2669. }
  2670. }
  2671. }
  2672. }
  2673. }
  2674. if (lbGroupsSeries.Items != null && lbGroupsSeries.Items.Count > 0)
  2675. {
  2676. lbGroupsSeries.SelectedIndex = 0;
  2677. lbGroupsSeries.Focus();
  2678. }
  2679. }
  2680. catch (Exception ex)
  2681. {
  2682. Utils.ShowErrorMessage(ex);
  2683. }
  2684. }
  2685. private void EnableDisableGroupControls(bool val)
  2686. {
  2687. lbGroupsSeries.IsEnabled = val;
  2688. txtGroupSearch.IsEnabled = val;
  2689. tbSeriesEpisodes.IsEnabled = val;
  2690. //epListMain.IsEnabled = val;
  2691. //ccDetail.IsEnabled = val;
  2692. }
  2693. private void SetDetailBinding(object objToBind)
  2694. {
  2695. try
  2696. {
  2697. //BindingOperations.ClearBinding(ccDetail, ContentControl.ContentProperty);
  2698. Binding b = new Binding();
  2699. b.Source = objToBind;
  2700. b.UpdateSourceTrigger = UpdateSourceTrigger.Explicit;
  2701. ccDetail.SetBinding(ContentControl.ContentProperty, b);
  2702. }
  2703. catch (Exception ex)
  2704. {
  2705. Utils.ShowErrorMessage(ex);
  2706. }
  2707. }
  2708. private void SetDetailBindingPlaylist(object objToBind)
  2709. {
  2710. try
  2711. {
  2712. //BindingOperations.ClearBinding(ccDetail, ContentControl.ContentProperty);
  2713. Binding b = new Binding();
  2714. b.Source = objToBind;
  2715. b.UpdateSourceTrigger = UpdateSourceTrigger.Explicit;
  2716. ccPlaylist.SetBinding(ContentControl.ContentProperty, b);
  2717. }
  2718. catch (Exception ex)
  2719. {
  2720. Utils.ShowErrorMessage(ex);
  2721. }
  2722. }
  2723. void URL_RequestNavigate(object sender, RequestNavigateEventArgs e)
  2724. {
  2725. Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri));
  2726. e.Handled = true;
  2727. }
  2728. void grdMain_LayoutUpdated(object sender, EventArgs e)
  2729. {
  2730. }
  2731. }
  2732. /*public class RefreshOptions
  2733. {
  2734. public bool TraktScrobbles { get; set; }
  2735. public bool TraktShouts { get; set; }
  2736. }*/
  2737. }