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 42 kB

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