Advertisement
MrModest

VM.cs

Mar 8th, 2017
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.94 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Linq;
  5. using System.Runtime.CompilerServices;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using ShikiDesk;
  9. using ShikiApiLib;
  10. using System.Windows.Input;
  11. //using Microsoft.TeamFoundation.MVVM; //не смог найти dll для подключения пространства имён, поэтому закомментировано
  12.  
  13. namespace ShikiDeskVM
  14. {
  15.     class VM : INotifyPropertyChanged
  16.     {
  17.         protected bool Set<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
  18.         {
  19.             if (EqualityComparer<T>.Default.Equals(field, value))
  20.                 return false;
  21.  
  22.             field = value;
  23.             RaisePropertyChanged(propertyName);
  24.             return true;
  25.         }
  26.  
  27.         protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) =>
  28.             PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  29.  
  30.         public event PropertyChangedEventHandler PropertyChanged;
  31.     }
  32.  
  33.     class MainVM : VM
  34.     {
  35.         public MainVM() //при инициализации сразу пытаемся получить авторизацию из сохранённых данных
  36.         {
  37.             if (!String.IsNullOrWhiteSpace(ShikiDesk.Properties.Settings.Default.nickname) &&
  38.                 !String.IsNullOrWhiteSpace(ShikiDesk.Properties.Settings.Default.access_token) &&
  39.                 ShikiDesk.Properties.Settings.Default.curren_user_id != -1)
  40.             {
  41.                 User = new ShikiApi(ShikiDesk.Properties.Settings.Default.nickname,
  42.                                     ShikiDesk.Properties.Settings.Default.access_token,
  43.                                     ShikiDesk.Properties.Settings.Default.curren_user_id);
  44.             }
  45.         }
  46.  
  47.         ShikiApi _user;
  48.         public ShikiApi User //инициализированный экземпляр данного класса = авторизованный пользователь
  49.         {
  50.             get { return _user; }
  51.             set { Set(ref _user, value); }
  52.         }
  53.  
  54.         ProgressBar _progressBar;
  55.         public ProgressBar ProgressBar //для прослеживания прогресса загрузки данных
  56.         {
  57.             get { return _progressBar; }
  58.             set { Set(ref _progressBar, value); }
  59.         }
  60.  
  61.         public bool HasCredentials() //Если переменная не получила значение в конструкторе MainVM, значит нет авторизации
  62.         {
  63.             return (User != null);
  64.         }
  65.  
  66.         public void SetCredentials(AutorizationVM autorizationVM)
  67.         {
  68.             User = autorizationVM.User;
  69.         }
  70.  
  71.         public void DownloadData()
  72.         {
  73.             ProgressBar = new ProgressBar();
  74.  
  75.             ProgressBar.Set(0, "Ожидайте. Идёт первоначальная загрузка.");
  76.  
  77.             if (ShikiDesk.Properties.Settings.Default.firstStart) //решил, что данный метод можно будет использовать и для интервальных
  78.             {                                                     //обновлений с сервера, поэтому отдельно выделил запросы, которые
  79.                 User.GetUserInfo();                               //нужны лишь при первом входе
  80.             }
  81.  
  82.             ProgressBar.Set(30, "Идёт загрузка аниме листа. Продолжительность ожидания зависит от количества аниме в вашем списке.");
  83.  
  84.             User.GetAnimeRates();
  85.  
  86.             ProgressBar.Set(50, "Идёт загрузка манга листа. Продолжительность ожидания зависит от количества манги в вашем списке.");
  87.  
  88.             User.GetMangaRates();
  89.  
  90.             ProgressBar.Set(80, "Кэширование данных на диск. Ещё пара секунд..");
  91.  
  92.             DBMethods.FillDataDB(User.anime_rates); //Поля anime_rate и manga_rate сохраняют в себя последний результат соответствующих
  93.                                                     //методов выше                                                              
  94.             DBMethods.FillDataDB(User.manga_rates); //сделано так, чтобы не отправлять лишний раз запросов на сервер, а лишь при
  95.                                                     //необходимости самых свежих. Своего рода кэширование результатов запроса.
  96.                                                     //доступны только для чтения.
  97.             ProgressBar.Set(100, "Загрузка завершена. Запуск приложения.");
  98.         }
  99.     }
  100.  
  101.     class AutorizationVM : VM
  102.     {
  103.         public AutorizationVM()
  104.         {
  105.             Nickname = ShikiDesk.Properties.Settings.Default.nickname;
  106.             //TryLogin = new RelayCommand(onTryLogin); //RelayCommand не существует, без подключения пространства выше
  107.         }
  108.  
  109.         string _nickname;
  110.         public string Nickname
  111.         {
  112.             get { return _nickname; }
  113.             set { Set(ref _nickname, value); }
  114.         }
  115.  
  116.         string _password;
  117.         public string Password
  118.         {
  119.             get { return _password; }
  120.             set { Set(ref _password, value); }
  121.         }
  122.  
  123.         ShikiApi _user;
  124.         public ShikiApi User
  125.         {
  126.             get { return _user; }
  127.             set { Set(ref _user, value); }
  128.         }
  129.  
  130.         string _errorString;
  131.         public string ErrorString //Разве не надо сделать так, чтобы изменять поле можно было только внутри класса?
  132.         {
  133.             get { return _errorString; }
  134.             set { Set(ref _errorString, value); }
  135.         }
  136.  
  137.         bool _savePassword;
  138.         public bool SavePassword //тут по идее должно храниться значение CheckBox "Запомнить пароль"
  139.         {
  140.             get { return _savePassword; }
  141.             set { Set(ref _savePassword, value); }
  142.         }
  143.  
  144.         TaskCompletionSource<int> taskCompletionSource;
  145.  
  146.         public ICommand TryLogin { get; }
  147.  
  148.         public async Task RunAuthorization()
  149.         {
  150.             if (taskCompletionSource != null)
  151.             {
  152.                 throw new InvalidOperationException("Авторизация уже идёт.");
  153.             }
  154.             taskCompletionSource = new TaskCompletionSource<int>();
  155.             await taskCompletionSource.Task;
  156.             taskCompletionSource = null;
  157.         }
  158.  
  159.         void onTryLogin()
  160.         {
  161.             if (string.IsNullOrEmpty(Nickname) || string.IsNullOrEmpty(Password))
  162.             {
  163.                 ErrorString = "Пожалуйста введите логин/пароль!";
  164.                 return;
  165.             }
  166.  
  167.             try
  168.             {
  169.                 User = new ShikiApi(Nickname, Password);
  170.             }
  171.             catch (Exception ex)
  172.             {
  173.                 ErrorString = "Ошибка авторизации: " + ex.Message;
  174.                 return;
  175.             }
  176.  
  177.             if (SavePassword)
  178.             {
  179.                 ShikiDesk.Properties.Settings.Default.nickname = User.nickname;
  180.                 ShikiDesk.Properties.Settings.Default.access_token = User.access_token;
  181.                 ShikiDesk.Properties.Settings.Default.curren_user_id = User.current_user_id;
  182.                 ShikiDesk.Properties.Settings.Default.firstStart = false; //Если сохранили пароль, то следующий вход уже не первый.
  183.                 ShikiDesk.Properties.Settings.Default.Save();
  184.             }
  185.  
  186.             taskCompletionSource.SetResult(0); // только если всё прошло успешно, завершить задачу, что приведёт к возврату управления главному окну.
  187.         }
  188.     }
  189.  
  190.     class ProgressBar
  191.     {
  192.         public ProgressBar()
  193.         {
  194.             Percent = 0;
  195.             Log = "Загрузка...";
  196.         }
  197.  
  198.         int _percent;
  199.         public int Percent
  200.         {
  201.             get { return (_percent > 100) ? 100 : _percent; }
  202.             set { _percent = (value > 100) ? 100 : value; }
  203.         }
  204.  
  205.         string _log;
  206.         public string Log
  207.         {
  208.             get { return "[" + _percent + "] " + _log; }
  209.             set { _log = value; }
  210.         }
  211.  
  212.         public void Set(int percent, string log)
  213.         {
  214.             Percent = percent;
  215.             Log = log;
  216.         }
  217.     }
  218. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement