using starter.viewmodel.common;
using System;
using System.Windows;
using System.Windows.Forms;
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;
///
/// Model object
///
private SettingsModel obj = new SettingsModel();
///
/// initializer
///
public SettingsViewModel()
{
//Program.Tencent_cos_download.UpdateHash();
//实例化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");
this.RaisePropertyChanged("LaunchVis");
if (obj.RecallUser())
RememberMe = true;
else
RememberMe = false;
this.RaisePropertyChanged("RememberMe");
//在启动时立刻检查更新,确保选手启动最新版选手包
//若有更新,将启动键改为更新键;
//相应地,使用login界面启动;
//结构:上方为登录框架,下方有“修改选手包”按钮
}
else
{
Route = Environment.GetEnvironmentVariable("USERPROFILE") + "\\THUAI6";
Status = SettingsModel.Status.newUser;
this.RaisePropertyChanged("WindowWidth");
}
}
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:界面中应包含上次对战完成提示及下载回放按钮
public int ExtraColumn
{
get
{
if (Status == SettingsModel.Status.newUser || Status == SettingsModel.Status.move)
return 75;
else
return 0;
}
}
public int WindowWidth
{
get
{
switch (Status)
{
case SettingsModel.Status.newUser:
return 505;
case SettingsModel.Status.move:
return 505;
case SettingsModel.Status.working:
return 435;
case SettingsModel.Status.successful:
return 435;
default:
return 355;
}
}
}
public SettingsModel.Status Status
{
get
{
return obj.status;
}
set
{
obj.status = value;
this.RaisePropertyChanged("ExtraColumn");
this.RaisePropertyChanged("Intro");
this.RaisePropertyChanged("RouteBoxIntro");
this.RaisePropertyChanged("LoginVis");
this.RaisePropertyChanged("MenuVis");
this.RaisePropertyChanged("RouteBoxVis");
this.RaisePropertyChanged("ProgressVis");
//TODO: Thread will be taken by process working and window will not refresh.
this.RaisePropertyChanged("CompleteVis");
this.RaisePropertyChanged("WindowWidth");
this.RaisePropertyChanged("WebVis");
this.RaisePropertyChanged("CoverVis");
this.RaisePropertyChanged("LaunchVis");
this.RaisePropertyChanged("NewUserVis");
this.RaisePropertyChanged("ConfirmBtnCont");
}
}
public string Intro
{
get
{
switch (Status)
{
case SettingsModel.Status.newUser:
return "欢迎使用选手包,请选择你想要安装选手包的位置:";
case SettingsModel.Status.menu:
return "你已经安装了选手包,请选择想要进行的操作:";
case SettingsModel.Status.login:
return "使用EESAST账号登录";
case SettingsModel.Status.web:
return "THUAI6 赛场:";
case SettingsModel.Status.disconnected:
return "你可能没有连接到网络,无法下载/更新选手包";
case SettingsModel.Status.error:
return "我们遇到了一些问题,请向[]反馈";
default:
return "";
}
}
}
public string RouteBoxIntro
{
get
{
switch (Status)
{
case SettingsModel.Status.newUser:
return "将选手包安装在(将创建THUAI6文件夹):";
case SettingsModel.Status.move:
return "将选手包移动到(THUAI6文件夹将会被整体移动):";
default:
return "";
}
}
}
public int PlayerNum
{
get
{
int ans;
if (obj.PlayerNum.Equals("player_1"))
ans = 1;
else if (obj.PlayerNum.Equals("player_2"))
ans = 2;
else if (obj.PlayerNum.Equals("player_3"))
ans = 3;
else if (obj.PlayerNum.Equals("player_4"))
ans = 4;
else
ans = 0;
return ans;
}
set
{
switch (value)
{
case 1:
obj.PlayerNum = "player_1";
break;
case 2:
obj.PlayerNum = "player_2";
break;
case 3:
obj.PlayerNum = "player_3";
break;
case 4:
obj.PlayerNum = "player_4";
break;
default:
obj.PlayerNum = "nSelect";
break;
}
this.RaisePropertyChanged("PlayerNum");
}
}
public string Route
{
get
{
return obj.Route;
}
set
{
obj.Route = value;
this.RaisePropertyChanged("Route");
}
}
public string Username
{
get => obj.Username;
set
{
obj.Username = value;
this.RaisePropertyChanged("Username");
}
}
public string Password
{
get => obj.Password;
set
{
obj.Password = value;
this.RaisePropertyChanged("Password");
}
}
public string CodeName
{
get
{
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
{
return Status == SettingsModel.Status.menu ? Visibility.Visible : Visibility.Collapsed;
}
}
public Visibility RouteBoxVis
{
get
{
return (Status == SettingsModel.Status.newUser || Status == SettingsModel.Status.move) ? Visibility.Visible : Visibility.Collapsed;
}
}
public Visibility LoginVis
{
get
{
return Status == SettingsModel.Status.login ? Visibility.Visible : Visibility.Collapsed;
}
}
public Visibility ProgressVis
{
get
{
return Status == SettingsModel.Status.working ? Visibility.Visible : Visibility.Collapsed;
}
}
public Visibility CompleteVis
{
get
{
return Status == SettingsModel.Status.successful ? Visibility.Visible : Visibility.Collapsed;
}
}
public Visibility WebVis
{
get
{
return Status == SettingsModel.Status.web ? Visibility.Visible : Visibility.Collapsed;
}
}
public Visibility CoverVis
{
get
{
return Status == SettingsModel.Status.web && !obj.UploadReady ? Visibility.Visible : Visibility.Collapsed;
}
}
public Visibility LoginFailVis
{
get
{
return obj.LoginFailed ? Visibility.Visible : Visibility.Collapsed;
}
}
public Visibility MatchFinishedVis
{
get
{
return obj.CombatCompleted ? Visibility.Visible : Visibility.Collapsed;
}
}
public Visibility UploadReadyVis
{
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
{
return obj.UpdatePlanned ? "更新" : "检查更新";
}
}
public string UpdateInfo
{
get
{
if (obj.UpdatePlanned)
return obj.Updates;
else
return "已是最新版本";
}
}
public string LaunchBtnCont
{
get
{
string ans;
if (obj.UpdatePlanned)
ans = "更新";
else if (obj.launchLanguage == SettingsModel.LaunchLanguage.cpp)
ans = "启动c++包";
else
ans = "启动python包";
return ans;
}
}
public string UploadBtnCont
{
get
{
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)
{
if (type == "Folder")
{
using (FolderBrowserDialog dialog = new FolderBrowserDialog())
{
_ = dialog.ShowDialog();
if (dialog.SelectedPath != String.Empty)
return dialog.SelectedPath;
}
}
else if (type == "File")
{
var openFileDialog = new Microsoft.Win32.OpenFileDialog()
{
Filter = "c++ Source Files (.cpp)|*.cpp|c++ Header File (.h)|*.h|python Source File (.py)|*.py"
};
var result = openFileDialog.ShowDialog();
if (result == true)
{
return openFileDialog.FileName;
}
}
return "";
}
private BaseCommand clickBrowseCommand;
public BaseCommand ClickBrowseCommand
{
get
{
if (clickBrowseCommand == null)
{
clickBrowseCommand = new BaseCommand(new Action