HomeViewModel.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. using ApplicationAvalonia.Models;
  2. using CommunityToolkit.Mvvm.ComponentModel;
  3. using CommunityToolkit.Mvvm.Input;
  4. using DryIoc.ImTools;
  5. using Microsoft.EntityFrameworkCore;
  6. using MsBox.Avalonia.Enums;
  7. using MsBox.Avalonia;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Collections.ObjectModel;
  11. using System.Linq;
  12. using System.Text;
  13. using System.Threading.Tasks;
  14. using MsBox.Avalonia.ViewModels.Commands;
  15. using System.ComponentModel;
  16. using OpenGL;
  17. using Pango;
  18. namespace ApplicationAvalonia.ViewModels
  19. {
  20. internal partial class HomeViewModel : ViewModelBase, INotifyPropertyChanged
  21. {
  22. PageSwitcher pgSwitch;
  23. [ObservableProperty]
  24. List<Film> _listFilms;
  25. [ObservableProperty]
  26. List<Film> _listStorage;
  27. [ObservableProperty]
  28. List<Genre> genres;
  29. [ObservableProperty]
  30. string _textSearch = string.Empty;
  31. static List<int> valuesOfGenre = new List<int>();
  32. partial void OnTextSearchChanged(string value) { AllFilters(); }
  33. public HomeViewModel(ref PageSwitcher pgSwitch)
  34. {
  35. this.pgSwitch = pgSwitch;
  36. ListFilms = dbContext.Films.Include(x => x.FilmAndGenres).ThenInclude(x => x.Genre).Include(x => x.DirectorsAndFilms)
  37. .ThenInclude(x => x.IdDirectorNavigation).ToList();
  38. Genres = dbContext.Genres.ToList();
  39. ListStorage = ListFilms;
  40. }
  41. private void AllFilters()
  42. {
  43. ListFilms = ListStorage;
  44. if (valuesOfGenre.Count() > 0)
  45. {
  46. var filmsAndGenre = dbContext.FilmAndGenres.ToList(); // беру таблицу фильмов и жанров
  47. List<int> idOfFilms = new List<int>(); // создаю список под все перечисленные фильмы
  48. foreach (var genre in valuesOfGenre) // шагаю по всем жанрам и беру фильмы по ним (без повторов)
  49. {
  50. var items = filmsAndGenre.Where(x => x.GenreId == genre).Select(x => x.FilmId).ToList();
  51. var unique = items.Except(idOfFilms);
  52. idOfFilms.AddRange(unique);
  53. }
  54. var newListFilms = new List<Film>(); // создаю объекты фильмов
  55. foreach (var film in idOfFilms) // добавляю каждый фильм из ранее найденных
  56. {
  57. var currentFilm = ListStorage.Find(x => x.Id == film);
  58. if (currentFilm != null)
  59. {
  60. newListFilms.Add(currentFilm);
  61. }
  62. }
  63. ListFilms = newListFilms; // отображаю на страницу
  64. }
  65. if (TextSearch.Trim() != string.Empty)
  66. {
  67. ListFilms = ListFilms.Where(x => x.Name.ToLower().Contains(TextSearch.ToLower())).ToList();
  68. }
  69. }
  70. [RelayCommand]
  71. private async void FilmInfo(int IdFilm)
  72. {
  73. var currentFilm = ListFilms.Find(x => x.Id == IdFilm);
  74. if (currentFilm != null)
  75. {
  76. valuesOfGenre = new List<int>();
  77. this.pgSwitch.View = new InfoFilmViewModel(ref pgSwitch, currentFilm);
  78. return;
  79. }
  80. var box = MessageBoxManager.GetMessageBoxStandard("Сообщение", "Что то пошло не так",
  81. ButtonEnum.Ok, Icon.Error);
  82. var result = await box.ShowAsync();
  83. }
  84. [RelayCommand]
  85. private void CallCategory()
  86. {
  87. AllFilters();
  88. }
  89. public static void TakeCategory(int IdCategory)
  90. {
  91. // Тут приходят команды из юзер контроль но в целом это костыль на check`ах
  92. // Лучше поставить на CallCategory с ID в аргументе
  93. if (!valuesOfGenre.Contains(IdCategory))
  94. {
  95. valuesOfGenre.Add(IdCategory);
  96. }
  97. else
  98. {
  99. valuesOfGenre.Remove(IdCategory);
  100. }
  101. }
  102. [RelayCommand]
  103. private void GoToPersonalCabinet()
  104. {
  105. this.pgSwitch.View = new PersonalCabinetViewModel(ref pgSwitch);
  106. }
  107. }
  108. }