using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.IO;
using System.Windows;
using System.Windows.Media;
using HeBianGu.Base.WpfBase;
using HeBianGu.Control.Guide;
using HeBianGu.Control.ThemeSet;
using HeBianGu.General.WpfControlLib;
using HeBianGu.Service.Mvp;
using HeBianGu.Systems.Identity;
using HeBianGu.Systems.Setting;
using HeBianGu.Window.Link;
using Hopetry.Provider;
using Hopetry.Services;
using Hopetry.ViewModel.Sync;
using SqlSugar;
using SystemSetting = FileUploader.Models.SystemSetting;
namespace HeBianGu.App.Disk
{
///
/// App.xaml 的交互逻辑
///
public partial class App : ApplicationBase
{
public new static ComponentResourceKey Custom
{
get => new ComponentResourceKey(typeof(LinkWindowBase), (object)"S.Window.Link.Custom");
}
public static ComponentResourceKey WaitingPercent =>
new ComponentResourceKey(typeof(ProgressBarKeys), "S.ProgressBar.Custom");
protected override MainWindowBase CreateMainWindow(StartupEventArgs e)
{
return new ShellWindow();
}
protected override void ConfigureServices(IServiceCollection services)
{
base.ConfigureServices(services);
// 本地持久化
services.AddXmlSerialize();
// 设置
services.AddSetting();
// 另外保存设置目录
//services.AddSettingPath();
// minio 服务
services.AddSingleton();
services.AddWindowDialog();
services.AddObjectWindowDialog();
services.AddWindowAnimation();
services.AddMessageProxy();
services.AddPropertyGridMessage();
services.AddAutoColumnPagedDataGridMessage();
//services.AddNotifyMessage();
// 认证
// services.AddIdentity(x => x.ProductFontSize = 50);
services.AddMvc();
//services.AddProjectDefault();
services.AddXmlWebSerializerService();
//// Do :注册软件更新页面
/* services.AddAutoUpgrade(x =>
{
x.Uri = "https://gitee.com/hebiangu/wpf-auto-update/raw/master/Install/Computer/AutoUpdate.xml";
x.UseIEDownload = true;
});*/
services.AddDESCryptService();
services.AddPrintBoxMessage();
// ???
services.AddWindowExplorer();
#region - More -
//services.AddUpgradeViewPresenter();
//services.AddLicense();
//services.AddLicenseViewPresenter();
//services.AddVip();
//services.AddVipViewPresenter();
//services.AddSurveyViewPresenter();
//services.AddFeedbackViewPresenter();
services.AddLogoutViewPresenter();
//services.AddAboutViewPresenter();
services.AddMoreViewPresenter(x =>
{
//x.AddPersenter(UpgradeViewPresenter.Instance);
//x.AddPersenter(LicenseViewPresenter.Instance);
//x.AddPersenter(VipViewPresenter.Instance);
//x.AddPersenter(SurveyViewPresenter.Instance);
//x.AddPersenter(FeedbackViewPresenter.Instance);
//x.AddPersenter(AboutViewPresenter.Instance);
x.AddPersenter(LogoutViewPresenter.Instance);
});
#endregion
#region - WindowCaption -
//以下各种功能按钮
//services.AddLoginViewPresenter();
// 引导功能按钮
services.AddGuideViewPresenter();
services.AddHideWindowViewPresenter();
services.AddSettingViewPrenter();
//services.AddThemeRightToolViewPresenter();
//services.AddThemeRightViewPresenter();
services.AddWindowCaptionViewPresenter(x =>
{
x.AddPersenter(LoginViewPresenter.Instance);
x.AddPersenter(MoreViewPresenter.Instance);
x.AddPersenter(GuideViewPresenter.Instance);
x.AddPersenter(HideWindowViewPresenter.Instance);
x.AddPersenter(SettingViewPresenter.Instance);
//x.AddPersenter(ThemeRightToolViewPresenter.Instance);
});
#endregion
//string path = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Module", "HeBianGu.Domain.FATFS.dll");
//var dll = Assembly.LoadFile(path);
//var find = dll.GetTypes().Where(x => typeof(IExplorerService).IsAssignableFrom(x))?.FirstOrDefault();
//ServiceRegistry.Instance.Register(typeof(IExplorerService), find);
//services.AddSingleton();
//minio分片上传修改
PartSizeOverride.OverrideMinioCalculator();
var minioService = services.GetService();
var bucketName = minioService._bucketName;
var xmlSerializerService = services.GetService();
if (!File.Exists("./settings.xml"))
{
var tempSetting = new SystemSetting();
tempSetting.TaskCount = 3;
tempSetting.SyncDir = Path.Combine(SelectDrive(), "HopetryBoxData");
if (!Directory.Exists(tempSetting.SyncDir))
{
Directory.CreateDirectory(tempSetting.SyncDir);
}
xmlSerializerService.Save("./settings.xml", tempSetting);
}
var setting = xmlSerializerService.Load("./settings.xml");
if (string.IsNullOrEmpty(setting.SyncDir))
{
var selectDrive = SelectDrive();
setting.SyncDir = Path.Combine(selectDrive, "HopetryBoxData");
if (!Directory.Exists(setting.SyncDir))
{
Directory.CreateDirectory(setting.SyncDir);
}
// 保存配置
xmlSerializerService.Save("./settings.xml", setting);
}
if (setting.TaskCount == 0)
{
setting.TaskCount = 3;
}
// 创建统一的取消令牌源
var cancelToken = new CancellationTokenSource();
var temp = SyncSetting.Instance;
var notRun = true;
// 注册设置变更监听
temp.PropertyChanged += (s, e) =>
{
// 取下载目录
var setting1 = xmlSerializerService.Load("./settings.xml");
if (!string.IsNullOrEmpty(setting.SyncDir))
{
xmlSerializerService.Save("./settings.xml", setting);
setting.SyncDir = setting1.SyncDir;
}
if (temp.IsOn && notRun)
{
// 异步启动服务
Console.WriteLine("启动同步:");
try
{
var syncModel = services.GetService();
Task.Run(async () =>
{
await minioService.MirrorAsync(bucketName, setting.SyncDir, (total, count, fileName) =>
{
//添加同步信息
syncModel.SyncProgressText = $"同步中: {count}/{total} {fileName}";
},
setting.TaskCount);
syncModel.SyncProgressText = "同步完成";
});
Task.Run(async () =>
{
await minioService.RealTimeListen(bucketName, setting.SyncDir, ( fileName) =>
{
//添加同步信息
syncModel.SyncProgressText = $"{fileName}";
},
cancellationToken: cancelToken.Token);
//syncModel.SyncProgressText = $"实时同步完成";
});
notRun = false;
}
catch (OperationCanceledException)
{
Console.WriteLine("同步监听已取消");
}
catch (Exception ex)
{
Console.WriteLine($"同步失败: {ex.Message}");
}
}
// 运行中 且 temp.IsOn 变成 false
else if (!notRun && !temp.IsOn)
{
notRun = true;
// 当设置关闭时取消所有任务
cancelToken.Cancel(); // 取消任务
cancelToken.Dispose();
cancelToken = new CancellationTokenSource();
}
};
/*var delayTimer = new DispatcherTimer();
delayTimer.Interval = TimeSpan.FromSeconds(5);
delayTimer.Tick += async (s, e) =>
{
delayTimer.Stop(); // 确保只执行一次
// 异步操作不会阻塞UI
await Current.Dispatcher.InvokeAsync(() =>
{
// 注册设置变更监听
SyncSetting.Instance.PropertyChanged += (s1, e1) =>
{
if (SyncSetting.Instance.IsOn)
{
// 异步启动服务
_ = StartSyncServicesAsync();
}
else
{
// 当设置关闭时取消所有任务
cancelToken.Cancel();
cancelToken.Dispose();
cancelToken = new CancellationTokenSource();
}
};
});
};
delayTimer.Start();*/
/*var syncSettingPath = SyncSetting.Instance.GetPath();
var syncSetting = xmlSerializerService.Load(syncSettingPath);
SyncSetting.Instance.IsOn = syncSetting.IsOn;
if (syncSetting.IsOn)
{
// 是否启监听
minioService.MirrorAsync1(bucketName, setting.SyncDir, setting.TaskCount);
}*/
/*minioService.RealTimeListen(bucketName, setting.SyncDir,
cancellationToken: cancelToken.Token);*/
}
private static string SelectDrive()
{
var maxFreeSpace = 0L;
var selectDrive = "";
// 如果同步目录为空,则选择一个本地空闲空间比较大的分区
foreach (DriveInfo drive in DriveInfo.GetDrives())
{
if (drive.DriveType != DriveType.Fixed) continue; // 只获取固定硬盘
if (drive.AvailableFreeSpace > maxFreeSpace)
{
maxFreeSpace = drive.AvailableFreeSpace;
selectDrive = drive.Name;
}
}
return selectDrive;
}
protected override void Configure(IApplicationBuilder app)
{
base.Configure(app);
app.UseSetting(x =>
{
x.Settings.Clear();
x.Settings.Add(MySetting.Instance);
x.Settings.Add(SyncSetting.Instance);
x.Settings.Add(DownloadSetting.Instance);
});
app.UseStyle();
//app.UseSettingDefault();
// Do:设置默认主题
app.UseLocalTheme(l =>
{
// 主题色
l.AccentColor = (Color)ColorConverter.ConvertFromString("#FF0093FF");
l.DefaultFontSize = 13D;
l.FontSize = FontSize.Normal;
l.ItemHeight = 35;
//l.ItemWidth = 120;
l.ItemCornerRadius = 5;
l.AnimalSpeed = 300;
l.AccentColorSelectType = 0;
l.IsUseAnimal = false;
l.ThemeType = ThemeType.DarkBlack;
l.StyleType = StyleType.Single;
l.Language = Language.Chinese;
l.AccentBrushType = AccentBrushType.LinearGradientBrush;
});
}
}
[Displayer(Name = "下载设置", GroupName = "通用设置")]
public class DownloadSetting : LazySettingInstance
{
private int _maxConcurrent;
[DefaultValue(3)]
[Display(Name = "下载并行任务数")]
public int MaxConcurrent
{
get => _maxConcurrent;
set
{
if (_maxConcurrent == value) return;
_maxConcurrent = value;
RaisePropertyChanged();
}
}
private string _downDir;
[Display(Name = "下载目录")]
public string DownDir
{
get => _downDir;
set
{
if (_downDir == value) return;
_downDir = value;
RaisePropertyChanged();
}
}
private bool _isSelect;
[DefaultValue(false)]
[Display(Name = "设置为默认下载目录")]
public bool IsSelect
{
get => _isSelect;
set
{
if (_isSelect == value) return;
_isSelect = value;
RaisePropertyChanged();
}
}
}
[Displayer(Name = "同步设置", GroupName = "通用设置")]
public class SyncSetting : LazySettingInstance
{
private bool _ison;
public string GetPath()
{
return GetDefaultPath();
}
[DefaultValue(false)]
[Display(Name = "自动同步")]
public bool IsOn
{
get { return _ison; }
set
{
if (_ison == value) return;
_ison = value;
RaisePropertyChanged();
}
}
}
[Displayer(Name = "关机设置", GroupName = "通用设置")]
public class MySetting : LazySettingInstance
{
private bool _ison;
[DefaultValue(false)]
[Display(Name = "是否上传完成关机")]
public bool IsOn
{
get { return _ison; }
set
{
_ison = value;
RaisePropertyChanged("IsOn");
}
}
}
}