You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

ViewModel.cs 40 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035
  1. 
  2. using starter.viewmodel.common;
  3. using System;
  4. using System.Windows;
  5. using System.Windows.Forms;
  6. using Downloader;
  7. using MessageBox = System.Windows.MessageBox;
  8. using System.Configuration;
  9. using System.Drawing.Design;
  10. using Application = System.Windows.Application;
  11. using System.ComponentModel;
  12. using Installer;
  13. using static System.Windows.Forms.VisualStyles.VisualStyleElement;
  14. using System.IO;
  15. using System.Windows.Automation.Provider;
  16. using System.Diagnostics;
  17. namespace starter.viewmodel.settings
  18. {
  19. public class SettingsViewModel : NotificationObject
  20. {
  21. //定义BackgroundWorker
  22. BackgroundWorker asyncDownloader;
  23. BackgroundWorker asyncUpdater;
  24. /// <summary>
  25. /// Model object
  26. /// </summary>
  27. private SettingsModel obj = new SettingsModel();
  28. /// <summary>
  29. /// initializer
  30. /// </summary>
  31. public SettingsViewModel()
  32. {
  33. Program.Tencent_cos_download.UpdateHash();
  34. Status = SettingsModel.Status.working;
  35. switch (Program.Tencent_cos_download.CheckSelfVersion())
  36. {
  37. case 1:
  38. if (MessageBoxResult.Yes == MessageBox.Show("下载器需要更新,是否现在更新", "需要更新", MessageBoxButton.YesNo))
  39. {
  40. Process.Start(Path.Combine(Directory.GetCurrentDirectory(), "InstallerUpdater.exe"));
  41. Environment.Exit(0);
  42. }
  43. break;
  44. case -1:
  45. MessageBox.Show("下载器更新检查出错,将继续启动现有下载器");
  46. break;
  47. }
  48. //实例化BackgroundWorker
  49. asyncDownloader = new BackgroundWorker();
  50. asyncUpdater = new BackgroundWorker();
  51. //指示BackgroundWorker是否可以报告进度更新
  52. //当该属性值为True是,将可以成功调用ReportProgress方法,否则将引发InvalidOperationException异常。
  53. asyncDownloader.WorkerReportsProgress = true;
  54. asyncUpdater.WorkerReportsProgress = true;
  55. //挂载方法:
  56. asyncDownloader.DoWork += AsyncDownloader_DoWork;
  57. asyncUpdater.DoWork += AsyncUpdater_DoWork;
  58. //完成通知器:
  59. asyncDownloader.RunWorkerCompleted += AsyncDownloader_RunWorkerCompleted;
  60. asyncUpdater.RunWorkerCompleted += AsyncUpdater_RunWorkerCompleted;
  61. UpdateInfoVis = Visibility.Collapsed;
  62. if (Downloader.Program.Tencent_cos_download.CheckAlreadyDownload())
  63. {
  64. obj.checkUpdate();
  65. Status = SettingsModel.Status.login;
  66. this.RaisePropertyChanged("WindowWidth");
  67. this.RaisePropertyChanged("LaunchVis");
  68. if (obj.RecallUser())
  69. RememberMe = true;
  70. else
  71. RememberMe = false;
  72. this.RaisePropertyChanged("RememberMe");
  73. //在启动时立刻检查更新,确保选手启动最新版选手包
  74. //若有更新,将启动键改为更新键;
  75. //相应地,使用login界面启动;
  76. //结构:上方为登录框架,下方有“修改选手包”按钮
  77. }
  78. else
  79. {
  80. Route = Environment.GetEnvironmentVariable("USERPROFILE") + "\\THUAI6";
  81. Status = SettingsModel.Status.newUser;
  82. this.RaisePropertyChanged("WindowWidth");
  83. }
  84. }
  85. private void AsyncDownloader_RunWorkerCompleted(object? sender, RunWorkerCompletedEventArgs e)
  86. {
  87. if (e.Result == null)
  88. {
  89. Status = SettingsModel.Status.error;
  90. }
  91. else if ((bool)e.Result)
  92. {
  93. Status = SettingsModel.Status.successful;
  94. }
  95. else
  96. {
  97. Status = SettingsModel.Status.newUser;
  98. }
  99. }
  100. private void AsyncUpdater_RunWorkerCompleted(object? sender, RunWorkerCompletedEventArgs e)
  101. {
  102. if (e.Result == null)
  103. {
  104. Status = SettingsModel.Status.error;
  105. }
  106. else
  107. {
  108. this.RaisePropertyChanged("LaunchVis");
  109. if ((int)e.Result == 1)
  110. {
  111. Status = SettingsModel.Status.successful;
  112. this.RaisePropertyChanged("UpdateBtnCont");
  113. this.RaisePropertyChanged("UpdateInfo");
  114. this.RaisePropertyChanged("LaunchBtnCont");
  115. }
  116. else if ((int)e.Result == 2)
  117. {
  118. Status = SettingsModel.Status.login;
  119. this.RaisePropertyChanged("UpdateBtnCont");
  120. this.RaisePropertyChanged("LaunchBtnCont");
  121. this.RaisePropertyChanged("UpdateInfo");
  122. }
  123. else
  124. {
  125. string updateFailList = "";
  126. foreach (var Filename in Program.UpdateFailed)
  127. {
  128. updateFailList += Filename + "\n";
  129. }
  130. MessageBox.Show($"以下文件因被占用而未能成功更新:\n{updateFailList}请关闭它们,并再试一次");
  131. Program.ResetUpdateFailedInfo();
  132. Status = SettingsModel.Status.successful;
  133. this.RaisePropertyChanged("UpdateBtnCont");
  134. this.RaisePropertyChanged("UpdateInfo");
  135. this.RaisePropertyChanged("LaunchBtnCont");
  136. }
  137. }
  138. }
  139. private void AsyncUpdater_DoWork(object? sender, DoWorkEventArgs e)
  140. {
  141. if (asyncUpdater.CancellationPending)
  142. {
  143. e.Cancel = true;
  144. MessageBox.Show("下载取消");
  145. if (e.Argument.ToString().Equals("Manual"))
  146. {
  147. Status = SettingsModel.Status.menu;
  148. }
  149. else
  150. Status = SettingsModel.Status.login;
  151. return;
  152. }
  153. else
  154. {
  155. if (obj.Update())
  156. if (e.Argument.ToString().Equals("Manual"))
  157. {
  158. e.Result = 1;
  159. }
  160. else
  161. e.Result = 2;
  162. else
  163. e.Result = -1;
  164. }
  165. }
  166. private void AsyncDownloader_DoWork(object? sender, DoWorkEventArgs e)
  167. {
  168. if (asyncDownloader.CancellationPending)
  169. {
  170. e.Cancel = true;
  171. return;
  172. }
  173. else
  174. {
  175. if (obj.install())
  176. e.Result = true;
  177. else
  178. e.Result = false;
  179. }
  180. }
  181. //TODO:参赛界面:包括上传参赛代码、申请对战
  182. //TODO:界面中应包含上次对战完成提示及下载回放按钮
  183. public int ExtraColumn
  184. {
  185. get
  186. {
  187. if (Status == SettingsModel.Status.newUser || Status == SettingsModel.Status.move)
  188. return 75;
  189. else
  190. return 0;
  191. }
  192. }
  193. public int WindowWidth
  194. {
  195. get
  196. {
  197. switch (Status)
  198. {
  199. case SettingsModel.Status.newUser:
  200. return 505;
  201. case SettingsModel.Status.move:
  202. return 505;
  203. case SettingsModel.Status.working:
  204. return 435;
  205. case SettingsModel.Status.successful:
  206. return 435;
  207. default:
  208. return 355;
  209. }
  210. }
  211. }
  212. public SettingsModel.Status Status
  213. {
  214. get
  215. {
  216. return obj.status;
  217. }
  218. set
  219. {
  220. obj.status = value;
  221. this.RaisePropertyChanged("ExtraColumn");
  222. this.RaisePropertyChanged("Intro");
  223. this.RaisePropertyChanged("RouteBoxIntro");
  224. this.RaisePropertyChanged("LoginVis");
  225. this.RaisePropertyChanged("MenuVis");
  226. this.RaisePropertyChanged("RouteBoxVis");
  227. this.RaisePropertyChanged("ProgressVis");
  228. //TODO: Thread will be taken by process working and window will not refresh.
  229. this.RaisePropertyChanged("CompleteVis");
  230. this.RaisePropertyChanged("WindowWidth");
  231. this.RaisePropertyChanged("WebVis");
  232. this.RaisePropertyChanged("CoverVis");
  233. this.RaisePropertyChanged("LaunchVis");
  234. this.RaisePropertyChanged("NewUserVis");
  235. this.RaisePropertyChanged("ConfirmBtnCont");
  236. }
  237. }
  238. public string Intro
  239. {
  240. get
  241. {
  242. switch (Status)
  243. {
  244. case SettingsModel.Status.newUser:
  245. return "欢迎使用选手包,请选择你想要安装选手包的位置:";
  246. case SettingsModel.Status.menu:
  247. return "你已经安装了选手包,请选择想要进行的操作:";
  248. case SettingsModel.Status.login:
  249. return "使用EESAST账号登录";
  250. case SettingsModel.Status.web:
  251. return "THUAI6 赛场:";
  252. case SettingsModel.Status.disconnected:
  253. return "你可能没有连接到网络,无法下载/更新选手包";
  254. case SettingsModel.Status.error:
  255. return "我们遇到了一些问题,请向[]反馈";
  256. default:
  257. return "";
  258. }
  259. }
  260. }
  261. public string RouteBoxIntro
  262. {
  263. get
  264. {
  265. switch (Status)
  266. {
  267. case SettingsModel.Status.newUser:
  268. return "将选手包安装在(将创建THUAI6文件夹):";
  269. case SettingsModel.Status.move:
  270. return "将选手包移动到(THUAI6文件夹将会被整体移动):";
  271. default:
  272. return "";
  273. }
  274. }
  275. }
  276. public string AbortOrSelLanguage
  277. {
  278. get
  279. {
  280. string ans = "";
  281. if (obj.UploadReady)
  282. ans = "放弃上传";
  283. else if (obj.launchLanguage == SettingsModel.LaunchLanguage.cpp)
  284. ans = "语言:c++";
  285. else if (obj.launchLanguage == SettingsModel.LaunchLanguage.python)
  286. ans = "语言:python";
  287. return ans;
  288. }
  289. }
  290. public int PlayerNum
  291. {
  292. get
  293. {
  294. int ans;
  295. if (obj.PlayerNum.Equals("player_1"))
  296. ans = 1;
  297. else if (obj.PlayerNum.Equals("player_2"))
  298. ans = 2;
  299. else if (obj.PlayerNum.Equals("player_3"))
  300. ans = 3;
  301. else if (obj.PlayerNum.Equals("player_4"))
  302. ans = 4;
  303. else
  304. ans = 0;
  305. return ans;
  306. }
  307. set
  308. {
  309. switch (value)
  310. {
  311. case 1:
  312. obj.PlayerNum = "player_1";
  313. break;
  314. case 2:
  315. obj.PlayerNum = "player_2";
  316. break;
  317. case 3:
  318. obj.PlayerNum = "player_3";
  319. break;
  320. case 4:
  321. obj.PlayerNum = "player_4";
  322. break;
  323. default:
  324. obj.PlayerNum = "nSelect";
  325. break;
  326. }
  327. this.RaisePropertyChanged("PlayerNum");
  328. }
  329. }
  330. public string Route
  331. {
  332. get
  333. {
  334. return obj.Route;
  335. }
  336. set
  337. {
  338. obj.Route = value;
  339. this.RaisePropertyChanged("Route");
  340. }
  341. }
  342. public string Username
  343. {
  344. get => obj.Username;
  345. set
  346. {
  347. obj.Username = value;
  348. this.RaisePropertyChanged("Username");
  349. }
  350. }
  351. public string Password
  352. {
  353. get => obj.Password;
  354. set
  355. {
  356. obj.Password = value;
  357. this.RaisePropertyChanged("Password");
  358. }
  359. }
  360. public string CodeName
  361. {
  362. get
  363. {
  364. return obj.CodeRoute.Substring(obj.CodeRoute.LastIndexOf('/') == -1 ? obj.CodeRoute.LastIndexOf('\\') + 1 : obj.CodeRoute.LastIndexOf('/') + 1);
  365. }
  366. }
  367. public bool RememberMe
  368. {
  369. get
  370. {
  371. return obj.RememberMe;
  372. }
  373. set
  374. {
  375. obj.RememberMe = value;
  376. this.RaisePropertyChanged("RememberMe");
  377. }
  378. }
  379. public Visibility NewUserVis
  380. {
  381. get
  382. {
  383. return Status == SettingsModel.Status.newUser ? Visibility.Visible : Visibility.Collapsed;
  384. }
  385. }
  386. public Visibility MenuVis
  387. {
  388. get
  389. {
  390. return Status == SettingsModel.Status.menu ? Visibility.Visible : Visibility.Collapsed;
  391. }
  392. }
  393. public Visibility RouteBoxVis
  394. {
  395. get
  396. {
  397. return (Status == SettingsModel.Status.newUser || Status == SettingsModel.Status.move) ? Visibility.Visible : Visibility.Collapsed;
  398. }
  399. }
  400. public Visibility LoginVis
  401. {
  402. get
  403. {
  404. return Status == SettingsModel.Status.login ? Visibility.Visible : Visibility.Collapsed;
  405. }
  406. }
  407. public Visibility ProgressVis
  408. {
  409. get
  410. {
  411. return Status == SettingsModel.Status.working ? Visibility.Visible : Visibility.Collapsed;
  412. }
  413. }
  414. public Visibility CompleteVis
  415. {
  416. get
  417. {
  418. return Status == SettingsModel.Status.successful ? Visibility.Visible : Visibility.Collapsed;
  419. }
  420. }
  421. public Visibility WebVis
  422. {
  423. get
  424. {
  425. return Status == SettingsModel.Status.web ? Visibility.Visible : Visibility.Collapsed;
  426. }
  427. }
  428. public Visibility CoverVis
  429. {
  430. get
  431. {
  432. return Status == SettingsModel.Status.web && !obj.UploadReady ? Visibility.Visible : Visibility.Collapsed;
  433. }
  434. }
  435. public Visibility LoginFailVis
  436. {
  437. get
  438. {
  439. return obj.LoginFailed ? Visibility.Visible : Visibility.Collapsed;
  440. }
  441. }
  442. public Visibility MatchFinishedVis
  443. {
  444. get
  445. {
  446. return obj.CombatCompleted ? Visibility.Visible : Visibility.Collapsed;
  447. }
  448. }
  449. public Visibility UploadReadyVis
  450. {
  451. get { return obj.UploadReady ? Visibility.Visible : Visibility.Collapsed; }
  452. }
  453. public Visibility UpdateInfoVis
  454. {
  455. get; set;
  456. }
  457. public Visibility LaunchVis
  458. {
  459. get
  460. {
  461. return obj.status == SettingsModel.Status.login && (!obj.UpdatePlanned) ? Visibility.Visible : Visibility.Collapsed;
  462. }
  463. }
  464. public string UpdateBtnCont
  465. {
  466. get
  467. {
  468. return obj.UpdatePlanned ? "更新" : "检查更新";
  469. }
  470. }
  471. public string UpdateInfo
  472. {
  473. get
  474. {
  475. if (obj.UpdatePlanned)
  476. return obj.Updates;
  477. else
  478. return "已是最新版本";
  479. }
  480. }
  481. public string LaunchBtnCont
  482. {
  483. get
  484. {
  485. string ans;
  486. if (obj.UpdatePlanned)
  487. ans = "更新";
  488. else if (obj.launchLanguage == SettingsModel.LaunchLanguage.cpp)
  489. ans = "启动c++包";
  490. else
  491. ans = "启动python包";
  492. return ans;
  493. }
  494. }
  495. public string UploadBtnCont
  496. {
  497. get
  498. {
  499. return obj.UploadReady ? "上传代码" : "选择代码上传";
  500. }
  501. }
  502. public string ShiftLanguageBtnCont
  503. {
  504. get
  505. {
  506. return obj.launchLanguage == SettingsModel.LaunchLanguage.cpp ? "改为python" : "改为c++";
  507. }
  508. }
  509. public string ConfirmBtnCont
  510. {
  511. get
  512. {
  513. switch (Status)
  514. {
  515. case SettingsModel.Status.newUser:
  516. return "确认并安装";
  517. case SettingsModel.Status.move:
  518. return "确认并移动";
  519. default:
  520. return "";
  521. }
  522. }
  523. }
  524. public string RouteSelectWindow(string type)
  525. {
  526. if (type == "Folder")
  527. {
  528. using (FolderBrowserDialog dialog = new FolderBrowserDialog())
  529. {
  530. _ = dialog.ShowDialog();
  531. if (dialog.SelectedPath != String.Empty)
  532. return dialog.SelectedPath;
  533. }
  534. }
  535. else if (type == "File")
  536. {
  537. var openFileDialog = new Microsoft.Win32.OpenFileDialog();
  538. if (obj.launchLanguage == SettingsModel.LaunchLanguage.cpp)
  539. {
  540. openFileDialog.InitialDirectory = (Route + "/THUAI6/win/CAPI/cpp/API/src/").Replace("/", "\\");
  541. openFileDialog.Filter = "c++ Source Files (.cpp)|*.cpp|c++ Header File (.h)|*.h|python Source File (.py)|*.py";
  542. }
  543. else if (obj.launchLanguage == SettingsModel.LaunchLanguage.python)
  544. {
  545. openFileDialog.InitialDirectory = (Route + "/THUAI6/win/CAPI/python/PyAPI/").Replace("/", "\\");
  546. openFileDialog.Filter = "python Source File (.py)|*.py|c++ Source Files (.cpp)|*.cpp|c++ Header File (.h)|*.h";
  547. }
  548. var result = openFileDialog.ShowDialog();
  549. if (result == true)
  550. {
  551. return openFileDialog.FileName;
  552. }
  553. }
  554. return "";
  555. }
  556. private BaseCommand clickBrowseCommand;
  557. public BaseCommand ClickBrowseCommand
  558. {
  559. get
  560. {
  561. if (clickBrowseCommand == null)
  562. {
  563. clickBrowseCommand = new BaseCommand(new Action<object>(o =>
  564. {
  565. Route = RouteSelectWindow("Folder");
  566. }));
  567. }
  568. return clickBrowseCommand;
  569. }
  570. }
  571. private BaseCommand clickConfirmCommand;
  572. public BaseCommand ClickConfirmCommand
  573. {
  574. get
  575. {
  576. if (clickConfirmCommand == null)
  577. {
  578. clickConfirmCommand = new BaseCommand(new Action<object>(o =>
  579. {
  580. if (Status == SettingsModel.Status.newUser)
  581. {
  582. if (Directory.Exists(Route))
  583. {
  584. Status = SettingsModel.Status.working;
  585. this.RaisePropertyChanged("ProgressVis");
  586. /*if (obj.install())
  587. {
  588. Status = SettingsModel.Status.successful;
  589. }*/
  590. if (asyncDownloader.IsBusy)
  591. return;
  592. else
  593. {
  594. asyncDownloader.RunWorkerAsync();
  595. }
  596. }
  597. else
  598. {
  599. MessageBox.Show("所选的路径不存在,请重新选择", "路径不存在", MessageBoxButton.OK, MessageBoxImage.Warning);
  600. }
  601. }
  602. else if (Status == SettingsModel.Status.move)
  603. {
  604. //Status = SettingsModel.Status.working;
  605. //this.RaisePropertyChanged("ProgressVis");
  606. if (Directory.Exists(Route))
  607. {
  608. switch (obj.move())
  609. {
  610. case -1:
  611. MessageBox.Show("文件已打开或者目标路径下有同名文件!", "", MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK);
  612. break;
  613. case -2:
  614. Status = SettingsModel.Status.error;
  615. break;
  616. }
  617. Status = SettingsModel.Status.successful;
  618. }
  619. else
  620. {
  621. MessageBox.Show("所选的路径不存在,请重新选择", "路径不存在", MessageBoxButton.OK, MessageBoxImage.Warning);
  622. }
  623. }
  624. }));
  625. }
  626. return clickConfirmCommand;
  627. }
  628. }
  629. private BaseCommand clickUpdateCommand;
  630. public BaseCommand ClickUpdateCommand
  631. {
  632. get
  633. {
  634. if (clickUpdateCommand == null)
  635. {
  636. clickUpdateCommand = new BaseCommand(new Action<object>(o =>
  637. {
  638. this.RaisePropertyChanged("UpdateInfoVis");
  639. if (obj.UpdatePlanned)
  640. {
  641. UpdateInfoVis = Visibility.Collapsed;
  642. this.RaisePropertyChanged("UpdateInfoVis");
  643. Status = SettingsModel.Status.working;
  644. this.RaisePropertyChanged("ProgressVis");
  645. /*if (obj.Update())
  646. {
  647. Status = SettingsModel.Status.successful;
  648. this.RaisePropertyChanged("UpdateBtnCont");
  649. this.RaisePropertyChanged("UpdateInfo");
  650. }
  651. else
  652. Status = SettingsModel.Status.error;*/
  653. if (asyncUpdater.IsBusy)
  654. return;
  655. else
  656. asyncUpdater.RunWorkerAsync("Manual");
  657. }
  658. else
  659. {
  660. UpdateInfoVis = Visibility.Visible;
  661. this.RaisePropertyChanged("UpdateInfoVis");
  662. //Status = SettingsModel.Status.working;
  663. //this.RaisePropertyChanged("ProgressVis");
  664. Status = obj.checkUpdate();
  665. this.RaisePropertyChanged("UpdateBtnCont");
  666. this.RaisePropertyChanged("UpdateInfo");
  667. this.RaisePropertyChanged("LaunchVis");
  668. }
  669. }));
  670. }
  671. return clickUpdateCommand;
  672. }
  673. }
  674. private BaseCommand clickMoveCommand;
  675. public BaseCommand ClickMoveCommand
  676. {
  677. get
  678. {
  679. if (clickMoveCommand == null)
  680. {
  681. clickMoveCommand = new BaseCommand(new Action<object>(o =>
  682. {
  683. Status = SettingsModel.Status.move;
  684. }));
  685. }
  686. return clickMoveCommand;
  687. }
  688. }
  689. private BaseCommand clickUninstCommand;
  690. public BaseCommand ClickUninstCommand
  691. {
  692. get
  693. {
  694. if (clickUninstCommand == null)
  695. {
  696. clickUninstCommand = new BaseCommand(new Action<object>(o =>
  697. {
  698. UpdateInfoVis = Visibility.Collapsed;
  699. this.RaisePropertyChanged("UpdateInfoVis");
  700. switch (obj.Uninst())
  701. {
  702. case -1:
  703. Status = SettingsModel.Status.menu;
  704. MessageBox.Show("文件已经打开,请关闭后再删除", "", MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK);
  705. break;
  706. case 0:
  707. Status = SettingsModel.Status.newUser;
  708. MessageBox.Show($"删除成功!player文件夹中的文件已经放在{Downloader.Program.Data.FilePath}/{Downloader.Program.ProgramName}的根目录下", "", MessageBoxButton.OK, MessageBoxImage.Information, MessageBoxResult.OK);
  709. break;
  710. default:
  711. Status = SettingsModel.Status.error;
  712. break;
  713. }
  714. }));
  715. }
  716. return clickUninstCommand;
  717. }
  718. }
  719. private BaseCommand clickLoginCommand;
  720. public BaseCommand ClickLoginCommand
  721. {
  722. get
  723. {
  724. if (clickLoginCommand == null)
  725. {
  726. clickLoginCommand = new BaseCommand(new Action<object>(async o =>
  727. {
  728. switch (await obj.Login())
  729. {
  730. case -1:
  731. obj.LoginFailed = true;
  732. break;
  733. case 0:
  734. obj.LoginFailed = false;
  735. Status = SettingsModel.Status.web;
  736. if (obj.RememberMe)
  737. {
  738. obj.RememberUser();
  739. RememberMe = true;
  740. this.RaisePropertyChanged("RememberMe");
  741. }
  742. else
  743. {
  744. obj.ForgetUser();
  745. RememberMe = false;
  746. this.RaisePropertyChanged("RememberMe");
  747. Username = "";
  748. Password = "";
  749. this.RaisePropertyChanged("Username");
  750. this.RaisePropertyChanged("Password");
  751. }
  752. this.RaisePropertyChanged("CoverVis");
  753. break;
  754. case -2:
  755. MessageBox.Show("无法连接服务器,请检查网络情况", "网络错误", MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK);
  756. break;
  757. }
  758. this.RaisePropertyChanged("LoginFailVis");
  759. }));
  760. }
  761. return clickLoginCommand;
  762. }
  763. }
  764. private BaseCommand clickLaunchCommand;
  765. public BaseCommand ClickLaunchCommand
  766. {
  767. get
  768. {
  769. if (clickLaunchCommand == null)
  770. {
  771. clickLaunchCommand = new BaseCommand(new Action<object>(o =>
  772. {
  773. if (obj.UpdatePlanned)
  774. {
  775. Status = SettingsModel.Status.working;
  776. this.RaisePropertyChanged("ProgressVis");
  777. if (asyncUpdater.IsBusy)
  778. return;
  779. else
  780. asyncUpdater.RunWorkerAsync("Auto");
  781. }
  782. else if (!obj.Launch())
  783. {
  784. Status = SettingsModel.Status.menu;
  785. }
  786. }));
  787. }
  788. return clickLaunchCommand;
  789. }
  790. }
  791. private BaseCommand clickEditCommand;
  792. public BaseCommand ClickEditCommand
  793. {
  794. get
  795. {
  796. if (clickEditCommand == null)
  797. {
  798. clickEditCommand = new BaseCommand(new Action<object>(o =>
  799. {
  800. Status = SettingsModel.Status.menu;
  801. if (obj.UpdatePlanned)
  802. UpdateInfoVis = Visibility.Visible;
  803. this.RaisePropertyChanged("UpdateInfoVis");
  804. }));
  805. }
  806. return clickEditCommand;
  807. }
  808. }
  809. private BaseCommand clickBackCommand;
  810. public BaseCommand ClickBackCommand
  811. {
  812. get
  813. {
  814. if (clickBackCommand == null)
  815. {
  816. clickBackCommand = new BaseCommand(new Action<object>(o =>
  817. {
  818. UpdateInfoVis = Visibility.Collapsed;
  819. this.RaisePropertyChanged("UpdateInfoVis");
  820. if (Downloader.Program.Tencent_cos_download.CheckAlreadyDownload())
  821. Status = SettingsModel.Status.login;
  822. else
  823. Status = SettingsModel.Status.newUser;
  824. }));
  825. }
  826. return clickBackCommand;
  827. }
  828. }
  829. private BaseCommand clickUploadCommand;
  830. public BaseCommand ClickUploadCommand
  831. {
  832. get
  833. {
  834. if (clickUploadCommand == null)
  835. {
  836. clickUploadCommand = new BaseCommand(new Action<object>(async o =>
  837. {
  838. if (obj.UploadReady)
  839. {
  840. if (obj.PlayerNum.Equals("nSelect"))
  841. {
  842. MessageBox.Show("您还没有选择要上传的玩家身份", "", MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK);
  843. }
  844. else
  845. {
  846. switch (await obj.Upload())
  847. {
  848. case -1:
  849. MessageBox.Show("Token失效!", "", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
  850. break;
  851. case -2:
  852. MessageBox.Show("目标路径不存在!", "", MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK);
  853. break;
  854. case -3:
  855. MessageBox.Show("服务器错误", "", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
  856. break;
  857. case -4:
  858. MessageBox.Show("您未登录或登录失效", "", MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK);
  859. Status = SettingsModel.Status.login;
  860. break;
  861. case -5:
  862. MessageBox.Show("您未报名THUAI!", "", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
  863. break;
  864. case -6:
  865. MessageBox.Show("读取文件失败,请确认文件是否被占用", "", MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK);
  866. break;
  867. case -7:
  868. MessageBox.Show("网络错误,请检查你的网络", "", MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK);
  869. break;
  870. case -8:
  871. MessageBox.Show("不是c++或python源文件", "", MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK);
  872. break;
  873. }
  874. obj.CodeRoute = "";
  875. obj.UploadReady = false;
  876. this.RaisePropertyChanged("UploadBtnCont");
  877. this.RaisePropertyChanged("UploadReadyVis");
  878. this.RaisePropertyChanged("CoverVis");
  879. this.RaisePropertyChanged("AbortOrSelLanguage");
  880. }
  881. }
  882. else
  883. {
  884. obj.CodeRoute = RouteSelectWindow("File");
  885. if (obj.CodeRoute != "")
  886. {
  887. obj.UploadReady = true;
  888. this.RaisePropertyChanged("UploadBtnCont");
  889. this.RaisePropertyChanged("UploadReadyVis");
  890. this.RaisePropertyChanged("CodeName");
  891. this.RaisePropertyChanged("CoverVis");
  892. this.RaisePropertyChanged("AbortOrSelLanguage");
  893. }
  894. else
  895. {
  896. MessageBox.Show("未选择代码,请重新选择!", "", MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK);
  897. }
  898. }
  899. }));
  900. }
  901. return clickUploadCommand;
  902. }
  903. }
  904. private BaseCommand clickAboutUploadCommand;
  905. public BaseCommand ClickAboutUploadCommand
  906. {
  907. get
  908. {
  909. if (clickAboutUploadCommand == null)
  910. {
  911. clickAboutUploadCommand = new BaseCommand(new Action<object>(o =>
  912. {
  913. if (obj.UploadReady)
  914. {
  915. obj.CodeRoute = "";
  916. obj.UploadReady = false;
  917. this.RaisePropertyChanged("UploadBtnCont");
  918. this.RaisePropertyChanged("UploadReadyVis");
  919. this.RaisePropertyChanged("CodeName");
  920. this.RaisePropertyChanged("CoverVis");
  921. this.RaisePropertyChanged("AbortOrSelLanguage");
  922. }
  923. else
  924. {
  925. if (obj.launchLanguage == SettingsModel.LaunchLanguage.cpp)
  926. obj.launchLanguage = SettingsModel.LaunchLanguage.python;
  927. else
  928. obj.launchLanguage = SettingsModel.LaunchLanguage.cpp;
  929. this.RaisePropertyChanged("AbortOrSelLanguage");
  930. this.RaisePropertyChanged("ShiftLanguageBtnCont");
  931. this.RaisePropertyChanged("LaunchBtnCont");
  932. }
  933. }));
  934. }
  935. return clickAboutUploadCommand;
  936. }
  937. }
  938. private BaseCommand clickExitCommand;
  939. public BaseCommand ClickExitCommand
  940. {
  941. get
  942. {
  943. if (clickExitCommand == null)
  944. {
  945. clickExitCommand = new BaseCommand(new Action<object>(o =>
  946. {
  947. Application.Current.Shutdown();
  948. }));
  949. }
  950. return clickExitCommand;
  951. }
  952. }
  953. private BaseCommand clickShiftLanguageCommand;
  954. public BaseCommand ClickShiftLanguageCommand
  955. {
  956. get
  957. {
  958. if (clickShiftLanguageCommand == null)
  959. {
  960. clickShiftLanguageCommand = new BaseCommand(new Action<object>(o =>
  961. {
  962. if (obj.launchLanguage == SettingsModel.LaunchLanguage.cpp)
  963. obj.launchLanguage = SettingsModel.LaunchLanguage.python;
  964. else
  965. obj.launchLanguage = SettingsModel.LaunchLanguage.cpp;
  966. this.RaisePropertyChanged("ShiftLanguageBtnCont");
  967. this.RaisePropertyChanged("LaunchBtnCont");
  968. this.RaisePropertyChanged("AbortOrSelLanguage");
  969. }));
  970. }
  971. return clickShiftLanguageCommand;
  972. }
  973. }
  974. private BaseCommand clickReadCommand;
  975. public BaseCommand ClickReadCommand
  976. {
  977. get
  978. {
  979. if (clickReadCommand == null)
  980. {
  981. clickReadCommand = new BaseCommand(new Action<object>(o =>
  982. {
  983. if (!Directory.Exists(Route + "/THUAI6/win"))
  984. {
  985. if (Directory.Exists(Route.Substring(0, Route.Length - 7) + "/THUAI6/win"))
  986. Route = Route.Substring(0, Route.Length - 7);
  987. else
  988. {
  989. MessageBox.Show("请选择名为THUAI6的完整选手包文件夹,这可能意味着你需要对选手包文件夹进行重命名");
  990. return;
  991. }
  992. }
  993. Program.Data.ResetFilepath(Route);
  994. if (Program.Tencent_cos_download.CheckAlreadyDownload())
  995. Status = SettingsModel.Status.login;
  996. }));
  997. }
  998. return clickReadCommand;
  999. }
  1000. }
  1001. }
  1002. }