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

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