PageRenderTime 46ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/SharpMedia/main/Pages/GridTitleSelectionPage.cs

#
C# | 541 lines | 443 code | 96 blank | 2 comment | 71 complexity | 9a982b772bd40ea8bf5578de89293b38 MD5 | raw file
  1. using System.Collections.Generic;
  2. using System.Data;
  3. using Lizk.SimpleHUD;
  4. using System.IO;
  5. using Lizk.WebScraper;
  6. using System;
  7. using SharpMedia.Controls;
  8. using MediaData;
  9. namespace SharpMedia.Pages
  10. {
  11. public class GridTitleSelectionPage : MediaPage
  12. {
  13. private string currentType;
  14. private HUD2dList list;
  15. private HUDImage selection;
  16. private HUDImage offlineIcon;
  17. private HUDLabel offline, lblCount;
  18. private TimedTrigger<string> keyTrigger;
  19. private TripTrigger selectionTrigger = new TripTrigger(new TimeSpan(0, 0, 0, 0, 200));
  20. private bool showOffline = true;
  21. public GridTitleSelectionPage(MediaPage parent, string type)
  22. : base(parent)
  23. {
  24. currentType = type;
  25. InitializeComponents();
  26. }
  27. private void InitializeComponents()
  28. {
  29. selection = new HUDImage("bigselection.png");
  30. selection.MovementPattern = MovementPattern.DeltaBased;
  31. selection.MovementSpeed = 12f;
  32. selection.ConstrainProportions = false;
  33. selection.Size = new SizeS(400, 200);
  34. selection.Alpha = 0;
  35. Add(selection);
  36. list = new HUD2dList(new SizeS(350, 200));
  37. list.Bounds = new RectangleS(10, 100, Size.Width - 20, Size.Height - 110);
  38. list.Anchor = Anchor.All;
  39. Add(list);
  40. offline = new HUDLabel("Show offline", "tahoma14b");
  41. offline.Bounds = new RectangleS(34, 80, 170, 16);
  42. offline.Alignment = Alignment.VCenter;
  43. Add(offline);
  44. offlineIcon = new HUDImage(showOffline ? "yes.png" : "no.png");
  45. offlineIcon.Bounds = new RectangleS(offline.Bounds.Left - 20, offline.Bounds.Top, 16, 16);
  46. Add(offlineIcon);
  47. lblCount = new HUDLabel("", "tahoma30b");
  48. lblCount.Anchor = Anchor.Top | Anchor.Right;
  49. lblCount.Alignment = Alignment.Right | Alignment.VCenter;
  50. lblCount.Location = new PointS(Bounds.Right - 200, 0);
  51. lblCount.Size = new SizeS(180, list.Bounds.Top - 20);
  52. Add(lblCount);
  53. keyTrigger = new TimedTrigger<string>("", new TimeSpan(0, 0, 0, 0, 600));
  54. keyTrigger.TimeOut += new EventHandler(keyTrigger_TimeOut);
  55. keyTrigger.FirstTrigger += new EventHandler(keyTrigger_FirstTrigger);
  56. keyTrigger.ReTriggered += new EventHandler(keyTrigger_ReTriggered);
  57. selectionTrigger.TimeOut += new EventHandler(selectionTrigger_TimeOut);
  58. list.SelectedIndexChanged += new EventHandler<SelectionEventArgs>(list_SelectedIndexChanged);
  59. }
  60. void list_SelectedIndexChanged(object sender, SelectionEventArgs e)
  61. {
  62. selectionTrigger.Trigger();
  63. if (list.Count > 0)
  64. {
  65. list.Get<GridPageItem>(e.OldIndex).OfflineLabel.Fade(0, 6f);
  66. RectangleS selectionBounds = new RectangleS(new PointS(list.Bounds.Left + list.Selection.Left, list.Bounds.Top + list.Selection.Top), list.Selection.Size);
  67. selection.Destination = selectionBounds.Location;
  68. selection.DestinationSize = selectionBounds.Size;
  69. selection.Fade(255, 6f);
  70. if (!e.Animate)
  71. {
  72. selection.Size = selection.DestinationSize;
  73. selection.Location = selection.Destination;
  74. selection.Alpha = 255;
  75. }
  76. lblCount.Text = list.SelectedIndex + 1 + " of " + list.Count;
  77. //list_SelectedIndexChanged(this, new SelectionEventArgs(list.SelectedIndex, false));
  78. }
  79. else
  80. {
  81. lblCount.Text = "No items found";
  82. selection.Alpha = 0;
  83. }
  84. }
  85. void selectionTrigger_TimeOut(object sender, EventArgs e)
  86. {
  87. if (list.GetSelectedControl<GridPageItem>() == null)
  88. return;
  89. if (Util.IsTitleOffline(SelectedTitle()))
  90. {
  91. list.GetSelectedControl<GridPageItem>().OfflineLabel.Fade(255, 6f);
  92. }
  93. }
  94. void keyTrigger_ReTriggered(object sender, EventArgs e)
  95. {
  96. SelectByString(keyTrigger.StateVar);
  97. }
  98. void keyTrigger_FirstTrigger(object sender, EventArgs e)
  99. {
  100. SelectByString(keyTrigger.StateVar);
  101. }
  102. void keyTrigger_TimeOut(object sender, EventArgs e)
  103. {
  104. keyTrigger.Reset("");
  105. }
  106. public override void Update(TimeSpan ts)
  107. {
  108. base.Update(ts);
  109. keyTrigger.Update();
  110. selectionTrigger.Update(ts);
  111. }
  112. public void SelectByString(string s)
  113. {
  114. int i = 0;
  115. if (s.Length == 0)
  116. return;
  117. while (i < list.Count && s.CompareTo(list.Get<GridPageItem>(i).Title.Name) > -1)
  118. {
  119. i++;
  120. }
  121. if (i == list.Count)
  122. return;
  123. if (s.ToLower()[0].CompareTo(list.Get<GridPageItem>(i).Title.Name.ToLower()[0]) < 0 && i > 0)
  124. {
  125. i--;
  126. }
  127. list.SelectedIndex = i;
  128. UpdateSelection(true);
  129. }
  130. protected override void MediaChanged(MediaDataSet changes)
  131. {
  132. for (int i = 0; i < list.Count; i++)
  133. {
  134. GridPageItem gi = list.Get<GridPageItem>(i);
  135. if (gi.Title.RowState == DataRowState.Deleted || gi.Title.RowState == DataRowState.Detached || gi.Title.GetFilesRows().Length == 0)
  136. {
  137. list.RemoveAt(i--);
  138. continue;
  139. }
  140. if (Util.IsTitleOffline(gi.Title))
  141. {
  142. if (!showOffline)
  143. {
  144. list.RemoveAt(i--);
  145. continue;
  146. }
  147. else
  148. {
  149. gi.Image.Color = ColorS.Red;
  150. gi.OfflineLabel.Text = Util.PrintVolumeInfo(gi.Title) + "\nIs unavailable!";
  151. }
  152. }
  153. else
  154. {
  155. gi.Image.Color = ColorS.White;
  156. gi.OfflineLabel.Fade(0, 6f);
  157. }
  158. gi.Image.File = SharpMedia.ImageCache.TryGetImagePath(gi.Title, "film.png");
  159. }
  160. int insertIndex = 0;
  161. foreach (MediaDataSet.TitlesRow title in (from t in SharpMedia.Database.Data.Titles where t.Type == currentType orderby t.Name select t))
  162. {
  163. if (title.RowState == DataRowState.Deleted || (Util.IsTitleOffline(title) && !showOffline))
  164. continue;
  165. insertIndex = InsertTitle(insertIndex, title);
  166. }
  167. list.MoveItems(true);
  168. UpdateSelection(true);
  169. }
  170. private int InsertTitle(int i, MediaDataSet.TitlesRow title)
  171. {
  172. while (i < list.Count && title.Name.CompareTo(list.Get<GridPageItem>(i).Title.Name) > -1)
  173. {
  174. if (list.Get<GridPageItem>(i).Title == title)
  175. return i;
  176. i++;
  177. }
  178. GridPageItem item = new GridPageItem(title, list.ItemSize);
  179. item.OnMouseUp += new EventHandler<MouseEventArgs>(item_OnMouseUp);
  180. //item.SetScraperIcon(SharpMedia.ScraperCache.GetScrapeStatus(title));
  181. list.Insert(i, item);
  182. return i;
  183. }
  184. void item_OnMouseUp(object sender, HUDControl.MouseEventArgs e)
  185. {
  186. int index = list.IndexOf((HUDControl)sender);
  187. if (index > -1)
  188. {
  189. if (list.SelectedIndex == index)
  190. {
  191. Command(HUDCommands.Select, null);
  192. }
  193. else
  194. {
  195. list.SelectedIndex = index;
  196. }
  197. }
  198. }
  199. private void ListItems()
  200. {
  201. string currentTitle = null;
  202. var titles = from t in SharpMedia.Database.Data.Titles
  203. where t.Type == currentType && t.GetFilesRows().Length > 0
  204. orderby t.Name
  205. select t;
  206. if (list.GetSelectedControl<GridPageItem>() != null)
  207. {
  208. currentTitle = list.GetSelectedControl<GridPageItem>().TitleLabel.Text;
  209. }
  210. list.Clear();
  211. foreach (var title in titles)
  212. {
  213. if (!showOffline && Util.IsTitleOffline(title))
  214. continue;
  215. GridPageItem item = new GridPageItem(title, list.ItemSize);
  216. item.OnMouseUp += new EventHandler<MouseEventArgs>(item_OnMouseUp);
  217. list.Add(item);
  218. }
  219. list.MoveItems(false);
  220. if (currentTitle != null)
  221. {
  222. for (int i = 0; i < list.Count; i++)
  223. {
  224. int cmp = list.Get<GridPageItem>(i).TitleLabel.Text.CompareTo(currentTitle);
  225. if (cmp < 1)
  226. {
  227. list.SelectedIndex = i;
  228. if (cmp == 0)
  229. break;
  230. }
  231. }
  232. UpdateSelection(true);
  233. }
  234. else
  235. {
  236. UpdateSelection(false);
  237. }
  238. }
  239. private void UpdateSelection(bool animate)
  240. {
  241. list_SelectedIndexChanged(this, new SelectionEventArgs(list.SelectedIndex, animate));
  242. }
  243. public override void Activate()
  244. {
  245. Fade(255, 6f);
  246. base.Activate();
  247. }
  248. public override void Show()
  249. {
  250. lock(SharpMedia.UpdateLockObject)
  251. if(!SharpMedia.UpdateLock)
  252. ListItems();
  253. Fade(255, 6f);
  254. base.Show();
  255. }
  256. public override void Close()
  257. {
  258. Fade(0, 6f);
  259. base.Close();
  260. }
  261. public override void Deactivate()
  262. {
  263. Fade(0, 6f);
  264. base.Deactivate();
  265. }
  266. public MediaDataSet.TitlesRow SelectedTitle()
  267. {
  268. if (list.Count == 0 || list.SelectedIndex < 0)
  269. return null;
  270. return list.GetSelectedControl<GridPageItem>().Title;
  271. }
  272. public override void ResizeMove(RectangleS oldRect, RectangleS newRect)
  273. {
  274. base.ResizeMove(oldRect, newRect);
  275. if (list != null)
  276. UpdateSelection(true);
  277. }
  278. public override void Command(HUDCommands command, object tag)
  279. {
  280. MediaDataSet.TitlesRow title = SelectedTitle();
  281. switch (command)
  282. {
  283. case HUDCommands.Up:
  284. list.SelectedRow--;
  285. break;
  286. case HUDCommands.Down:
  287. list.SelectedRow++;
  288. break;
  289. case HUDCommands.Left:
  290. list.SelectedColumn--;
  291. break;
  292. case HUDCommands.Right:
  293. list.SelectedColumn++;
  294. break;
  295. case HUDCommands.PageUp:
  296. list.SelectedRow -= 10;
  297. break;
  298. case HUDCommands.PageDown:
  299. list.SelectedRow += 10;
  300. break;
  301. case HUDCommands.Back:
  302. if (keyTrigger.Triggered)
  303. break;
  304. SharpMedia.Back();
  305. break;
  306. case HUDCommands.Menu:
  307. if (keyTrigger.Triggered)
  308. break;
  309. showOffline = !showOffline;
  310. offlineIcon.File = showOffline ? "images/yes.png" : "images/no.png";
  311. if (SharpMedia.CanUseDatabase)
  312. ListItems();
  313. break;
  314. case HUDCommands.Web:
  315. if (title == null)
  316. break;
  317. if (keyTrigger.Triggered)
  318. break;
  319. Util.TryScrape(this, SelectedTitle());
  320. break;
  321. case HUDCommands.Select:
  322. if (title == null)
  323. break;
  324. if(!SharpMedia.CanUseDatabase)
  325. return;
  326. RectangleS selectedItemBounds = new RectangleS(list.GetSelectedControl<GridPageItem>().Image.Bounds.Location + list.SelectedControl.Bounds.Location + list.Bounds.Location, list.GetSelectedControl<GridPageItem>().Image.Size);
  327. var episodes = title.GetEpisodesRows();
  328. if (episodes.Length > 0)
  329. {
  330. EpisodeSelectionPage esp = new EpisodeSelectionPage(this, title, selectedItemBounds, list.GetSelectedControl<GridPageItem>().Image.ImageSize.Size, null);
  331. SharpMedia.Navigate(esp);
  332. }
  333. else
  334. {
  335. MovieInfoPage mip = new MovieInfoPage(this, title);
  336. SharpMedia.Navigate(mip);
  337. Fade(0, 6f);
  338. }
  339. break;
  340. case HUDCommands.KeyPress:
  341. if (keyTrigger.StateVar.Trim() == "" && (char)tag == ' ')
  342. {
  343. }
  344. else
  345. keyTrigger.StateVar += (char)tag;
  346. break;
  347. default:
  348. if (parent != null)
  349. parent.Command(command, tag);
  350. break;
  351. }
  352. }
  353. }
  354. public class GridPageItem : HUDContainerSimple
  355. {
  356. private MediaDataSet.TitlesRow title;
  357. private HUDImage image;
  358. private ScraperIcon scraperImage;
  359. private HUDLabel offlineLabel;
  360. private HUDLabel titleLabel;
  361. private HUDImage backSelection;
  362. public HUDLabel TitleLabel
  363. {
  364. get { return titleLabel; }
  365. set { titleLabel = value; }
  366. }
  367. public HUDLabel OfflineLabel
  368. {
  369. get { return offlineLabel; }
  370. set { offlineLabel = value; }
  371. }
  372. public ScraperIcon ScraperImage
  373. {
  374. get { return scraperImage; }
  375. set { scraperImage = value; }
  376. }
  377. public HUDImage Image
  378. {
  379. get { return image; }
  380. set { image = value; }
  381. }
  382. public MediaDataSet.TitlesRow Title
  383. {
  384. get { return title; }
  385. set { title = value; }
  386. }
  387. public HUDImage BackSelection
  388. {
  389. get { return backSelection; }
  390. set { backSelection = value; }
  391. }
  392. public GridPageItem(MediaDataSet.TitlesRow title, SizeS itemSize)
  393. {
  394. this.title = title;
  395. Size = itemSize;
  396. backSelection = new HUDImage("bigselection.png");
  397. backSelection.MovementSpeed = 8f;
  398. backSelection.ConstrainProportions = false;
  399. backSelection.Size = Size;
  400. BackSelection.Anchor = Anchor.All;
  401. backSelection.Alpha = 0;
  402. Add(backSelection);
  403. image = new HUDImage(SharpMedia.ImageCache.TryGetImagePath(title, "film.png"));
  404. image.Bounds = new RectangleS(5, 15, itemSize.Width - 10, itemSize.Height - 40);
  405. image.Anchor = Anchor.All;
  406. image.Color = Util.IsTitleOffline(title) ? Lizk.SimpleHUD.ColorS.Red : Lizk.SimpleHUD.ColorS.White;
  407. image.FadeOnLoad = true;
  408. image.ImageSizeChanged += new EventHandler(image_ImageSizeChanged);
  409. Add(image);
  410. RectangleS s = HUDImage.ResizeConstrained(true, Image.ImageSize.Size, Image.Size);
  411. scraperImage = new ScraperIcon(title);
  412. scraperImage.Bounds = new RectangleS(image.Bounds.Left + s.Right - 42, Image.Bounds.Top + s.Bottom - 42, 42, 42);
  413. scraperImage.Anchor = Anchor.Bottom | Anchor.Right;
  414. Add(scraperImage);
  415. offlineLabel = new HUDLabel(Util.PrintVolumeInfo(title) + "\nIs unavailable!", "tahoma20b");
  416. offlineLabel.Alignment = Alignment.Center | Alignment.VCenter;
  417. offlineLabel.Bounds = new RectangleS(0, 0, itemSize.Width, itemSize.Height);
  418. offlineLabel.Alpha = 0;
  419. offlineLabel.Anchor = Anchor.All;
  420. Add(offlineLabel);
  421. titleLabel = new HUDLabel(title.Name, "tahoma28bo");
  422. titleLabel.Bounds = new RectangleS(5, image.Bounds.Bottom - 20, itemSize.Width - 10, itemSize.Height - image.Bounds.Bottom + 20);
  423. titleLabel.Alignment = Alignment.Center | Alignment.Bottom;
  424. titleLabel.Anchor = Anchor.All ^ Anchor.Top;
  425. Add(titleLabel);
  426. }
  427. public override void Update(TimeSpan ts)
  428. {
  429. base.Update(ts);
  430. if (!SharpMedia.Engine.IsCursorHidden && IsMouseOver)
  431. {
  432. backSelection.Fade(100, 6f);
  433. }
  434. else
  435. {
  436. backSelection.Fade(0, 6f);
  437. }
  438. }
  439. void image_ImageSizeChanged(object sender, EventArgs e)
  440. {
  441. RectangleS s = HUDImage.ResizeConstrained(true, Image.ImageSize.Size, Image.Size);
  442. scraperImage.Bounds = new RectangleS(image.Bounds.Left + s.Right - 42, Image.Bounds.Top + s.Bottom - 42, 42, 42);
  443. }
  444. }
  445. }