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

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