using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls.Primitives; using Microsoft.UI.Xaml.Media; using Microsoft.VisualBasic.FileIO; using RustTools.muqing; using RustTools.Themes; using RustTools.ViewModels; using SharpCompress.Common; namespace RustTools.Views; /// /// 模组碎片 /// public class DataObject { public string Dri { get; set; } public string Name { get; set; } public string Info { get; set; } public bool IsRwmod { get; set; } public string Icon { get; set; } #pragma warning disable CS8765 // 参数类型的为 Null 性与重写成员不匹配(可能是由于为 Null 性特性)。 public override bool Equals(object obj) { if (obj is DataObject other) { return Dri == other.Dri; } return false; } #pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。 public DataObject(FileInfo fileInfo) { Name = Path.GetFileNameWithoutExtension(fileInfo.Name); //Name = fileInfo.Name; IsRwmod = true; Info = $"大小:{wj.FormatFileSize(fileInfo.Length)}"; Dri = fileInfo.FullName; } public DataObject(DirectoryInfo fileInfo) { Name = fileInfo.Name; IsRwmod = false; Info = $"{fileInfo.CreationTime}"; Dri = fileInfo.FullName; Icon = File.Exists(Path.Combine(Dri, "icon.png")) ? Path.Combine(Dri, "icon.png") : "/Assets/image/folder.svg"; var modinfo = Path.Combine(Dri, "mod-info.txt"); if (File.Exists(modinfo)) { var dictionary = gj.IniInfo(modinfo); if (dictionary.TryGetValue("mod", out var sectionValues)) { gj.sc(sectionValues); Name = sectionValues.TryGetValue("title", out var value) ? value : Name; gj.sc(value); Info = sectionValues.TryGetValue("description", out var description) ? description : Info; } } } } public sealed partial class ModulePage : Page { public ModuleViewModel ViewModel { get; set; } public ModulePage() { ViewModel = App.GetService(); InitializeComponent(); } /// /// 打开模组 /// /// /// private void Button_Click(object sender, RoutedEventArgs e) { var button = sender as Button; if (button != null) { var container = VisualTreeHelper.GetParent(button) as FrameworkElement; if (container != null && container.DataContext is DataObject dataItem) { FlyoutShowOptions myOption = new FlyoutShowOptions(); myOption.ShowMode = FlyoutShowMode.Standard; CommandBarFlyout1.ShowAt(button, myOption); } } } /// /// 删除模组和文件夹 /// /// /// private async void Button_Delete(object sender, RoutedEventArgs e) { var menuItem = sender as Control; gj.sc(menuItem); if (menuItem != null) { if (menuItem.DataContext is DataObject folderItem) { var task = await Dialog.DialogWarnYes("你确定要删除(回收站)" + folderItem.Dri, XamlRoot); if (task == ContentDialogResult.Primary) { if (Directory.Exists(folderItem.Dri)) { // 删除文件夹 //Directory.Delete(folderItem.Dri, true); FileSystem.DeleteDirectory(folderItem.Dri, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin); } else if (File.Exists(folderItem.Dri)) { //删除文件 //File.Delete(folderItem.Dri); FileSystem.DeleteFile(folderItem.Dri, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin); } } ViewModel.ListMod.Remove(folderItem); } } } /// /// 解压模组 /// /// /// private async void UnzipRwmod(DataObject a) { ContentDialog dialog = new ContentDialog { XamlRoot = XamlRoot, Title = "提示", PrimaryButtonText = "确定", SecondaryButtonText = "取消", Content = CreateCheckboxContent() }; var contentDialogResult = await dialog.ShowAsync(); if (contentDialogResult == ContentDialogResult.Primary) { var checkbox = (dialog.Content as StackPanel)?.Children[1] as CheckBox; var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(a.Dri); var GetDirectoryName = Path.GetDirectoryName(a.Dri); if (Directory.Exists(GetDirectoryName) && fileNameWithoutExtension != null) { var targetDirectory = Path.Combine(GetDirectoryName, fileNameWithoutExtension); var v = wj.UnzipFile(a.Dri, targetDirectory); gj.sc("解压成功:" + v); if (checkbox?.IsChecked == true) { File.Delete(a.Dri); ViewModel.ListMod.Remove(a); } if (v) { ViewModel.ListMod.Remove(new DataObject(new DirectoryInfo(targetDirectory))); ViewModel.ListMod.Insert(0, new DataObject(new DirectoryInfo(targetDirectory))); } } } } private FrameworkElement CreateCheckboxContent() { var checkbox = new CheckBox { Content = "是否删除源文件", IsChecked = false, Margin = new Thickness(0, 16, 0, 0), }; var text = new TextBlock { Text = "解压模组到目录", }; var stackPanel = new StackPanel(); stackPanel.Children.Add(text); stackPanel.Children.Add(checkbox); return stackPanel; } /// /// 打包模组 /// /// /// public async void Button_Rwmod(object sender, RoutedEventArgs e) { var menuItem = sender as MenuFlyoutItem; if (menuItem != null) { if (menuItem.DataContext is DataObject folderItem) { var filepath = Path.Combine(Path.GetDirectoryName(folderItem.Dri), folderItem.Name + ".rwmod"); if (File.Exists(filepath)) { var show = await new ContentDialog() { XamlRoot = menuItem.XamlRoot, Title = "警告", Content = "已经存在必须覆盖", PrimaryButtonText = "确定", SecondaryButtonText = "取消" }.ShowAsync(); if (show == ContentDialogResult.Primary) { } else { return; } } // 压缩zip var v = wj.ZipExample(folderItem.Dri, folderItem.Name + ".rwmod"); if (v != string.Empty) { ViewModel.ListMod.Remove(new DataObject(new FileInfo(filepath))); ViewModel.ListMod.Insert(0, new DataObject(new FileInfo(v))); } } } } /// /// 双击GridView事件 /// /// /// private async void BasicGridView_DoubleTapped(object sender, Microsoft.UI.Xaml.Input.DoubleTappedRoutedEventArgs e) { var gridView = sender as GridView; var item = (e.OriginalSource as FrameworkElement)?.DataContext; if (item != null && gridView != null) { // 这里处理双击事件,例如显示一个消息框 // 替换为实际的数据类型 if (item is DataObject clickedItem) { // 在这里处理双击项 var IsRwmod = clickedItem.IsRwmod; // 假设你的项有一个 Name 属性 if (IsRwmod) { UnzipRwmod(clickedItem); } } } } /// /// 发布模组 /// /// /// private async void Button_PostRwmod(object sender, RoutedEventArgs e) { if (sender is MenuFlyoutItem item) { if (item.DataContext is not DataObject dataObject) { return; } //folderItem.IsRwmod = false; var contentDialog = new ContentDialog() { XamlRoot = XamlRoot, Title = "发布", }; var postRwmod = new PostRwmod(contentDialog) { XamlRoot = XamlRoot }; var h= ((Panel) Content).ActualHeight; postRwmod.Height =h-50; contentDialog.Content = postRwmod; // 订阅 Closing 事件 contentDialog.Closing += Dialog.DialogNotEsc; postRwmod.Init(dataObject.Dri); await contentDialog.ShowAsync(); } } } public class MyItemTemplateSelector : DataTemplateSelector { public DataTemplate Template1 { get; set; } = new(); public DataTemplate Template2 { get; set; } = new(); protected override DataTemplate SelectTemplateCore(object item) { if (item is not DataObject dataObject) { return base.SelectTemplateCore(item); } if (dataObject.IsRwmod) return Template1; else return Template2; } }