|
|
|
@@ -7,11 +7,19 @@ using Downloader; |
|
|
|
using MessageBox = System.Windows.MessageBox; |
|
|
|
using System.Configuration; |
|
|
|
using System.Drawing.Design; |
|
|
|
using Application = System.Windows.Application; |
|
|
|
using System.ComponentModel; |
|
|
|
using Installer; |
|
|
|
using static System.Windows.Forms.VisualStyles.VisualStyleElement; |
|
|
|
using System.IO; |
|
|
|
|
|
|
|
namespace starter.viewmodel.settings |
|
|
|
{ |
|
|
|
public class SettingsViewModel : NotificationObject |
|
|
|
{ |
|
|
|
//定义BackgroundWorker |
|
|
|
BackgroundWorker asyncDownloader; |
|
|
|
BackgroundWorker asyncUpdater; |
|
|
|
/// <summary> |
|
|
|
/// Model object |
|
|
|
/// </summary> |
|
|
|
@@ -22,17 +30,40 @@ namespace starter.viewmodel.settings |
|
|
|
|
|
|
|
public SettingsViewModel() |
|
|
|
{ |
|
|
|
|
|
|
|
//Program.Tencent_cos_download.UpdateHash(); |
|
|
|
//WebConnect.Web.WriteUserEmail("wangsk21@mails.tsinghua.edu.cn"); |
|
|
|
|
|
|
|
//实例化BackgroundWorker |
|
|
|
asyncDownloader = new BackgroundWorker(); |
|
|
|
asyncUpdater = new BackgroundWorker(); |
|
|
|
//指示BackgroundWorker是否可以报告进度更新 |
|
|
|
//当该属性值为True是,将可以成功调用ReportProgress方法,否则将引发InvalidOperationException异常。 |
|
|
|
asyncDownloader.WorkerReportsProgress = true; |
|
|
|
asyncUpdater.WorkerReportsProgress = true; |
|
|
|
//挂载方法: |
|
|
|
asyncDownloader.DoWork += AsyncDownloader_DoWork; |
|
|
|
asyncUpdater.DoWork += AsyncUpdater_DoWork; |
|
|
|
//完成通知器: |
|
|
|
asyncDownloader.RunWorkerCompleted += AsyncDownloader_RunWorkerCompleted; |
|
|
|
asyncUpdater.RunWorkerCompleted += AsyncUpdater_RunWorkerCompleted; |
|
|
|
|
|
|
|
UpdateInfoVis = Visibility.Collapsed; |
|
|
|
|
|
|
|
if (Downloader.Program.Tencent_cos_download.CheckAlreadyDownload()) |
|
|
|
{ |
|
|
|
obj.checkUpdate(); |
|
|
|
Status = SettingsModel.Status.login; |
|
|
|
this.RaisePropertyChanged("WindowWidth"); |
|
|
|
//TODO:在启动时立刻检查更新,确保选手启动最新版选手包 |
|
|
|
//TODO:若有更新,将启动键改为更新键; |
|
|
|
//TODO:相应地,使用login界面启动; |
|
|
|
//TODO:结构:上方为登录框架,下方有“修改选手包”按钮 |
|
|
|
this.RaisePropertyChanged("LaunchVis"); |
|
|
|
if (obj.RecallUser()) |
|
|
|
RememberMe = true; |
|
|
|
else |
|
|
|
RememberMe = false; |
|
|
|
this.RaisePropertyChanged("RememberMe"); |
|
|
|
//在启动时立刻检查更新,确保选手启动最新版选手包 |
|
|
|
//若有更新,将启动键改为更新键; |
|
|
|
//相应地,使用login界面启动; |
|
|
|
//结构:上方为登录框架,下方有“修改选手包”按钮 |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
@@ -42,6 +73,85 @@ namespace starter.viewmodel.settings |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void AsyncDownloader_RunWorkerCompleted(object? sender, RunWorkerCompletedEventArgs e) |
|
|
|
{ |
|
|
|
if (e.Result == null) |
|
|
|
{ |
|
|
|
Status = SettingsModel.Status.error; |
|
|
|
} |
|
|
|
else if ((bool)e.Result) |
|
|
|
{ |
|
|
|
Status = SettingsModel.Status.successful; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
Status = SettingsModel.Status.newUser; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void AsyncUpdater_RunWorkerCompleted(object? sender, RunWorkerCompletedEventArgs e) |
|
|
|
{ |
|
|
|
if (e.Result == null) |
|
|
|
{ |
|
|
|
Status = SettingsModel.Status.error; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
this.RaisePropertyChanged("LaunchVis"); |
|
|
|
if ((int)e.Result == 1) |
|
|
|
{ |
|
|
|
Status = SettingsModel.Status.successful; |
|
|
|
this.RaisePropertyChanged("UpdateBtnCont"); |
|
|
|
this.RaisePropertyChanged("UpdateInfo"); |
|
|
|
this.RaisePropertyChanged("LaunchBtnCont"); |
|
|
|
} |
|
|
|
else if ((int)e.Result == 2) |
|
|
|
{ |
|
|
|
Status = SettingsModel.Status.login; |
|
|
|
this.RaisePropertyChanged("UpdateBtnCont"); |
|
|
|
this.RaisePropertyChanged("LaunchBtnCont"); |
|
|
|
this.RaisePropertyChanged("UpdateInfo"); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void AsyncUpdater_DoWork(object? sender, DoWorkEventArgs e) |
|
|
|
{ |
|
|
|
if (asyncUpdater.CancellationPending) |
|
|
|
{ |
|
|
|
e.Cancel = true; |
|
|
|
return; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
if (obj.Update()) |
|
|
|
if (e.Argument.ToString().Equals("Manual")) |
|
|
|
{ |
|
|
|
e.Result = 1; |
|
|
|
} |
|
|
|
else |
|
|
|
e.Result = 2; |
|
|
|
else |
|
|
|
e.Result = -1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void AsyncDownloader_DoWork(object? sender, DoWorkEventArgs e) |
|
|
|
{ |
|
|
|
if (asyncDownloader.CancellationPending) |
|
|
|
{ |
|
|
|
e.Cancel = true; |
|
|
|
return; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
if (obj.install()) |
|
|
|
e.Result = true; |
|
|
|
else |
|
|
|
e.Result = false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
//TODO:参赛界面:包括上传参赛代码、申请对战 |
|
|
|
//TODO:界面中应包含上次对战完成提示及下载回放按钮 |
|
|
|
|
|
|
|
@@ -95,6 +205,10 @@ namespace starter.viewmodel.settings |
|
|
|
this.RaisePropertyChanged("CompleteVis"); |
|
|
|
this.RaisePropertyChanged("WindowWidth"); |
|
|
|
this.RaisePropertyChanged("WebVis"); |
|
|
|
this.RaisePropertyChanged("CoverVis"); |
|
|
|
this.RaisePropertyChanged("LaunchVis"); |
|
|
|
this.RaisePropertyChanged("NewUserVis"); |
|
|
|
this.RaisePropertyChanged("ConfirmBtnCont"); |
|
|
|
} |
|
|
|
} |
|
|
|
public string Intro |
|
|
|
@@ -128,9 +242,9 @@ namespace starter.viewmodel.settings |
|
|
|
{ |
|
|
|
|
|
|
|
case SettingsModel.Status.newUser: |
|
|
|
return "将主体程序安装在:"; |
|
|
|
return "将选手包安装在(将创建THUAI6文件夹):"; |
|
|
|
case SettingsModel.Status.move: |
|
|
|
return "将主体程序移动到:"; |
|
|
|
return "将选手包移动到(THUAI6文件夹将会被整体移动):"; |
|
|
|
default: |
|
|
|
return ""; |
|
|
|
} |
|
|
|
@@ -179,7 +293,10 @@ namespace starter.viewmodel.settings |
|
|
|
|
|
|
|
public string Route |
|
|
|
{ |
|
|
|
get => obj.Route; |
|
|
|
get |
|
|
|
{ |
|
|
|
return obj.Route; |
|
|
|
} |
|
|
|
set |
|
|
|
{ |
|
|
|
obj.Route = value; |
|
|
|
@@ -211,6 +328,27 @@ namespace starter.viewmodel.settings |
|
|
|
return obj.CodeRoute.Substring(obj.CodeRoute.LastIndexOf('/') == -1 ? obj.CodeRoute.LastIndexOf('\\') + 1 : obj.CodeRoute.LastIndexOf('/') + 1); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public bool RememberMe |
|
|
|
{ |
|
|
|
get |
|
|
|
{ |
|
|
|
return obj.RememberMe; |
|
|
|
} |
|
|
|
set |
|
|
|
{ |
|
|
|
obj.RememberMe = value; |
|
|
|
this.RaisePropertyChanged("RememberMe"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public Visibility NewUserVis |
|
|
|
{ |
|
|
|
get |
|
|
|
{ |
|
|
|
return Status == SettingsModel.Status.newUser ? Visibility.Visible : Visibility.Collapsed; |
|
|
|
} |
|
|
|
} |
|
|
|
public Visibility MenuVis |
|
|
|
{ |
|
|
|
get |
|
|
|
@@ -279,6 +417,19 @@ namespace starter.viewmodel.settings |
|
|
|
get { return obj.UploadReady ? Visibility.Visible : Visibility.Collapsed; } |
|
|
|
} |
|
|
|
|
|
|
|
public Visibility UpdateInfoVis |
|
|
|
{ |
|
|
|
get; set; |
|
|
|
} |
|
|
|
|
|
|
|
public Visibility LaunchVis |
|
|
|
{ |
|
|
|
get |
|
|
|
{ |
|
|
|
return obj.status == SettingsModel.Status.login && (!obj.UpdatePlanned) ? Visibility.Visible : Visibility.Collapsed; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public string UpdateBtnCont |
|
|
|
{ |
|
|
|
get |
|
|
|
@@ -293,14 +444,21 @@ namespace starter.viewmodel.settings |
|
|
|
if (obj.UpdatePlanned) |
|
|
|
return obj.Updates; |
|
|
|
else |
|
|
|
return ""; |
|
|
|
return "已是最新版本"; |
|
|
|
} |
|
|
|
} |
|
|
|
public string LaunchBtnCont |
|
|
|
{ |
|
|
|
get |
|
|
|
{ |
|
|
|
return obj.UpdatePlanned ? "更新" : "启动"; |
|
|
|
string ans; |
|
|
|
if (obj.UpdatePlanned) |
|
|
|
ans = "更新"; |
|
|
|
else if (obj.launchLanguage == SettingsModel.LaunchLanguage.cpp) |
|
|
|
ans = "启动c++包"; |
|
|
|
else |
|
|
|
ans = "启动python包"; |
|
|
|
return ans; |
|
|
|
} |
|
|
|
} |
|
|
|
public string UploadBtnCont |
|
|
|
@@ -310,6 +468,28 @@ namespace starter.viewmodel.settings |
|
|
|
return obj.UploadReady ? "上传代码" : "选择代码上传"; |
|
|
|
} |
|
|
|
} |
|
|
|
public string ShiftLanguageBtnCont |
|
|
|
{ |
|
|
|
get |
|
|
|
{ |
|
|
|
return obj.launchLanguage == SettingsModel.LaunchLanguage.cpp ? "改为python" : "改为c++"; |
|
|
|
} |
|
|
|
} |
|
|
|
public string ConfirmBtnCont |
|
|
|
{ |
|
|
|
get |
|
|
|
{ |
|
|
|
switch (Status) |
|
|
|
{ |
|
|
|
case SettingsModel.Status.newUser: |
|
|
|
return "确认并安装"; |
|
|
|
case SettingsModel.Status.move: |
|
|
|
return "确认并移动"; |
|
|
|
default: |
|
|
|
return ""; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public string RouteSelectWindow(string type) |
|
|
|
{ |
|
|
|
@@ -365,16 +545,22 @@ namespace starter.viewmodel.settings |
|
|
|
{ |
|
|
|
Status = SettingsModel.Status.working; |
|
|
|
this.RaisePropertyChanged("ProgressVis"); |
|
|
|
if (obj.install()) |
|
|
|
/*if (obj.install()) |
|
|
|
{ |
|
|
|
Status = SettingsModel.Status.successful; |
|
|
|
}*/ |
|
|
|
if (asyncDownloader.IsBusy) |
|
|
|
return; |
|
|
|
else |
|
|
|
{ |
|
|
|
asyncDownloader.RunWorkerAsync(); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
else if (Status == SettingsModel.Status.move) |
|
|
|
{ |
|
|
|
Status = SettingsModel.Status.working; |
|
|
|
this.RaisePropertyChanged("ProgressVis"); |
|
|
|
//Status = SettingsModel.Status.working; |
|
|
|
//this.RaisePropertyChanged("ProgressVis"); |
|
|
|
switch (obj.move()) |
|
|
|
{ |
|
|
|
case -1: |
|
|
|
@@ -400,11 +586,14 @@ namespace starter.viewmodel.settings |
|
|
|
{ |
|
|
|
clickUpdateCommand = new BaseCommand(new Action<object>(o => |
|
|
|
{ |
|
|
|
this.RaisePropertyChanged("UpdateInfoVis"); |
|
|
|
if (obj.UpdatePlanned) |
|
|
|
{ |
|
|
|
UpdateInfoVis = Visibility.Collapsed; |
|
|
|
this.RaisePropertyChanged("UpdateInfoVis"); |
|
|
|
Status = SettingsModel.Status.working; |
|
|
|
this.RaisePropertyChanged("ProgressVis"); |
|
|
|
if (obj.Update()) |
|
|
|
/*if (obj.Update()) |
|
|
|
{ |
|
|
|
|
|
|
|
Status = SettingsModel.Status.successful; |
|
|
|
@@ -413,15 +602,22 @@ namespace starter.viewmodel.settings |
|
|
|
|
|
|
|
} |
|
|
|
else |
|
|
|
Status = SettingsModel.Status.error; |
|
|
|
Status = SettingsModel.Status.error;*/ |
|
|
|
if (asyncUpdater.IsBusy) |
|
|
|
return; |
|
|
|
else |
|
|
|
asyncUpdater.RunWorkerAsync("Manual"); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
UpdateInfoVis = Visibility.Visible; |
|
|
|
this.RaisePropertyChanged("UpdateInfoVis"); |
|
|
|
Status = SettingsModel.Status.working; |
|
|
|
this.RaisePropertyChanged("ProgressVis"); |
|
|
|
Status = obj.checkUpdate(); |
|
|
|
this.RaisePropertyChanged("UpdateBtnCont"); |
|
|
|
this.RaisePropertyChanged("UpdateInfo"); |
|
|
|
this.RaisePropertyChanged("LaunchVis"); |
|
|
|
} |
|
|
|
})); |
|
|
|
} |
|
|
|
@@ -452,8 +648,8 @@ namespace starter.viewmodel.settings |
|
|
|
{ |
|
|
|
clickUninstCommand = new BaseCommand(new Action<object>(o => |
|
|
|
{ |
|
|
|
Status = SettingsModel.Status.working; |
|
|
|
this.RaisePropertyChanged("ProgressVis"); |
|
|
|
UpdateInfoVis = Visibility.Collapsed; |
|
|
|
this.RaisePropertyChanged("UpdateInfoVis"); |
|
|
|
switch (obj.Uninst()) |
|
|
|
{ |
|
|
|
case -1: |
|
|
|
@@ -461,13 +657,15 @@ namespace starter.viewmodel.settings |
|
|
|
MessageBox.Show("文件已经打开,请关闭后再删除", "", MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK); |
|
|
|
break; |
|
|
|
case 0: |
|
|
|
Status = SettingsModel.Status.successful; |
|
|
|
Status = SettingsModel.Status.newUser; |
|
|
|
MessageBox.Show($"删除成功!player文件夹中的文件已经放在{Downloader.Program.ProgramName}的根目录下", "", MessageBoxButton.OK, MessageBoxImage.Information, MessageBoxResult.OK); |
|
|
|
break; |
|
|
|
default: |
|
|
|
Status = SettingsModel.Status.error; |
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
})); |
|
|
|
} |
|
|
|
return clickUninstCommand; |
|
|
|
@@ -491,6 +689,22 @@ namespace starter.viewmodel.settings |
|
|
|
case 0: |
|
|
|
obj.LoginFailed = false; |
|
|
|
Status = SettingsModel.Status.web; |
|
|
|
if (obj.RememberMe) |
|
|
|
{ |
|
|
|
obj.RememberUser(); |
|
|
|
RememberMe = true; |
|
|
|
this.RaisePropertyChanged("RememberMe"); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
obj.ForgetUser(); |
|
|
|
RememberMe = false; |
|
|
|
this.RaisePropertyChanged("RememberMe"); |
|
|
|
Username = ""; |
|
|
|
Password = ""; |
|
|
|
this.RaisePropertyChanged("Username"); |
|
|
|
this.RaisePropertyChanged("Password"); |
|
|
|
} |
|
|
|
this.RaisePropertyChanged("CoverVis"); |
|
|
|
break; |
|
|
|
case -2: |
|
|
|
@@ -517,15 +731,10 @@ namespace starter.viewmodel.settings |
|
|
|
{ |
|
|
|
Status = SettingsModel.Status.working; |
|
|
|
this.RaisePropertyChanged("ProgressVis"); |
|
|
|
if (obj.Update()) |
|
|
|
{ |
|
|
|
this.RaisePropertyChanged("UpdateBtnCont"); |
|
|
|
this.RaisePropertyChanged("LaunchBtnCont"); |
|
|
|
Status = SettingsModel.Status.login; |
|
|
|
this.RaisePropertyChanged("UpdateInfo"); |
|
|
|
} |
|
|
|
if (asyncUpdater.IsBusy) |
|
|
|
return; |
|
|
|
else |
|
|
|
Status = SettingsModel.Status.error; |
|
|
|
asyncUpdater.RunWorkerAsync("Auto"); |
|
|
|
} |
|
|
|
else if (!obj.Launch()) |
|
|
|
{ |
|
|
|
@@ -546,6 +755,9 @@ namespace starter.viewmodel.settings |
|
|
|
clickEditCommand = new BaseCommand(new Action<object>(o => |
|
|
|
{ |
|
|
|
Status = SettingsModel.Status.menu; |
|
|
|
if (obj.UpdatePlanned) |
|
|
|
UpdateInfoVis = Visibility.Visible; |
|
|
|
this.RaisePropertyChanged("UpdateInfoVis"); |
|
|
|
})); |
|
|
|
} |
|
|
|
return clickEditCommand; |
|
|
|
@@ -560,6 +772,8 @@ namespace starter.viewmodel.settings |
|
|
|
{ |
|
|
|
clickBackCommand = new BaseCommand(new Action<object>(o => |
|
|
|
{ |
|
|
|
UpdateInfoVis = Visibility.Collapsed; |
|
|
|
this.RaisePropertyChanged("UpdateInfoVis"); |
|
|
|
if (Downloader.Program.Tencent_cos_download.CheckAlreadyDownload()) |
|
|
|
Status = SettingsModel.Status.login; |
|
|
|
else |
|
|
|
@@ -671,12 +885,51 @@ namespace starter.viewmodel.settings |
|
|
|
{ |
|
|
|
clickExitCommand = new BaseCommand(new Action<object>(o => |
|
|
|
{ |
|
|
|
System.Windows.Application.Current.Shutdown(); |
|
|
|
Application.Current.Shutdown(); |
|
|
|
})); |
|
|
|
} |
|
|
|
return clickExitCommand; |
|
|
|
} |
|
|
|
} |
|
|
|
private BaseCommand clickShiftLanguageCommand; |
|
|
|
public BaseCommand ClickShiftLanguageCommand |
|
|
|
{ |
|
|
|
get |
|
|
|
{ |
|
|
|
if (clickShiftLanguageCommand == null) |
|
|
|
{ |
|
|
|
clickShiftLanguageCommand = new BaseCommand(new Action<object>(o => |
|
|
|
{ |
|
|
|
if (obj.launchLanguage == SettingsModel.LaunchLanguage.cpp) |
|
|
|
obj.launchLanguage = SettingsModel.LaunchLanguage.python; |
|
|
|
else |
|
|
|
obj.launchLanguage = SettingsModel.LaunchLanguage.cpp; |
|
|
|
this.RaisePropertyChanged("ShiftLanguageBtnCont"); |
|
|
|
this.RaisePropertyChanged("LaunchBtnCont"); |
|
|
|
})); |
|
|
|
} |
|
|
|
return clickShiftLanguageCommand; |
|
|
|
} |
|
|
|
} |
|
|
|
private BaseCommand clickReadCommand; |
|
|
|
public BaseCommand ClickReadCommand |
|
|
|
{ |
|
|
|
get |
|
|
|
{ |
|
|
|
if (clickReadCommand == null) |
|
|
|
{ |
|
|
|
clickReadCommand = new BaseCommand(new Action<object>(o => |
|
|
|
{ |
|
|
|
if (!Directory.Exists(Route + "/THUAI6")) |
|
|
|
Route = Route.Substring(0, Route.Length - 7); |
|
|
|
Program.Data.ResetFilepath(Route); |
|
|
|
if (Program.Tencent_cos_download.CheckAlreadyDownload()) |
|
|
|
Status = SettingsModel.Status.login; |
|
|
|
})); |
|
|
|
} |
|
|
|
return clickReadCommand; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |