From d9326785e90f489a9076bee62be28c74606794a4 Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 21 Sep 2024 16:00:50 +0800 Subject: [PATCH 01/54] =?UTF-8?q?feat:=20=E6=88=AA=E5=9B=BE=E6=9F=A5?= =?UTF-8?q?=E7=9C=8B=E7=AE=A1=E7=90=86=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/FormMain.xaml.vb | 1 + Plain Craft Launcher 2/Modules/ModMain.vb | 1 + .../Pages/PageVersion/PageVersionLeft.xaml | 8 + .../Pages/PageVersion/PageVersionLeft.xaml.vb | 24 ++- .../PageVersion/PageVersionScreenshot.xaml | 25 +++ .../PageVersion/PageVersionScreenshot.xaml.vb | 144 ++++++++++++++++++ .../Plain Craft Launcher 2.vbproj | 7 + 7 files changed, 203 insertions(+), 7 deletions(-) create mode 100644 Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml create mode 100644 Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb index e57bc9686..fc42accae 100644 --- a/Plain Craft Launcher 2/FormMain.xaml.vb +++ b/Plain Craft Launcher 2/FormMain.xaml.vb @@ -1106,6 +1106,7 @@ Install: VersionSetup = 1 VersionMod = 2 VersionModDisabled = 3 + VersionScreenshot = 4 End Enum ''' ''' 获取次级页面的名称。若并非次级页面则返回空字符串,故可以以此判断是否为次级页面。 diff --git a/Plain Craft Launcher 2/Modules/ModMain.vb b/Plain Craft Launcher 2/Modules/ModMain.vb index 21362135f..dbbe96690 100644 --- a/Plain Craft Launcher 2/Modules/ModMain.vb +++ b/Plain Craft Launcher 2/Modules/ModMain.vb @@ -426,6 +426,7 @@ EndHint: Public FrmVersionOverall As PageVersionOverall Public FrmVersionMod As PageVersionMod Public FrmVersionModDisabled As PageVersionModDisabled + Public FrmVersionScreenshot As PageVersionScreenshot Public FrmVersionSetup As PageVersionSetup '资源信息分页声明 diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml index 32d8fdeec..21bcddb63 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml @@ -23,5 +23,13 @@ + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb index 99e211fad..31799a795 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb @@ -25,7 +25,7 @@ ''' ''' 勾选事件改变页面。 ''' - Private Sub PageCheck(sender As MyListItem, e As RouteEventArgs) Handles ItemOverall.Check, ItemMod.Check, ItemModDisabled.Check, ItemSetup.Check + Private Sub PageCheck(sender As MyListItem, e As RouteEventArgs) Handles ItemOverall.Check, ItemMod.Check, ItemModDisabled.Check, ItemSetup.Check, ItemScreenshot.Check '尚未初始化控件属性时,sender.Tag 为 Nothing,会导致切换到页面 0 '若使用 IsLoaded,则会导致模拟点击不被执行(模拟点击切换页面时,控件的 IsLoaded 为 False) If sender.Tag IsNot Nothing Then PageChange(Val(sender.Tag)) @@ -46,6 +46,9 @@ Case FormMain.PageSubType.VersionSetup If IsNothing(FrmVersionSetup) Then FrmVersionSetup = New PageVersionSetup Return FrmVersionSetup + Case FormMain.PageSubType.VersionScreenshot + If FrmVersionScreenshot Is Nothing Then FrmVersionScreenshot = New PageVersionScreenshot + Return FrmVersionScreenshot Case Else Throw New Exception("未知的版本设置子页面种类:" & ID) End Select @@ -90,14 +93,21 @@ Public Sub Refresh(sender As Object, e As EventArgs) '由边栏按钮匿名调用 '强制刷新 Try - CompProjectCache.Clear() - File.Delete(PathTemp & "Cache\LocalMod.json") - Log("[Mod] 由于点击刷新按钮,清理本地 Mod 信息缓存") + Select Case Val(sender.Tag) + Case FormMain.PageSubType.VersionMod + CompProjectCache.Clear() + File.Delete(PathTemp & "Cache\LocalMod.json") + Log("[Mod] 由于点击刷新按钮,清理本地 Mod 信息缓存") + If FrmVersionMod IsNot Nothing Then FrmVersionMod.ReloadModList(True) '无需 Else,还没加载刷个鬼的新 + ItemMod.Checked = True + Case FormMain.PageSubType.VersionScreenshot + FrmVersionScreenshot = New PageVersionScreenshot + If FrmVersionScreenshot IsNot Nothing Then FrmVersionScreenshot.Reload() + ItemScreenshot.Checked = True + End Select Catch ex As Exception - Log(ex, "强制刷新时清理本地 Mod 信息缓存失败") + Log(ex, "强制刷新出错") End Try - If FrmVersionMod IsNot Nothing Then FrmVersionMod.ReloadModList(True) '无需 Else,还没加载刷个鬼的新 - ItemMod.Checked = True Hint("正在刷新……", Log:=False) End Sub diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml new file mode 100644 index 000000000..dd81360e0 --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml @@ -0,0 +1,25 @@ + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb new file mode 100644 index 000000000..e1b465510 --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb @@ -0,0 +1,144 @@ +Imports System.Security.Principal + +Public Class PageVersionScreenshot + + Private IsLoad As Boolean = False + Private Sub PageSetupLaunch_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded + + '重复加载部分 + PanBack.ScrollToHome() + + Reload() + + '非重复加载部分 + If IsLoad Then Exit Sub + IsLoad = True + + End Sub + + Dim FileList As List(Of String) = New List(Of String) + Dim ScreenshotPath As String = PageVersionLeft.Version.Path + "screenshots" + + ''' + ''' 确保当前页面上的信息已正确显示。 + ''' + Public Sub Reload() + AniControlEnabled += 1 + PanBack.ScrollToHome() + LoadFileList() + AniControlEnabled -= 1 + End Sub + + Private Sub LoadFileList() + Log("[Screenshot] 刷新截图文件") + FileList.Clear() + If Directory.Exists(ScreenshotPath) Then FileList = Directory.EnumerateFiles(ScreenshotPath, "*.png", SearchOption.AllDirectories).ToList() + PanList.Children.Clear() + If ModeDebug Then Log("[Screenshot] 共发现 " & FileList.Count & " 个截图文件", LogLevel.Debug) + For Each i In FileList + Dim myCard As New MyCard With { + .Height = Double.NaN, ' 允许高度自适应 + .Width = Double.NaN, ' 允许宽度自适应 + .MinWidth = 230, + .Margin = New Thickness(7), + .Tag = i + } + Dim grid As New Grid + grid.Margin = New Thickness(4) + myCard.Children.Add(grid) + + grid.RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(120)}) + grid.RowDefinitions.Add(New RowDefinition) + + '图片 + Dim image As New Image + Dim bitmapImage As New BitmapImage() + bitmapImage.BeginInit() + bitmapImage.UriSource = New Uri(i) ' 直接使用文件路径加载图片 + bitmapImage.CacheOption = BitmapCacheOption.OnLoad ' 立即加载并释放文件流 + bitmapImage.EndInit() + bitmapImage.Freeze() ' 冻结图像以提高性能 + image.Source = bitmapImage + image.Stretch = Stretch.Uniform ' 使图片自适应控件大小 + Grid.SetRow(image, 0) + grid.Children.Add(image) + + '按钮 + Dim stackPanel As New StackPanel + stackPanel.Orientation = Orientation.Horizontal + stackPanel.Margin = New Thickness(3,5,3,2) + Grid.SetRow(stackPanel, 1) + grid.Children.Add(stackPanel) + + Dim btnOpen As New MyIconTextButton With { + .Name = "BtnOpen", + .Text = "打开", + .LogoScale = 0.8, + .Logo = Logo.IconButtonOpen + } + AddHandler btnOpen.Click, AddressOf btnOpen_Click + stackPanel.Children.Add(btnOpen) + Dim btnDelete As New MyIconTextButton With { + .Name = "BtnDelete", + .Text = "删除", + .LogoScale = 0.8, + .Logo = Logo.IconButtonDelete + } + AddHandler btnDelete.Click, AddressOf btnDelete_Click + stackPanel.Children.Add(btnDelete) + Dim btnCopy As New MyIconTextButton With { + .Name = "BtnCopy", + .Text = "复制", + .LogoScale = 0.8, + .Logo = Logo.IconButtonInfo + } + AddHandler btnCopy.Click, AddressOf btnCopy_Click + stackPanel.Children.Add(btnCopy) + + PanList.Children.Add(myCard) + Next + End Sub + + Private Sub RemoveItem(Path As String) + For Each i In PanList.Children + If CType(i, MyCard).Tag.Equals(Path) Then + PanList.Children.Remove(i) + Exit For + End If + Next + End Sub + + Private Function GetPathFromSender(sender As MyIconTextButton) As String + Return CType(CType(CType(sender.Parent, StackPanel).Parent, Grid).Parent, MyCard).Tag + End Function + + Private Sub btnOpen_Click(sender As MyIconTextButton, e As EventArgs) + OpenExplorer("""" & GetPathFromSender(sender) & """") + End Sub + Private Sub btnDelete_Click(sender As MyIconTextButton, e As EventArgs) + Dim IsShiftPressed As Boolean = My.Computer.Keyboard.ShiftKeyDown + Path = GetPathFromSender(sender) + RemoveItem(Path) + Try + If IsShiftPressed Then + File.Delete(Path) + Hint("已永久删除截图!") + Else + My.Computer.FileSystem.DeleteFile(Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) + Hint("已将截图移至回收站!") + End If + Catch ex As Exception + Log(ex, "删除截图失败!", LogLevel.Hint) + End Try + End Sub + Private Sub btnCopy_Click(sender As MyIconTextButton, e As EventArgs) + Dim imagePath As String = GetPathFromSender(sender) + If File.Exists(imagePath) Then + Dim bitmap As BitmapImage = New BitmapImage(New Uri(imagePath)) + Clipboard.SetImage(bitmap) + Hint("已复制截图到剪贴板!") + Else + Hint("截图文件不存在!") + End If + End Sub +End Class diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index bc74b16e4..38bcb94dd 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj @@ -293,6 +293,9 @@ PageVersionModDisabled.xaml + + PageVersionScreenshot.xaml + PageVersionOverall.xaml @@ -554,6 +557,10 @@ MSBuild:Compile Designer + + MSBuild:Compile + Designer + Designer MSBuild:Compile From 2aba4a96ff7e257985d80d0b673f62adf6ad8f9e Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 21 Sep 2024 16:28:45 +0800 Subject: [PATCH 02/54] =?UTF-8?q?fix:=20=E6=88=AA=E5=9B=BE=E4=B8=8D?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E6=8F=90=E7=A4=BA=20&=20=E6=9F=A5=E7=9C=8B?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PageVersion/PageVersionScreenshot.xaml | 28 +++++++++++++++++-- .../PageVersion/PageVersionScreenshot.xaml.vb | 14 ++++++++-- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml index dd81360e0..03bf2ac75 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml @@ -6,8 +6,29 @@ mc:Ignorable="d" x:Class="PageVersionScreenshot" PanScroll="{Binding ElementName=PanBack}" Grid.IsSharedSizeScope="True"> - - - + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb index e1b465510..08f37198d 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb @@ -7,7 +7,7 @@ Public Class PageVersionScreenshot '重复加载部分 PanBack.ScrollToHome() - + ScreenshotPath = PageVersionLeft.Version.Path + "screenshots" Reload() '非重复加载部分 @@ -17,7 +17,7 @@ Public Class PageVersionScreenshot End Sub Dim FileList As List(Of String) = New List(Of String) - Dim ScreenshotPath As String = PageVersionLeft.Version.Path + "screenshots" + Dim ScreenshotPath As String ''' ''' 确保当前页面上的信息已正确显示。 @@ -26,6 +26,11 @@ Public Class PageVersionScreenshot AniControlEnabled += 1 PanBack.ScrollToHome() LoadFileList() + If FileList.Count.Equals(0) Then + PanNoPic.Visibility = Visibility.Visible + Else + PanNoPic.Visibility = Visibility.Collapsed + End If AniControlEnabled -= 1 End Sub @@ -141,4 +146,9 @@ Public Class PageVersionScreenshot Hint("截图文件不存在!") End If End Sub + + Private Sub BtnOpenFolder_Click(sender As Object, e As MouseButtonEventArgs) + If Not Directory.Exists(ScreenshotPath) Then Directory.CreateDirectory(ScreenshotPath) + OpenExplorer("""" & ScreenshotPath & """") + End Sub End Class From 832d0ec24619ea1d4a3f1f146a6ce6468f84f531 Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 21 Sep 2024 16:33:58 +0800 Subject: [PATCH 03/54] =?UTF-8?q?fix:=20=E5=A4=8D=E5=88=B6=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E8=80=8C=E4=B8=8D=E6=98=AF=E6=96=87=E4=BB=B6=E5=86=85?= =?UTF-8?q?=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageVersion/PageVersionScreenshot.xaml.vb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb index 08f37198d..533137ec6 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb @@ -139,8 +139,7 @@ Public Class PageVersionScreenshot Private Sub btnCopy_Click(sender As MyIconTextButton, e As EventArgs) Dim imagePath As String = GetPathFromSender(sender) If File.Exists(imagePath) Then - Dim bitmap As BitmapImage = New BitmapImage(New Uri(imagePath)) - Clipboard.SetImage(bitmap) + Clipboard.SetFileDropList(New Specialized.StringCollection() From {imagePath}) Hint("已复制截图到剪贴板!") Else Hint("截图文件不存在!") From 4b62cb1e9b7258f23ec62b6155bd92eacfda1933 Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 21 Sep 2024 17:23:28 +0800 Subject: [PATCH 04/54] =?UTF-8?q?feat:=20=E5=AD=98=E6=A1=A3=E6=9F=A5?= =?UTF-8?q?=E7=9C=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/FormMain.xaml.vb | 3 +- Plain Craft Launcher 2/Modules/ModMain.vb | 1 + .../Pages/PageVersion/PageVersionLeft.xaml | 12 +++- .../Pages/PageVersion/PageVersionLeft.xaml.vb | 9 ++- .../PageVersion/PageVersionScreenshot.xaml.vb | 2 +- .../Pages/PageVersion/PageVersionWorld.xaml | 37 ++++++++++++ .../PageVersion/PageVersionWorld.xaml.vb | 60 +++++++++++++++++++ .../Plain Craft Launcher 2.vbproj | 7 +++ 8 files changed, 125 insertions(+), 6 deletions(-) create mode 100644 Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml create mode 100644 Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb index fc42accae..fc60542c9 100644 --- a/Plain Craft Launcher 2/FormMain.xaml.vb +++ b/Plain Craft Launcher 2/FormMain.xaml.vb @@ -1106,7 +1106,8 @@ Install: VersionSetup = 1 VersionMod = 2 VersionModDisabled = 3 - VersionScreenshot = 4 + VersionWorld = 4 + VersionScreenshot = 5 End Enum ''' ''' 获取次级页面的名称。若并非次级页面则返回空字符串,故可以以此判断是否为次级页面。 diff --git a/Plain Craft Launcher 2/Modules/ModMain.vb b/Plain Craft Launcher 2/Modules/ModMain.vb index dbbe96690..3da12cb93 100644 --- a/Plain Craft Launcher 2/Modules/ModMain.vb +++ b/Plain Craft Launcher 2/Modules/ModMain.vb @@ -427,6 +427,7 @@ EndHint: Public FrmVersionMod As PageVersionMod Public FrmVersionModDisabled As PageVersionModDisabled Public FrmVersionScreenshot As PageVersionScreenshot + Public FrmVersionWorld As PageVersionWorld Public FrmVersionSetup As PageVersionSetup '资源信息分页声明 diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml index 21bcddb63..bf8af0f00 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml @@ -23,13 +23,21 @@ - + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb index 31799a795..01006d5d1 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb @@ -25,7 +25,7 @@ ''' ''' 勾选事件改变页面。 ''' - Private Sub PageCheck(sender As MyListItem, e As RouteEventArgs) Handles ItemOverall.Check, ItemMod.Check, ItemModDisabled.Check, ItemSetup.Check, ItemScreenshot.Check + Private Sub PageCheck(sender As MyListItem, e As RouteEventArgs) Handles ItemOverall.Check, ItemMod.Check, ItemModDisabled.Check, ItemSetup.Check, ItemScreenshot.Check, ItemWorld.Check '尚未初始化控件属性时,sender.Tag 为 Nothing,会导致切换到页面 0 '若使用 IsLoaded,则会导致模拟点击不被执行(模拟点击切换页面时,控件的 IsLoaded 为 False) If sender.Tag IsNot Nothing Then PageChange(Val(sender.Tag)) @@ -46,6 +46,9 @@ Case FormMain.PageSubType.VersionSetup If IsNothing(FrmVersionSetup) Then FrmVersionSetup = New PageVersionSetup Return FrmVersionSetup + Case FormMain.PageSubType.VersionWorld + If FrmVersionWorld Is Nothing Then FrmVersionWorld = New PageVersionWorld + Return FrmVersionWorld Case FormMain.PageSubType.VersionScreenshot If FrmVersionScreenshot Is Nothing Then FrmVersionScreenshot = New PageVersionScreenshot Return FrmVersionScreenshot @@ -101,9 +104,11 @@ If FrmVersionMod IsNot Nothing Then FrmVersionMod.ReloadModList(True) '无需 Else,还没加载刷个鬼的新 ItemMod.Checked = True Case FormMain.PageSubType.VersionScreenshot - FrmVersionScreenshot = New PageVersionScreenshot If FrmVersionScreenshot IsNot Nothing Then FrmVersionScreenshot.Reload() ItemScreenshot.Checked = True + Case FormMain.PageSubType.VersionWorld + If FrmVersionWorld IsNot Nothing Then FrmVersionWorld.Reload() + ItemWorld.Checked = True End Select Catch ex As Exception Log(ex, "强制刷新出错") diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb index 533137ec6..351ec2b43 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb @@ -7,7 +7,7 @@ Public Class PageVersionScreenshot '重复加载部分 PanBack.ScrollToHome() - ScreenshotPath = PageVersionLeft.Version.Path + "screenshots" + ScreenshotPath = PageVersionLeft.Version.PathIndie + "screenshots" Reload() '非重复加载部分 diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml new file mode 100644 index 000000000..eec76f3a2 --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb new file mode 100644 index 000000000..f7e07f1e4 --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb @@ -0,0 +1,60 @@ +Imports System.Security.Principal + +Public Class PageVersionWorld + + Private IsLoad As Boolean = False + Private Sub PageSetupLaunch_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded + + '重复加载部分 + PanBack.ScrollToHome() + WorldPath = PageVersionLeft.Version.PathIndie + "saves" + Reload() + + '非重复加载部分 + If IsLoad Then Exit Sub + IsLoad = True + + End Sub + + Dim FileList As List(Of String) = New List(Of String) + Dim WorldPath As String + + ''' + ''' 确保当前页面上的信息已正确显示。 + ''' + Public Sub Reload() + AniControlEnabled += 1 + PanBack.ScrollToHome() + LoadFileList() + If FileList.Count.Equals(0) Then + PanNoWorld.Visibility = Visibility.Visible + PanContent.Visibility = Visibility.Collapsed + Else + PanNoWorld.Visibility = Visibility.Collapsed + PanContent.Visibility = Visibility.Visible + End If + AniControlEnabled -= 1 + End Sub + + Private Sub LoadFileList() + Log("[World] 刷新存档文件") + FileList.Clear() + FileList = Directory.EnumerateDirectories(WorldPath).ToList() + If ModeDebug Then Log("[World] 共发现 " & FileList.Count & " 个存档文件夹", LogLevel.Debug) + PanList.Children.Clear() + PanCard.Title = $"存档列表 ({FileList.Count})" + For Each i In FileList + Dim worldItem As MyListItem = New MyListItem With { + .Logo = i + "\icon.png", + .Title = GetFileNameFromPath(i), + .Info = $"创建时间:{ Directory.GetCreationTime(i).ToString("yyyy'/'MM'/'dd")},最后修改时间:{Directory.GetLastWriteTime(i).ToString("yyyy'/'MM'/'dd")}" + } + PanList.Children.Add(worldItem) + Next + End Sub + + Private Sub BtnOpenFolder_Click(sender As Object, e As MouseButtonEventArgs) + If Not Directory.Exists(WorldPath) Then Directory.CreateDirectory(WorldPath) + OpenExplorer("""" & WorldPath & """") + End Sub +End Class diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index 38bcb94dd..254c7e6a5 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj @@ -293,6 +293,9 @@ PageVersionModDisabled.xaml + + PageVersionWorld.xaml + PageVersionScreenshot.xaml @@ -557,6 +560,10 @@ MSBuild:Compile Designer + + MSBuild:Compile + Designer + MSBuild:Compile Designer From 6d915e2ededab954d648a08f354cc7716b0c96f1 Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 21 Sep 2024 17:27:29 +0800 Subject: [PATCH 05/54] =?UTF-8?q?feat:=20=E5=A4=8D=E5=88=B6=E5=9B=BE?= =?UTF-8?q?=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Modules/Base/ModBase.vb | 4 ++++ .../Pages/PageVersion/PageVersionScreenshot.xaml.vb | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb index 994dfaa90..513c19f75 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModBase.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModBase.vb @@ -174,6 +174,10 @@ Public Module ModBase ''' Public Const IconButtonOffline As String = "M533.293176 788.841412a60.235294 60.235294 0 1 1 85.202824 85.202823l-42.616471 42.586353c-129.355294 129.385412-339.124706 129.385412-468.510117 0-129.385412-129.385412-129.385412-339.124706 0-468.510117l42.586353-42.616471a60.235294 60.235294 0 1 1 85.202823 85.202824l-42.61647 42.586352a210.823529 210.823529 0 1 0 298.164706 298.164706l42.586352-42.61647z m255.548236-255.548236l42.61647-42.586352a210.823529 210.823529 0 1 0-298.164706-298.164706l-42.586352 42.61647a60.235294 60.235294 0 1 1-85.202824-85.202823l42.616471-42.586353c129.355294-129.385412 339.124706-129.385412 468.510117 0 129.385412 129.385412 129.385412 339.124706 0 468.510117l-42.586353 42.616471a60.235294 60.235294 0 1 1-85.202823-85.202824zM192.542118 192.542118a60.235294 60.235294 0 0 1 85.202823 0l553.712941 553.712941a60.235294 60.235294 0 0 1-85.202823 85.202823L192.542118 277.744941a60.235294 60.235294 0 0 1 0-85.202823z" ''' + ''' 图标按钮,复制 + ''' + Public Const IconButtonCopy As String = "M394.666667 106.666667h448a74.666667 74.666667 0 0 1 74.666666 74.666666v448a74.666667 74.666667 0 0 1-74.666666 74.666667H394.666667a74.666667 74.666667 0 0 1-74.666667-74.666667V181.333333a74.666667 74.666667 0 0 1 74.666667-74.666666z m0 64a10.666667 10.666667 0 0 0-10.666667 10.666666v448a10.666667 10.666667 0 0 0 10.666667 10.666667h448a10.666667 10.666667 0 0 0 10.666666-10.666667V181.333333a10.666667 10.666667 0 0 0-10.666666-10.666666H394.666667z m245.333333 597.333333a32 32 0 0 1 64 0v74.666667a74.666667 74.666667 0 0 1-74.666667 74.666666H181.333333a74.666667 74.666667 0 0 1-74.666666-74.666666V394.666667a74.666667 74.666667 0 0 1 74.666666-74.666667h74.666667a32 32 0 0 1 0 64h-74.666667a10.666667 10.666667 0 0 0-10.666666 10.666667v448a10.666667 10.666667 0 0 0 10.666666 10.666666h448a10.666667 10.666667 0 0 0 10.666667-10.666666v-74.666667z" + ''' ''' 图标,音符,1x ''' Public Const IconMusic As String = "M348.293565 716.53287V254.797913c0-41.672348 28.004174-78.358261 68.919652-90.37913L815.994435 40.826435c62.775652-18.610087 125.907478 26.579478 125.907478 89.933913v539.158261c8.013913 42.25113-8.94887 89.177043-47.014956 127.109565a232.848696 232.848696 0 0 1-170.785392 65.758609c-61.885217-2.938435-111.081739-33.435826-129.113043-80.050087-18.031304-46.614261-2.137043-102.177391 41.672348-145.853218a232.848696 232.848696 0 0 1 170.785391-65.80313c21.014261 1.024 40.514783 5.164522 57.878261 12.065391V233.338435c0-12.109913-10.551652-20.034783-20.569044-20.034783a24.620522 24.620522 0 0 0-5.787826 0.934957L439.785739 338.18713a19.545043 19.545043 0 0 0-14.825739 19.144348v438.984348H423.846957c11.53113 43.987478-5.164522 94.208-45.412174 134.322087a232.848696 232.848696 0 0 1-170.785392 65.758609c-61.885217-2.938435-111.081739-33.435826-129.113043-80.050087-18.031304-46.614261-2.137043-102.177391 41.672348-145.853218a232.848696 232.848696 0 0 1 170.785391-65.80313c20.791652 1.024 40.069565 5.075478 57.299478 11.842783z" diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb index 351ec2b43..388a3dac1 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb @@ -95,7 +95,7 @@ Public Class PageVersionScreenshot .Name = "BtnCopy", .Text = "复制", .LogoScale = 0.8, - .Logo = Logo.IconButtonInfo + .Logo = Logo.IconButtonCopy } AddHandler btnCopy.Click, AddressOf btnCopy_Click stackPanel.Children.Add(btnCopy) From 26939ccab6abf2d5d58fef41d44d662033cf7e15 Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 21 Sep 2024 20:16:28 +0800 Subject: [PATCH 06/54] =?UTF-8?q?feat:=20=E5=AD=98=E6=A1=A3=E8=AF=A6?= =?UTF-8?q?=E7=BB=86=E4=BF=A1=E6=81=AF=E6=9F=A5=E7=9C=8B=20&=20=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PageVersion/PageVersionScreenshot.xaml.vb | 10 +-- .../PageVersion/PageVersionWorld.xaml.vb | 74 ++++++++++++++++++- 2 files changed, 73 insertions(+), 11 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb index 388a3dac1..70fe1add8 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb @@ -121,17 +121,11 @@ Public Class PageVersionScreenshot OpenExplorer("""" & GetPathFromSender(sender) & """") End Sub Private Sub btnDelete_Click(sender As MyIconTextButton, e As EventArgs) - Dim IsShiftPressed As Boolean = My.Computer.Keyboard.ShiftKeyDown Path = GetPathFromSender(sender) RemoveItem(Path) Try - If IsShiftPressed Then - File.Delete(Path) - Hint("已永久删除截图!") - Else - My.Computer.FileSystem.DeleteFile(Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) - Hint("已将截图移至回收站!") - End If + My.Computer.FileSystem.DeleteFile(Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) + Hint("已将截图移至回收站!") Catch ex As Exception Log(ex, "删除截图失败!", LogLevel.Hint) End Try diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb index f7e07f1e4..b84266081 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb @@ -26,6 +26,11 @@ Public Class PageVersionWorld AniControlEnabled += 1 PanBack.ScrollToHome() LoadFileList() + AniControlEnabled -= 1 + End Sub + + Private Sub RefreshUI() + PanCard.Title = $"存档列表 ({FileList.Count})" If FileList.Count.Equals(0) Then PanNoWorld.Visibility = Visibility.Visible PanContent.Visibility = Visibility.Collapsed @@ -33,7 +38,6 @@ Public Class PageVersionWorld PanNoWorld.Visibility = Visibility.Collapsed PanContent.Visibility = Visibility.Visible End If - AniControlEnabled -= 1 End Sub Private Sub LoadFileList() @@ -42,17 +46,81 @@ Public Class PageVersionWorld FileList = Directory.EnumerateDirectories(WorldPath).ToList() If ModeDebug Then Log("[World] 共发现 " & FileList.Count & " 个存档文件夹", LogLevel.Debug) PanList.Children.Clear() - PanCard.Title = $"存档列表 ({FileList.Count})" For Each i In FileList Dim worldItem As MyListItem = New MyListItem With { .Logo = i + "\icon.png", .Title = GetFileNameFromPath(i), - .Info = $"创建时间:{ Directory.GetCreationTime(i).ToString("yyyy'/'MM'/'dd")},最后修改时间:{Directory.GetLastWriteTime(i).ToString("yyyy'/'MM'/'dd")}" + .Info = $"创建时间:{ Directory.GetCreationTime(i).ToString("yyyy'/'MM'/'dd")},最后修改时间:{Directory.GetLastWriteTime(i).ToString("yyyy'/'MM'/'dd")}", + .Tag = i + } + Dim BtnDelete As MyIconButton = New MyIconButton With { + .Logo = Logo.IconButtonDelete, + .ToolTip = "删除", + .Tag = i + } + AddHandler BtnDelete.Click, AddressOf BtnDelete_Click + Dim BtnCopy As MyIconButton = New MyIconButton With { + .Logo = Logo.IconButtonCopy, + .ToolTip = "复制", + .Tag = i + } + AddHandler BtnCopy.Click, AddressOf BtnCopy_Click + Dim BtnInfo As MyIconButton = New MyIconButton With { + .Logo = Logo.IconButtonInfo, + .ToolTip = "详情", + .Tag = i } + AddHandler BtnInfo.Click, AddressOf BtnInfo_Click + worldItem.Buttons = {BtnDelete, BtnCopy, BtnInfo} PanList.Children.Add(worldItem) Next + RefreshUI() End Sub + Private Function GetPathFromSender(sender As Object) As String + Return CType(sender, MyIconButton).Tag + End Function + + Private Sub RemoveItem(Path As String) + For Each i In PanList.Children + If CType(i, MyListItem).Tag.Equals(Path) Then + PanList.Children.Remove(CType(i, MyListItem)) + FileList.Remove(Path) + Exit For + End If + Next + RefreshUI() + End Sub + + Private Sub BtnDelete_Click(sender As Object, e As MouseButtonEventArgs) + Path = GetPathFromSender(sender) + RemoveItem(Path) + Try + My.Computer.FileSystem.DeleteDirectory(Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) + Hint("已将存档移至回收站!") + Catch ex As Exception + Log(ex, "删除存档失败!", LogLevel.Hint) + End Try + End Sub + Private Sub BtnCopy_Click(sender As Object, e As MouseButtonEventArgs) + Dim Path As String = GetPathFromSender(sender) + If Directory.Exists(Path) Then + Clipboard.SetFileDropList(New Specialized.StringCollection() From {Path}) + Hint("已复制存档文件夹到剪贴板!") + Else + Hint("存档文件夹不存在!") + End If + End Sub + Private Sub BtnInfo_Click(sender As Object, e As MouseButtonEventArgs) + Dim Path As String = GetPathFromSender(sender) + Dim infos As List(Of String) = New List(Of String) + infos.Add("名称:" & GetFileNameFromPath(Path)) + infos.Add("创建日期:" & Directory.GetCreationTime(Path).ToString("yyyy'/'MM'/'dd")) + infos.Add("最后一次修改日期:" & Directory.GetLastWriteTime(Path).ToString("yyyy'/'MM'/'dd")) + infos.Add("玩家数量:" & Directory.GetFiles(Path & "\playerdata", "*.dat", SearchOption.TopDirectoryOnly).Count()) + infos.Add("数据包数量:" & (Directory.GetDirectories(Path + "\datapacks").Count() + Directory.GetFiles(Path + "\datapacks").Count()).ToString()) + MyMsgBox(infos.Join(vbCrLf), "存档详细信息") + End Sub Private Sub BtnOpenFolder_Click(sender As Object, e As MouseButtonEventArgs) If Not Directory.Exists(WorldPath) Then Directory.CreateDirectory(WorldPath) OpenExplorer("""" & WorldPath & """") From a7469e26801d5dcf62a374445b6a9a0943244b73 Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 21 Sep 2024 21:02:22 +0800 Subject: [PATCH 07/54] =?UTF-8?q?feat:=20=E5=85=89=E5=BD=B1=20&=20?= =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=8C=85=20=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/FormMain.xaml.vb | 2 + Plain Craft Launcher 2/Modules/ModMain.vb | 2 + .../Pages/PageVersion/PageVersionLeft.xaml | 24 +++- .../Pages/PageVersion/PageVersionLeft.xaml.vb | 8 +- .../PageVersion/PageVersionResourcePack.xaml | 37 ++++++ .../PageVersionResourcePack.xaml.vb | 113 ++++++++++++++++++ .../PageVersion/PageVersionScreenshot.xaml.vb | 2 + .../Pages/PageVersion/PageVersionShader.xaml | 37 ++++++ .../PageVersion/PageVersionShader.xaml.vb | 113 ++++++++++++++++++ .../PageVersion/PageVersionWorld.xaml.vb | 1 + .../Plain Craft Launcher 2.vbproj | 14 +++ 11 files changed, 348 insertions(+), 5 deletions(-) create mode 100644 Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml create mode 100644 Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb create mode 100644 Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml create mode 100644 Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb index fc60542c9..65dc7a735 100644 --- a/Plain Craft Launcher 2/FormMain.xaml.vb +++ b/Plain Craft Launcher 2/FormMain.xaml.vb @@ -1108,6 +1108,8 @@ Install: VersionModDisabled = 3 VersionWorld = 4 VersionScreenshot = 5 + VersionResourcePack = 6 + VersionShader = 7 End Enum ''' ''' 获取次级页面的名称。若并非次级页面则返回空字符串,故可以以此判断是否为次级页面。 diff --git a/Plain Craft Launcher 2/Modules/ModMain.vb b/Plain Craft Launcher 2/Modules/ModMain.vb index 3da12cb93..0f280bf6e 100644 --- a/Plain Craft Launcher 2/Modules/ModMain.vb +++ b/Plain Craft Launcher 2/Modules/ModMain.vb @@ -428,6 +428,8 @@ EndHint: Public FrmVersionModDisabled As PageVersionModDisabled Public FrmVersionScreenshot As PageVersionScreenshot Public FrmVersionWorld As PageVersionWorld + Public FrmVersionShader As PageVersionShader + Public FrmVersionResourcePack As PageVersionResourcePack Public FrmVersionSetup As PageVersionSetup '资源信息分页声明 diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml index bf8af0f00..383eb3a85 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml @@ -13,7 +13,7 @@ - @@ -21,10 +21,10 @@ - + Logo="M819.392 0L1024 202.752v652.16a168.96 168.96 0 0 1-168.832 168.768h-104.192a47.296 47.296 0 0 1-10.752 0H283.776a47.232 47.232 0 0 1-10.752 0H168.832A168.96 168.96 0 0 1 0 854.912V168.768A168.96 168.96 0 0 1 168.832 0h650.56z m110.208 854.912V242.112l-149.12-147.776H168.896c-41.088 0-74.432 33.408-74.432 74.432v686.144c0 41.024 33.344 74.432 74.432 74.432h62.4v-190.528c0-33.408 27.136-60.544 60.544-60.544h440.448c33.408 0 60.544 27.136 60.544 60.544v190.528h62.4c41.088 0 74.432-33.408 74.432-74.432z m-604.032 74.432h372.864v-156.736H325.568v156.736z m403.52-596.48a47.168 47.168 0 1 1 0 94.336H287.872a47.168 47.168 0 1 1 0-94.336h441.216z m0-153.728a47.168 47.168 0 1 1 0 94.4H287.872a47.168 47.168 0 1 1 0-94.4h441.216z"> @@ -32,12 +32,28 @@ + Logo="M791.272727 837.818182v139.636363h-93.090909v-139.636363H232.727273a93.090909 93.090909 0 0 1-93.090909-93.090909V279.272727H0V186.181818h139.636364V46.545455h93.090909v139.636363h465.454545a93.090909 93.090909 0 0 1 93.090909 93.090909v465.454546h139.636364v93.090909h-139.636364z m-93.090909-232.727273V279.272727H232.727273v465.454546h465.454545v-139.636364z"> + + + + + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb index 01006d5d1..09af293c8 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb @@ -25,7 +25,7 @@ ''' ''' 勾选事件改变页面。 ''' - Private Sub PageCheck(sender As MyListItem, e As RouteEventArgs) Handles ItemOverall.Check, ItemMod.Check, ItemModDisabled.Check, ItemSetup.Check, ItemScreenshot.Check, ItemWorld.Check + Private Sub PageCheck(sender As MyListItem, e As RouteEventArgs) Handles ItemOverall.Check, ItemMod.Check, ItemModDisabled.Check, ItemSetup.Check, ItemScreenshot.Check, ItemWorld.Check, ItemResourcePack.Check, ItemShader.Check '尚未初始化控件属性时,sender.Tag 为 Nothing,会导致切换到页面 0 '若使用 IsLoaded,则会导致模拟点击不被执行(模拟点击切换页面时,控件的 IsLoaded 为 False) If sender.Tag IsNot Nothing Then PageChange(Val(sender.Tag)) @@ -52,6 +52,12 @@ Case FormMain.PageSubType.VersionScreenshot If FrmVersionScreenshot Is Nothing Then FrmVersionScreenshot = New PageVersionScreenshot Return FrmVersionScreenshot + Case FormMain.PageSubType.VersionResourcePack + If FrmVersionResourcePack Is Nothing Then FrmVersionResourcePack = New PageVersionResourcePack + Return FrmVersionResourcePack + Case FormMain.PageSubType.VersionShader + If FrmVersionShader Is Nothing Then FrmVersionShader = New PageVersionShader + Return FrmVersionShader Case Else Throw New Exception("未知的版本设置子页面种类:" & ID) End Select diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml new file mode 100644 index 000000000..3f1b862aa --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb new file mode 100644 index 000000000..8c34a8bf1 --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb @@ -0,0 +1,113 @@ +Imports System.Security.Principal + +Public Class PageVersionResourcePack + + Private IsLoad As Boolean = False + Private Sub PageSetupLaunch_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded + + '重复加载部分 + PanBack.ScrollToHome() + ResourcepacksPath = PageVersionLeft.Version.PathIndie + "resourcepacks" + If Not Directory.Exists(ResourcepacksPath) Then Directory.CreateDirectory(ResourcepacksPath) + Reload() + + '非重复加载部分 + If IsLoad Then Exit Sub + IsLoad = True + + End Sub + + Dim FileList As List(Of String) = New List(Of String) + Dim ResourcepacksPath As String + + ''' + ''' 确保当前页面上的信息已正确显示。 + ''' + Public Sub Reload() + AniControlEnabled += 1 + PanBack.ScrollToHome() + LoadFileList() + AniControlEnabled -= 1 + End Sub + + Private Sub RefreshUI() + PanCard.Title = $"资源包列表 ({FileList.Count})" + If FileList.Count.Equals(0) Then + PanNoWorld.Visibility = Visibility.Visible + PanContent.Visibility = Visibility.Collapsed + Else + PanNoWorld.Visibility = Visibility.Collapsed + PanContent.Visibility = Visibility.Visible + End If + End Sub + + Private Sub LoadFileList() + Log("[World] 刷新资源包文件") + FileList.Clear() + FileList = Directory.EnumerateFiles(ResourcepacksPath, "*.zip").ToList() + If ModeDebug Then Log("[World] 共发现 " & FileList.Count & " 个资源包文件", LogLevel.Debug) + PanList.Children.Clear() + For Each i In FileList + Dim worldItem As MyListItem = New MyListItem With { + .Title = GetFileNameWithoutExtentionFromPath(i), + .Info = $"引入时间:{ File.GetCreationTime(i).ToString("yyyy'/'MM'/'dd")}", + .Tag = i + } + Dim BtnDelete As MyIconButton = New MyIconButton With { + .Logo = Logo.IconButtonDelete, + .ToolTip = "删除", + .Tag = i + } + AddHandler BtnDelete.Click, AddressOf BtnDelete_Click + Dim BtnCopy As MyIconButton = New MyIconButton With { + .Logo = Logo.IconButtonCopy, + .ToolTip = "复制", + .Tag = i + } + AddHandler BtnCopy.Click, AddressOf BtnCopy_Click + worldItem.Buttons = {BtnDelete, BtnCopy} + PanList.Children.Add(worldItem) + Next + RefreshUI() + End Sub + + Private Function GetPathFromSender(sender As Object) As String + Return CType(sender, MyIconButton).Tag + End Function + + Private Sub RemoveItem(Path As String) + For Each i In PanList.Children + If CType(i, MyListItem).Tag.Equals(Path) Then + PanList.Children.Remove(CType(i, MyListItem)) + FileList.Remove(Path) + Exit For + End If + Next + RefreshUI() + End Sub + + Private Sub BtnDelete_Click(sender As Object, e As MouseButtonEventArgs) + Path = GetPathFromSender(sender) + RemoveItem(Path) + Try + My.Computer.FileSystem.DeleteDirectory(Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) + Hint("已将资源包移至回收站!") + Catch ex As Exception + Log(ex, "删除资源包失败!", LogLevel.Hint) + End Try + End Sub + Private Sub BtnCopy_Click(sender As Object, e As MouseButtonEventArgs) + Dim Path As String = GetPathFromSender(sender) + If File.Exists(Path) Then + Clipboard.SetFileDropList(New Specialized.StringCollection() From {Path}) + Hint("已复制资源包文件到剪贴板!") + Else + Hint("资源包不存在!") + End If + End Sub + + Private Sub BtnOpenFolder_Click(sender As Object, e As MouseButtonEventArgs) + If Not Directory.Exists(ResourcepacksPath) Then Directory.CreateDirectory(ResourcepacksPath) + OpenExplorer("""" & ResourcepacksPath & """") + End Sub +End Class diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb index 70fe1add8..77a9af713 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb @@ -8,8 +8,10 @@ Public Class PageVersionScreenshot '重复加载部分 PanBack.ScrollToHome() ScreenshotPath = PageVersionLeft.Version.PathIndie + "screenshots" + If Not Directory.Exists(ScreenshotPath) Then Directory.CreateDirectory(ScreenshotPath) Reload() + '非重复加载部分 If IsLoad Then Exit Sub IsLoad = True diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml new file mode 100644 index 000000000..89ba3f623 --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb new file mode 100644 index 000000000..60b7d8483 --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb @@ -0,0 +1,113 @@ +Imports System.Security.Principal + +Public Class PageVersionShader + + Private IsLoad As Boolean = False + Private Sub PageSetupLaunch_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded + + '重复加载部分 + PanBack.ScrollToHome() + ShaderPath = PageVersionLeft.Version.PathIndie + "shaderpacks" + If Not Directory.Exists(ShaderPath) Then Directory.CreateDirectory(ShaderPath) + Reload() + + '非重复加载部分 + If IsLoad Then Exit Sub + IsLoad = True + + End Sub + + Dim FileList As List(Of String) = New List(Of String) + Dim ShaderPath As String + + ''' + ''' 确保当前页面上的信息已正确显示。 + ''' + Public Sub Reload() + AniControlEnabled += 1 + PanBack.ScrollToHome() + LoadFileList() + AniControlEnabled -= 1 + End Sub + + Private Sub RefreshUI() + PanCard.Title = $"光影包列表 ({FileList.Count})" + If FileList.Count.Equals(0) Then + PanNoWorld.Visibility = Visibility.Visible + PanContent.Visibility = Visibility.Collapsed + Else + PanNoWorld.Visibility = Visibility.Collapsed + PanContent.Visibility = Visibility.Visible + End If + End Sub + + Private Sub LoadFileList() + Log("[World] 刷新光影包文件") + FileList.Clear() + FileList = Directory.EnumerateFiles(ShaderPath, "*.zip").ToList() + If ModeDebug Then Log("[World] 共发现 " & FileList.Count & " 个光影包文件", LogLevel.Debug) + PanList.Children.Clear() + For Each i In FileList + Dim worldItem As MyListItem = New MyListItem With { + .Title = GetFileNameWithoutExtentionFromPath(i), + .Info = $"引入时间:{ File.GetCreationTime(i).ToString("yyyy'/'MM'/'dd")}", + .Tag = i + } + Dim BtnDelete As MyIconButton = New MyIconButton With { + .Logo = Logo.IconButtonDelete, + .ToolTip = "删除", + .Tag = i + } + AddHandler BtnDelete.Click, AddressOf BtnDelete_Click + Dim BtnCopy As MyIconButton = New MyIconButton With { + .Logo = Logo.IconButtonCopy, + .ToolTip = "复制", + .Tag = i + } + AddHandler BtnCopy.Click, AddressOf BtnCopy_Click + worldItem.Buttons = {BtnDelete, BtnCopy} + PanList.Children.Add(worldItem) + Next + RefreshUI() + End Sub + + Private Function GetPathFromSender(sender As Object) As String + Return CType(sender, MyIconButton).Tag + End Function + + Private Sub RemoveItem(Path As String) + For Each i In PanList.Children + If CType(i, MyListItem).Tag.Equals(Path) Then + PanList.Children.Remove(CType(i, MyListItem)) + FileList.Remove(Path) + Exit For + End If + Next + RefreshUI() + End Sub + + Private Sub BtnDelete_Click(sender As Object, e As MouseButtonEventArgs) + Path = GetPathFromSender(sender) + RemoveItem(Path) + Try + My.Computer.FileSystem.DeleteDirectory(Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) + Hint("已将光影包移至回收站!") + Catch ex As Exception + Log(ex, "删除光影包失败!", LogLevel.Hint) + End Try + End Sub + Private Sub BtnCopy_Click(sender As Object, e As MouseButtonEventArgs) + Dim Path As String = GetPathFromSender(sender) + If File.Exists(Path) Then + Clipboard.SetFileDropList(New Specialized.StringCollection() From {Path}) + Hint("已复制光影包文件到剪贴板!") + Else + Hint("光影包不存在!") + End If + End Sub + + Private Sub BtnOpenFolder_Click(sender As Object, e As MouseButtonEventArgs) + If Not Directory.Exists(ShaderPath) Then Directory.CreateDirectory(ShaderPath) + OpenExplorer("""" & ShaderPath & """") + End Sub +End Class \ No newline at end of file diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb index b84266081..670bc9b54 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb @@ -8,6 +8,7 @@ Public Class PageVersionWorld '重复加载部分 PanBack.ScrollToHome() WorldPath = PageVersionLeft.Version.PathIndie + "saves" + If Not Directory.Exists(WorldPath) Then Directory.CreateDirectory(WorldPath) Reload() '非重复加载部分 diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index 254c7e6a5..857872f1c 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj @@ -293,6 +293,12 @@ PageVersionModDisabled.xaml + + PageVersionShader.xaml + + + PageVersionResourcePack.xaml + PageVersionWorld.xaml @@ -560,6 +566,14 @@ MSBuild:Compile Designer + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + MSBuild:Compile Designer From ce1f45cc5683caeacdc2b1446248d12d26a1964d Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 21 Sep 2024 21:06:56 +0800 Subject: [PATCH 08/54] =?UTF-8?q?feat:=20=E6=89=93=E5=BC=80=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PageVersion/PageVersionResourcePack.xaml.vb | 11 ++++++++++- .../Pages/PageVersion/PageVersionShader.xaml.vb | 12 +++++++++++- .../Pages/PageVersion/PageVersionWorld.xaml.vb | 11 ++++++++++- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb index 8c34a8bf1..2b69ff1da 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb @@ -53,6 +53,12 @@ Public Class PageVersionResourcePack .Info = $"引入时间:{ File.GetCreationTime(i).ToString("yyyy'/'MM'/'dd")}", .Tag = i } + Dim BtnOpen As MyIconButton = New MyIconButton With { + .Logo = Logo.IconButtonOpen, + .ToolTip = "打开", + .Tag = i + } + AddHandler BtnOpen.Click, AddressOf BtnOpen_Click Dim BtnDelete As MyIconButton = New MyIconButton With { .Logo = Logo.IconButtonDelete, .ToolTip = "删除", @@ -65,7 +71,7 @@ Public Class PageVersionResourcePack .Tag = i } AddHandler BtnCopy.Click, AddressOf BtnCopy_Click - worldItem.Buttons = {BtnDelete, BtnCopy} + worldItem.Buttons = {BtnOpen, BtnDelete, BtnCopy} PanList.Children.Add(worldItem) Next RefreshUI() @@ -110,4 +116,7 @@ Public Class PageVersionResourcePack If Not Directory.Exists(ResourcepacksPath) Then Directory.CreateDirectory(ResourcepacksPath) OpenExplorer("""" & ResourcepacksPath & """") End Sub + Private Sub BtnOpen_Click(sender As Object, e As MouseButtonEventArgs) + OpenExplorer("""" & sender.Tag & """") + End Sub End Class diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb index 60b7d8483..e05456de6 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb @@ -53,6 +53,12 @@ Public Class PageVersionShader .Info = $"引入时间:{ File.GetCreationTime(i).ToString("yyyy'/'MM'/'dd")}", .Tag = i } + Dim BtnOpen As MyIconButton = New MyIconButton With { + .Logo = Logo.IconButtonOpen, + .ToolTip = "打开", + .Tag = i + } + AddHandler BtnOpen.Click, AddressOf BtnOpen_Click Dim BtnDelete As MyIconButton = New MyIconButton With { .Logo = Logo.IconButtonDelete, .ToolTip = "删除", @@ -65,7 +71,7 @@ Public Class PageVersionShader .Tag = i } AddHandler BtnCopy.Click, AddressOf BtnCopy_Click - worldItem.Buttons = {BtnDelete, BtnCopy} + worldItem.Buttons = {BtnOpen, BtnDelete, BtnCopy} PanList.Children.Add(worldItem) Next RefreshUI() @@ -110,4 +116,8 @@ Public Class PageVersionShader If Not Directory.Exists(ShaderPath) Then Directory.CreateDirectory(ShaderPath) OpenExplorer("""" & ShaderPath & """") End Sub + + Private Sub BtnOpen_Click(sender As Object, e As MouseButtonEventArgs) + OpenExplorer("""" & sender.Tag & """") + End Sub End Class \ No newline at end of file diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb index 670bc9b54..482398e23 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb @@ -54,6 +54,12 @@ Public Class PageVersionWorld .Info = $"创建时间:{ Directory.GetCreationTime(i).ToString("yyyy'/'MM'/'dd")},最后修改时间:{Directory.GetLastWriteTime(i).ToString("yyyy'/'MM'/'dd")}", .Tag = i } + Dim BtnOpen As MyIconButton = New MyIconButton With { + .Logo = Logo.IconButtonOpen, + .ToolTip = "打开", + .Tag = i + } + AddHandler BtnOpen.Click, AddressOf BtnOpen_Click Dim BtnDelete As MyIconButton = New MyIconButton With { .Logo = Logo.IconButtonDelete, .ToolTip = "删除", @@ -72,7 +78,7 @@ Public Class PageVersionWorld .Tag = i } AddHandler BtnInfo.Click, AddressOf BtnInfo_Click - worldItem.Buttons = {BtnDelete, BtnCopy, BtnInfo} + worldItem.Buttons = {BtnOpen, BtnDelete, BtnCopy, BtnInfo} PanList.Children.Add(worldItem) Next RefreshUI() @@ -126,4 +132,7 @@ Public Class PageVersionWorld If Not Directory.Exists(WorldPath) Then Directory.CreateDirectory(WorldPath) OpenExplorer("""" & WorldPath & """") End Sub + Private Sub BtnOpen_Click(sender As Object, e As MouseButtonEventArgs) + OpenExplorer("""" & sender.Tag & """") + End Sub End Class From e800b5adbce07d070dab4453e9983cb2f14ac82d Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 21 Sep 2024 21:08:01 +0800 Subject: [PATCH 09/54] =?UTF-8?q?feat:=20=E6=88=AA=E5=9B=BE=E5=9B=BE?= =?UTF-8?q?=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml index 383eb3a85..6f26e2b63 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml @@ -32,7 +32,7 @@ + Logo="M791.3,837.8v117.7c0,12.1-9.8,22-22,22h-49.1c-12.1,0-22-9.8-22-22V837.8H232.7c-51.4,0-93.1-41.7-93.1-93.1V279.3H22 c-12.1,0-22-9.8-22-22v-49.1c0-12.1,9.8-22,22-22h117.7V68.5c0-12.1,9.8-22,22-22h49.1c12.1,0,22,9.8,22,22v117.7h465.5 c51.4,0,93.1,41.7,93.1,93.1v465.5h117.7c12.1,0,22,9.8,22,22v49.1c0,12.1-9.8,22-22,22L791.3,837.8L791.3,837.8z M698.2,605.1 V279.3H232.7v465.5h465.5L698.2,605.1L698.2,605.1z"> From fc81f94953648c28ee34105cf32c7da5d641dcce Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 21 Sep 2024 21:13:20 +0800 Subject: [PATCH 10/54] =?UTF-8?q?feat:=20=E6=88=AA=E5=9B=BE=E5=9B=BE?= =?UTF-8?q?=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml index 6f26e2b63..e24e3717a 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml @@ -32,7 +32,7 @@ + Logo="M853.333333 42.666667H170.666667C99.978667 42.666667 42.666667 99.978667 42.666667 170.666667v682.666666c0 70.688 57.312 128 128 128h682.666666c70.688 0 128-57.312 128-128V170.666667c0-70.688-57.312-128-128-128z m42.666667 810.666666c0 23.573333-19.093333 42.666667-42.666667 42.666667H316.341333L682.666667 529.674667l213.333333 213.322666V853.333333z m0-230.997333l-213.333333-213.333333L195.658667 896H170.666667c-23.573333 0-42.666667-19.093333-42.666667-42.666667V170.666667c0-23.573333 19.093333-42.666667 42.666667-42.666667h682.666666c23.573333 0 42.666667 19.093333 42.666667 42.666667v451.669333zM341.333333 213.333333c-70.688 0-128 57.312-128 128s57.312 128 128 128 128-57.312 128-128-57.312-128-128-128z m0 170.666667a42.666667 42.666667 0 1 1 0-85.333333 42.666667 42.666667 0 0 1 0 85.333333z"> From 5eb2bf4b4d38af3d1aee031a5db69f9ef4c62a6c Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 21 Sep 2024 21:18:02 +0800 Subject: [PATCH 11/54] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4=E9=A1=BA?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/FormMain.xaml.vb | 8 ++++---- .../Pages/PageVersion/PageVersionLeft.xaml | 20 +++++++++---------- .../Pages/PageVersion/PageVersionLeft.xaml.vb | 6 ++++++ 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb index 65dc7a735..c0e390b54 100644 --- a/Plain Craft Launcher 2/FormMain.xaml.vb +++ b/Plain Craft Launcher 2/FormMain.xaml.vb @@ -1104,10 +1104,10 @@ Install: OtherTest = 2 VersionOverall = 0 VersionSetup = 1 - VersionMod = 2 - VersionModDisabled = 3 - VersionWorld = 4 - VersionScreenshot = 5 + VersionWorld = 2 + VersionScreenshot = 3 + VersionMod = 4 + VersionModDisabled = 5 VersionResourcePack = 6 VersionShader = 7 End Enum diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml index e24e3717a..11f7418ff 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml @@ -13,32 +13,32 @@ - + - - + - + - + - + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb index 09af293c8..37f5c053d 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb @@ -115,6 +115,12 @@ Case FormMain.PageSubType.VersionWorld If FrmVersionWorld IsNot Nothing Then FrmVersionWorld.Reload() ItemWorld.Checked = True + Case FormMain.PageSubType.VersionResourcePack + If FrmVersionWorld IsNot Nothing Then FrmVersionResourcePack.Reload() + ItemResourcePack.Checked = True + Case FormMain.PageSubType.VersionShader + If FrmVersionWorld IsNot Nothing Then FrmVersionShader.Reload() + ItemShader.Checked = True End Select Catch ex As Exception Log(ex, "强制刷新出错") From 6c7fbcd34afeaa129bbd909e3ab1a74402cff943 Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 21 Sep 2024 21:30:23 +0800 Subject: [PATCH 12/54] =?UTF-8?q?feat:=20=E6=8C=89=E9=92=AE=E5=B1=85?= =?UTF-8?q?=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageVersion/PageVersionScreenshot.xaml.vb | 1 + 1 file changed, 1 insertion(+) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb index 77a9af713..4cc7c2115 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb @@ -73,6 +73,7 @@ Public Class PageVersionScreenshot '按钮 Dim stackPanel As New StackPanel stackPanel.Orientation = Orientation.Horizontal + stackPanel.HorizontalAlignment = HorizontalAlignment.Center stackPanel.Margin = New Thickness(3,5,3,2) Grid.SetRow(stackPanel, 1) grid.Children.Add(stackPanel) From 62805dc16f31d9d1db1f053404de07eb4aa07261 Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 21 Sep 2024 22:04:53 +0800 Subject: [PATCH 13/54] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E5=BB=BA?= =?UTF-8?q?=E8=AE=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 资源包显示图标 部分图标修改 部分文案修改 --- .../Pages/PageVersion/PageVersionLeft.xaml | 6 +++--- .../Pages/PageVersion/PageVersionResourcePack.xaml.vb | 9 ++++++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml index 11f7418ff..956bf5e5b 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml @@ -40,15 +40,15 @@ + Logo="M913.066667 264.533333l-371.2-209.066666c-25.6-12.8-59.733333-12.8-85.333334 0L89.6 264.533333C34.133333 298.666667 34.133333 379.733333 89.6 413.866667l371.2 209.066666c25.6 12.8 59.733333 12.8 85.333333 0l371.2-209.066666c55.466667-34.133333 55.466667-119.466667-4.266666-149.333334z m-413.866667 281.6L132.266667 337.066667 499.2 128l371.2 209.066667-371.2 209.066666z M46.933333 516.266667c12.8-21.333333 38.4-25.6 59.733334-17.066667l384 221.866667c12.8 8.533333 29.866667 8.533333 42.666666 0l388.266667-217.6c21.333333-12.8 46.933333-4.266667 59.733333 17.066666 12.8 21.333333 4.266667 46.933333-17.066666 59.733334l-388.266667 217.6c-38.4 21.333333-89.6 21.333333-128 0l-384-221.866667c-21.333333-12.8-25.6-38.4-17.066667-59.733333z M106.666667 669.866667c-21.333333-12.8-46.933333-4.266667-59.733334 17.066666-12.8 21.333333-4.266667 46.933333 17.066667 59.733334l388.266667 217.6c38.4 21.333333 85.333333 21.333333 128 0l379.733333-217.6c21.333333-12.8 25.6-38.4 17.066667-59.733334-12.8-21.333333-38.4-25.6-59.733334-17.066666l-379.733333 217.6c-12.8 8.533333-29.866667 8.533333-42.666667 0l-388.266666-217.6z"> - + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb index 2b69ff1da..a063a9e09 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb @@ -1,4 +1,5 @@ -Imports System.Security.Principal +Imports System.IO.Compression +Imports System.Security.Principal Public Class PageVersionResourcePack @@ -47,9 +48,15 @@ Public Class PageVersionResourcePack FileList = Directory.EnumerateFiles(ResourcepacksPath, "*.zip").ToList() If ModeDebug Then Log("[World] 共发现 " & FileList.Count & " 个资源包文件", LogLevel.Debug) PanList.Children.Clear() + Directory.Delete(PageVersionLeft.Version.PathIndie & "PCL\Resourcepacks\", True) + Directory.CreateDirectory(PageVersionLeft.Version.PathIndie & "PCL\Resourcepacks\") For Each i In FileList + Dim Archive = New ZipArchive(New FileStream(i, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + Dim ResTempFile = PageVersionLeft.Version.PathIndie & "PCL\Resourcepacks\" & GetHash(i) & ".png" + Archive.GetEntry("pack.png").ExtractToFile(ResTempFile) Dim worldItem As MyListItem = New MyListItem With { .Title = GetFileNameWithoutExtentionFromPath(i), + .Logo = ResTempFile, .Info = $"引入时间:{ File.GetCreationTime(i).ToString("yyyy'/'MM'/'dd")}", .Tag = i } From 8000b3e41863246ef367b403295f49ee1febad38 Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 21 Sep 2024 22:17:22 +0800 Subject: [PATCH 14/54] =?UTF-8?q?fix:=20=E7=BC=93=E5=AD=98=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E5=88=9B=E5=BB=BA=E4=B8=8E=E5=88=A0=E9=99=A4=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageVersion/PageVersionResourcePack.xaml.vb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb index a063a9e09..0dfe28f7e 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb @@ -9,7 +9,7 @@ Public Class PageVersionResourcePack '重复加载部分 PanBack.ScrollToHome() ResourcepacksPath = PageVersionLeft.Version.PathIndie + "resourcepacks" - If Not Directory.Exists(ResourcepacksPath) Then Directory.CreateDirectory(ResourcepacksPath) + Directory.CreateDirectory(ResourcepacksPath) Reload() '非重复加载部分 @@ -48,7 +48,8 @@ Public Class PageVersionResourcePack FileList = Directory.EnumerateFiles(ResourcepacksPath, "*.zip").ToList() If ModeDebug Then Log("[World] 共发现 " & FileList.Count & " 个资源包文件", LogLevel.Debug) PanList.Children.Clear() - Directory.Delete(PageVersionLeft.Version.PathIndie & "PCL\Resourcepacks\", True) + Dim ResCachaPath = PageVersionLeft.Version.PathIndie & "PCL\Resourcepacks\" + If Directory.Exists(ResCachaPath) Then Directory.Delete(ResCachaPath, True) Directory.CreateDirectory(PageVersionLeft.Version.PathIndie & "PCL\Resourcepacks\") For Each i In FileList Dim Archive = New ZipArchive(New FileStream(i, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) From ad46cc16661eca9a6e0905d4f53dc877a3867890 Mon Sep 17 00:00:00 2001 From: tangge233 <50769997+tangge233@users.noreply.github.com> Date: Sat, 21 Sep 2024 22:20:01 +0800 Subject: [PATCH 15/54] Update Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml Co-authored-by: 3gf8jv4dv <3gf8jv4dv@gmail.com> --- .../Pages/PageVersion/PageVersionScreenshot.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml index 03bf2ac75..e3cb0d415 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml @@ -23,7 +23,7 @@ - + From 668c83ffd51a4ef49706fe3a0a331e37a9c30bca Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 21 Sep 2024 22:50:25 +0800 Subject: [PATCH 16/54] =?UTF-8?q?fix:=20=E5=8F=AF=E8=83=BD=E5=87=BA?= =?UTF-8?q?=E7=8E=B0=E7=9A=84=E5=A4=8D=E5=88=B6=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PageVersion/PageVersionScreenshot.xaml.vb | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb index 4cc7c2115..4633d4f2b 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb @@ -136,10 +136,22 @@ Public Class PageVersionScreenshot Private Sub btnCopy_Click(sender As MyIconTextButton, e As EventArgs) Dim imagePath As String = GetPathFromSender(sender) If File.Exists(imagePath) Then - Clipboard.SetFileDropList(New Specialized.StringCollection() From {imagePath}) - Hint("已复制截图到剪贴板!") + Dim TryTime = 0 + While TryTime <= 5 + Try + Log("[Screenshot] 尝试复制" & imagePath & "到剪切板") + Clipboard.Clear() + Clipboard.SetImage(New BitmapImage(New Uri(imagePath))) + Hint("已复制截图到剪贴板!") + TryTime = 6 + Exit Sub + Catch ex As Exception + TryTime += 1 + End Try + End While + Hint("截图复制失败!", HintType.Critical) Else - Hint("截图文件不存在!") + Hint("截图文件不存在!") End If End Sub From a55e8cfcab0a9e7f4dd53b6c40728d54bb63653e Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 21 Sep 2024 23:46:50 +0800 Subject: [PATCH 17/54] =?UTF-8?q?fix:=20=E4=B8=8D=E5=90=88=E7=90=86?= =?UTF-8?q?=E7=9A=84=E5=89=AA=E5=88=87=E6=9D=BF=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageVersion/PageVersionScreenshot.xaml.vb | 1 - 1 file changed, 1 deletion(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb index 4633d4f2b..d60176058 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb @@ -140,7 +140,6 @@ Public Class PageVersionScreenshot While TryTime <= 5 Try Log("[Screenshot] 尝试复制" & imagePath & "到剪切板") - Clipboard.Clear() Clipboard.SetImage(New BitmapImage(New Uri(imagePath))) Hint("已复制截图到剪贴板!") TryTime = 6 From 0665e813bab1c4efc8433cf7d0b15755445df182 Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sun, 22 Sep 2024 13:03:31 +0800 Subject: [PATCH 18/54] =?UTF-8?q?feat:=20=E7=B2=98=E8=B4=B4=E6=8C=89?= =?UTF-8?q?=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PageVersion/PageVersionResourcePack.xaml | 11 ++++ .../PageVersionResourcePack.xaml.vb | 57 ++++++++++++++++--- .../PageVersion/PageVersionScreenshot.xaml | 41 ++++++++----- .../PageVersion/PageVersionScreenshot.xaml.vb | 2 +- .../Pages/PageVersion/PageVersionShader.xaml | 11 ++++ .../PageVersion/PageVersionShader.xaml.vb | 38 +++++++++++-- .../Pages/PageVersion/PageVersionWorld.xaml | 12 ++++ .../PageVersion/PageVersionWorld.xaml.vb | 31 +++++++++- 8 files changed, 171 insertions(+), 32 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml index 3f1b862aa..77937d3b6 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml @@ -25,9 +25,20 @@ + + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb index 0dfe28f7e..924f08e0e 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb @@ -8,7 +8,7 @@ Public Class PageVersionResourcePack '重复加载部分 PanBack.ScrollToHome() - ResourcepacksPath = PageVersionLeft.Version.PathIndie + "resourcepacks" + ResourcepacksPath = PageVersionLeft.Version.PathIndie + "resourcepacks\" Directory.CreateDirectory(ResourcepacksPath) Reload() @@ -43,18 +43,28 @@ Public Class PageVersionResourcePack End Sub Private Sub LoadFileList() - Log("[World] 刷新资源包文件") + Log("[Resourcepack] 刷新资源包文件") FileList.Clear() FileList = Directory.EnumerateFiles(ResourcepacksPath, "*.zip").ToList() - If ModeDebug Then Log("[World] 共发现 " & FileList.Count & " 个资源包文件", LogLevel.Debug) + If ModeDebug Then Log("[Resourcepack] 共发现 " & FileList.Count & " 个资源包文件", LogLevel.Debug) PanList.Children.Clear() - Dim ResCachaPath = PageVersionLeft.Version.PathIndie & "PCL\Resourcepacks\" + Dim ResCachaPath = PageVersionLeft.Version.PathIndie & "PCL\Cache\resourcepacks\" If Directory.Exists(ResCachaPath) Then Directory.Delete(ResCachaPath, True) - Directory.CreateDirectory(PageVersionLeft.Version.PathIndie & "PCL\Resourcepacks\") + Directory.CreateDirectory(ResCachaPath) For Each i In FileList - Dim Archive = New ZipArchive(New FileStream(i, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) - Dim ResTempFile = PageVersionLeft.Version.PathIndie & "PCL\Resourcepacks\" & GetHash(i) & ".png" - Archive.GetEntry("pack.png").ExtractToFile(ResTempFile) + Dim ResTempFile = ResCachaPath & GetHash(i) & ".png" + Try + Dim Archive = New ZipArchive(New FileStream(i, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + Dim pack = Archive.GetEntry("pack.png") + If pack Is Nothing Then + ResTempFile = PathImage & "Icons/NoIcon.png" + Else + pack.ExtractToFile(ResTempFile) + End If + Catch ex As Exception + Log(ex, "[Resourcepack] 提取整合包图片失败!") + ResTempFile = PathImage & "Icons/NoIcon.png" + End Try Dim worldItem As MyListItem = New MyListItem With { .Title = GetFileNameWithoutExtentionFromPath(i), .Logo = ResTempFile, @@ -104,7 +114,7 @@ Public Class PageVersionResourcePack Path = GetPathFromSender(sender) RemoveItem(Path) Try - My.Computer.FileSystem.DeleteDirectory(Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) + My.Computer.FileSystem.DeleteFile(Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) Hint("已将资源包移至回收站!") Catch ex As Exception Log(ex, "删除资源包失败!", LogLevel.Hint) @@ -127,4 +137,33 @@ Public Class PageVersionResourcePack Private Sub BtnOpen_Click(sender As Object, e As MouseButtonEventArgs) OpenExplorer("""" & sender.Tag & """") End Sub + Private Sub BtnPaste_Click(sender As Object, e As MouseButtonEventArgs) + Try + Dim files As Specialized.StringCollection = Clipboard.GetFileDropList() + If files.Count.Equals(0) Then + Hint("剪切板内无文件可粘贴") + Exit Sub + End If + Dim CopiedFiles = 0 + For Each i In files + If File.Exists(i) Then + Try + If File.Exists(ResourcepacksPath & GetFileNameFromPath(i)) Then + Hint("已存在同名文件:" & GetFileNameWithoutExtentionFromPath(i)) + Else + File.Copy(i, ResourcepacksPath & GetFileNameFromPath(i)) + CopiedFiles += 1 + End If + Catch ex As Exception + Log(ex, "[Shader] 复制文件时出错") + Continue For + End Try + End If + Next + Hint("已复制 " & CopiedFiles & "个文件") + LoadFileList() + Catch ex As Exception + Log(ex, "粘贴存档文件夹失败", LogLevel.Hint) + End Try + End Sub End Class diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml index e3cb0d415..874551096 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml @@ -27,21 +27,32 @@ - - - + + + + + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb index d60176058..09633fea7 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb @@ -7,7 +7,7 @@ Public Class PageVersionScreenshot '重复加载部分 PanBack.ScrollToHome() - ScreenshotPath = PageVersionLeft.Version.PathIndie + "screenshots" + ScreenshotPath = PageVersionLeft.Version.PathIndie + "screenshots\" If Not Directory.Exists(ScreenshotPath) Then Directory.CreateDirectory(ScreenshotPath) Reload() diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml index 89ba3f623..d51b7d19b 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml @@ -25,9 +25,20 @@ + + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb index e05456de6..db4f0a397 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb @@ -7,7 +7,7 @@ Public Class PageVersionShader '重复加载部分 PanBack.ScrollToHome() - ShaderPath = PageVersionLeft.Version.PathIndie + "shaderpacks" + ShaderPath = PageVersionLeft.Version.PathIndie + "shaderpacks\" If Not Directory.Exists(ShaderPath) Then Directory.CreateDirectory(ShaderPath) Reload() @@ -42,10 +42,10 @@ Public Class PageVersionShader End Sub Private Sub LoadFileList() - Log("[World] 刷新光影包文件") + Log("[Shader] 刷新光影包文件") FileList.Clear() FileList = Directory.EnumerateFiles(ShaderPath, "*.zip").ToList() - If ModeDebug Then Log("[World] 共发现 " & FileList.Count & " 个光影包文件", LogLevel.Debug) + If ModeDebug Then Log("[Shader] 共发现 " & FileList.Count & " 个光影包文件", LogLevel.Debug) PanList.Children.Clear() For Each i In FileList Dim worldItem As MyListItem = New MyListItem With { @@ -96,7 +96,7 @@ Public Class PageVersionShader Path = GetPathFromSender(sender) RemoveItem(Path) Try - My.Computer.FileSystem.DeleteDirectory(Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) + My.Computer.FileSystem.DeleteFile(Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) Hint("已将光影包移至回收站!") Catch ex As Exception Log(ex, "删除光影包失败!", LogLevel.Hint) @@ -120,4 +120,34 @@ Public Class PageVersionShader Private Sub BtnOpen_Click(sender As Object, e As MouseButtonEventArgs) OpenExplorer("""" & sender.Tag & """") End Sub + + Private Sub BtnPaste_Click(sender As Object, e As MouseButtonEventArgs) + Try + Dim files As Specialized.StringCollection = Clipboard.GetFileDropList() + If files.Count.Equals(0) Then + Hint("剪切板内无文件可粘贴") + Exit Sub + End If + Dim CopiedFiles = 0 + For Each i In files + If File.Exists(i) Then + Try + If File.Exists(ShaderPath & GetFileNameFromPath(i)) Then + Hint("已存在同名文件:" & GetFileNameWithoutExtentionFromPath(i)) + Else + File.Copy(i, ShaderPath & GetFileNameFromPath(i)) + CopiedFiles += 1 + End If + Catch ex As Exception + Log(ex, "[Shader] 复制文件时出错") + Continue For + End Try + End If + Next + Hint("已复制 " & CopiedFiles & "个文件") + LoadFileList() + Catch ex As Exception + Log(ex, "粘贴存档文件夹失败", LogLevel.Hint) + End Try + End Sub End Class \ No newline at end of file diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml index eec76f3a2..36582eba8 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml @@ -25,9 +25,21 @@ + + + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb index 482398e23..602d31815 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb @@ -7,7 +7,7 @@ Public Class PageVersionWorld '重复加载部分 PanBack.ScrollToHome() - WorldPath = PageVersionLeft.Version.PathIndie + "saves" + WorldPath = PageVersionLeft.Version.PathIndie + "saves\" If Not Directory.Exists(WorldPath) Then Directory.CreateDirectory(WorldPath) Reload() @@ -48,9 +48,11 @@ Public Class PageVersionWorld If ModeDebug Then Log("[World] 共发现 " & FileList.Count & " 个存档文件夹", LogLevel.Debug) PanList.Children.Clear() For Each i In FileList + Dim SaveLogo = i + "\icon.png" + If Not File.Exists(SaveLogo) Then SaveLogo = PathImage & "Icons/NoIcon.png" Dim worldItem As MyListItem = New MyListItem With { - .Logo = i + "\icon.png", - .Title = GetFileNameFromPath(i), + .Logo = SaveLogo, + .Title = GetFolderNameFromPath(i), .Info = $"创建时间:{ Directory.GetCreationTime(i).ToString("yyyy'/'MM'/'dd")},最后修改时间:{Directory.GetLastWriteTime(i).ToString("yyyy'/'MM'/'dd")}", .Tag = i } @@ -135,4 +137,27 @@ Public Class PageVersionWorld Private Sub BtnOpen_Click(sender As Object, e As MouseButtonEventArgs) OpenExplorer("""" & sender.Tag & """") End Sub + Private Sub BtnPaste_Click(sender As Object, e As MouseButtonEventArgs) + Dim files As Specialized.StringCollection = Clipboard.GetFileDropList() + Dim Copied = 0 + For Each i In files + Try + If Directory.Exists(i) Then + If (Directory.Exists(WorldPath & GetFolderNameFromPath(i))) Then + Hint("发现同名文件夹,无法粘贴:" & GetFolderNameFromPath(i)) + Else + CopyDirectory(i, WorldPath & GetFolderNameFromPath(i)) + Copied += 1 + End If + Else + Hint("源文件夹不存在或源目标不是文件夹") + End If + Catch ex As Exception + Log(ex, "粘贴存档文件夹失败", LogLevel.Hint) + Continue For + End Try + Next + Hint("已复制 " & Copied & " 个文件夹") + LoadFileList() + End Sub End Class From f8bebb5ac0ff9612bdc242e6e548379b3a9a1bb4 Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sun, 22 Sep 2024 13:09:39 +0800 Subject: [PATCH 19/54] =?UTF-8?q?fix:=20=E6=96=87=E6=9C=AC=E6=8F=8F?= =?UTF-8?q?=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageVersion/PageVersionResourcePack.xaml | 4 ++-- .../Pages/PageVersion/PageVersionResourcePack.xaml.vb | 2 +- .../Pages/PageVersion/PageVersionScreenshot.xaml.vb | 2 +- .../Pages/PageVersion/PageVersionShader.xaml | 4 ++-- .../Pages/PageVersion/PageVersionShader.xaml.vb | 2 +- .../Pages/PageVersion/PageVersionWorld.xaml | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml index 77937d3b6..08571ebec 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml @@ -25,7 +25,7 @@ - + @@ -36,7 +36,7 @@ - + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb index 924f08e0e..444c5c44b 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb @@ -141,7 +141,7 @@ Public Class PageVersionResourcePack Try Dim files As Specialized.StringCollection = Clipboard.GetFileDropList() If files.Count.Equals(0) Then - Hint("剪切板内无文件可粘贴") + Hint("剪贴板内无文件可粘贴") Exit Sub End If Dim CopiedFiles = 0 diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb index 09633fea7..1e6e9b414 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb @@ -139,7 +139,7 @@ Public Class PageVersionScreenshot Dim TryTime = 0 While TryTime <= 5 Try - Log("[Screenshot] 尝试复制" & imagePath & "到剪切板") + Log("[Screenshot] 尝试复制" & imagePath & "到剪贴板") Clipboard.SetImage(New BitmapImage(New Uri(imagePath))) Hint("已复制截图到剪贴板!") TryTime = 6 diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml index d51b7d19b..e323cc288 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml @@ -25,7 +25,7 @@ - + @@ -36,7 +36,7 @@ - + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb index db4f0a397..8d81a95fc 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb @@ -125,7 +125,7 @@ Public Class PageVersionShader Try Dim files As Specialized.StringCollection = Clipboard.GetFileDropList() If files.Count.Equals(0) Then - Hint("剪切板内无文件可粘贴") + Hint("剪贴板内无文件可粘贴") Exit Sub End If Dim CopiedFiles = 0 diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml index 36582eba8..d0b5c6de7 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml @@ -25,7 +25,7 @@ - + @@ -37,7 +37,7 @@ - + From 688c8847ca43c5c6462b12d6d2b5d6db5de542cb Mon Sep 17 00:00:00 2001 From: tangge233 <50769997+tangge233@users.noreply.github.com> Date: Sun, 22 Sep 2024 13:17:50 +0800 Subject: [PATCH 20/54] Apply suggestions from code review Co-authored-by: 3gf8jv4dv <3gf8jv4dv@gmail.com> --- .../Pages/PageVersion/PageVersionResourcePack.xaml.vb | 2 +- .../Pages/PageVersion/PageVersionShader.xaml.vb | 2 +- .../Pages/PageVersion/PageVersionWorld.xaml.vb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb index 444c5c44b..dfb6add4a 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb @@ -160,7 +160,7 @@ Public Class PageVersionResourcePack End Try End If Next - Hint("已复制 " & CopiedFiles & "个文件") + Hint("已粘贴 " & CopiedFiles & " 个文件") LoadFileList() Catch ex As Exception Log(ex, "粘贴存档文件夹失败", LogLevel.Hint) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb index 8d81a95fc..9881602a9 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb @@ -144,7 +144,7 @@ Public Class PageVersionShader End Try End If Next - Hint("已复制 " & CopiedFiles & "个文件") + Hint("已粘贴 " & CopiedFiles & " 个文件") LoadFileList() Catch ex As Exception Log(ex, "粘贴存档文件夹失败", LogLevel.Hint) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb index 602d31815..74f4be184 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb @@ -157,7 +157,7 @@ Public Class PageVersionWorld Continue For End Try Next - Hint("已复制 " & Copied & " 个文件夹") + Hint("已粘贴 " & Copied & " 个文件夹") LoadFileList() End Sub End Class From 2c3f87cb21f893b3d556004fa994524b9ef0ae2d Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sun, 22 Sep 2024 13:48:57 +0800 Subject: [PATCH 21/54] =?UTF-8?q?fix:=20UI=20=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageVersion/PageVersionScreenshot.xaml.vb | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb index 1e6e9b414..609c26f5c 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb @@ -28,12 +28,17 @@ Public Class PageVersionScreenshot AniControlEnabled += 1 PanBack.ScrollToHome() LoadFileList() + AniControlEnabled -= 1 + End Sub + + Private Sub RefreshUI() If FileList.Count.Equals(0) Then PanNoPic.Visibility = Visibility.Visible + PanContent.Visibility = Visibility.Collapsed Else PanNoPic.Visibility = Visibility.Collapsed + PanContent.Visibility = Visibility.Visible End If - AniControlEnabled -= 1 End Sub Private Sub LoadFileList() @@ -48,7 +53,8 @@ Public Class PageVersionScreenshot .Width = Double.NaN, ' 允许宽度自适应 .MinWidth = 230, .Margin = New Thickness(7), - .Tag = i + .Tag = i, + .ToolTip = i.Replace(ScreenshotPath, "") } Dim grid As New Grid grid.Margin = New Thickness(4) @@ -74,7 +80,7 @@ Public Class PageVersionScreenshot Dim stackPanel As New StackPanel stackPanel.Orientation = Orientation.Horizontal stackPanel.HorizontalAlignment = HorizontalAlignment.Center - stackPanel.Margin = New Thickness(3,5,3,2) + stackPanel.Margin = New Thickness(3, 5, 3, 2) Grid.SetRow(stackPanel, 1) grid.Children.Add(stackPanel) @@ -105,6 +111,7 @@ Public Class PageVersionScreenshot PanList.Children.Add(myCard) Next + RefreshUI() End Sub Private Sub RemoveItem(Path As String) From dfa2663fde4148f3d00c6eb709ecbc2e1e2ac657 Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sun, 22 Sep 2024 16:46:05 +0800 Subject: [PATCH 22/54] =?UTF-8?q?feat:=20=E6=88=AA=E5=9B=BE=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E6=94=B9=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageVersion/PageVersionScreenshot.xaml.vb | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb index 609c26f5c..c124bcbe0 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb @@ -51,15 +51,13 @@ Public Class PageVersionScreenshot Dim myCard As New MyCard With { .Height = Double.NaN, ' 允许高度自适应 .Width = Double.NaN, ' 允许宽度自适应 - .MinWidth = 230, .Margin = New Thickness(7), - .Tag = i, - .ToolTip = i.Replace(ScreenshotPath, "") + .Tag = i } Dim grid As New Grid - grid.Margin = New Thickness(4) myCard.Children.Add(grid) + grid.RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(7)}) grid.RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(120)}) grid.RowDefinitions.Add(New RowDefinition) @@ -73,15 +71,15 @@ Public Class PageVersionScreenshot bitmapImage.Freeze() ' 冻结图像以提高性能 image.Source = bitmapImage image.Stretch = Stretch.Uniform ' 使图片自适应控件大小 - Grid.SetRow(image, 0) + Grid.SetRow(image, 1) grid.Children.Add(image) '按钮 Dim stackPanel As New StackPanel stackPanel.Orientation = Orientation.Horizontal stackPanel.HorizontalAlignment = HorizontalAlignment.Center - stackPanel.Margin = New Thickness(3, 5, 3, 2) - Grid.SetRow(stackPanel, 1) + stackPanel.Margin = New Thickness(3, 5, 3, 5) + Grid.SetRow(stackPanel, 2) grid.Children.Add(stackPanel) Dim btnOpen As New MyIconTextButton With { From 8902ffdda67ed38b33a9a6400048f852a5891321 Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sun, 22 Sep 2024 21:03:40 +0800 Subject: [PATCH 23/54] =?UTF-8?q?chore:=20=E8=B0=83=E6=95=B4=E7=95=8C?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageVersion/PageVersionScreenshot.xaml.vb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb index c124bcbe0..da3e2b959 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb @@ -52,12 +52,13 @@ Public Class PageVersionScreenshot .Height = Double.NaN, ' 允许高度自适应 .Width = Double.NaN, ' 允许宽度自适应 .Margin = New Thickness(7), - .Tag = i + .Tag = i, + .ToolTip = i.Replace(ScreenshotPath, "") '适配高清截图模组 } Dim grid As New Grid myCard.Children.Add(grid) - grid.RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(7)}) + grid.RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(9)}) grid.RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(120)}) grid.RowDefinitions.Add(New RowDefinition) From eb52f3eeec555ea169771029a309b13cb65b1e9b Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sun, 22 Sep 2024 21:08:18 +0800 Subject: [PATCH 24/54] =?UTF-8?q?fix:=20=E7=A9=BA=E5=80=BC=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E5=AF=B9=E8=B1=A1=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageVersion/PageVersionLeft.xaml.vb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb index 37f5c053d..a1ba52f68 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb @@ -116,10 +116,10 @@ If FrmVersionWorld IsNot Nothing Then FrmVersionWorld.Reload() ItemWorld.Checked = True Case FormMain.PageSubType.VersionResourcePack - If FrmVersionWorld IsNot Nothing Then FrmVersionResourcePack.Reload() + If FrmVersionResourcePack IsNot Nothing Then FrmVersionResourcePack.Reload() ItemResourcePack.Checked = True Case FormMain.PageSubType.VersionShader - If FrmVersionWorld IsNot Nothing Then FrmVersionShader.Reload() + If FrmVersionShader IsNot Nothing Then FrmVersionShader.Reload() ItemShader.Checked = True End Select Catch ex As Exception From ca6c7861e55aea852a7ff529862ce072d26bfaec Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sun, 22 Sep 2024 21:19:48 +0800 Subject: [PATCH 25/54] =?UTF-8?q?fix:=20=E7=95=8C=E9=9D=A2=E5=85=83?= =?UTF-8?q?=E7=B4=A0=E6=9C=89=E6=97=B6=E7=9C=8B=E4=B8=8D=E5=88=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageVersion/PageVersionResourcePack.xaml.vb | 2 ++ .../Pages/PageVersion/PageVersionScreenshot.xaml.vb | 2 ++ .../Pages/PageVersion/PageVersionShader.xaml.vb | 2 ++ .../Pages/PageVersion/PageVersionWorld.xaml.vb | 2 ++ 4 files changed, 8 insertions(+) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb index dfb6add4a..7fc869767 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb @@ -36,9 +36,11 @@ Public Class PageVersionResourcePack If FileList.Count.Equals(0) Then PanNoWorld.Visibility = Visibility.Visible PanContent.Visibility = Visibility.Collapsed + PanNoWorld.UpdateLayout() Else PanNoWorld.Visibility = Visibility.Collapsed PanContent.Visibility = Visibility.Visible + PanContent.UpdateLayout() End If End Sub diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb index da3e2b959..d36cdca77 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb @@ -35,9 +35,11 @@ Public Class PageVersionScreenshot If FileList.Count.Equals(0) Then PanNoPic.Visibility = Visibility.Visible PanContent.Visibility = Visibility.Collapsed + PanNoPic.UpdateLayout() Else PanNoPic.Visibility = Visibility.Collapsed PanContent.Visibility = Visibility.Visible + PanContent.UpdateLayout() End If End Sub diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb index 9881602a9..3d7732ac2 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb @@ -35,9 +35,11 @@ Public Class PageVersionShader If FileList.Count.Equals(0) Then PanNoWorld.Visibility = Visibility.Visible PanContent.Visibility = Visibility.Collapsed + PanNoWorld.UpdateLayout() Else PanNoWorld.Visibility = Visibility.Collapsed PanContent.Visibility = Visibility.Visible + PanContent.UpdateLayout() End If End Sub diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb index 74f4be184..8b6e9a14a 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb @@ -35,9 +35,11 @@ Public Class PageVersionWorld If FileList.Count.Equals(0) Then PanNoWorld.Visibility = Visibility.Visible PanContent.Visibility = Visibility.Collapsed + PanNoWorld.UpdateLayout() Else PanNoWorld.Visibility = Visibility.Collapsed PanContent.Visibility = Visibility.Visible + PanContent.UpdateLayout() End If End Sub From 62be47d961bddb2005ea2a88f520da7287c08bf5 Mon Sep 17 00:00:00 2001 From: tangge233 Date: Mon, 23 Sep 2024 17:07:32 +0800 Subject: [PATCH 26/54] =?UTF-8?q?feat:=20=E8=B5=84=E6=BA=90=E5=8C=85?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=E6=94=AF=E6=8C=81=E6=96=87=E4=BB=B6=E5=A4=B9?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PageVersionResourcePack.xaml.vb | 61 ++++++++++++++----- 1 file changed, 45 insertions(+), 16 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb index 7fc869767..d6414b2e4 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb @@ -18,6 +18,9 @@ Public Class PageVersionResourcePack End Sub + ''' + ''' 文件和文件夹列表 + ''' Dim FileList As List(Of String) = New List(Of String) Dim ResourcepacksPath As String @@ -47,31 +50,40 @@ Public Class PageVersionResourcePack Private Sub LoadFileList() Log("[Resourcepack] 刷新资源包文件") FileList.Clear() - FileList = Directory.EnumerateFiles(ResourcepacksPath, "*.zip").ToList() - If ModeDebug Then Log("[Resourcepack] 共发现 " & FileList.Count & " 个资源包文件", LogLevel.Debug) + Dim fileRes = Directory.EnumerateFiles(ResourcepacksPath, "*.zip").ToList() + FileList.AddRange(fileRes) + Dim FolderRes = Directory.EnumerateDirectories(ResourcepacksPath).ToList() + FileList.AddRange(FolderRes) + If ModeDebug Then Log($"[Resourcepack] 共发现 {FileList.Count} 个资源包文件({fileRes.Count} 个文件,{FolderRes.Count} 个文件夹)", LogLevel.Debug) PanList.Children.Clear() Dim ResCachaPath = PageVersionLeft.Version.PathIndie & "PCL\Cache\resourcepacks\" If Directory.Exists(ResCachaPath) Then Directory.Delete(ResCachaPath, True) Directory.CreateDirectory(ResCachaPath) For Each i In FileList Dim ResTempFile = ResCachaPath & GetHash(i) & ".png" + Dim isFile = File.Exists(i) Try - Dim Archive = New ZipArchive(New FileStream(i, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) - Dim pack = Archive.GetEntry("pack.png") - If pack Is Nothing Then - ResTempFile = PathImage & "Icons/NoIcon.png" - Else - pack.ExtractToFile(ResTempFile) + If isFile Then '文件类型的资源包 + Dim Archive = New ZipArchive(New FileStream(i, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + Dim pack = Archive.GetEntry("pack.png") + If pack Is Nothing Then + ResTempFile = PathImage & "Icons/NoIcon.png" + Else + pack.ExtractToFile(ResTempFile) + End If + Else '文件夹型资源包 + ResTempFile = i + "\pack.png" End If Catch ex As Exception Log(ex, "[Resourcepack] 提取整合包图片失败!") ResTempFile = PathImage & "Icons/NoIcon.png" End Try + If Not File.Exists(ResTempFile) Then ResTempFile = PathImage & "Icons/NoIcon.png" '防止未考虑到的错误 Dim worldItem As MyListItem = New MyListItem With { - .Title = GetFileNameWithoutExtentionFromPath(i), - .Logo = ResTempFile, - .Info = $"引入时间:{ File.GetCreationTime(i).ToString("yyyy'/'MM'/'dd")}", - .Tag = i + .Title = If(isFile, GetFileNameWithoutExtentionFromPath(i), GetFolderNameFromPath(i)), + .Logo = ResTempFile, + .Info = $"引入时间:{ If(isFile, File.GetCreationTime(i), Directory.GetCreationTime(i)).ToString("yyyy'/'MM'/'dd")}", + .Tag = i } Dim BtnOpen As MyIconButton = New MyIconButton With { .Logo = Logo.IconButtonOpen, @@ -116,7 +128,11 @@ Public Class PageVersionResourcePack Path = GetPathFromSender(sender) RemoveItem(Path) Try - My.Computer.FileSystem.DeleteFile(Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) + If File.Exists(Path) Then + My.Computer.FileSystem.DeleteFile(Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) + Else + My.Computer.FileSystem.DeleteDirectory(Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) + End If Hint("已将资源包移至回收站!") Catch ex As Exception Log(ex, "删除资源包失败!", LogLevel.Hint) @@ -124,7 +140,7 @@ Public Class PageVersionResourcePack End Sub Private Sub BtnCopy_Click(sender As Object, e As MouseButtonEventArgs) Dim Path As String = GetPathFromSender(sender) - If File.Exists(Path) Then + If File.Exists(Path) Or Directory.Exists(Path) Then Clipboard.SetFileDropList(New Specialized.StringCollection() From {Path}) Hint("已复制资源包文件到剪贴板!") Else @@ -147,6 +163,7 @@ Public Class PageVersionResourcePack Exit Sub End If Dim CopiedFiles = 0 + Dim CopiedFolders = 0 For Each i In files If File.Exists(i) Then Try @@ -157,12 +174,24 @@ Public Class PageVersionResourcePack CopiedFiles += 1 End If Catch ex As Exception - Log(ex, "[Shader] 复制文件时出错") + Log(ex, "[Reourcepack] 复制文件时出错") + Continue For + End Try + Else + Try + If Directory.Exists(ResourcepacksPath & GetFolderNameFromPath(i)) Then + Hint("已存在同名文件夹:" & GetFolderNameFromPath(i)) + Else + CopyDirectory(i, ResourcepacksPath & GetFolderNameFromPath(i)) + CopiedFolders += 1 + End If + Catch ex As Exception + Log(ex, "[Resourcepack] 复制文件时出错") Continue For End Try End If Next - Hint("已粘贴 " & CopiedFiles & " 个文件") + Hint("已粘贴 " & CopiedFiles & " 个文件和 " & CopiedFolders & " 个文件夹") LoadFileList() Catch ex As Exception Log(ex, "粘贴存档文件夹失败", LogLevel.Hint) From 7123f890b125b0a9907a7e27a1678b50cb73cd57 Mon Sep 17 00:00:00 2001 From: tangge233 <50769997+tangge233@users.noreply.github.com> Date: Mon, 23 Sep 2024 17:32:38 +0800 Subject: [PATCH 27/54] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 《我不希望我的日志拿起来就被别人看懂》 Co-authored-by: 3gf8jv4dv <3gf8jv4dv@gmail.com> --- .../Pages/PageVersion/PageVersionResourcePack.xaml.vb | 4 ++-- .../Pages/PageVersion/PageVersionShader.xaml.vb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb index d6414b2e4..edf50fb7f 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb @@ -75,7 +75,7 @@ Public Class PageVersionResourcePack ResTempFile = i + "\pack.png" End If Catch ex As Exception - Log(ex, "[Resourcepack] 提取整合包图片失败!") + Log(ex, "[Resourcepack] 提取资源包图片失败!") ResTempFile = PathImage & "Icons/NoIcon.png" End Try If Not File.Exists(ResTempFile) Then ResTempFile = PathImage & "Icons/NoIcon.png" '防止未考虑到的错误 @@ -194,7 +194,7 @@ Public Class PageVersionResourcePack Hint("已粘贴 " & CopiedFiles & " 个文件和 " & CopiedFolders & " 个文件夹") LoadFileList() Catch ex As Exception - Log(ex, "粘贴存档文件夹失败", LogLevel.Hint) + Log(ex, "粘贴资源包文件失败", LogLevel.Hint) End Try End Sub End Class diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb index 3d7732ac2..fbcbc3a2b 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb @@ -149,7 +149,7 @@ Public Class PageVersionShader Hint("已粘贴 " & CopiedFiles & " 个文件") LoadFileList() Catch ex As Exception - Log(ex, "粘贴存档文件夹失败", LogLevel.Hint) + Log(ex, "粘贴光影包文件失败", LogLevel.Hint) End Try End Sub End Class \ No newline at end of file From b5d721ee87dc141f888b38cc85f2f26c060d2edb Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 28 Sep 2024 13:13:54 +0800 Subject: [PATCH 28/54] =?UTF-8?q?fix:=20=E7=9B=AE=E5=BD=95=E4=B8=8D?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E6=97=B6=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PageVersion/PageVersionWorld.xaml.vb | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb index 8b6e9a14a..b3008616d 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb @@ -123,17 +123,22 @@ Public Class PageVersionWorld End If End Sub Private Sub BtnInfo_Click(sender As Object, e As MouseButtonEventArgs) - Dim Path As String = GetPathFromSender(sender) - Dim infos As List(Of String) = New List(Of String) - infos.Add("名称:" & GetFileNameFromPath(Path)) - infos.Add("创建日期:" & Directory.GetCreationTime(Path).ToString("yyyy'/'MM'/'dd")) - infos.Add("最后一次修改日期:" & Directory.GetLastWriteTime(Path).ToString("yyyy'/'MM'/'dd")) - infos.Add("玩家数量:" & Directory.GetFiles(Path & "\playerdata", "*.dat", SearchOption.TopDirectoryOnly).Count()) - infos.Add("数据包数量:" & (Directory.GetDirectories(Path + "\datapacks").Count() + Directory.GetFiles(Path + "\datapacks").Count()).ToString()) - MyMsgBox(infos.Join(vbCrLf), "存档详细信息") + Try + Dim Path As String = GetPathFromSender(sender) + Dim infos As List(Of String) = New List(Of String) + infos.Add("名称:" & GetFileNameFromPath(Path)) + infos.Add("创建日期:" & Directory.GetCreationTime(Path).ToString("yyyy'/'MM'/'dd")) + infos.Add("最后一次修改日期:" & Directory.GetLastWriteTime(Path).ToString("yyyy'/'MM'/'dd")) + Directory.CreateDirectory(Path & "\playerdata") + infos.Add("玩家数量:" & Directory.GetFiles(Path & "\playerdata", "*.dat", SearchOption.TopDirectoryOnly).Count()) + Directory.CreateDirectory(Path + "\datapacks") + infos.Add("数据包数量:" & (Directory.GetDirectories(Path + "\datapacks").Count() + Directory.GetFiles(Path + "\datapacks").Count()).ToString()) + MyMsgBox(infos.Join(vbCrLf), "存档详细信息") + Catch ex As Exception + Log(ex, "获取存档详细信息失败……", LogLevel.Hint) + End Try End Sub Private Sub BtnOpenFolder_Click(sender As Object, e As MouseButtonEventArgs) - If Not Directory.Exists(WorldPath) Then Directory.CreateDirectory(WorldPath) OpenExplorer("""" & WorldPath & """") End Sub Private Sub BtnOpen_Click(sender As Object, e As MouseButtonEventArgs) From 3accfe038a3af94689726ac24f9c5014289b41cd Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 28 Sep 2024 13:39:21 +0800 Subject: [PATCH 29/54] =?UTF-8?q?chore:=20=E8=B5=84=E6=BA=90=E5=8C=85?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=86=85=E9=83=A8=E8=87=AA=E5=B8=A6=E6=8F=8F?= =?UTF-8?q?=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PageVersionResourcePack.xaml.vb | 33 ++++++++++++++----- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb index edf50fb7f..970bbfbca 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb @@ -60,29 +60,44 @@ Public Class PageVersionResourcePack If Directory.Exists(ResCachaPath) Then Directory.Delete(ResCachaPath, True) Directory.CreateDirectory(ResCachaPath) For Each i In FileList - Dim ResTempFile = ResCachaPath & GetHash(i) & ".png" + Dim ResTempIconFile = ResCachaPath & GetHash(i) & ".png" + Dim ResTempDescFile = ResCachaPath & GetHash(i) & ".json" + Dim ResDesc As String = "" Dim isFile = File.Exists(i) + + '提取资源 Try If isFile Then '文件类型的资源包 Dim Archive = New ZipArchive(New FileStream(i, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) Dim pack = Archive.GetEntry("pack.png") + Dim desc = Archive.GetEntry("pack.mcmeta") If pack Is Nothing Then - ResTempFile = PathImage & "Icons/NoIcon.png" + ResTempIconFile = PathImage & "Icons/NoIcon.png" Else - pack.ExtractToFile(ResTempFile) + pack.ExtractToFile(ResTempIconFile) + End If + If desc IsNot Nothing Then + desc.ExtractToFile(ResTempDescFile) + ResDesc = GetJson(File.ReadAllText(ResTempDescFile, Encoding.UTF8))?("pack")?("description") End If Else '文件夹型资源包 - ResTempFile = i + "\pack.png" + ResTempIconFile = i + "\pack.png" + ResDesc = GetJson(File.ReadAllText(i & "\pack.mcmeta", Encoding.UTF8))?("pack")?("description") End If Catch ex As Exception - Log(ex, "[Resourcepack] 提取资源包图片失败!") - ResTempFile = PathImage & "Icons/NoIcon.png" + Log(ex, "[Resourcepack] 提取资源包信息失败!") + ResTempIconFile = PathImage & "Icons/NoIcon.png" + ResDesc = $"引入时间:{ If(isFile, File.GetCreationTime(i), Directory.GetCreationTime(i)).ToString("yyyy'/'MM'/'dd")}" End Try - If Not File.Exists(ResTempFile) Then ResTempFile = PathImage & "Icons/NoIcon.png" '防止未考虑到的错误 + + '防止错误 + If String.IsNullOrEmpty(ResDesc) Then ResDesc = $"引入时间:{ If(isFile, File.GetCreationTime(i), Directory.GetCreationTime(i)).ToString("yyyy'/'MM'/'dd")}" + If Not File.Exists(ResTempIconFile) Then ResTempIconFile = PathImage & "Icons/NoIcon.png" + Dim worldItem As MyListItem = New MyListItem With { .Title = If(isFile, GetFileNameWithoutExtentionFromPath(i), GetFolderNameFromPath(i)), - .Logo = ResTempFile, - .Info = $"引入时间:{ If(isFile, File.GetCreationTime(i), Directory.GetCreationTime(i)).ToString("yyyy'/'MM'/'dd")}", + .Logo = ResTempIconFile, + .Info = ResDesc, .Tag = i } Dim BtnOpen As MyIconButton = New MyIconButton With { From 3f0ed3ab96bf48f1e136f16a3e05b60803e37dda Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 28 Sep 2024 13:47:44 +0800 Subject: [PATCH 30/54] =?UTF-8?q?chore:=20=E5=8A=A0=E5=85=A5=20Try=20Catch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PageVersionResourcePack.xaml.vb | 36 +++++++++++-------- .../PageVersion/PageVersionScreenshot.xaml.vb | 17 +++++---- .../PageVersion/PageVersionShader.xaml.vb | 34 +++++++++++------- .../PageVersion/PageVersionWorld.xaml.vb | 34 +++++++++++------- 4 files changed, 75 insertions(+), 46 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb index 970bbfbca..8d3999303 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb @@ -129,13 +129,17 @@ Public Class PageVersionResourcePack End Function Private Sub RemoveItem(Path As String) - For Each i In PanList.Children - If CType(i, MyListItem).Tag.Equals(Path) Then - PanList.Children.Remove(CType(i, MyListItem)) - FileList.Remove(Path) - Exit For - End If - Next + Try + For Each i In PanList.Children + If CType(i, MyListItem).Tag.Equals(Path) Then + PanList.Children.Remove(CType(i, MyListItem)) + FileList.Remove(Path) + Exit For + End If + Next + Catch ex As Exception + Log(ex, "未能找到对应 UI") + End Try RefreshUI() End Sub @@ -154,13 +158,17 @@ Public Class PageVersionResourcePack End Try End Sub Private Sub BtnCopy_Click(sender As Object, e As MouseButtonEventArgs) - Dim Path As String = GetPathFromSender(sender) - If File.Exists(Path) Or Directory.Exists(Path) Then - Clipboard.SetFileDropList(New Specialized.StringCollection() From {Path}) - Hint("已复制资源包文件到剪贴板!") - Else - Hint("资源包不存在!") - End If + Try + Dim Path As String = GetPathFromSender(sender) + If File.Exists(Path) Or Directory.Exists(Path) Then + Clipboard.SetFileDropList(New Specialized.StringCollection() From {Path}) + Hint("已复制资源包文件到剪贴板!") + Else + Hint("资源包不存在!") + End If + Catch ex As Exception + Log(ex, "复制失败……", LogLevel.Hint) + End Try End Sub Private Sub BtnOpenFolder_Click(sender As Object, e As MouseButtonEventArgs) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb index d36cdca77..049838525 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb @@ -116,12 +116,16 @@ Public Class PageVersionScreenshot End Sub Private Sub RemoveItem(Path As String) - For Each i In PanList.Children - If CType(i, MyCard).Tag.Equals(Path) Then - PanList.Children.Remove(i) - Exit For - End If - Next + Try + For Each i In PanList.Children + If CType(i, MyCard).Tag.Equals(Path) Then + PanList.Children.Remove(i) + Exit For + End If + Next + Catch ex As Exception + Log(ex, "未能找到对应 UI") + End Try End Sub Private Function GetPathFromSender(sender As MyIconTextButton) As String @@ -154,6 +158,7 @@ Public Class PageVersionScreenshot Exit Sub Catch ex As Exception TryTime += 1 + Log(ex, $"[Screenshot]第 {TryTime} 次复制尝试失败") End Try End While Hint("截图复制失败!", HintType.Critical) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb index fbcbc3a2b..34adf371d 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb @@ -84,13 +84,17 @@ Public Class PageVersionShader End Function Private Sub RemoveItem(Path As String) - For Each i In PanList.Children - If CType(i, MyListItem).Tag.Equals(Path) Then - PanList.Children.Remove(CType(i, MyListItem)) - FileList.Remove(Path) - Exit For - End If - Next + Try + For Each i In PanList.Children + If CType(i, MyListItem).Tag.Equals(Path) Then + PanList.Children.Remove(CType(i, MyListItem)) + FileList.Remove(Path) + Exit For + End If + Next + Catch ex As Exception + Log(ex, "未能找到对应 UI") + End Try RefreshUI() End Sub @@ -106,12 +110,16 @@ Public Class PageVersionShader End Sub Private Sub BtnCopy_Click(sender As Object, e As MouseButtonEventArgs) Dim Path As String = GetPathFromSender(sender) - If File.Exists(Path) Then - Clipboard.SetFileDropList(New Specialized.StringCollection() From {Path}) - Hint("已复制光影包文件到剪贴板!") - Else - Hint("光影包不存在!") - End If + Try + If File.Exists(Path) Then + Clipboard.SetFileDropList(New Specialized.StringCollection() From {Path}) + Hint("已复制光影包文件到剪贴板!") + Else + Hint("光影包不存在!") + End If + Catch ex As Exception + Log(ex, "复制失败……", LogLevel.Hint) + End Try End Sub Private Sub BtnOpenFolder_Click(sender As Object, e As MouseButtonEventArgs) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb index b3008616d..c208bb1e4 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb @@ -93,13 +93,17 @@ Public Class PageVersionWorld End Function Private Sub RemoveItem(Path As String) - For Each i In PanList.Children - If CType(i, MyListItem).Tag.Equals(Path) Then - PanList.Children.Remove(CType(i, MyListItem)) - FileList.Remove(Path) - Exit For - End If - Next + Try + For Each i In PanList.Children + If CType(i, MyListItem).Tag.Equals(Path) Then + PanList.Children.Remove(CType(i, MyListItem)) + FileList.Remove(Path) + Exit For + End If + Next + Catch ex As Exception + Log(ex, "未能找到对应 UI") + End Try RefreshUI() End Sub @@ -115,12 +119,16 @@ Public Class PageVersionWorld End Sub Private Sub BtnCopy_Click(sender As Object, e As MouseButtonEventArgs) Dim Path As String = GetPathFromSender(sender) - If Directory.Exists(Path) Then - Clipboard.SetFileDropList(New Specialized.StringCollection() From {Path}) - Hint("已复制存档文件夹到剪贴板!") - Else - Hint("存档文件夹不存在!") - End If + Try + If Directory.Exists(Path) Then + Clipboard.SetFileDropList(New Specialized.StringCollection() From {Path}) + Hint("已复制存档文件夹到剪贴板!") + Else + Hint("存档文件夹不存在!") + End If + Catch ex As Exception + Log(ex, "复制失败……", LogLevel.Hint) + End Try End Sub Private Sub BtnInfo_Click(sender As Object, e As MouseButtonEventArgs) Try From e49f038ecc1f6b3ed3d7a520840810a1739b3fd7 Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 28 Sep 2024 13:50:49 +0800 Subject: [PATCH 31/54] =?UTF-8?q?fix:=20=E4=B8=8D=E5=90=88=E7=90=86?= =?UTF-8?q?=E7=9A=84=E8=B7=AF=E5=BE=84=E8=8E=B7=E5=8F=96=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageVersion/PageVersionResourcePack.xaml.vb | 2 +- .../Pages/PageVersion/PageVersionScreenshot.xaml.vb | 11 +++++++---- .../Pages/PageVersion/PageVersionShader.xaml.vb | 2 +- .../Pages/PageVersion/PageVersionWorld.xaml.vb | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb index 8d3999303..6eae3d8a4 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb @@ -125,7 +125,7 @@ Public Class PageVersionResourcePack End Sub Private Function GetPathFromSender(sender As Object) As String - Return CType(sender, MyIconButton).Tag + Return sender.Tag End Function Private Sub RemoveItem(Path As String) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb index 049838525..142d5e0b7 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb @@ -89,7 +89,8 @@ Public Class PageVersionScreenshot .Name = "BtnOpen", .Text = "打开", .LogoScale = 0.8, - .Logo = Logo.IconButtonOpen + .Logo = Logo.IconButtonOpen, + .Tag = i } AddHandler btnOpen.Click, AddressOf btnOpen_Click stackPanel.Children.Add(btnOpen) @@ -97,7 +98,8 @@ Public Class PageVersionScreenshot .Name = "BtnDelete", .Text = "删除", .LogoScale = 0.8, - .Logo = Logo.IconButtonDelete + .Logo = Logo.IconButtonDelete, + .Tag = i } AddHandler btnDelete.Click, AddressOf btnDelete_Click stackPanel.Children.Add(btnDelete) @@ -105,7 +107,8 @@ Public Class PageVersionScreenshot .Name = "BtnCopy", .Text = "复制", .LogoScale = 0.8, - .Logo = Logo.IconButtonCopy + .Logo = Logo.IconButtonCopy, + .Tag = i } AddHandler btnCopy.Click, AddressOf btnCopy_Click stackPanel.Children.Add(btnCopy) @@ -129,7 +132,7 @@ Public Class PageVersionScreenshot End Sub Private Function GetPathFromSender(sender As MyIconTextButton) As String - Return CType(CType(CType(sender.Parent, StackPanel).Parent, Grid).Parent, MyCard).Tag + Return sender.Tag End Function Private Sub btnOpen_Click(sender As MyIconTextButton, e As EventArgs) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb index 34adf371d..79ac5d03d 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb @@ -80,7 +80,7 @@ Public Class PageVersionShader End Sub Private Function GetPathFromSender(sender As Object) As String - Return CType(sender, MyIconButton).Tag + Return sender.Tag End Function Private Sub RemoveItem(Path As String) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb index c208bb1e4..d9b87c76b 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb @@ -89,7 +89,7 @@ Public Class PageVersionWorld End Sub Private Function GetPathFromSender(sender As Object) As String - Return CType(sender, MyIconButton).Tag + Return sender.Tag End Function Private Sub RemoveItem(Path As String) From cf56f948e8c6b28019d83cf162930110cc15f000 Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sun, 29 Sep 2024 19:59:39 +0800 Subject: [PATCH 32/54] chore: that's better --- .../Pages/PageVersion/PageVersionScreenshot.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml index 874551096..b36bfb54c 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml @@ -37,7 +37,7 @@ - + + + + + + + + + - - --> - + + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb index 510f8d764..5da6c1c68 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb @@ -1,6 +1,4 @@ -Imports System.Security.Principal - -Public Class PageVersionScreenshot +Public Class PageVersionScreenshot Implements IRefreshable Private Sub RefreshSelf() Implements IRefreshable.Refresh Refresh() @@ -10,6 +8,15 @@ Public Class PageVersionScreenshot FrmVersionLeft.ItemScreenshot.Checked = True End Sub + Private Sub LoaderInit() Handles Me.Initialized + PageLoaderInit(Load, PanLoad, PanContent, PanAlways, ScreenshotLoader, AddressOf UpdateList, AutoRun:=False) + End Sub + + Public ScreenshotLoader As New LoaderTask(Of Integer, List(Of MyCard))("Screenshot file loader", AddressOf LoadImages) + Private Page As Integer = 0 + Private MaxPage As Integer = 1 + Private SingleLoadCount As Integer = 20 + Private IsLoad As Boolean = False Private Sub PageSetupLaunch_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded @@ -35,105 +42,187 @@ Public Class PageVersionScreenshot Public Sub Reload() AniControlEnabled += 1 PanBack.ScrollToHome() - LoadFileList() + + '加载文件列表 + Log("[Screenshot] 刷新截图文件") + FileList.Clear() + If Directory.Exists(ScreenshotPath) Then FileList = Directory.EnumerateFiles(ScreenshotPath, "*", SearchOption.TopDirectoryOnly).ToList() + Log("[Screenshot] 共发现 " & FileList.Count & " 个截图文件") + 'FileList.RemoveAll(Function(c) c.ContainsF("\debug\")) '排除资源包调试输出 + FileList.RemoveAll(Function(c) + If File.GetAttributes(c).HasFlag(FileAttributes.Hidden) Then Return True '排除隐藏文件 + Dim info As New FileInfo(c) + If info Is Nothing Then Return True + If info.Length < 1024 Then Return True '小于 1 KB 可能为无效文件 + Dim AllowedSuffix As String() = {".png", ".jpg", ".jpeg", ".bmp", ".webp", ".tiff"} + If Not AllowedSuffix.Contains(info.Extension.ToLower()) Then Return True '只允许指定后缀的文件 + Return False + End Function) + Log("[Screenshot] 筛选后得到 " & FileList.Count & " 个截图文件") + RefreshTip() + Page = 1 + MaxPage = FileList.Count / SingleLoadCount + If(FileList.Count Mod SingleLoadCount > 0, 1, 0) + PanList.Children.Clear() + If FileList.Count > 0 Then + SetPageButton() + ScreenshotLoader.Start() + End If + AniControlEnabled -= 1 End Sub - Private Sub RefreshUI() + Private Sub LoadImages(Loader As LoaderTask(Of Integer, List(Of MyCard))) + Dim StartIndex = (Page - 1) * SingleLoadCount + If StartIndex >= FileList.Count Then Exit Sub + Dim EndIndex = Math.Min(Page * SingleLoadCount - 1, FileList.Count - 1) + Dim res As New List(Of MyCard) + For i = StartIndex To EndIndex + Dim card As MyCard = Nothing + RunInUiWait(Sub() card = BuildImageCard(FileList.ElementAt(i))) + If card IsNot Nothing Then + res.Add(card) + End If + Next + Loader.Output = res + End Sub + + Private Sub SetPageButton() + Dim LeftRange = 3, RightRange = 3 + Dim StartPage = Math.Max(1, Page - LeftRange) + Dim EndPage = Math.Min(MaxPage, Page + RightRange) + Dim BuildButton = Function(Num As Integer) + Dim labPage As New MyTextButton + labPage.Text = Num.ToString() + labPage.Margin = New Thickness(8, 0, 13, 0) + labPage.FontSize = 15 + labPage.VerticalAlignment = VerticalAlignment.Center + + AddHandler labPage.Click, Sub() ChangePage(Num) + + Return labPage + End Function + CardPageBtns.Children.Clear() + For i = StartPage To EndPage + CardPageBtns.Children.Add(BuildButton(i)) + Next + BtnPageLeft.Opacity = If(Page = 1, 0.2, 1) + BtnPageRight.Opacity = If(Page = MaxPage, 0.2, 1) + End Sub + + Private Sub ChangePage(Num As Integer) + Page = Math.Max(1, Math.Min(Num, MaxPage)) + If Page <> Num Then + Hint("再怎么翻也没有了呀……") + Exit Sub + End If + ScreenshotLoader.Start(IsForceRestart:=True) + End Sub + + Private Sub ChangePageBtn(sender As Object, e As EventArgs) Handles BtnPageLeft.Click, BtnPageRight.Click + If (CType(sender, MyIconButton)).Name = "BtnPageLeft" Then ChangePage(Page - 1) + If (CType(sender, MyIconButton)).Name = "BtnPageRight" Then ChangePage(Page + 1) + End Sub + + Private Sub RefreshTip() If FileList.Count.Equals(0) Then PanNoPic.Visibility = Visibility.Visible PanContent.Visibility = Visibility.Collapsed - PanNoPic.UpdateLayout() + CardPages.Visibility = Visibility.Collapsed Else PanNoPic.Visibility = Visibility.Collapsed PanContent.Visibility = Visibility.Visible - PanContent.UpdateLayout() + CardPages.Visibility = Visibility.Visible End If End Sub - Private Sub LoadFileList() - Log("[Screenshot] 刷新截图文件") - FileList.Clear() - If Directory.Exists(ScreenshotPath) Then FileList = Directory.EnumerateFiles(ScreenshotPath, "*.png", SearchOption.AllDirectories).ToList() + Private Sub UpdateList() PanList.Children.Clear() - Log("[Screenshot] 共发现 " & FileList.Count & " 个截图文件") - For Each i In FileList - Try - If i.ContainsF("\debug\") Then Continue For ' 排除资源包调试输出 - If Not File.Exists(i) Then Continue For ' 文件在加载途中消失了 - If File.GetAttributes(i).HasFlag(FileAttributes.Hidden) Then Continue For ' 隐藏文件 - If New FileInfo(i).Length = 0 Then Continue For ' 空文件 - Dim myCard As New MyCard With { - .Height = Double.NaN, ' 允许高度自适应 - .Width = Double.NaN, ' 允许宽度自适应 - .Margin = New Thickness(7), - .Tag = i, - .ToolTip = i.Replace(ScreenshotPath, "") '适配高清截图模组 - } - Dim grid As New Grid - myCard.Children.Add(grid) - - grid.RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(9)}) - grid.RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(120)}) - grid.RowDefinitions.Add(New RowDefinition) - - '图片 - Dim image As New Image - Dim bitmapImage As New BitmapImage() - bitmapImage.BeginInit() - bitmapImage.UriSource = New Uri(i) ' 直接使用文件路径加载图片 - bitmapImage.CacheOption = BitmapCacheOption.OnLoad ' 立即加载并释放文件流 - bitmapImage.EndInit() - bitmapImage.Freeze() ' 冻结图像以提高性能 - image.Source = bitmapImage - image.Stretch = Stretch.Uniform ' 使图片自适应控件大小 - Grid.SetRow(image, 1) - grid.Children.Add(image) - - '按钮 - Dim stackPanel As New StackPanel - stackPanel.Orientation = Orientation.Horizontal - stackPanel.HorizontalAlignment = HorizontalAlignment.Center - stackPanel.Margin = New Thickness(3, 5, 3, 5) - Grid.SetRow(stackPanel, 2) - grid.Children.Add(stackPanel) - - Dim btnOpen As New MyIconTextButton With { - .Name = "BtnOpen", - .Text = "打开", - .LogoScale = 0.8, - .Logo = Logo.IconButtonOpen, - .Tag = i - } - AddHandler btnOpen.Click, AddressOf btnOpen_Click - stackPanel.Children.Add(btnOpen) - Dim btnDelete As New MyIconTextButton With { - .Name = "BtnDelete", - .Text = "删除", - .LogoScale = 0.8, - .Logo = Logo.IconButtonDelete, - .Tag = i - } - AddHandler btnDelete.Click, AddressOf btnDelete_Click - stackPanel.Children.Add(btnDelete) - Dim btnCopy As New MyIconTextButton With { - .Name = "BtnCopy", - .Text = "复制", - .LogoScale = 0.8, - .Logo = Logo.IconButtonCopy, - .Tag = i - } - AddHandler btnCopy.Click, AddressOf btnCopy_Click - stackPanel.Children.Add(btnCopy) - - PanList.Children.Add(myCard) - Catch ex As Exception - Log(ex, $"[Screenshot] 加载图片 {i} 失败", LogLevel.Hint) - End Try + For Each item In ScreenshotLoader.Output + PanList.Children.Add(item) Next - RefreshUI() + SetPageButton() End Sub + Private Shared ImageCardCache As New Dictionary(Of String, MyCard) + + Private Function BuildImageCard(FilePath As String) As MyCard + Try + If Not File.Exists(FilePath) Then Return Nothing ' 文件在加载途中消失了 + If ImageCardCache.Keys.Contains(FilePath) Then Return ImageCardCache(FilePath) + Dim myCard As New MyCard With { + .Height = Double.NaN, ' 允许高度自适应 + .Width = Double.NaN, ' 允许宽度自适应 + .Margin = New Thickness(7), + .Tag = FilePath, + .ToolTip = FilePath.Replace(ScreenshotPath, "") + } + Dim grid As New Grid + myCard.Children.Add(grid) + + grid.RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(9)}) + grid.RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(120)}) + grid.RowDefinitions.Add(New RowDefinition) + + '图片 + Dim image As New Image + Dim bitmapImage As New BitmapImage() + Using fs As New FileStream(FilePath, FileMode.Open, FileAccess.Read) + bitmapImage.BeginInit() + bitmapImage.DecodePixelHeight = 200 + bitmapImage.DecodePixelWidth = 400 + bitmapImage.CacheOption = BitmapCacheOption.OnLoad + bitmapImage.StreamSource = fs + bitmapImage.EndInit() + bitmapImage.Freeze() + End Using + image.Source = bitmapImage + image.Stretch = Stretch.Uniform ' 使图片自适应控件大小 + Grid.SetRow(image, 1) + grid.Children.Add(image) + + '按钮 + Dim stackPanel As New StackPanel + stackPanel.Orientation = Orientation.Horizontal + stackPanel.HorizontalAlignment = HorizontalAlignment.Center + stackPanel.Margin = New Thickness(3, 5, 3, 5) + Grid.SetRow(stackPanel, 2) + grid.Children.Add(stackPanel) + + Dim btnOpen As New MyIconTextButton With { + .Name = "BtnOpen", + .Text = "打开", + .LogoScale = 0.8, + .Logo = Logo.IconButtonOpen, + .Tag = FilePath + } + AddHandler btnOpen.Click, AddressOf btnOpen_Click + stackPanel.Children.Add(btnOpen) + Dim btnDelete As New MyIconTextButton With { + .Name = "BtnDelete", + .Text = "删除", + .LogoScale = 0.8, + .Logo = Logo.IconButtonDelete, + .Tag = FilePath + } + AddHandler btnDelete.Click, AddressOf btnDelete_Click + stackPanel.Children.Add(btnDelete) + Dim btnCopy As New MyIconTextButton With { + .Name = "BtnCopy", + .Text = "复制", + .LogoScale = 0.8, + .Logo = Logo.IconButtonCopy, + .Tag = FilePath + } + AddHandler btnCopy.Click, AddressOf btnCopy_Click + stackPanel.Children.Add(btnCopy) + ImageCardCache.Add(FilePath, myCard) + Return myCard + Catch ex As Exception + Log(ex, $"[Screenshot] 加载图片 {FilePath} 失败", LogLevel.Hint) + End Try + Return Nothing + End Function + Private Sub RemoveItem(Path As String) Try For Each i In PanList.Children @@ -182,7 +271,7 @@ Public Class PageVersionScreenshot End While Hint("截图复制失败!", HintType.Critical) Else - Hint("截图文件不存在!") + Hint("截图文件不存在!") End If End Sub From d9f6292fa63dff07696e8157846d37faf2ad699a Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 25 Jan 2025 21:55:15 +0800 Subject: [PATCH 41/54] chore: ui --- .../Pages/PageVersion/PageVersionScreenshot.xaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml index 22f595e11..cfa7addc2 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml @@ -7,7 +7,7 @@ PanScroll="{Binding ElementName=PanBack}" Grid.IsSharedSizeScope="True"> - + @@ -53,7 +53,7 @@ --> - + From bfb892268883c2e80e428c6fde16aeff81282184 Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 25 Jan 2025 22:22:30 +0800 Subject: [PATCH 42/54] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=20webp=20&=20T?= =?UTF-8?q?ask=20=E5=BC=82=E6=AD=A5=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Base/MyBitmap.vb | 2 +- .../PageVersion/PageVersionScreenshot.xaml | 46 +++++++++---------- .../PageVersion/PageVersionScreenshot.xaml.vb | 30 +++++++++++- 3 files changed, 53 insertions(+), 25 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Base/MyBitmap.vb b/Plain Craft Launcher 2/Modules/Base/MyBitmap.vb index c5303d607..f29742be1 100644 --- a/Plain Craft Launcher 2/Modules/Base/MyBitmap.vb +++ b/Plain Craft Launcher 2/Modules/Base/MyBitmap.vb @@ -121,7 +121,7 @@ Public Class MyBitmap Pic = New System.Drawing.Bitmap(MS) End Using End Sub - Private Class WebPDecoder '将代码隔离在另外一个类中,这样只要不调用这个方法就不会加载 Imazen.WebP.dll + Public Class WebPDecoder '将代码隔离在另外一个类中,这样只要不调用这个方法就不会加载 Imazen.WebP.dll Public Shared Function DecodeFromBytes(Bytes As Byte()) As System.Drawing.Bitmap If Is32BitSystem Then Throw New Exception("不支持在 32 位系统下加载 WebP 图片。") Dim Decoder As New Imazen.WebP.SimpleDecoder() diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml index cfa7addc2..77f7ae740 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml @@ -7,26 +7,6 @@ PanScroll="{Binding ElementName=PanBack}" Grid.IsSharedSizeScope="True"> - - - - - - - - - - - - - - - - - - - - @@ -37,7 +17,30 @@ + + + + + + + + + + + + + + + + + + + + + + + - + @@ -20,9 +20,9 @@ - + - + @@ -39,24 +39,24 @@ - + - + - - - + + + - + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionCompResource.xaml.vb similarity index 74% rename from Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb rename to Plain Craft Launcher 2/Pages/PageVersion/PageVersionCompResource.xaml.vb index 459a65bd2..4ac3b4708 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionCompResource.xaml.vb @@ -1,15 +1,48 @@ -Public Class PageVersionMod +Public Class PageVersionCompResource Implements IRefreshable #Region "初始化" + Private CurrentCompType As CompType = CompType.Mod + + Private CurrentLoader As CompLocalLoader + + Private CurrentSwipSelect As MyLocalCompItem.SwipeSelect + + Public Sub New(LoadCompType As CompType) + CurrentCompType = LoadCompType + Dim RequireLoaders As List(Of CompLoaderType) + Select Case CurrentCompType + Case CompType.Mod + RequireLoaders = GetCurrentVersionModLoader() + Case CompType.ResourcePack + RequireLoaders = {CompLoaderType.Minecraft}.ToList() + Case CompType.Shader + RequireLoaders = {CompLoaderType.OptiFine, CompLoaderType.Iris, CompLoaderType.Vanilla, CompLoaderType.Canvas}.ToList() + End Select + CurrentLoader = New CompLocalLoader(Me, PageVersionLeft.Version.Version.McName, RequireLoaders) + + CurrentSwipSelect = New MyLocalCompItem.SwipeSelect() With {.TargetFrm = Me} + + ' 此调用是设计器所必需的。 + InitializeComponent() + + ' 在 InitializeComponent() 调用之后添加任何初始化。 + + If {CompType.Shader, CompType.ResourcePack}.Contains(CurrentCompType) Then + BtnSelectEnable.Visibility = Visibility.Collapsed + BtnSelectDisable.Visibility = Visibility.Collapsed + End If + + End Sub + Private IsLoad As Boolean = False Public Sub PageOther_Loaded() Handles Me.Loaded If FrmMain.PageLast.Page <> FormMain.PageType.CompDetail Then PanBack.ScrollToHome() AniControlEnabled += 1 SelectedMods.Clear() - ReloadModList() + ReloadCompFileList() ChangeAllSelected(False) AniControlEnabled -= 1 @@ -30,7 +63,7 @@ ''' ''' 刷新 Mod 列表。 ''' - Public Sub ReloadModList(Optional ForceReload As Boolean = False) + Public Sub ReloadCompFileList(Optional ForceReload As Boolean = False) If LoaderRun(If(ForceReload, LoaderFolderRunType.ForceRun, LoaderFolderRunType.RunOnUpdated)) Then Log("[System] 已刷新 Mod 列表") Filter = FilterType.All @@ -40,33 +73,43 @@ End Sub '强制刷新 Private Sub RefreshSelf() Implements IRefreshable.Refresh - Refresh() + Refresh(CurrentCompType) End Sub - Public Shared Sub Refresh() + Public Shared Sub Refresh(WhichPage As CompType) '强制刷新 Try CompProjectCache.Clear() CompFilesCache.Clear() - File.Delete(PathTemp & "Cache\LocalMod.json") - Log("[Mod] 由于点击刷新按钮,清理本地 Mod 信息缓存") + File.Delete(PathTemp & "Cache\LocalComp.json") + Log("[CompResource] 由于点击刷新按钮,清理本地工程信息缓存") Catch ex As Exception - Log(ex, "强制刷新时清理本地 Mod 信息缓存失败") + Log(ex, "强制刷新时清理本地工程信息缓存失败") End Try - If FrmVersionMod IsNot Nothing Then FrmVersionMod.ReloadModList(True) '无需 Else,还没加载刷个鬼的新 - FrmVersionLeft.ItemMod.Checked = True + Select Case WhichPage + Case CompType.Mod + If FrmVersionMod IsNot Nothing Then FrmVersionMod.ReloadCompFileList(True) '无需 Else,还没加载刷个鬼的新 + FrmVersionLeft.ItemMod.Checked = True + Case CompType.ResourcePack + If FrmVersionResourcePack IsNot Nothing Then FrmVersionResourcePack.ReloadCompFileList(True) + FrmVersionLeft.ItemResourcePack.Checked = True + Case CompType.Shader + If FrmVersionShader IsNot Nothing Then FrmVersionShader.ReloadCompFileList(True) + FrmVersionLeft.ItemShader.Checked = True + End Select Hint("正在刷新……", Log:=False) End Sub Private Sub LoaderInit() Handles Me.Initialized - PageLoaderInit(Load, PanLoad, PanAllBack, Nothing, McModLoader, AddressOf LoadUIFromLoaderOutput, AutoRun:=False) + PageLoaderInit(Load, PanLoad, PanAllBack, Nothing, CurrentLoader.CompResourceListLoader, AddressOf LoadUIFromLoaderOutput, Function() CurrentCompType, AutoRun:=False) End Sub Private Sub Load_Click(sender As Object, e As MouseButtonEventArgs) Handles Load.Click - If McModLoader.State = LoadState.Failed Then + If CurrentLoader.CompResourceListLoader.State = LoadState.Failed Then LoaderRun(LoaderFolderRunType.ForceRun) End If End Sub Public Function LoaderRun(Type As LoaderFolderRunType) As Boolean - Return LoaderFolderRun(McModLoader, PageVersionLeft.Version.PathIndie & "mods\", Type) + Dim CompResourcePath As String = PageVersionLeft.Version.PathIndie & GetPathNameByCompType(CurrentCompType) & "\" + Return LoaderFolderRun(CurrentLoader.CompResourceListLoader, CompResourcePath, Type) End Function #End Region @@ -76,14 +119,14 @@ ''' ''' 已加载的 Mod UI 缓存,不确保按显示顺序排列。Key 为 Mod 的 RawFileName。 ''' - Public ModItems As New Dictionary(Of String, MyLocalModItem) + Public ModItems As New Dictionary(Of String, MyLocalCompItem) ''' ''' 将加载器结果的 Mod 列表加载为 UI。 ''' Private Sub LoadUIFromLoaderOutput() Try '判断应该显示哪一个页面 - If McModLoader.Output.Any() Then + If CurrentLoader.CompResourceListLoader.Output.Any() Then PanBack.Visibility = Visibility.Visible PanEmpty.Visibility = Visibility.Collapsed Else @@ -93,8 +136,8 @@ End If '修改缓存 ModItems.Clear() - For Each ModEntity As McMod In McModLoader.Output - ModItems(ModEntity.RawFileName) = McModListItem(ModEntity) + For Each ModEntity As LocalCompFile In CurrentLoader.CompResourceListLoader.Output + ModItems(ModEntity.RawFileName) = BuildLocalCompItem(ModEntity) Next '显示结果 Filter = FilterType.All @@ -104,19 +147,20 @@ Log(ex, "加载 Mod 列表 UI 失败", LogLevel.Feedback) End Try End Sub - Private Function McModListItem(Entry As McMod) As MyLocalModItem + Private Function BuildLocalCompItem(Entry As LocalCompFile) As MyLocalCompItem AniControlEnabled += 1 - Dim NewItem As New MyLocalModItem With {.SnapsToDevicePixels = True, .Entry = Entry, - .ButtonHandler = AddressOf McModContent, .Checked = SelectedMods.Contains(Entry.RawFileName)} + Dim NewItem As New MyLocalCompItem With {.SnapsToDevicePixels = True, .Entry = Entry, + .ButtonHandler = AddressOf BuildLocalCompItemBtnHandler, .Checked = SelectedMods.Contains(Entry.RawFileName)} + NewItem.CurrentSwipe = CurrentSwipSelect AddHandler Entry.OnCompUpdate, AddressOf NewItem.Refresh NewItem.Refresh() AniControlEnabled -= 1 Return NewItem End Function - Private Sub McModContent(sender As MyLocalModItem, e As EventArgs) + Private Sub BuildLocalCompItemBtnHandler(sender As MyLocalCompItem, e As EventArgs) '点击事件 AddHandler sender.Changed, AddressOf CheckChanged - AddHandler sender.Click, Sub(ss As MyLocalModItem, ee As EventArgs) ss.Checked = Not ss.Checked + AddHandler sender.Click, Sub(ss As MyLocalCompItem, ee As EventArgs) ss.Checked = Not ss.Checked '图标按钮 Dim BtnOpen As New MyIconButton With {.LogoScale = 1.05, .Logo = Logo.IconButtonOpen, .Tag = sender} BtnOpen.ToolTip = "打开文件位置" @@ -137,15 +181,15 @@ ToolTipService.SetVerticalOffset(BtnDelete, 30) ToolTipService.SetHorizontalOffset(BtnDelete, 2) AddHandler BtnDelete.Click, AddressOf Delete_Click - Dim BtnED As New MyIconButton With {.LogoScale = 1, .Logo = If(sender.Entry.State = McMod.McModState.Fine, Logo.IconButtonStop, Logo.IconButtonCheck), .Tag = sender} - BtnED.ToolTip = If(sender.Entry.State = McMod.McModState.Fine, "禁用", "启用") - ToolTipService.SetPlacement(BtnED, Primitives.PlacementMode.Center) - ToolTipService.SetVerticalOffset(BtnED, 30) - ToolTipService.SetHorizontalOffset(BtnED, 2) - AddHandler BtnED.Click, AddressOf ED_Click - If sender.Entry.State = McMod.McModState.Unavailable Then + If CurrentCompType <> CompType.Mod OrElse sender.Entry.State = LocalCompFile.LocalFileStatus.Unavailable Then sender.Buttons = {BtnCont, BtnOpen, BtnDelete} Else + Dim BtnED As New MyIconButton With {.LogoScale = 1, .Logo = If(sender.Entry.State = LocalCompFile.LocalFileStatus.Fine, Logo.IconButtonStop, Logo.IconButtonCheck), .Tag = sender} + BtnED.ToolTip = If(sender.Entry.State = LocalCompFile.LocalFileStatus.Fine, "禁用", "启用") + ToolTipService.SetPlacement(BtnED, Primitives.PlacementMode.Center) + ToolTipService.SetVerticalOffset(BtnED, 30) + ToolTipService.SetHorizontalOffset(BtnED, 2) + AddHandler BtnED.Click, AddressOf ED_Click sender.Buttons = {BtnCont, BtnOpen, BtnED, BtnDelete} End If End Sub @@ -155,14 +199,14 @@ ''' Public Sub RefreshUI() If PanList Is Nothing Then Exit Sub - Dim ShowingMods = If(IsSearching, SearchResult, If(McModLoader.Output, New List(Of McMod))).Where(Function(m) CanPassFilter(m)).ToList + Dim ShowingMods = If(IsSearching, SearchResult, If(CurrentLoader.CompResourceListLoader.Output, New List(Of LocalCompFile))).Where(Function(m) CanPassFilter(m)).ToList '重新列出列表 AniControlEnabled += 1 If ShowingMods.Any() Then PanList.Visibility = Visibility.Visible PanList.Children.Clear() For Each TargetMod In ShowingMods - Dim Item As MyLocalModItem = ModItems(TargetMod.RawFileName) + Dim Item As MyLocalCompItem = ModItems(TargetMod.RawFileName) Item.Checked = SelectedMods.Contains(TargetMod.RawFileName) '更新选中状态 PanList.Children.Add(Item) Next @@ -188,12 +232,12 @@ Dim DisabledCount As Integer = 0 Dim UpdateCount As Integer = 0 Dim UnavalialeCount As Integer = 0 - For Each ModItem In If(IsSearching, SearchResult, If(McModLoader.Output, New List(Of McMod))) + For Each ModItem In If(IsSearching, SearchResult, If(CurrentLoader.CompResourceListLoader.Output, New List(Of LocalCompFile))) AnyCount += 1 If ModItem.CanUpdate Then UpdateCount += 1 - If ModItem.State.Equals(McMod.McModState.Fine) Then EnabledCount += 1 - If ModItem.State.Equals(McMod.McModState.Disabled) Then DisabledCount += 1 - If ModItem.State.Equals(McMod.McModState.Unavailable) Then UnavalialeCount += 1 + If ModItem.State.Equals(LocalCompFile.LocalFileStatus.Fine) Then EnabledCount += 1 + If ModItem.State.Equals(LocalCompFile.LocalFileStatus.Disabled) Then DisabledCount += 1 + If ModItem.State.Equals(LocalCompFile.LocalFileStatus.Unavailable) Then UnavalialeCount += 1 Next '显示 BtnFilterAll.Text = If(IsSearching, "搜索结果", "全部") & $" ({AnyCount})" @@ -219,12 +263,12 @@ Dim HasUpdate As Boolean = False Dim HasEnabled As Boolean = False Dim HasDisabled As Boolean = False - For Each ModEntity In McModLoader.Output + For Each ModEntity In CurrentLoader.CompResourceListLoader.Output If SelectedMods.Contains(ModEntity.RawFileName) Then If ModEntity.CanUpdate Then HasUpdate = True - If ModEntity.State = McMod.McModState.Fine Then + If ModEntity.State = LocalCompFile.LocalFileStatus.Fine Then HasEnabled = True - ElseIf ModEntity.State = McMod.McModState.Disabled Then + ElseIf ModEntity.State = LocalCompFile.LocalFileStatus.Disabled Then HasDisabled = True End If End If @@ -288,8 +332,9 @@ ''' Private Sub BtnManageOpen_Click(sender As Object, e As EventArgs) Handles BtnManageOpen.Click, BtnHintOpen.Click Try - Directory.CreateDirectory(PageVersionLeft.Version.PathIndie & "mods\") - OpenExplorer("""" & PageVersionLeft.Version.PathIndie & "mods\""") + Dim CompFilePath = PageVersionLeft.Version.PathIndie & GetPathNameByCompType(CurrentCompType) & "\" + Directory.CreateDirectory(CompFilePath) + OpenExplorer("""" & CompFilePath & """") Catch ex As Exception Log(ex, "打开 Mods 文件夹失败", LogLevel.Msgbox) End Try @@ -324,8 +369,13 @@ ''' 安装 Mod。 ''' Private Sub BtnManageInstall_Click(sender As Object, e As MouseButtonEventArgs) Handles BtnManageInstall.Click, BtnHintInstall.Click - Dim FileList = SelectFiles("Mod 文件(*.jar;*.litemod;*.disabled;*.old)|*.jar;*.litemod;*.disabled;*.old", "选择要安装的 Mod") - If Not FileList.Any Then Return + Dim FileList As String() = Nothing + Select Case CurrentCompType + Case CompType.Mod : FileList = SelectFiles("Mod 文件(*.jar;*.litemod;*.disabled;*.old)|*.jar;*.litemod;*.disabled;*.old", "选择要安装的 Mod") + Case CompType.ResourcePack : FileList = SelectFiles("资源包文件(*.zip)|*.zip", "选择要安装的资源包") + Case CompType.Shader : FileList = SelectFiles("光影包文件(*.zip)|*.zip", "选择要安装的光影包") + End Select + If FileList Is Nothing OrElse Not FileList.Any Then Exit Sub InstallMods(FileList) End Sub ''' @@ -367,7 +417,7 @@ Install: End If '刷新列表 If FrmMain.PageCurrent = FormMain.PageType.VersionSetup AndAlso FrmMain.PageCurrentSub = FormMain.PageSubType.VersionMod Then - LoaderFolderRun(McModLoader, TargetVersion.PathIndie & "mods\", LoaderFolderRunType.ForceRun) + LoaderFolderRun(FrmVersionMod?.CurrentLoader.CompResourceListLoader, TargetVersion.PathIndie & "mods\", LoaderFolderRunType.ForceRun) End If Catch ex As Exception Log(ex, "复制 Mod 文件失败", LogLevel.Msgbox) @@ -380,8 +430,11 @@ Install: ''' 下载 Mod。 ''' Private Sub BtnManageDownload_Click(sender As Object, e As MouseButtonEventArgs) Handles BtnManageDownload.Click, BtnHintDownload.Click - PageDownloadMod.TargetVersion = PageVersionLeft.Version '将当前版本设置为筛选器 - FrmMain.PageChange(FormMain.PageType.Download, FormMain.PageSubType.DownloadMod) + Select Case CurrentCompType + Case CompType.Mod : FrmMain.PageChange(FormMain.PageType.Download, FormMain.PageSubType.DownloadMod) + 'Case CompType.ResourcePack : FrmMain.PageChange(FormMain.PageType.Download, FormMain.PageSubType.DownloadResourcePack) + 'Case CompType.Shader : FrmMain.PageChange(FormMain.PageType.Download, FormMain.PageSubType.DownloadShader) + End Select End Sub #End Region @@ -392,7 +445,7 @@ Install: Public SelectedMods As New List(Of String) '单项切换选择状态 - Public Sub CheckChanged(sender As MyLocalModItem, e As RouteEventArgs) + Public Sub CheckChanged(sender As MyLocalCompItem, e As RouteEventArgs) If AniControlEnabled <> 0 Then Return '更新选择了的内容 Dim SelectedKey As String = sender.Entry.RawFileName @@ -408,7 +461,7 @@ Install: Private Sub ChangeAllSelected(Value As Boolean) AniControlEnabled += 1 SelectedMods.Clear() - For Each Item As MyLocalModItem In ModItems.Values + For Each Item As MyLocalCompItem In ModItems.Values '#4992,Mod 从过滤器看可能不应在列表中,但因为刚切换状态所以依然保留在列表中,所以应该从列表 UI 判断,而非从过滤器判断 Dim ShouldSelected As Boolean = Value AndAlso PanList.Children.Contains(Item) Item.Checked = ShouldSelected @@ -465,18 +518,18 @@ Install: ''' ''' 检查该 Mod 项是否符合当前筛选的类别。 ''' - Private Function CanPassFilter(CheckingMod As McMod) As Boolean + Private Function CanPassFilter(CheckingMod As LocalCompFile) As Boolean Select Case Filter Case FilterType.All Return True Case FilterType.Enabled - Return CheckingMod.State = McMod.McModState.Fine + Return CheckingMod.State = LocalCompFile.LocalFileStatus.Fine Case FilterType.Disabled - Return CheckingMod.State = McMod.McModState.Disabled + Return CheckingMod.State = LocalCompFile.LocalFileStatus.Disabled Case FilterType.CanUpdate Return CheckingMod.CanUpdate Case FilterType.Unavailable - Return CheckingMod.State = McMod.McModState.Unavailable + Return CheckingMod.State = LocalCompFile.LocalFileStatus.Unavailable Case Else Return False End Select @@ -494,19 +547,19 @@ Install: '启用 / 禁用 Private Sub BtnSelectED_Click(sender As MyIconTextButton, e As RouteEventArgs) Handles BtnSelectEnable.Click, BtnSelectDisable.Click - EDMods(McModLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName)), + EDMods(CurrentLoader.CompResourceListLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName)), Not sender.Equals(BtnSelectDisable)) ChangeAllSelected(False) End Sub - Private Sub EDMods(ModList As IEnumerable(Of McMod), IsEnable As Boolean) + Private Sub EDMods(ModList As IEnumerable(Of LocalCompFile), IsEnable As Boolean) Dim IsSuccessful As Boolean = True For Each ModE In ModList.ToList Dim ModEntity = ModE '仅用于去除迭代变量无法修改的限制 Dim NewPath As String = Nothing - If ModEntity.State = McMod.McModState.Fine AndAlso Not IsEnable Then + If ModEntity.State = LocalCompFile.LocalFileStatus.Fine AndAlso Not IsEnable Then '禁用 NewPath = ModEntity.Path & If(File.Exists(ModEntity.Path & ".old"), ".old", ".disabled") - ElseIf ModEntity.State = McMod.McModState.Disabled AndAlso IsEnable Then + ElseIf ModEntity.State = LocalCompFile.LocalFileStatus.Disabled AndAlso IsEnable Then '启用 NewPath = ModEntity.RawPath Else @@ -531,19 +584,19 @@ Install: FileSystem.Rename(ModEntity.Path, NewPath) Catch ex As FileNotFoundException Log(ex, $"未找到需要重命名的 Mod({If(ModEntity.Path, "null")})", LogLevel.Feedback) - ReloadModList(True) + ReloadCompFileList(True) Return Catch ex As Exception Log(ex, $"重命名 Mod 失败({If(ModEntity.Path, "null")})") IsSuccessful = False End Try '更改 Loader 中的列表 - Dim NewModEntity As New McMod(NewPath) + Dim NewModEntity As New LocalCompFile(NewPath) NewModEntity.FromJson(ModEntity.ToJson) - If McModLoader.Output.Contains(ModEntity) Then - Dim IndexOfLoader As Integer = McModLoader.Output.IndexOf(ModEntity) - McModLoader.Output.RemoveAt(IndexOfLoader) - McModLoader.Output.Insert(IndexOfLoader, NewModEntity) + If CurrentLoader.CompResourceListLoader.Output.Contains(ModEntity) Then + Dim IndexOfLoader As Integer = CurrentLoader.CompResourceListLoader.Output.IndexOf(ModEntity) + CurrentLoader.CompResourceListLoader.Output.RemoveAt(IndexOfLoader) + CurrentLoader.CompResourceListLoader.Output.Insert(IndexOfLoader, NewModEntity) End If If SearchResult IsNot Nothing AndAlso SearchResult.Contains(ModEntity) Then '#4862 Dim IndexOfResult As Integer = SearchResult.IndexOf(ModEntity) @@ -551,9 +604,9 @@ Install: SearchResult.Insert(IndexOfResult, NewModEntity) End If '更改 UI 中的列表 - Dim NewItem As MyLocalModItem = McModListItem(NewModEntity) + Dim NewItem As MyLocalCompItem = BuildLocalCompItem(NewModEntity) ModItems(ModEntity.RawFileName) = NewItem - Dim IndexOfUi As Integer = PanList.Children.IndexOf(PanList.Children.OfType(Of MyLocalModItem).FirstOrDefault(Function(i) i.Entry Is ModEntity)) + Dim IndexOfUi As Integer = PanList.Children.IndexOf(PanList.Children.OfType(Of MyLocalCompItem).FirstOrDefault(Function(i) i.Entry Is ModEntity)) If IndexOfUi = -1 Then Continue For '因为未知原因 Mod 的状态已经切换完了 PanList.Children.RemoveAt(IndexOfUi) PanList.Children.Insert(IndexOfUi, NewItem) @@ -562,25 +615,25 @@ Install: RefreshBars() Else Hint("由于文件被占用,Mod 的状态切换失败,请尝试关闭正在运行的游戏后再试!", HintType.Critical) - ReloadModList(True) + ReloadCompFileList(True) End If LoaderRun(LoaderFolderRunType.UpdateOnly) End Sub '更新 Private Sub BtnSelectUpdate_Click() Handles BtnSelectUpdate.Click - Dim UpdateList As List(Of McMod) = McModLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName) AndAlso m.CanUpdate).ToList() + Dim UpdateList As List(Of LocalCompFile) = CurrentLoader.CompResourceListLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName) AndAlso m.CanUpdate).ToList() If Not UpdateList.Any() Then Return - UpdateMods(UpdateList) + UpdateResource(UpdateList) ChangeAllSelected(False) End Sub ''' ''' 记录正在进行 Mod 更新的 mods 文件夹路径。 ''' Public Shared UpdatingVersions As New List(Of String) - Public Sub UpdateMods(ModList As IEnumerable(Of McMod)) + Public Sub UpdateResource(ModList As IEnumerable(Of LocalCompFile)) '更新前警告 - If Not Setup.Get("HintUpdateMod") OrElse ModList.Count >= 15 Then + If CurrentCompType = CompType.Mod AndAlso ((Not Setup.Get("HintUpdateMod")) OrElse ModList.Count >= 15) Then If MyMsgBox($"新版本 Mod 可能不兼容旧存档或者其他 Mod,这可能导致游戏崩溃,甚至永久损坏存档!{vbCrLf}如果你在游玩整合包,请千万不要自行更新 Mod!{vbCrLf}{vbCrLf}在更新前,请先备份存档,并检查 Mod 的更新日志。{vbCrLf}如果更新后出现问题,你也可以在回收站找回更新前的 Mod。", "Mod 更新警告", "我已了解风险,继续更新", "取消", IsWarn:=True) = 1 Then Setup.Set("HintUpdateMod", True) Else @@ -592,7 +645,7 @@ Install: ModList = ModList.ToList() '防止刷新影响迭代器 Dim FileList As New List(Of NetFile) Dim FileCopyList As New Dictionary(Of String, String) - For Each Entry As McMod In ModList + For Each Entry As LocalCompFile In ModList Dim File As CompFile = Entry.UpdateFile If Not File.Available Then Continue For '确认更新后的文件名 @@ -612,7 +665,7 @@ Install: NewestReplaceName = Join(NewestSegs, "-") End If '添加到下载列表 - Dim TempAddress As String = PathTemp & "DownloadedMods\" & Entry.FileName.Replace(CurrentReplaceName, NewestReplaceName) + Dim TempAddress As String = PathTemp & "DownloadedComp\" & Entry.FileName.Replace(CurrentReplaceName, NewestReplaceName) Dim RealAddress As String = GetPathFromFullPath(Entry.Path) & Entry.FileName.Replace(CurrentReplaceName, NewestReplaceName) FileList.Add(File.ToNetFile(TempAddress)) FileCopyList(TempAddress) = RealAddress @@ -620,21 +673,21 @@ Install: '构造加载器 Dim InstallLoaders As New List(Of LoaderBase) Dim FinishedFileNames As New List(Of String) - InstallLoaders.Add(New LoaderDownload("下载新版 Mod 文件", FileList) With {.ProgressWeight = ModList.Count * 1.5}) '每个 Mod 需要 1.5s - InstallLoaders.Add(New LoaderTask(Of Integer, Integer)("替换旧版 Mod 文件", + InstallLoaders.Add(New LoaderDownload("下载新版资源文件", FileList) With {.ProgressWeight = ModList.Count * 1.5}) '每个 Mod 需要 1.5s + InstallLoaders.Add(New LoaderTask(Of Integer, Integer)("替换旧版资源文件", Sub() Try - For Each Entry As McMod In ModList + For Each Entry As LocalCompFile In ModList If File.Exists(Entry.Path) Then My.Computer.FileSystem.DeleteFile(Entry.Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) Else - Log($"[Mod] 未找到更新前的 Mod 文件,跳过对它的删除:{Entry.Path}", LogLevel.Debug) + Log($"[Mod] 未找到更新前的资源文件,跳过对它的删除:{Entry.Path}", LogLevel.Debug) End If Next For Each Entry As KeyValuePair(Of String, String) In FileCopyList If File.Exists(Entry.Value) Then My.Computer.FileSystem.DeleteFile(Entry.Value, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) - Log($"[Mod] 更新后的 Mod 文件已存在,将会把它放入回收站:{Entry.Value}", LogLevel.Debug) + Log($"[Mod] 更新后的资源文件已存在,将会把它放入回收站:{Entry.Value}", LogLevel.Debug) End If If Directory.Exists(GetPathFromFullPath(Entry.Value)) Then File.Move(Entry.Key, Entry.Value) @@ -644,12 +697,12 @@ Install: End If Next Catch ex As OperationCanceledException - Log(ex, "替换旧版 Mod 文件时被主动取消") + Log(ex, "替换旧版资源文件时被主动取消") End Try End Sub)) '结束处理 - Dim Loader As New LoaderCombo(Of IEnumerable(Of McMod))("Mod 更新:" & PageVersionLeft.Version.Name, InstallLoaders) - Dim PathMods As String = PageVersionLeft.Version.PathIndie & "mods\" + Dim Loader As New LoaderCombo(Of IEnumerable(Of LocalCompFile))("资源更新:" & PageVersionLeft.Version.Name, InstallLoaders) + Dim PathMods As String = PageVersionLeft.Version.PathIndie & GetPathNameByCompType(CurrentCompType) & "\" Loader.OnStateChanged = Sub() '结果提示 @@ -657,20 +710,20 @@ Install: Case LoadState.Finished Select Case FinishedFileNames.Count Case 0 '一般是由于 Mod 文件被占用,然后玩家主动取消 - Log($"[Mod] 没有 Mod 被成功更新") + Log($"[Mod] 没有资源被成功更新") Case 1 Hint($"已成功更新 {FinishedFileNames.Single}!", HintType.Finish) Case Else - Hint($"已成功更新 {FinishedFileNames.Count} 个 Mod!", HintType.Finish) + Hint($"已成功更新 {FinishedFileNames.Count} 个资源!", HintType.Finish) End Select Case LoadState.Failed - Hint("Mod 更新失败:" & GetExceptionSummary(Loader.Error), HintType.Critical) + Hint("资源更新失败:" & GetExceptionSummary(Loader.Error), HintType.Critical) Case LoadState.Aborted - Hint("Mod 更新已中止!", HintType.Info) + Hint("资源更新已中止!", HintType.Info) Case Else Exit Sub End Select - Log($"[Mod] 已从正在进行 Mod 更新的文件夹列表移除:{PathMods}") + Log($"[Mod] 已从正在进行资源更新的文件夹列表移除:{PathMods}") UpdatingVersions.Remove(PathMods) '清理缓存 RunInNewThread( @@ -680,41 +733,41 @@ Install: If File.Exists(TempFile) Then File.Delete(TempFile) Next Catch ex As Exception - Log(ex, "清理 Mod 更新缓存失败") + Log(ex, "清理资源更新缓存失败") End Try - End Sub, "Clean Mod Update Cache", ThreadPriority.BelowNormal) + End Sub, "Clean Comp Update Cache", ThreadPriority.BelowNormal) End Sub '启动加载器 - Log($"[Mod] 开始更新 {ModList.Count} 个 Mod:{PathMods}") + Log($"[Mod] 开始更新 {ModList.Count} 个资源:{PathMods}") UpdatingVersions.Add(PathMods) Loader.Start() LoaderTaskbarAdd(Loader) FrmMain.BtnExtraDownload.ShowRefresh() FrmMain.BtnExtraDownload.Ribble() - ReloadModList(True) + ReloadCompFileList(True) Catch ex As Exception - Log(ex, "初始化 Mod 更新失败") + Log(ex, "初始化资源更新失败") End Try End Sub '删除 Private Sub BtnSelectDelete_Click() Handles BtnSelectDelete.Click - DeleteMods(McModLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName))) + DeleteMods(CurrentLoader.CompResourceListLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName))) ChangeAllSelected(False) End Sub - Private Sub DeleteMods(ModList As IEnumerable(Of McMod)) + Private Sub DeleteMods(ModList As IEnumerable(Of LocalCompFile)) Try Dim IsSuccessful As Boolean = True Dim IsShiftPressed As Boolean = My.Computer.Keyboard.ShiftKeyDown '确认需要删除的文件 ModList = ModList.SelectMany( - Function(Target As McMod) - If Target.State = McMod.McModState.Fine Then + Function(Target As LocalCompFile) + If Target.State = LocalCompFile.LocalFileStatus.Fine Then Return {Target.Path, Target.Path & If(File.Exists(Target.Path & ".old"), ".old", ".disabled")} Else Return {Target.Path, Target.RawPath} End If - End Function).Distinct.Where(Function(m) File.Exists(m)).Select(Function(m) New McMod(m)).ToList() + End Function).Distinct.Where(Function(m) File.Exists(m)).Select(Function(m) New LocalCompFile(m)).ToList() '实际删除文件 For Each ModEntity In ModList '删除 @@ -726,7 +779,7 @@ Install: End If Catch ex As OperationCanceledException Log(ex, "删除 Mod 被主动取消") - ReloadModList(True) + ReloadCompFileList(True) Return Catch ex As Exception Log(ex, $"删除 Mod 失败({ModEntity.Path})", LogLevel.Msgbox) @@ -735,18 +788,18 @@ Install: '取消选中 SelectedMods.Remove(ModEntity.RawFileName) '更改 Loader 和 UI 中的列表 - McModLoader.Output.Remove(ModEntity) + CurrentLoader.CompResourceListLoader.Output.Remove(ModEntity) SearchResult?.Remove(ModEntity) ModItems.Remove(ModEntity.RawFileName) - Dim IndexOfUi As Integer = PanList.Children.IndexOf(PanList.Children.OfType(Of MyLocalModItem).FirstOrDefault(Function(i) i.Entry.Equals(ModEntity))) + Dim IndexOfUi As Integer = PanList.Children.IndexOf(PanList.Children.OfType(Of MyLocalCompItem).FirstOrDefault(Function(i) i.Entry.Equals(ModEntity))) If IndexOfUi >= 0 Then PanList.Children.RemoveAt(IndexOfUi) Next RefreshBars() If Not IsSuccessful Then Hint("由于文件被占用,Mod 删除失败,请尝试关闭正在运行的游戏后再试!", HintType.Critical) - ReloadModList(True) + ReloadCompFileList(True) ElseIf PanList.Children.Count = 0 Then - ReloadModList(True) '删除了全部文件 + ReloadCompFileList(True) '删除了全部文件 Else RefreshBars() End If @@ -767,10 +820,10 @@ Install: End If Catch ex As OperationCanceledException Log(ex, "删除 Mod 被主动取消") - ReloadModList(True) + ReloadCompFileList(True) Catch ex As Exception Log(ex, "删除 Mod 出现未知错误", LogLevel.Feedback) - ReloadModList(True) + ReloadCompFileList(True) End Try LoaderRun(LoaderFolderRunType.UpdateOnly) End Sub @@ -788,9 +841,9 @@ Install: Public Sub Info_Click(sender As Object, e As EventArgs) Try - Dim ModEntry As McMod = CType(If(TypeOf sender Is MyIconButton, sender.Tag, sender), MyLocalModItem).Entry + Dim ModEntry As LocalCompFile = CType(If(TypeOf sender Is MyIconButton, sender.Tag, sender), MyLocalCompItem).Entry '加载失败信息 - If ModEntry.State = McMod.McModState.Unavailable Then + If ModEntry.State = LocalCompFile.LocalFileStatus.Unavailable Then MyMsgBox("无法读取此 Mod 的信息。" & vbCrLf & vbCrLf & "详细的错误信息:" & GetExceptionDetail(ModEntry.FileUnavailableReason), "Mod 读取失败") Return End If @@ -798,9 +851,9 @@ Install: '跳转到 Mod 下载页面 FrmMain.PageChange(New FormMain.PageStackData With {.Page = FormMain.PageType.CompDetail, .Additional = {ModEntry.Comp, New List(Of String), PageVersionLeft.Version.Version.McName, - If(PageVersionLeft.Version.Version.HasForge, CompModLoaderType.Forge, - If(PageVersionLeft.Version.Version.HasNeoForge, CompModLoaderType.NeoForge, - If(PageVersionLeft.Version.Version.HasFabric, CompModLoaderType.Fabric, CompModLoaderType.Any)))}}) + If(PageVersionLeft.Version.Version.HasForge, CompLoaderType.Forge, + If(PageVersionLeft.Version.Version.HasNeoForge, CompLoaderType.NeoForge, + If(PageVersionLeft.Version.Version.HasFabric, CompLoaderType.Fabric, CompLoaderType.Any)))}}) Else '获取信息 Dim ContentLines As New List(Of String) @@ -857,7 +910,7 @@ Install: Public Sub Open_Click(sender As MyIconButton, e As EventArgs) Try - Dim ListItem As MyLocalModItem = sender.Tag + Dim ListItem As MyLocalCompItem = sender.Tag OpenExplorer("/select,""" & ListItem.Entry.Path & """") Catch ex As Exception @@ -866,13 +919,13 @@ Install: End Sub '删除 Public Sub Delete_Click(sender As MyIconButton, e As EventArgs) - Dim ListItem As MyLocalModItem = sender.Tag + Dim ListItem As MyLocalCompItem = sender.Tag DeleteMods({ListItem.Entry}) End Sub '启用 / 禁用 Public Sub ED_Click(sender As MyIconButton, e As EventArgs) - Dim ListItem As MyLocalModItem = sender.Tag - EDMods({ListItem.Entry}, ListItem.Entry.State = McMod.McModState.Disabled) + Dim ListItem As MyLocalCompItem = sender.Tag + EDMods({ListItem.Entry}, ListItem.Entry.State = LocalCompFile.LocalFileStatus.Disabled) End Sub #End Region @@ -884,12 +937,13 @@ Install: Return Not String.IsNullOrWhiteSpace(SearchBox.Text) End Get End Property - Private SearchResult As List(Of McMod) + Private SearchResult As List(Of LocalCompFile) + Public Sub SearchRun() Handles SearchBox.TextChanged If IsSearching Then '构造请求 - Dim QueryList As New List(Of SearchEntry(Of McMod)) - For Each Entry As McMod In McModLoader.Output + Dim QueryList As New List(Of SearchEntry(Of LocalCompFile)) + For Each Entry As LocalCompFile In CurrentLoader.CompResourceListLoader.Output Dim SearchSource As New List(Of KeyValuePair(Of String, Double)) SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.Name, 1)) SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.FileName, 1)) @@ -905,7 +959,7 @@ Install: If Entry.Comp.Description <> Entry.Description Then SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.Comp.Description, 0.4)) SearchSource.Add(New KeyValuePair(Of String, Double)(String.Join("", Entry.Comp.Tags), 0.2)) End If - QueryList.Add(New SearchEntry(Of McMod) With {.Item = Entry, .SearchSource = SearchSource}) + QueryList.Add(New SearchEntry(Of LocalCompFile) With {.Item = Entry, .SearchSource = SearchSource}) Next '进行搜索 SearchResult = Search(QueryList, SearchBox.Text, MaxBlurCount:=6, MinBlurSimilarity:=0.35).Select(Function(r) r.Item).ToList diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb index a53362b6b..d98c4dbdd 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb @@ -40,7 +40,7 @@ Public Class PageVersionLeft If FrmVersionOverall Is Nothing Then FrmVersionOverall = New PageVersionOverall Return FrmVersionOverall Case FormMain.PageSubType.VersionMod - If FrmVersionMod Is Nothing Then FrmVersionMod = New PageVersionMod + If FrmVersionMod Is Nothing Then FrmVersionMod = New PageVersionCompResource(CompType.Mod) Return FrmVersionMod Case FormMain.PageSubType.VersionModDisabled If FrmVersionModDisabled Is Nothing Then FrmVersionModDisabled = New PageVersionModDisabled @@ -55,10 +55,10 @@ Public Class PageVersionLeft If FrmVersionScreenshot Is Nothing Then FrmVersionScreenshot = New PageVersionScreenshot Return FrmVersionScreenshot Case FormMain.PageSubType.VersionResourcePack - If FrmVersionResourcePack Is Nothing Then FrmVersionResourcePack = New PageVersionResourcePack + If FrmVersionResourcePack Is Nothing Then FrmVersionResourcePack = New PageVersionCompResource(CompType.ResourcePack) Return FrmVersionResourcePack Case FormMain.PageSubType.VersionShader - If FrmVersionShader Is Nothing Then FrmVersionShader = New PageVersionShader + If FrmVersionShader Is Nothing Then FrmVersionShader = New PageVersionCompResource(CompType.Shader) Return FrmVersionShader Case Else Throw New Exception("未知的版本设置子页面种类:" & ID) @@ -104,15 +104,15 @@ Public Class PageVersionLeft Public Sub Refresh(sender As Object, e As EventArgs) '由边栏按钮匿名调用 Select Case Val(sender.Tag) Case FormMain.PageSubType.VersionMod - PageVersionMod.Refresh() + PageVersionCompResource.Refresh(CompType.Mod) Case FormMain.PageSubType.VersionScreenshot PageVersionScreenshot.Refresh() Case FormMain.PageSubType.VersionWorld PageVersionWorld.Refresh() Case FormMain.PageSubType.VersionResourcePack - PageVersionResourcePack.Refresh() + PageVersionCompResource.Refresh(CompType.ResourcePack) Case FormMain.PageSubType.VersionShader - PageVersionShader.Refresh() + PageVersionCompResource.Refresh(CompType.Shader) End Select End Sub diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml deleted file mode 100644 index 08571ebec..000000000 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb deleted file mode 100644 index 65a246424..000000000 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionResourcePack.xaml.vb +++ /dev/null @@ -1,215 +0,0 @@ -Imports System.IO.Compression -Imports System.Security.Principal - -Public Class PageVersionResourcePack - Implements IRefreshable - Private Sub RefreshSelf() Implements IRefreshable.Refresh - Refresh() - End Sub - Public Shared Sub Refresh() - If FrmVersionResourcePack IsNot Nothing Then FrmVersionResourcePack.Reload() - FrmVersionLeft.ItemResourcePack.Checked = True - Hint("正在刷新……", Log:=False) - End Sub - - Private IsLoad As Boolean = False - Private Sub PageSetupLaunch_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded - - '重复加载部分 - PanBack.ScrollToHome() - ResourcepacksPath = PageVersionLeft.Version.PathIndie + "resourcepacks\" - Directory.CreateDirectory(ResourcepacksPath) - Reload() - - '非重复加载部分 - If IsLoad Then Exit Sub - IsLoad = True - - End Sub - - ''' - ''' 文件和文件夹列表 - ''' - Dim FileList As List(Of String) = New List(Of String) - Dim ResourcepacksPath As String - - ''' - ''' 确保当前页面上的信息已正确显示。 - ''' - Public Sub Reload() - AniControlEnabled += 1 - PanBack.ScrollToHome() - LoadFileList() - AniControlEnabled -= 1 - End Sub - - Private Sub RefreshUI() - PanCard.Title = $"资源包列表 ({FileList.Count})" - If FileList.Count.Equals(0) Then - PanNoWorld.Visibility = Visibility.Visible - PanContent.Visibility = Visibility.Collapsed - PanNoWorld.UpdateLayout() - Else - PanNoWorld.Visibility = Visibility.Collapsed - PanContent.Visibility = Visibility.Visible - PanContent.UpdateLayout() - End If - End Sub - - Private Sub LoadFileList() - Try - Log("[Resourcepack] 刷新资源包文件") - FileList.Clear() - Dim fileRes = Directory.EnumerateFiles(ResourcepacksPath, "*.zip").ToList() - FileList.AddRange(fileRes) - Dim FolderRes = Directory.EnumerateDirectories(ResourcepacksPath).ToList() - FileList.AddRange(FolderRes) - If ModeDebug Then Log($"[Resourcepack] 共发现 {FileList.Count} 个资源包文件({fileRes.Count} 个文件,{FolderRes.Count} 个文件夹)", LogLevel.Debug) - PanList.Children.Clear() - Dim ResCachaPath = PageVersionLeft.Version.PathIndie & "PCL\Cache\resourcepacks\" - If Directory.Exists(ResCachaPath) Then Directory.Delete(ResCachaPath, True) - Directory.CreateDirectory(ResCachaPath) - For Each i In FileList - Dim ResTempIconFile = ResCachaPath & GetHash(i) & ".png" - Dim ResTempDescFile = ResCachaPath & GetHash(i) & ".json" - Dim ResDesc As String = "" - Dim isFile = File.Exists(i) - - '提取资源 - Try - Dim GetResourcepackDesc = - Function(Json As JObject) As String - If Json?("pack")?("description").Type = JTokenType.String Then - Return Json("pack")("description").ToString() - ElseIf Json?("pack")?("description")?("fallback") IsNot Nothing Then - Return Json("pack")("description")("fallback").ToString() - ElseIf Json?("pack")?("description")?("text") IsNot Nothing Then - Return Json("pack")("description")("text").ToString() - End If - Return Nothing - End Function - If isFile Then '文件类型的资源包 - Using Archive As New ZipArchive(New FileStream(i, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) - Dim pack = Archive.GetEntry("pack.png") - Dim desc = Archive.GetEntry("pack.mcmeta") - If pack Is Nothing Then - ResTempIconFile = PathImage & "Icons/NoIcon.png" - Else - pack.ExtractToFile(ResTempIconFile) - End If - If desc IsNot Nothing Then - desc.ExtractToFile(ResTempDescFile) - ResDesc = GetResourcepackDesc(GetJson(File.ReadAllText(ResTempDescFile, Encoding.UTF8))) - End If - End Using - Else '文件夹型资源包 - ResTempIconFile = i + "\pack.png" - ResDesc = GetResourcepackDesc(GetJson(File.ReadAllText(i & "\pack.mcmeta", Encoding.UTF8))) - End If - Catch ex As Exception - Log(ex, "[Resourcepack] 提取资源包信息失败!") - ResTempIconFile = PathImage & "Icons/NoIcon.png" - ResDesc = $"引入时间:{ If(isFile, File.GetCreationTime(i), Directory.GetCreationTime(i)).ToString("yyyy'/'MM'/'dd")}" - End Try - - '防止错误 - If String.IsNullOrEmpty(ResDesc) Then ResDesc = $"引入时间:{ If(isFile, File.GetCreationTime(i), Directory.GetCreationTime(i)).ToString("yyyy'/'MM'/'dd")}" - If Not File.Exists(ResTempIconFile) Then ResTempIconFile = PathImage & "Icons/NoIcon.png" - - Dim worldItem As MyListItem = New MyListItem With { - .Title = If(isFile, GetFileNameWithoutExtentionFromPath(i), GetFolderNameFromPath(i)), - .Logo = ResTempIconFile, - .Info = ResDesc, - .Tag = i - } - Dim BtnOpen As MyIconButton = New MyIconButton With { - .Logo = Logo.IconButtonOpen, - .ToolTip = "打开", - .Tag = i - } - AddHandler BtnOpen.Click, AddressOf BtnOpen_Click - Dim BtnDelete As MyIconButton = New MyIconButton With { - .Logo = Logo.IconButtonDelete, - .ToolTip = "删除", - .Tag = i - } - AddHandler BtnDelete.Click, AddressOf BtnDelete_Click - Dim BtnCopy As MyIconButton = New MyIconButton With { - .Logo = Logo.IconButtonCopy, - .ToolTip = "复制", - .Tag = i - } - AddHandler BtnCopy.Click, AddressOf BtnCopy_Click - worldItem.Buttons = {BtnOpen, BtnDelete, BtnCopy} - PanList.Children.Add(worldItem) - Next - RefreshUI() - Catch ex As Exception - Log(ex, "[Resourcepack] 刷新资源包文件失败!", LogLevel.Msgbox) - End Try - End Sub - - Private Function GetPathFromSender(sender As Object) As String - Return sender.Tag - End Function - - Private Sub RemoveItem(Path As String) - Try - For Each i In PanList.Children - If CType(i, MyListItem).Tag.Equals(Path) Then - PanList.Children.Remove(CType(i, MyListItem)) - FileList.Remove(Path) - Exit For - End If - Next - Catch ex As Exception - Log(ex, "未能找到对应 UI") - End Try - RefreshUI() - End Sub - - Private Sub BtnDelete_Click(sender As Object, e As MouseButtonEventArgs) - Path = GetPathFromSender(sender) - RemoveItem(Path) - Try - If File.Exists(Path) Then - My.Computer.FileSystem.DeleteFile(Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) - Else - My.Computer.FileSystem.DeleteDirectory(Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) - End If - Hint("已将资源包移至回收站!") - Catch ex As Exception - Log(ex, "删除资源包失败!", LogLevel.Hint) - End Try - End Sub - Private Sub BtnCopy_Click(sender As Object, e As MouseButtonEventArgs) - Try - Dim Path As String = GetPathFromSender(sender) - If File.Exists(Path) Or Directory.Exists(Path) Then - Clipboard.SetFileDropList(New Specialized.StringCollection() From {Path}) - Hint("已复制资源包文件到剪贴板!") - Else - Hint("资源包不存在!") - End If - Catch ex As Exception - Log(ex, "复制失败……", LogLevel.Hint) - End Try - End Sub - - Private Sub BtnOpenFolder_Click(sender As Object, e As MouseButtonEventArgs) - If Not Directory.Exists(ResourcepacksPath) Then Directory.CreateDirectory(ResourcepacksPath) - OpenExplorer("""" & ResourcepacksPath & """") - End Sub - Private Sub BtnOpen_Click(sender As Object, e As MouseButtonEventArgs) - OpenExplorerAndSelect(sender.Tag) - End Sub - Private Sub BtnPaste_Click(sender As Object, e As MouseButtonEventArgs) - Dim count = PasteFileFromClipboard(ResourcepacksPath) - If count > 0 Then - Hint($"已成功粘贴 {count} 个资源包文件(夹)!") - RefreshUI() - Else - Hint("没有资源包文件(夹)可供粘贴!") - End If - End Sub -End Class diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml deleted file mode 100644 index e323cc288..000000000 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb deleted file mode 100644 index 124f4d2e3..000000000 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionShader.xaml.vb +++ /dev/null @@ -1,178 +0,0 @@ -Imports System.Security.Principal - -Public Class PageVersionShader - Implements IRefreshable - Private Sub RefreshSelf() Implements IRefreshable.Refresh - Refresh() - End Sub - Public Shared Sub Refresh() - If FrmVersionShader IsNot Nothing Then FrmVersionShader.Reload() - FrmVersionLeft.ItemShader.Checked = True - Hint("正在刷新……", Log:=False) - End Sub - - Private IsLoad As Boolean = False - Private Sub PageSetupLaunch_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded - - '重复加载部分 - PanBack.ScrollToHome() - ShaderPath = PageVersionLeft.Version.PathIndie + "shaderpacks\" - If Not Directory.Exists(ShaderPath) Then Directory.CreateDirectory(ShaderPath) - Reload() - - '非重复加载部分 - If IsLoad Then Exit Sub - IsLoad = True - - End Sub - - Dim FileList As List(Of String) = New List(Of String) - Dim ShaderPath As String - - ''' - ''' 确保当前页面上的信息已正确显示。 - ''' - Public Sub Reload() - AniControlEnabled += 1 - PanBack.ScrollToHome() - LoadFileList() - AniControlEnabled -= 1 - End Sub - - Private Sub RefreshUI() - PanCard.Title = $"光影包列表 ({FileList.Count})" - If FileList.Count.Equals(0) Then - PanNoWorld.Visibility = Visibility.Visible - PanContent.Visibility = Visibility.Collapsed - PanNoWorld.UpdateLayout() - Else - PanNoWorld.Visibility = Visibility.Collapsed - PanContent.Visibility = Visibility.Visible - PanContent.UpdateLayout() - End If - End Sub - - Private Sub LoadFileList() - Try - Log("[Shader] 刷新光影包文件") - FileList.Clear() - - ' 获取所有 .zip 文件 - Dim zipFiles = Directory.EnumerateFiles(ShaderPath, "*.zip").ToList() - - ' 获取所有文件夹 - Dim folders = Directory.EnumerateDirectories(ShaderPath).ToList() - - ' 合并文件和文件夹列表 - FileList = zipFiles.Concat(folders).ToList() - - If ModeDebug Then Log("[Shader] 共发现 " & FileList.Count & " 个光影包文件", LogLevel.Debug) - - PanList.Children.Clear() - - For Each i In FileList - Dim worldItem As MyListItem = New MyListItem With { - .Title = If(Directory.Exists(i), GetFolderNameFromPath(i), GetFileNameFromPath(i)), - .Info = If(Directory.Exists(i), - $"类型:文件夹 | 创建时间:{Directory.GetCreationTime(i).ToString("yyyy'/'MM'/'dd")}", - $"类型:文件 | 引入时间:{File.GetCreationTime(i).ToString("yyyy'/'MM'/'dd")}"), - .Tag = i - } - - Dim BtnOpen As MyIconButton = New MyIconButton With { - .Logo = Logo.IconButtonOpen, - .ToolTip = "打开", - .Tag = i - } - AddHandler BtnOpen.Click, AddressOf BtnOpen_Click - - Dim BtnDelete As MyIconButton = New MyIconButton With { - .Logo = Logo.IconButtonDelete, - .ToolTip = "删除", - .Tag = i - } - AddHandler BtnDelete.Click, AddressOf BtnDelete_Click - - Dim BtnCopy As MyIconButton = New MyIconButton With { - .Logo = Logo.IconButtonCopy, - .ToolTip = "复制", - .Tag = i - } - AddHandler BtnCopy.Click, AddressOf BtnCopy_Click - - worldItem.Buttons = {BtnOpen, BtnDelete, BtnCopy} - PanList.Children.Add(worldItem) - Next - - RefreshUI() - Catch ex As Exception - Log(ex, "[Shader] 刷新光影包文件失败!", LogLevel.Msgbox) - End Try - End Sub - - Private Function GetPathFromSender(sender As Object) As String - Return sender.Tag - End Function - - Private Sub RemoveItem(Path As String) - Try - For Each i In PanList.Children - If CType(i, MyListItem).Tag.Equals(Path) Then - PanList.Children.Remove(CType(i, MyListItem)) - FileList.Remove(Path) - Exit For - End If - Next - Catch ex As Exception - Log(ex, "未能找到对应 UI") - End Try - RefreshUI() - End Sub - - Private Sub BtnDelete_Click(sender As Object, e As MouseButtonEventArgs) - Path = GetPathFromSender(sender) - RemoveItem(Path) - Try - If Directory.Exists(Path) Then - My.Computer.FileSystem.DeleteDirectory(Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) - Else - My.Computer.FileSystem.DeleteFile(Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) - End If - Hint("已将光影包移至回收站!") - Catch ex As Exception - Log(ex, "删除光影包失败!", LogLevel.Hint) - End Try - End Sub - Private Sub BtnCopy_Click(sender As Object, e As MouseButtonEventArgs) - Dim Path As String = GetPathFromSender(sender) - Try - If File.Exists(Path) OrElse Directory.Exists(Path) Then - Clipboard.SetFileDropList(New Specialized.StringCollection() From {Path}) - Hint("已复制光影包文件到剪贴板!") - Else - Hint("光影包不存在!") - End If - Catch ex As Exception - Log(ex, "复制失败……", LogLevel.Hint) - End Try - End Sub - - Private Sub BtnOpenFolder_Click(sender As Object, e As MouseButtonEventArgs) - If Not Directory.Exists(ShaderPath) Then Directory.CreateDirectory(ShaderPath) - OpenExplorer("""" & ShaderPath & """") - End Sub - - Private Sub BtnOpen_Click(sender As Object, e As MouseButtonEventArgs) - OpenExplorerAndSelect(sender.Tag) - End Sub - - Private Sub BtnPaste_Click(sender As Object, e As MouseButtonEventArgs) - Dim count = PasteFileFromClipboard(ShaderPath) - If count > 0 Then - Hint("已成功导入 " & count & " 个光影包文件(夹)!") - RefreshUI() - Else - Hint("没有光影包文件(夹)可供粘贴!") - End If - End Sub -End Class \ No newline at end of file diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index 414d9f221..779ff624d 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj @@ -192,15 +192,12 @@ MyIconTextButton.xaml - - - - + - - MyLocalModItem.xaml + + MyLocalCompItem.xaml @@ -293,18 +290,12 @@ PageVersionLeft.xaml - - PageVersionMod.xaml + + PageVersionCompResource.xaml PageVersionModDisabled.xaml - - PageVersionShader.xaml - - - PageVersionResourcePack.xaml - PageVersionWorld.xaml @@ -491,8 +482,7 @@ FormMain.xaml Code - - + MSBuild:Compile Designer @@ -573,14 +563,6 @@ MSBuild:Compile Designer - - MSBuild:Compile - Designer - - - MSBuild:Compile - Designer - MSBuild:Compile Designer @@ -693,7 +675,7 @@ Designer MSBuild:Compile - + Designer MSBuild:Compile @@ -942,7 +924,6 @@ - From 07ad70034f9d28967b9e5e0c97594e80cec9e5f2 Mon Sep 17 00:00:00 2001 From: tangge233 Date: Fri, 7 Mar 2025 22:41:29 +0800 Subject: [PATCH 48/54] =?UTF-8?q?feat(ScreeanShot):=20=E6=8C=89=E7=85=A7?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E6=97=B6=E9=97=B4=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageVersion/PageVersionScreenshot.xaml.vb | 1 + 1 file changed, 1 insertion(+) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb index 0c4f93f4c..87eb39af6 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb @@ -58,6 +58,7 @@ If Not AllowedSuffix.Contains(info.Extension.ToLower()) Then Return True '只允许指定后缀的文件 Return False End Function) + FileList = FileList.Sort(Function(a, b) New FileInfo(a).CreationTime > New FileInfo(b).CreationTime) Log("[Screenshot] 筛选后得到 " & FileList.Count & " 个截图文件") RefreshTip() Page = 1 From e811cb83be61076938720cacb03af7962e1c9a88 Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sun, 9 Mar 2025 17:25:32 +0800 Subject: [PATCH 49/54] =?UTF-8?q?fix(CompUpdate):=20=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E7=9A=84=E9=94=AE=E4=B8=8D=E5=AF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Modules/Minecraft/ModLocalComp.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModLocalComp.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModLocalComp.vb index c779262f1..b33331d33 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModLocalComp.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModLocalComp.vb @@ -901,7 +901,7 @@ Finished: ModList.Add(ModEntry) '读取 Comp 缓存 If ModEntry.State = LocalCompFile.LocalFileStatus.Unavailable Then Continue For - Dim CacheKey = ModEntry.ModrinthHash & PageVersionLeft.Version.Version.McName & GetCurrentVersionModLoader().Join("") + Dim CacheKey = ModEntry.ModrinthHash & _GameVersion & _Loaders.Join("") If Cache.ContainsKey(CacheKey) Then ModEntry.FromJson(Cache(CacheKey)) '如果缓存中的信息在 6 小时以内更新过,则无需重新获取 From 8b6ffc166e86391c60489bba8c3a3c1457cbfabe Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 15 Mar 2025 16:01:56 +0800 Subject: [PATCH 50/54] =?UTF-8?q?fix(CompUpdate):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Base/ModLoader.vb | 7 +- .../Modules/Minecraft/ModLocalComp.vb | 298 +++++++++--------- .../PageVersionCompResource.xaml.vb | 67 ++-- 3 files changed, 188 insertions(+), 184 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Base/ModLoader.vb b/Plain Craft Launcher 2/Modules/Base/ModLoader.vb index f06988287..666c7f1e5 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModLoader.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModLoader.vb @@ -652,7 +652,8 @@ Restart: ''' 返回是否执行了加载器。 ''' ''' 用于检查文件夹修改的额外路径。该路径不会传入加载器。 - Public Function LoaderFolderRun(Loader As LoaderBase, FolderPath As String, Type As LoaderFolderRunType, Optional MaxDepth As Integer = 0, Optional ExtraPath As String = "", Optional WaitForExit As Boolean = False) As Boolean + ''' 如果不想要文件夹路径为输入值,则传入期望数据 + Public Function LoaderFolderRun(Loader As LoaderBase, FolderPath As String, Type As LoaderFolderRunType, Optional MaxDepth As Integer = 0, Optional ExtraPath As String = "", Optional WaitForExit As Boolean = False, Optional LoaderInput As Object = Nothing) As Boolean Dim FolderInfo As DirectoryInfo Dim Value As New LoaderFolderDictionaryEntry With {.FolderPath = FolderPath & ExtraPath, .LastCheckTime = Nothing} Try @@ -676,9 +677,9 @@ Restart: '开始检查 If Type = LoaderFolderRunType.UpdateOnly Then Return False If WaitForExit Then - Loader.WaitForExit(FolderPath, IsForceRestart:=True) + Loader.WaitForExit(If(LoaderInput, FolderPath), IsForceRestart:=True) Else - Loader.Start(FolderPath, IsForceRestart:=True) + Loader.Start(If(LoaderInput, FolderPath), IsForceRestart:=True) End If Return True End Function diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModLocalComp.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModLocalComp.vb index b33331d33..28e2062cc 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModLocalComp.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModLocalComp.vb @@ -807,113 +807,111 @@ Finished: End Class - Public Class CompLocalLoader - Private _GameVersion As String - Private _Loaders As List(Of CompLoaderType) - Private _Frm As PageVersionCompResource + Public Class CompLocalLoaderData + Public GameVersion As McVersion + Public Loaders As List(Of CompLoaderType) + Public Frm As PageVersionCompResource + Public CompPath As String - Public Sub New(TargetFrm As PageVersionCompResource, TargetGameVersion As String, TargetLoaders As List(Of CompLoaderType)) - Me._GameVersion = TargetGameVersion - Me._Loaders = TargetLoaders - Me._Frm = TargetFrm - End Sub + Public DetailInfo As KeyValuePair(Of List(Of LocalCompFile), JObject) + End Class - '加载资源列表 - Public CompResourceListLoader As New LoaderTask(Of String, List(Of LocalCompFile))("Comp Resource List Loader", AddressOf CompResourceListLoad) - Private Sub CompResourceListLoad(Loader As LoaderTask(Of String, List(Of LocalCompFile))) - Try - RunInUiWait(Sub() If _Frm IsNot Nothing Then _Frm.Load.ShowProgress = False) + '加载资源列表 + Public CompResourceListLoader As New LoaderTask(Of CompLocalLoaderData, List(Of LocalCompFile))("Comp Resource List Loader", AddressOf CompResourceListLoad) + Private Sub CompResourceListLoad(Loader As LoaderTask(Of CompLocalLoaderData, List(Of LocalCompFile))) + Try + RunInUiWait(Sub() If Loader.Input.Frm IsNot Nothing Then Loader.Input.Frm.Load.ShowProgress = False) - '等待 Mod 更新完成 - If PageVersionCompResource.UpdatingVersions.Contains(Loader.Input) Then - Log($"[Mod] 等待资源更新完成后才能继续加载资源列表:" & Loader.Input) - Try - RunInUiWait(Sub() If _Frm IsNot Nothing Then _Frm.Load.Text = "正在更新资源") - Do Until Not PageVersionCompResource.UpdatingVersions.Contains(Loader.Input) - If Loader.IsAborted Then Exit Sub - Thread.Sleep(100) - Loop - Finally - RunInUiWait(Sub() If _Frm IsNot Nothing Then _Frm.Load.Text = "正在加载资源列表") - End Try - _Frm.LoaderRun(LoaderFolderRunType.UpdateOnly) - End If + '等待 Mod 更新完成 + If PageVersionCompResource.UpdatingVersions.Contains(Loader.Input.CompPath) Then + Log($"[Mod] 等待资源更新完成后才能继续加载资源列表:" & Loader.Input.CompPath) + Try + RunInUiWait(Sub() If Loader.Input.Frm IsNot Nothing Then Loader.Input.Frm.Load.Text = "正在更新资源") + Do Until Not PageVersionCompResource.UpdatingVersions.Contains(Loader.Input.CompPath) + If Loader.IsAborted Then Exit Sub + Thread.Sleep(100) + Loop + Finally + RunInUiWait(Sub() If Loader.Input.Frm IsNot Nothing Then Loader.Input.Frm.Load.Text = "正在加载资源列表") + End Try + Loader.Input.Frm.LoaderRun(LoaderFolderRunType.UpdateOnly) + End If - '获取 Mod 文件夹下的可用文件列表 - Dim ModFileList As New List(Of FileInfo) - If Directory.Exists(Loader.Input) Then - Dim RawName As String = Loader.Input.ToLower - For Each File As FileInfo In EnumerateFiles(Loader.Input) - If File.DirectoryName.ToLower & "\" <> RawName Then - '仅当 Forge 1.13- 且文件夹名与版本号相同时,才加载该子文件夹下的 Mod - If Not (PageVersionLeft.Version IsNot Nothing AndAlso PageVersionLeft.Version.Version.HasForge AndAlso + '获取 Mod 文件夹下的可用文件列表 + Dim ModFileList As New List(Of FileInfo) + If Directory.Exists(Loader.Input.CompPath) Then + Dim RawName As String = Loader.Input.CompPath.ToLower + For Each File As FileInfo In EnumerateFiles(Loader.Input.CompPath) + If File.DirectoryName.ToLower & "\" <> RawName Then + '仅当 Forge 1.13- 且文件夹名与版本号相同时,才加载该子文件夹下的 Mod + If Not (PageVersionLeft.Version IsNot Nothing AndAlso PageVersionLeft.Version.Version.HasForge AndAlso PageVersionLeft.Version.Version.McCodeMain < 13 AndAlso File.Directory.Name = "1." & PageVersionLeft.Version.Version.McCodeMain & "." & PageVersionLeft.Version.Version.McCodeSub) Then - Continue For - End If + Continue For End If - If LocalCompFile.IsModFile(File.FullName) Then ModFileList.Add(File) - Next - End If + End If + If LocalCompFile.IsModFile(File.FullName) Then ModFileList.Add(File) + Next + End If - '确定是否显示进度 - Loader.Progress = 0.05 - If ModFileList.Count > 50 Then RunInUi(Sub() If _Frm IsNot Nothing Then _Frm.Load.ShowProgress = True) + '确定是否显示进度 + Loader.Progress = 0.05 + If ModFileList.Count > 50 Then RunInUi(Sub() If Loader.Input.Frm IsNot Nothing Then Loader.Input.Frm.Load.ShowProgress = True) - '获取本地文件缓存 - Dim CachePath As String = PathTemp & "Cache\LocalComp.json" - Dim Cache As New JObject - Try - Dim CacheContent As String = ReadFile(CachePath) - If Not String.IsNullOrWhiteSpace(CacheContent) Then - Cache = GetJson(CacheContent) - If Not Cache.ContainsKey("version") OrElse Cache("version").ToObject(Of Integer) <> LocalModCacheVersion Then - Log($"[Mod] 本地 Mod 信息缓存版本已过期,将弃用这些缓存信息", LogLevel.Debug) - Cache = New JObject - End If + '获取本地文件缓存 + Dim CachePath As String = PathTemp & "Cache\LocalComp.json" + Dim Cache As New JObject + Try + Dim CacheContent As String = ReadFile(CachePath) + If Not String.IsNullOrWhiteSpace(CacheContent) Then + Cache = GetJson(CacheContent) + If Not Cache.ContainsKey("version") OrElse Cache("version").ToObject(Of Integer) <> LocalModCacheVersion Then + Log($"[Mod] 本地 Mod 信息缓存版本已过期,将弃用这些缓存信息", LogLevel.Debug) + Cache = New JObject End If - Catch ex As Exception - Log(ex, "读取本地 Mod 信息缓存失败,已重置") - Cache = New JObject - End Try - Cache("version") = LocalModCacheVersion + End If + Catch ex As Exception + Log(ex, "读取本地 Mod 信息缓存失败,已重置") + Cache = New JObject + End Try + Cache("version") = LocalModCacheVersion - '加载 Mod 列表 - Dim ModList As New List(Of LocalCompFile) - Dim ModUpdateList As New List(Of LocalCompFile) - For Each ModFile As FileInfo In ModFileList - Loader.Progress += 0.94 / ModFileList.Count - If Loader.IsAborted Then Exit Sub - '加载 McMod 对象 - Dim ModEntry As New LocalCompFile(ModFile.FullName) - ModEntry.Load() - Dim DumpMod As LocalCompFile = ModList.FirstOrDefault(Function(m) m.RawFileName = ModEntry.RawFileName) - If DumpMod IsNot Nothing Then - Dim DisabledMod As LocalCompFile = If(DumpMod.State = LocalCompFile.LocalFileStatus.Disabled, DumpMod, ModEntry) - Log($"[Mod] 重复的 Mod 文件:{DumpMod.FileName} 与 {ModEntry.FileName},已忽略 {DisabledMod.FileName}", LogLevel.Debug) - If DisabledMod Is ModEntry Then - Continue For - Else - ModList.Remove(DisabledMod) - ModUpdateList.Remove(DisabledMod) - End If - End If - ModList.Add(ModEntry) - '读取 Comp 缓存 - If ModEntry.State = LocalCompFile.LocalFileStatus.Unavailable Then Continue For - Dim CacheKey = ModEntry.ModrinthHash & _GameVersion & _Loaders.Join("") - If Cache.ContainsKey(CacheKey) Then - ModEntry.FromJson(Cache(CacheKey)) - '如果缓存中的信息在 6 小时以内更新过,则无需重新获取 - If ModEntry.CompLoaded AndAlso Date.Now - Cache(CacheKey)("Comp")("CacheTime").ToObject(Of Date) < New TimeSpan(6, 0, 0) Then Continue For + '加载 Mod 列表 + Dim ModList As New List(Of LocalCompFile) + Dim ModUpdateList As New List(Of LocalCompFile) + For Each ModFile As FileInfo In ModFileList + Loader.Progress += 0.94 / ModFileList.Count + If Loader.IsAborted Then Exit Sub + '加载 McMod 对象 + Dim ModEntry As New LocalCompFile(ModFile.FullName) + ModEntry.Load() + Dim DumpMod As LocalCompFile = ModList.FirstOrDefault(Function(m) m.RawFileName = ModEntry.RawFileName) + If DumpMod IsNot Nothing Then + Dim DisabledMod As LocalCompFile = If(DumpMod.State = LocalCompFile.LocalFileStatus.Disabled, DumpMod, ModEntry) + Log($"[Mod] 重复的 Mod 文件:{DumpMod.FileName} 与 {ModEntry.FileName},已忽略 {DisabledMod.FileName}", LogLevel.Debug) + If DisabledMod Is ModEntry Then + Continue For + Else + ModList.Remove(DisabledMod) + ModUpdateList.Remove(DisabledMod) End If - ModUpdateList.Add(ModEntry) - Next - Loader.Progress = 0.99 - Log($"[Mod] 共有 {ModList.Count} 个 Mod,其中 {ModUpdateList.Where(Function(m) m.Comp Is Nothing).Count} 个需要联网获取信息,{ModUpdateList.Where(Function(m) m.Comp IsNot Nothing).Count} 个需要更新信息") + End If + ModList.Add(ModEntry) + '读取 Comp 缓存 + If ModEntry.State = LocalCompFile.LocalFileStatus.Unavailable Then Continue For + Dim CacheKey = ModEntry.ModrinthHash & Loader.Input.GameVersion.Version.McName & Loader.Input.Loaders.Join("") + If Cache.ContainsKey(CacheKey) Then + ModEntry.FromJson(Cache(CacheKey)) + '如果缓存中的信息在 6 小时以内更新过,则无需重新获取 + If ModEntry.CompLoaded AndAlso Date.Now - Cache(CacheKey)("Comp")("CacheTime").ToObject(Of Date) < New TimeSpan(6, 0, 0) Then Continue For + End If + ModUpdateList.Add(ModEntry) + Next + Loader.Progress = 0.99 + Log($"[Mod] 共有 {ModList.Count} 个 Mod,其中 {ModUpdateList.Where(Function(m) m.Comp Is Nothing).Count} 个需要联网获取信息,{ModUpdateList.Where(Function(m) m.Comp IsNot Nothing).Count} 个需要更新信息") - '排序 - ModList = Sort(ModList, + '排序 + ModList = Sort(ModList, Function(Left As LocalCompFile, Right As LocalCompFile) As Boolean If (Left.State = LocalCompFile.LocalFileStatus.Unavailable) <> (Right.State = LocalCompFile.LocalFileStatus.Unavailable) Then Return Left.State = LocalCompFile.LocalFileStatus.Unavailable @@ -922,44 +920,45 @@ Finished: End If End Function) - '回设 - If Loader.IsAborted Then Exit Sub - Loader.Output = ModList + '回设 + If Loader.IsAborted Then Exit Sub + Loader.Output = ModList - '开始联网加载 - If ModUpdateList.Any() Then - 'TODO: 添加信息获取中提示 - CompUpdateDetailLoader.Start(New KeyValuePair(Of List(Of LocalCompFile), JObject)(ModUpdateList, Cache), IsForceRestart:=True) - End If + '开始联网加载 + If ModUpdateList.Any() Then + 'TODO: 添加信息获取中提示 + Loader.Input.DetailInfo = New KeyValuePair(Of List(Of LocalCompFile), JObject)(ModUpdateList, Cache) + CompUpdateDetailLoader.Start(Loader.Input, IsForceRestart:=True) + End If - Catch ex As Exception - Log(ex, "Mod 列表加载失败", LogLevel.Debug) - Throw - End Try - End Sub - '联网加载 Mod 详情 - Public CompUpdateDetailLoader As New LoaderTask(Of KeyValuePair(Of List(Of LocalCompFile), JObject), Integer)("Comp List Detail Loader", AddressOf CompUpdateDetailLoad) - Private Sub CompUpdateDetailLoad(Loader As LoaderTask(Of KeyValuePair(Of List(Of LocalCompFile), JObject), Integer)) - Dim Mods As List(Of LocalCompFile) = Loader.Input.Key - Dim Cache As JObject = Loader.Input.Value - '获取作为检查目标的加载器和版本 - Dim ModLoaders = _Loaders - Dim McVersion = _GameVersion - '暂不向下扩展检查的 MC 小版本 - '例如:Mod 在更新 1.16.5 后,对早期的 1.16.2 版本发布了修补补丁,这会导致 PCL 将 1.16.5 版本的 Mod 降级到 1.16.2 - 'If TargetMcVersion.McCodeMain > 0 AndAlso TargetMcVersion.McCodeMain < 99 Then - ' McVersions.Add($"1.{TargetMcVersion.McCodeMain}") - ' For i = 1 To TargetMcVersion.McCodeSub - ' McVersions.Add($"1.{TargetMcVersion.McCodeMain}.{i}") - ' Next - 'End If - 'McVersions = McVersions.Distinct().ToList() - '开始网络获取 - Log($"[Mod] 目标加载器:{ModLoaders.Join("/")},版本:{McVersion}") - Dim EndedThreadCount As Integer = 0, IsFailed As Boolean = False - Dim MainThread As Thread = Thread.CurrentThread - '从 Modrinth 获取信息 - RunInNewThread( + Catch ex As Exception + Log(ex, "Mod 列表加载失败", LogLevel.Debug) + Throw + End Try + End Sub + '联网加载 Mod 详情 + Public CompUpdateDetailLoader As New LoaderTask(Of CompLocalLoaderData, Integer)("Comp List Detail Loader", AddressOf CompUpdateDetailLoad) + Private Sub CompUpdateDetailLoad(Loader As LoaderTask(Of CompLocalLoaderData, Integer)) + Dim Mods As List(Of LocalCompFile) = Loader.Input.DetailInfo.Key + Dim Cache As JObject = Loader.Input.DetailInfo.Value + '获取作为检查目标的加载器和版本 + Dim ModLoaders = Loader.Input.Loaders + Dim McVersion = Loader.Input.GameVersion.Version.McName + '暂不向下扩展检查的 MC 小版本 + '例如:Mod 在更新 1.16.5 后,对早期的 1.16.2 版本发布了修补补丁,这会导致 PCL 将 1.16.5 版本的 Mod 降级到 1.16.2 + 'If TargetMcVersion.McCodeMain > 0 AndAlso TargetMcVersion.McCodeMain < 99 Then + ' McVersions.Add($"1.{TargetMcVersion.McCodeMain}") + ' For i = 1 To TargetMcVersion.McCodeSub + ' McVersions.Add($"1.{TargetMcVersion.McCodeMain}.{i}") + ' Next + 'End If + 'McVersions = McVersions.Distinct().ToList() + '开始网络获取 + Log($"[Mod] 目标加载器:{ModLoaders.Join("/")},版本:{McVersion}") + Dim EndedThreadCount As Integer = 0, IsFailed As Boolean = False + Dim MainThread As Thread = Thread.CurrentThread + '从 Modrinth 获取信息 + RunInNewThread( Sub() Try '步骤 1:获取 Hash 与对应的工程 ID @@ -1023,8 +1022,8 @@ Finished: EndedThreadCount += 1 End Try End Sub, "Mod List Detail Loader Modrinth") - '从 CurseForge 获取信息 - RunInNewThread( + '从 CurseForge 获取信息 + RunInNewThread( Sub() Try '步骤 1:获取 Hash 与对应的工程 ID @@ -1130,25 +1129,24 @@ Finished: EndedThreadCount += 1 End Try End Sub, "Mod List Detail Loader CurseForge") - '等待线程结束 - Do Until EndedThreadCount = 2 - If Loader.IsAborted Then Exit Sub - Thread.Sleep(10) - Loop - '保存缓存 - Mods = Mods.Where(Function(m) m.Comp IsNot Nothing).ToList() - Log($"[Mod] 联网获取本地 Mod 信息完成,为 {Mods.Count} 个 Mod 更新缓存") - If Not Mods.Any() Then Exit Sub - For Each Entry In Mods - Entry.CompLoaded = Not IsFailed - Cache(Entry.ModrinthHash & McVersion & ModLoaders.Join("")) = Entry.ToJson() - Next - WriteFile(PathTemp & "Cache\LocalComp.json", Cache.ToString(If(ModeDebug, Newtonsoft.Json.Formatting.Indented, Newtonsoft.Json.Formatting.None))) - '刷新边栏 - RunInUi(Sub() _Frm.RefreshBars()) - End Sub + '等待线程结束 + Do Until EndedThreadCount = 2 + If Loader.IsAborted Then Exit Sub + Thread.Sleep(10) + Loop + '保存缓存 + Mods = Mods.Where(Function(m) m.Comp IsNot Nothing).ToList() + Log($"[Mod] 联网获取本地 Mod 信息完成,为 {Mods.Count} 个 Mod 更新缓存") + If Not Mods.Any() Then Exit Sub + For Each Entry In Mods + Entry.CompLoaded = Not IsFailed + Cache(Entry.ModrinthHash & McVersion & ModLoaders.Join("")) = Entry.ToJson() + Next + WriteFile(PathTemp & "Cache\LocalComp.json", Cache.ToString(If(ModeDebug, Newtonsoft.Json.Formatting.Indented, Newtonsoft.Json.Formatting.None))) + '刷新边栏 + RunInUi(Sub() Loader.Input.Frm.RefreshBars()) + End Sub - End Class Public Function GetCurrentVersionModLoader() As List(Of CompLoaderType) Dim ModLoaders As New List(Of CompLoaderType) If PageVersionLeft.Version.Version.HasForge Then ModLoaders.Add(CompLoaderType.Forge) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionCompResource.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionCompResource.xaml.vb index 4ac3b4708..a2767c7c5 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionCompResource.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionCompResource.xaml.vb @@ -5,23 +5,10 @@ Private CurrentCompType As CompType = CompType.Mod - Private CurrentLoader As CompLocalLoader - Private CurrentSwipSelect As MyLocalCompItem.SwipeSelect Public Sub New(LoadCompType As CompType) CurrentCompType = LoadCompType - Dim RequireLoaders As List(Of CompLoaderType) - Select Case CurrentCompType - Case CompType.Mod - RequireLoaders = GetCurrentVersionModLoader() - Case CompType.ResourcePack - RequireLoaders = {CompLoaderType.Minecraft}.ToList() - Case CompType.Shader - RequireLoaders = {CompLoaderType.OptiFine, CompLoaderType.Iris, CompLoaderType.Vanilla, CompLoaderType.Canvas}.ToList() - End Select - CurrentLoader = New CompLocalLoader(Me, PageVersionLeft.Version.Version.McName, RequireLoaders) - CurrentSwipSelect = New MyLocalCompItem.SwipeSelect() With {.TargetFrm = Me} ' 此调用是设计器所必需的。 @@ -36,6 +23,24 @@ End Sub + Private Function GetRequireLoaderData() As CompLocalLoaderData + Dim res As New CompLocalLoaderData + res.GameVersion = PageVersionLeft.Version + res.Frm = Me + Dim RequireLoaders As New List(Of CompLoaderType) + Select Case CurrentCompType + Case CompType.Mod + RequireLoaders = GetCurrentVersionModLoader() + Case CompType.ResourcePack + RequireLoaders = {CompLoaderType.Minecraft}.ToList() + Case CompType.Shader + RequireLoaders = {CompLoaderType.OptiFine, CompLoaderType.Iris, CompLoaderType.Vanilla, CompLoaderType.Canvas}.ToList() + End Select + res.Loaders = RequireLoaders + res.CompPath = PageVersionLeft.Version.PathIndie & GetPathNameByCompType(CurrentCompType) & "\" + Return res + End Function + Private IsLoad As Boolean = False Public Sub PageOther_Loaded() Handles Me.Loaded @@ -100,16 +105,16 @@ End Sub Private Sub LoaderInit() Handles Me.Initialized - PageLoaderInit(Load, PanLoad, PanAllBack, Nothing, CurrentLoader.CompResourceListLoader, AddressOf LoadUIFromLoaderOutput, Function() CurrentCompType, AutoRun:=False) + PageLoaderInit(Load, PanLoad, PanAllBack, Nothing, CompResourceListLoader, AddressOf LoadUIFromLoaderOutput, Function() CurrentCompType, AutoRun:=False) End Sub Private Sub Load_Click(sender As Object, e As MouseButtonEventArgs) Handles Load.Click - If CurrentLoader.CompResourceListLoader.State = LoadState.Failed Then + If CompResourceListLoader.State = LoadState.Failed Then LoaderRun(LoaderFolderRunType.ForceRun) End If End Sub Public Function LoaderRun(Type As LoaderFolderRunType) As Boolean Dim CompResourcePath As String = PageVersionLeft.Version.PathIndie & GetPathNameByCompType(CurrentCompType) & "\" - Return LoaderFolderRun(CurrentLoader.CompResourceListLoader, CompResourcePath, Type) + Return LoaderFolderRun(CompResourceListLoader, CompResourcePath, Type, LoaderInput:=GetRequireLoaderData()) End Function #End Region @@ -126,7 +131,7 @@ Private Sub LoadUIFromLoaderOutput() Try '判断应该显示哪一个页面 - If CurrentLoader.CompResourceListLoader.Output.Any() Then + If CompResourceListLoader.Output.Any() Then PanBack.Visibility = Visibility.Visible PanEmpty.Visibility = Visibility.Collapsed Else @@ -136,7 +141,7 @@ End If '修改缓存 ModItems.Clear() - For Each ModEntity As LocalCompFile In CurrentLoader.CompResourceListLoader.Output + For Each ModEntity As LocalCompFile In CompResourceListLoader.Output ModItems(ModEntity.RawFileName) = BuildLocalCompItem(ModEntity) Next '显示结果 @@ -199,7 +204,7 @@ ''' Public Sub RefreshUI() If PanList Is Nothing Then Exit Sub - Dim ShowingMods = If(IsSearching, SearchResult, If(CurrentLoader.CompResourceListLoader.Output, New List(Of LocalCompFile))).Where(Function(m) CanPassFilter(m)).ToList + Dim ShowingMods = If(IsSearching, SearchResult, If(CompResourceListLoader.Output, New List(Of LocalCompFile))).Where(Function(m) CanPassFilter(m)).ToList '重新列出列表 AniControlEnabled += 1 If ShowingMods.Any() Then @@ -232,7 +237,7 @@ Dim DisabledCount As Integer = 0 Dim UpdateCount As Integer = 0 Dim UnavalialeCount As Integer = 0 - For Each ModItem In If(IsSearching, SearchResult, If(CurrentLoader.CompResourceListLoader.Output, New List(Of LocalCompFile))) + For Each ModItem In If(IsSearching, SearchResult, If(CompResourceListLoader.Output, New List(Of LocalCompFile))) AnyCount += 1 If ModItem.CanUpdate Then UpdateCount += 1 If ModItem.State.Equals(LocalCompFile.LocalFileStatus.Fine) Then EnabledCount += 1 @@ -263,7 +268,7 @@ Dim HasUpdate As Boolean = False Dim HasEnabled As Boolean = False Dim HasDisabled As Boolean = False - For Each ModEntity In CurrentLoader.CompResourceListLoader.Output + For Each ModEntity In CompResourceListLoader.Output If SelectedMods.Contains(ModEntity.RawFileName) Then If ModEntity.CanUpdate Then HasUpdate = True If ModEntity.State = LocalCompFile.LocalFileStatus.Fine Then @@ -417,7 +422,7 @@ Install: End If '刷新列表 If FrmMain.PageCurrent = FormMain.PageType.VersionSetup AndAlso FrmMain.PageCurrentSub = FormMain.PageSubType.VersionMod Then - LoaderFolderRun(FrmVersionMod?.CurrentLoader.CompResourceListLoader, TargetVersion.PathIndie & "mods\", LoaderFolderRunType.ForceRun) + LoaderFolderRun(CompResourceListLoader, TargetVersion.PathIndie & "mods\", LoaderFolderRunType.ForceRun, LoaderInput:=FrmVersionMod?.GetRequireLoaderData()) End If Catch ex As Exception Log(ex, "复制 Mod 文件失败", LogLevel.Msgbox) @@ -547,7 +552,7 @@ Install: '启用 / 禁用 Private Sub BtnSelectED_Click(sender As MyIconTextButton, e As RouteEventArgs) Handles BtnSelectEnable.Click, BtnSelectDisable.Click - EDMods(CurrentLoader.CompResourceListLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName)), + EDMods(CompResourceListLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName)), Not sender.Equals(BtnSelectDisable)) ChangeAllSelected(False) End Sub @@ -593,10 +598,10 @@ Install: '更改 Loader 中的列表 Dim NewModEntity As New LocalCompFile(NewPath) NewModEntity.FromJson(ModEntity.ToJson) - If CurrentLoader.CompResourceListLoader.Output.Contains(ModEntity) Then - Dim IndexOfLoader As Integer = CurrentLoader.CompResourceListLoader.Output.IndexOf(ModEntity) - CurrentLoader.CompResourceListLoader.Output.RemoveAt(IndexOfLoader) - CurrentLoader.CompResourceListLoader.Output.Insert(IndexOfLoader, NewModEntity) + If CompResourceListLoader.Output.Contains(ModEntity) Then + Dim IndexOfLoader As Integer = CompResourceListLoader.Output.IndexOf(ModEntity) + CompResourceListLoader.Output.RemoveAt(IndexOfLoader) + CompResourceListLoader.Output.Insert(IndexOfLoader, NewModEntity) End If If SearchResult IsNot Nothing AndAlso SearchResult.Contains(ModEntity) Then '#4862 Dim IndexOfResult As Integer = SearchResult.IndexOf(ModEntity) @@ -622,7 +627,7 @@ Install: '更新 Private Sub BtnSelectUpdate_Click() Handles BtnSelectUpdate.Click - Dim UpdateList As List(Of LocalCompFile) = CurrentLoader.CompResourceListLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName) AndAlso m.CanUpdate).ToList() + Dim UpdateList As List(Of LocalCompFile) = CompResourceListLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName) AndAlso m.CanUpdate).ToList() If Not UpdateList.Any() Then Return UpdateResource(UpdateList) ChangeAllSelected(False) @@ -752,7 +757,7 @@ Install: '删除 Private Sub BtnSelectDelete_Click() Handles BtnSelectDelete.Click - DeleteMods(CurrentLoader.CompResourceListLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName))) + DeleteMods(CompResourceListLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName))) ChangeAllSelected(False) End Sub Private Sub DeleteMods(ModList As IEnumerable(Of LocalCompFile)) @@ -788,7 +793,7 @@ Install: '取消选中 SelectedMods.Remove(ModEntity.RawFileName) '更改 Loader 和 UI 中的列表 - CurrentLoader.CompResourceListLoader.Output.Remove(ModEntity) + CompResourceListLoader.Output.Remove(ModEntity) SearchResult?.Remove(ModEntity) ModItems.Remove(ModEntity.RawFileName) Dim IndexOfUi As Integer = PanList.Children.IndexOf(PanList.Children.OfType(Of MyLocalCompItem).FirstOrDefault(Function(i) i.Entry.Equals(ModEntity))) @@ -943,7 +948,7 @@ Install: If IsSearching Then '构造请求 Dim QueryList As New List(Of SearchEntry(Of LocalCompFile)) - For Each Entry As LocalCompFile In CurrentLoader.CompResourceListLoader.Output + For Each Entry As LocalCompFile In CompResourceListLoader.Output Dim SearchSource As New List(Of KeyValuePair(Of String, Double)) SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.Name, 1)) SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.FileName, 1)) From 8c9c13ce6a0aae6584bcbb77da37504dbd58cd2c Mon Sep 17 00:00:00 2001 From: tangge233 Date: Tue, 29 Apr 2025 22:10:56 +0800 Subject: [PATCH 51/54] =?UTF-8?q?Revert:=20=E5=90=88=E5=B9=B6=E5=86=B2?= =?UTF-8?q?=E7=AA=81=E7=88=86=E7=82=B8=EF=BC=8C=E9=87=8D=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/FormMain.xaml.vb | 47 +- .../Modules/Base/ModBase.vb | 62 -- .../Modules/Base/ModLoader.vb | 7 +- .../Modules/Base/MyBitmap.vb | 2 +- .../Modules/Minecraft/ModComp.vb | 44 +- .../Minecraft/{ModLocalComp.vb => ModMod.vb} | 458 +++++++------- .../Modules/Minecraft/MyLocalCompItem.xaml | 57 -- .../Modules/Minecraft/MyLocalCompItem.xaml.vb | 568 ------------------ Plain Craft Launcher 2/Modules/ModMain.vb | 6 +- .../Pages/PageDownload/Comp/PageComp.xaml.vb | 4 +- .../Comp/PageDownloadCompDetail.xaml.vb | 12 +- .../Pages/PageVersion/MyLocalModItem.xaml | 2 +- .../Pages/PageVersion/MyLocalModItem.xaml.vb | 82 +-- .../Pages/PageVersion/PageVersionLeft.xaml | 42 +- .../Pages/PageVersion/PageVersionLeft.xaml.vb | 32 +- ...nCompResource.xaml => PageVersionMod.xaml} | 20 +- ...esource.xaml.vb => PageVersionMod.xaml.vb} | 285 ++++----- .../PageVersion/PageVersionScreenshot.xaml | 72 --- .../PageVersion/PageVersionScreenshot.xaml.vb | 311 ---------- .../Pages/PageVersion/PageVersionWorld.xaml | 49 -- .../PageVersion/PageVersionWorld.xaml.vb | 190 ------ .../Plain Craft Launcher 2.vbproj | 33 +- 22 files changed, 429 insertions(+), 1956 deletions(-) rename Plain Craft Launcher 2/Modules/Minecraft/{ModLocalComp.vb => ModMod.vb} (74%) delete mode 100644 Plain Craft Launcher 2/Modules/Minecraft/MyLocalCompItem.xaml delete mode 100644 Plain Craft Launcher 2/Modules/Minecraft/MyLocalCompItem.xaml.vb rename Plain Craft Launcher 2/Pages/PageVersion/{PageVersionCompResource.xaml => PageVersionMod.xaml} (87%) rename Plain Craft Launcher 2/Pages/PageVersion/{PageVersionCompResource.xaml.vb => PageVersionMod.xaml.vb} (75%) delete mode 100644 Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml delete mode 100644 Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb delete mode 100644 Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml delete mode 100644 Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb index 642f999e5..7cbbc0f9b 100644 --- a/Plain Craft Launcher 2/FormMain.xaml.vb +++ b/Plain Craft Launcher 2/FormMain.xaml.vb @@ -640,7 +640,7 @@ Public Class FormMain Try If PageCurrent = PageType.VersionSetup AndAlso PageCurrentSub = PageSubType.VersionMod Then 'Mod 管理自动刷新 - FrmVersionMod.ReloadCompFileList() + FrmVersionMod.ReloadModList() ElseIf PageCurrent = PageType.VersionSelect Then '版本选择自动刷新 LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.RunOnUpdated, MaxDepth:=1, ExtraPath:="versions\") @@ -774,42 +774,7 @@ Public Class FormMain Exit Sub End If '安装 Mod - If FrmVersionMod.InstallMods(FilePathList) Then Exit Sub - '处理资源安装 - If PageCurrent = PageType.VersionSetup AndAlso {"zip"}.Any(Function(i) i = Extension) Then - Select Case PageCurrentSub - Case PageSubType.VersionWorld - Dim DestFolder = PageVersionLeft.Version.PathIndie + "saves\" + GetFileNameWithoutExtentionFromPath(FilePath) - If Directory.Exists(DestFolder) Then - Hint("发现同名文件夹,无法粘贴:" + DestFolder, HintType.Critical) - Exit Sub - End If - ExtractFile(FilePath, DestFolder) - Hint($"已导入 {GetFileNameWithoutExtentionFromPath(FilePath)}", HintType.Finish) - If FrmVersionWorld IsNot Nothing Then RunInUi(Sub() FrmVersionWorld.Reload()) - Exit Sub - Case PageSubType.VersionResourcePack - Dim DestFile = PageVersionLeft.Version.PathIndie + "resourcepacks\" + GetFileNameFromPath(FilePath) - If File.Exists(DestFile) Then - Hint("已存在同名文件:" + DestFile, HintType.Critical) - Exit Sub - End If - CopyFile(FilePath, DestFile) - Hint($"已导入 {GetFileNameFromPath(FilePath)}", HintType.Finish) - If FrmVersionResourcePack IsNot Nothing Then RunInUi(Sub() FrmVersionResourcePack.ReloadCompFileList()) - Exit Sub - Case PageSubType.VersionShader - Dim DestFile = PageVersionLeft.Version.PathIndie + "shaderpacks\" + GetFileNameFromPath(FilePath) - If File.Exists(DestFile) Then - Hint("已存在同名文件:" + DestFile, HintType.Critical) - Exit Sub - End If - CopyFile(FilePath, DestFile) - Hint($"已导入 {GetFileNameFromPath(FilePath)}", HintType.Finish) - If FrmVersionShader IsNot Nothing Then RunInUi(Sub() FrmVersionShader.ReloadCompFileList()) - Exit Sub - End Select - End If + If PageVersionMod.InstallMods(FilePathList) Then Exit Sub '安装整合包 If {"zip", "rar", "mrpack"}.Any(Function(t) t = Extension) Then '部分压缩包是 zip 格式但后缀为 rar,总之试一试 Log("[System] 文件为压缩包,尝试作为整合包安装") @@ -991,12 +956,8 @@ Public Class FormMain OtherTest = 2 VersionOverall = 0 VersionSetup = 1 - VersionWorld = 3 - VersionScreenshot = 4 - VersionMod = 5 - VersionModDisabled = 6 - VersionResourcePack = 7 - VersionShader = 8 + VersionMod = 2 + VersionModDisabled = 3 VersionExport = 4 End Enum ''' diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb index 84d2887a4..e444e9f97 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModBase.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModBase.vb @@ -181,10 +181,6 @@ Public Module ModBase ''' Public Const IconButtonServer As String = "M224 160a64 64 0 0 0-64 64v576a64 64 0 0 0 64 64h576a64 64 0 0 0 64-64V224a64 64 0 0 0-64-64H224z m0 384h576v256H224v-256z m192 96v64h320v-64H416z m-128 0v64h64v-64H288zM224 224h576v256H224V224z m192 96v64h320v-64H416z m-128 0v64h64v-64H288z" ''' - ''' 图标按钮,复制 - ''' - Public Const IconButtonCopy As String = "M394.666667 106.666667h448a74.666667 74.666667 0 0 1 74.666666 74.666666v448a74.666667 74.666667 0 0 1-74.666666 74.666667H394.666667a74.666667 74.666667 0 0 1-74.666667-74.666667V181.333333a74.666667 74.666667 0 0 1 74.666667-74.666666z m0 64a10.666667 10.666667 0 0 0-10.666667 10.666666v448a10.666667 10.666667 0 0 0 10.666667 10.666667h448a10.666667 10.666667 0 0 0 10.666666-10.666667V181.333333a10.666667 10.666667 0 0 0-10.666666-10.666666H394.666667z m245.333333 597.333333a32 32 0 0 1 64 0v74.666667a74.666667 74.666667 0 0 1-74.666667 74.666666H181.333333a74.666667 74.666667 0 0 1-74.666666-74.666666V394.666667a74.666667 74.666667 0 0 1 74.666666-74.666667h74.666667a32 32 0 0 1 0 64h-74.666667a10.666667 10.666667 0 0 0-10.666666 10.666667v448a10.666667 10.666667 0 0 0 10.666666 10.666666h448a10.666667 10.666667 0 0 0 10.666667-10.666666v-74.666667z" - ''' ''' 图标,音符,1x ''' Public Const IconMusic As String = "M348.293565 716.53287V254.797913c0-41.672348 28.004174-78.358261 68.919652-90.37913L815.994435 40.826435c62.775652-18.610087 125.907478 26.579478 125.907478 89.933913v539.158261c8.013913 42.25113-8.94887 89.177043-47.014956 127.109565a232.848696 232.848696 0 0 1-170.785392 65.758609c-61.885217-2.938435-111.081739-33.435826-129.113043-80.050087-18.031304-46.614261-2.137043-102.177391 41.672348-145.853218a232.848696 232.848696 0 0 1 170.785391-65.80313c21.014261 1.024 40.514783 5.164522 57.878261 12.065391V233.338435c0-12.109913-10.551652-20.034783-20.569044-20.034783a24.620522 24.620522 0 0 0-5.787826 0.934957L439.785739 338.18713a19.545043 19.545043 0 0 0-14.825739 19.144348v438.984348H423.846957c11.53113 43.987478-5.164522 94.208-45.412174 134.322087a232.848696 232.848696 0 0 1-170.785392 65.758609c-61.885217-2.938435-111.081739-33.435826-129.113043-80.050087-18.031304-46.614261-2.137043-102.177391 41.672348-145.853218a232.848696 232.848696 0 0 1 170.785391-65.80313c20.791652 1.024 40.069565 5.075478 57.299478 11.842783z" @@ -2582,10 +2578,6 @@ NextElement: End Try End Sub - Public Sub OpenExplorerAndSelect(Path As String) - OpenExplorer("/select,""" & Path & """") - End Sub - ''' ''' 设置剪贴板。将在另一线程运行,且不会抛出异常。 ''' @@ -2613,60 +2605,6 @@ Retry: End Sub) End Sub - ''' - ''' 从剪切板粘贴文件或文件夹 - ''' - ''' 目标文件夹 - ''' 是否粘贴文件 - ''' 是否粘贴文件夹 - ''' 总共粘贴的数量 - Public Function PasteFileFromClipboard(dest As String, Optional copyFile As Boolean = True, Optional copyDir As Boolean = True) As Integer - Log("[System] 从剪贴板粘贴文件到:" & dest) - Try - Dim files As Specialized.StringCollection = Clipboard.GetFileDropList() - If files.Count.Equals(0) Then - Log("[System] 剪贴板内无文件可粘贴") - Return 0 - End If - Dim CopiedFiles = 0 - Dim CopiedFolders = 0 - For Each i In files - If copyFile AndAlso File.Exists(i) Then '文件 - Try - Dim thisDest = dest & GetFileNameFromPath(i) - If File.Exists(thisDest) Then - Log("[System] 已存在同名文件:" & thisDest) - Else - File.Copy(i, thisDest) - CopiedFiles += 1 - End If - Catch ex As Exception - Log(ex, "[System] 复制文件时出错") - Continue For - End Try - End If - If copyDir AndAlso Directory.Exists(i) Then '文件夹 - Try - Dim thisDest = dest & GetFolderNameFromPath(i) - If Directory.Exists(thisDest) Then - Log("[System] 已存在同名文件夹:" & thisDest) - Else - CopyDirectory(i, thisDest) - CopiedFolders += 1 - End If - Catch ex As Exception - Log(ex, "[System] 复制文件时出错") - Continue For - End Try - End If - Next - Hint("[System] 已粘贴 " & CopiedFiles & " 个文件和 " & CopiedFolders & " 个文件夹") - Catch ex As Exception - Log(ex, "[System] 从剪切板粘贴文件失败", LogLevel.Hint) - End Try - End Function - - ''' ''' 以 Byte() 形式获取程序中的资源。 ''' diff --git a/Plain Craft Launcher 2/Modules/Base/ModLoader.vb b/Plain Craft Launcher 2/Modules/Base/ModLoader.vb index 4c7b19e7c..45f7bd5d3 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModLoader.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModLoader.vb @@ -655,8 +655,7 @@ Restart: ''' 返回是否执行了加载器。 ''' ''' 用于检查文件夹修改的额外路径。该路径不会传入加载器。 - ''' 如果不想要文件夹路径为输入值,则传入期望数据 - Public Function LoaderFolderRun(Loader As LoaderBase, FolderPath As String, Type As LoaderFolderRunType, Optional MaxDepth As Integer = 0, Optional ExtraPath As String = "", Optional WaitForExit As Boolean = False, Optional LoaderInput As Object = Nothing) As Boolean + Public Function LoaderFolderRun(Loader As LoaderBase, FolderPath As String, Type As LoaderFolderRunType, Optional MaxDepth As Integer = 0, Optional ExtraPath As String = "", Optional WaitForExit As Boolean = False) As Boolean Dim FolderInfo As DirectoryInfo Dim Value As New LoaderFolderDictionaryEntry With {.FolderPath = FolderPath & ExtraPath, .LastCheckTime = Nothing} Try @@ -680,9 +679,9 @@ Restart: '开始检查 If Type = LoaderFolderRunType.UpdateOnly Then Return False If WaitForExit Then - Loader.WaitForExit(If(LoaderInput, FolderPath), IsForceRestart:=True) + Loader.WaitForExit(FolderPath, IsForceRestart:=True) Else - Loader.Start(If(LoaderInput, FolderPath), IsForceRestart:=True) + Loader.Start(FolderPath, IsForceRestart:=True) End If Return True End Function diff --git a/Plain Craft Launcher 2/Modules/Base/MyBitmap.vb b/Plain Craft Launcher 2/Modules/Base/MyBitmap.vb index f29742be1..c5303d607 100644 --- a/Plain Craft Launcher 2/Modules/Base/MyBitmap.vb +++ b/Plain Craft Launcher 2/Modules/Base/MyBitmap.vb @@ -121,7 +121,7 @@ Public Class MyBitmap Pic = New System.Drawing.Bitmap(MS) End Using End Sub - Public Class WebPDecoder '将代码隔离在另外一个类中,这样只要不调用这个方法就不会加载 Imazen.WebP.dll + Private Class WebPDecoder '将代码隔离在另外一个类中,这样只要不调用这个方法就不会加载 Imazen.WebP.dll Public Shared Function DecodeFromBytes(Bytes As Byte()) As System.Drawing.Bitmap If Is32BitSystem Then Throw New Exception("不支持在 32 位系统下加载 WebP 图片。") Dim Decoder As New Imazen.WebP.SimpleDecoder() diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb index 3e82ef52c..e5265cd4f 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb @@ -31,22 +31,14 @@ ''' Plugin = 5 End Enum - Public Enum CompLoaderType + Public Enum CompModLoaderType 'https://docs.curseforge.com/?http#tocS_ModLoaderType - ' 模组 Any = 0 Forge = 1 LiteLoader = 3 Fabric = 4 Quilt = 5 NeoForge = 6 - ' 材质包 - Minecraft = 7 - ' 光影包 - OptiFine = 8 - Iris = 9 - Canvas = 10 - Vanilla = 11 End Enum Public Enum CompSourceType CurseForge = 1 @@ -179,7 +171,7 @@ ''' ''' 支持的 Mod 加载器列表。可能为空。 ''' - Public ReadOnly ModLoaders As List(Of CompLoaderType) + Public ReadOnly ModLoaders As List(Of CompModLoaderType) ''' ''' 描述性标签的内容。已转换为中文。 ''' @@ -251,9 +243,9 @@ If Data.ContainsKey("LastUpdate") Then LastUpdate = Data("LastUpdate") DownloadCount = Data("DownloadCount") If Data.ContainsKey("ModLoaders") Then - ModLoaders = CType(Data("ModLoaders"), JArray).Select(Function(t) CType(t.ToObject(Of Integer), CompLoaderType)).ToList + ModLoaders = CType(Data("ModLoaders"), JArray).Select(Function(t) CType(t.ToObject(Of Integer), CompModLoaderType)).ToList Else - ModLoaders = New List(Of CompLoaderType) + ModLoaders = New List(Of CompModLoaderType) End If Tags = CType(Data("Tags"), JArray).Select(Function(t) t.ToString).ToList If Data.ContainsKey("LogoUrl") Then LogoUrl = Data("LogoUrl") @@ -297,7 +289,7 @@ Type = CompType.DataPack End If 'FileIndexes / GameVersions / ModLoaders - ModLoaders = New List(Of CompLoaderType) + ModLoaders = New List(Of CompModLoaderType) Dim Files As New List(Of KeyValuePair(Of Integer, List(Of String))) 'FileId, GameVersions For Each File In If(Data("latestFiles"), New JArray) Dim NewFile As New CompFile(File, Type) @@ -583,8 +575,8 @@ End If '获取 Mod 加载器描述 Dim ModLoaderDescriptionFull As String, ModLoaderDescriptionPart As String - Dim ModLoadersForDesc As New List(Of CompLoaderType)(ModLoaders) - If Setup.Get("ToolDownloadIgnoreQuilt") Then ModLoadersForDesc.Remove(CompLoaderType.Quilt) + Dim ModLoadersForDesc As New List(Of CompModLoaderType)(ModLoaders) + If Setup.Get("ToolDownloadIgnoreQuilt") Then ModLoadersForDesc.Remove(CompModLoaderType.Quilt) Select Case ModLoadersForDesc.Count Case 0 If ModLoaders.Count = 1 Then @@ -832,7 +824,7 @@ NoSubtitle: ''' ''' 筛选 Mod 加载器类别。 ''' - Public ModLoader As CompLoaderType = CompLoaderType.Any + Public ModLoader As CompModLoaderType = CompModLoaderType.Any ''' ''' 筛选 MC 版本。 ''' @@ -878,7 +870,7 @@ NoSubtitle: Address += "&classId=12" End Select Address += "&categoryId=" & If(Tag = "", "0", Tag.BeforeFirst("/")) - If ModLoader <> CompLoaderType.Any Then Address += "&modLoaderType=" & CType(ModLoader, Integer) + If ModLoader <> CompModLoaderType.Any Then Address += "&modLoaderType=" & CType(ModLoader, Integer) If Not String.IsNullOrEmpty(GameVersion) Then Address += "&gameVersion=" & GameVersion If Not String.IsNullOrEmpty(SearchText) Then Address += "&searchFilter=" & Net.WebUtility.UrlEncode(SearchText) If Storage.CurseForgeOffset > 0 Then Address += "&index=" & Storage.CurseForgeOffset @@ -899,7 +891,7 @@ NoSubtitle: Dim Facets As New List(Of String) Facets.Add($"[""project_type:{GetStringFromEnum(Type).ToLower}""]") If Not String.IsNullOrEmpty(Tag) Then Facets.Add($"[""categories:'{Tag.AfterLast("/")}'""]") - If ModLoader <> CompLoaderType.Any Then Facets.Add($"[""categories:'{GetStringFromEnum(ModLoader).ToLower}'""]") + If ModLoader <> CompModLoaderType.Any Then Facets.Add($"[""categories:'{GetStringFromEnum(ModLoader).ToLower}'""]") If Not String.IsNullOrEmpty(GameVersion) Then Facets.Add($"[""versions:'{GameVersion}'""]") Address += "&facets=[" & String.Join(",", Facets) & "]" Return Address @@ -971,7 +963,7 @@ NoSubtitle: #Region "拒绝 1.13- Quilt(这个版本根本没有 Quilt)" - If Task.Input.ModLoader = CompLoaderType.Quilt AndAlso VersionSortInteger(If(Task.Input.GameVersion, "1.15"), "1.14") = -1 Then + If Task.Input.ModLoader = CompModLoaderType.Quilt AndAlso VersionSortInteger(If(Task.Input.GameVersion, "1.15"), "1.14") = -1 Then Throw New Exception("Quilt 不支持 Minecraft " & Task.Input.GameVersion) End If @@ -1287,7 +1279,7 @@ Retry: ''' ''' 支持的 Mod 加载器列表。可能为空。 ''' - Public ReadOnly ModLoaders As List(Of CompLoaderType) + Public ReadOnly ModLoaders As List(Of CompModLoaderType) ''' ''' 支持的游戏版本列表。类型包括:"1.18.5","1.18","1.18 预览版","21w15a","未知版本"。 ''' @@ -1367,7 +1359,7 @@ Retry: Status = CType(Data("Status").ToObject(Of Integer), CompFileStatus) If Data.ContainsKey("FileName") Then FileName = Data("FileName").ToString If Data.ContainsKey("DownloadUrls") Then DownloadUrls = Data("DownloadUrls").ToObject(Of List(Of String)) - If Data.ContainsKey("ModLoaders") Then ModLoaders = Data("ModLoaders").ToObject(Of List(Of CompLoaderType)) + If Data.ContainsKey("ModLoaders") Then ModLoaders = Data("ModLoaders").ToObject(Of List(Of CompModLoaderType)) If Data.ContainsKey("Hash") Then Hash = Data("Hash").ToString If Data.ContainsKey("GameVersions") Then GameVersions = Data("GameVersions").ToObject(Of List(Of String)) If Data.ContainsKey("RawDependencies") Then RawDependencies = Data("RawDependencies").ToObject(Of List(Of String)) @@ -1412,11 +1404,11 @@ Retry: GameVersions = New List(Of String) From {"未知版本"} End If 'ModLoaders - ModLoaders = New List(Of CompLoaderType) - If RawVersions.Contains("forge") Then ModLoaders.Add(CompLoaderType.Forge) - If RawVersions.Contains("fabric") Then ModLoaders.Add(CompLoaderType.Fabric) - If RawVersions.Contains("quilt") Then ModLoaders.Add(CompLoaderType.Quilt) - If RawVersions.Contains("neoforge") Then ModLoaders.Add(CompLoaderType.NeoForge) + ModLoaders = New List(Of CompModLoaderType) + If RawVersions.Contains("forge") Then ModLoaders.Add(CompModLoaderType.Forge) + If RawVersions.Contains("fabric") Then ModLoaders.Add(CompModLoaderType.Fabric) + If RawVersions.Contains("quilt") Then ModLoaders.Add(CompModLoaderType.Quilt) + If RawVersions.Contains("neoforge") Then ModLoaders.Add(CompModLoaderType.NeoForge) #End Region Else #Region "Modrinth" diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModLocalComp.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb similarity index 74% rename from Plain Craft Launcher 2/Modules/Minecraft/ModLocalComp.vb rename to Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb index 69a183719..9f6eedafd 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModLocalComp.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb @@ -1,9 +1,9 @@ Imports System.IO.Compression -Public Module ModLocalComp +Public Module ModMod Private Const LocalModCacheVersion As Integer = 7 - Public Class LocalCompFile + Public Class McMod #Region "基础" @@ -44,19 +44,19 @@ Public Module ModLocalComp ''' ''' Mod 的状态。 ''' - Public ReadOnly Property State As LocalFileStatus + Public ReadOnly Property State As McModState Get Load() If Not IsFileAvailable Then - Return LocalFileStatus.Unavailable + Return McModState.Unavailable ElseIf Path.EndsWithF(".disabled", True) OrElse Path.EndsWithF(".old", True) Then - Return LocalFileStatus.Disabled + Return McModState.Disabled Else - Return LocalFileStatus.Fine + Return McModState.Fine End If End Get End Property - Public Enum LocalFileStatus As Integer + Public Enum McModState As Integer Fine = 0 Disabled = 1 Unavailable = 2 @@ -616,7 +616,7 @@ Finished: ''' ''' 当任何网络信息更新时触发。 ''' - Public Event OnCompUpdate(sender As LocalCompFile) + Public Event OnCompUpdate(sender As McMod) ''' ''' 该 Mod 关联的网络项目。 @@ -701,7 +701,7 @@ Finished: '读取缓存 Dim Info As New FileInfo(Path) Dim CacheKey As String = GetHash($"{RawPath}-{Info.LastWriteTime.ToLongTimeString}-{Info.Length}-C") - Dim Cached As String = ReadIni(PathTemp & "Cache\CompHash.ini", CacheKey) + Dim Cached As String = ReadIni(PathTemp & "Cache\ModHash.ini", CacheKey) If Cached <> "" AndAlso RegexCheck(Cached, "^\d+$") Then '#5062 _CurseForgeHash = Cached Return _CurseForgeHash @@ -741,7 +741,7 @@ Finished: h = h Xor (h >> 15) _CurseForgeHash = h '写入缓存 - WriteIni(PathTemp & "Cache\CompHash.ini", CacheKey, h.ToString) + WriteIni(PathTemp & "Cache\ModHash.ini", CacheKey, h.ToString) End If Return _CurseForgeHash End Get @@ -757,7 +757,7 @@ Finished: '读取缓存 Dim Info As New FileInfo(Path) Dim CacheKey As String = GetHash($"{RawPath}-{Info.LastWriteTime.ToLongTimeString}-{Info.Length}-M") - Dim Cached As String = ReadIni(PathTemp & "Cache\CompHash.ini", CacheKey) + Dim Cached As String = ReadIni(PathTemp & "Cache\ModHash.ini", CacheKey) If Cached <> "" Then _ModrinthHash = Cached Return _ModrinthHash @@ -765,7 +765,7 @@ Finished: '计算 SHA1 _ModrinthHash = GetFileSHA1(Path) '写入缓存 - WriteIni(PathTemp & "Cache\CompHash.ini", CacheKey, _ModrinthHash) + WriteIni(PathTemp & "Cache\ModHash.ini", CacheKey, _ModrinthHash) End If Return _ModrinthHash End Get @@ -780,7 +780,7 @@ Finished: Return $"{State} - {Path}" End Function Public Overrides Function Equals(obj As Object) As Boolean - Dim target = TryCast(obj, LocalCompFile) + Dim target = TryCast(obj, McMod) Return target IsNot Nothing AndAlso Path = target.Path End Function @@ -807,41 +807,32 @@ Finished: End Class - Public Class CompLocalLoaderData - Public GameVersion As McVersion - Public Loaders As List(Of CompLoaderType) - Public Frm As PageVersionCompResource - Public CompPath As String - - Public DetailInfo As KeyValuePair(Of List(Of LocalCompFile), JObject) - End Class - - '加载资源列表 - Public CompResourceListLoader As New LoaderTask(Of CompLocalLoaderData, List(Of LocalCompFile))("Comp Resource List Loader", AddressOf CompResourceListLoad) - Private Sub CompResourceListLoad(Loader As LoaderTask(Of CompLocalLoaderData, List(Of LocalCompFile))) + '加载 Mod 列表 + Public McModLoader As New LoaderTask(Of String, List(Of McMod))("Mod List Loader", AddressOf McModLoad) + Private Sub McModLoad(Loader As LoaderTask(Of String, List(Of McMod))) Try - RunInUiWait(Sub() If Loader.Input.Frm IsNot Nothing Then Loader.Input.Frm.Load.ShowProgress = False) + RunInUiWait(Sub() If FrmVersionMod IsNot Nothing Then FrmVersionMod.Load.ShowProgress = False) '等待 Mod 更新完成 - If PageVersionCompResource.UpdatingVersions.Contains(Loader.Input.CompPath) Then - Log($"[Mod] 等待资源更新完成后才能继续加载资源列表:" & Loader.Input.CompPath) + If PageVersionMod.UpdatingVersions.Contains(Loader.Input) Then + Log($"[Mod] 等待 Mod 更新完成后才能继续加载 Mod 列表:" & Loader.Input) Try - RunInUiWait(Sub() If Loader.Input.Frm IsNot Nothing Then Loader.Input.Frm.Load.Text = "正在更新资源") - Do Until Not PageVersionCompResource.UpdatingVersions.Contains(Loader.Input.CompPath) + RunInUiWait(Sub() If FrmVersionMod IsNot Nothing Then FrmVersionMod.Load.Text = "正在更新 Mod") + Do Until Not PageVersionMod.UpdatingVersions.Contains(Loader.Input) If Loader.IsAborted Then Exit Sub Thread.Sleep(100) Loop Finally - RunInUiWait(Sub() If Loader.Input.Frm IsNot Nothing Then Loader.Input.Frm.Load.Text = "正在加载资源列表") + RunInUiWait(Sub() If FrmVersionMod IsNot Nothing Then FrmVersionMod.Load.Text = "正在加载 Mod 列表") End Try - Loader.Input.Frm.LoaderRun(LoaderFolderRunType.UpdateOnly) + FrmVersionMod.LoaderRun(LoaderFolderRunType.UpdateOnly) End If '获取 Mod 文件夹下的可用文件列表 Dim ModFileList As New List(Of FileInfo) - If Directory.Exists(Loader.Input.CompPath) Then - Dim RawName As String = Loader.Input.CompPath.ToLower - For Each File As FileInfo In EnumerateFiles(Loader.Input.CompPath) + If Directory.Exists(Loader.Input) Then + Dim RawName As String = Loader.Input.ToLower + For Each File As FileInfo In EnumerateFiles(Loader.Input) If File.DirectoryName.ToLower & "\" <> RawName Then '仅当 Forge 1.13- 且文件夹名与版本号相同时,才加载该子文件夹下的 Mod If Not (PageVersionLeft.Version IsNot Nothing AndAlso PageVersionLeft.Version.Version.HasForge AndAlso @@ -850,16 +841,16 @@ Finished: Continue For End If End If - If LocalCompFile.IsModFile(File.FullName) Then ModFileList.Add(File) + If McMod.IsModFile(File.FullName) Then ModFileList.Add(File) Next End If '确定是否显示进度 Loader.Progress = 0.05 - If ModFileList.Count > 50 Then RunInUi(Sub() If Loader.Input.Frm IsNot Nothing Then Loader.Input.Frm.Load.ShowProgress = True) + If ModFileList.Count > 50 Then RunInUi(Sub() If FrmVersionMod IsNot Nothing Then FrmVersionMod.Load.ShowProgress = True) '获取本地文件缓存 - Dim CachePath As String = PathTemp & "Cache\LocalComp.json" + Dim CachePath As String = PathTemp & "Cache\LocalMod.json" Dim Cache As New JObject Try Dim CacheContent As String = ReadFile(CachePath) @@ -877,17 +868,17 @@ Finished: Cache("version") = LocalModCacheVersion '加载 Mod 列表 - Dim ModList As New List(Of LocalCompFile) - Dim ModUpdateList As New List(Of LocalCompFile) + Dim ModList As New List(Of McMod) + Dim ModUpdateList As New List(Of McMod) For Each ModFile As FileInfo In ModFileList Loader.Progress += 0.94 / ModFileList.Count If Loader.IsAborted Then Exit Sub '加载 McMod 对象 - Dim ModEntry As New LocalCompFile(ModFile.FullName) + Dim ModEntry As New McMod(ModFile.FullName) ModEntry.Load() - Dim DumpMod As LocalCompFile = ModList.FirstOrDefault(Function(m) m.RawFileName = ModEntry.RawFileName) + Dim DumpMod As McMod = ModList.FirstOrDefault(Function(m) m.RawFileName = ModEntry.RawFileName) If DumpMod IsNot Nothing Then - Dim DisabledMod As LocalCompFile = If(DumpMod.State = LocalCompFile.LocalFileStatus.Disabled, DumpMod, ModEntry) + Dim DisabledMod As McMod = If(DumpMod.State = McMod.McModState.Disabled, DumpMod, ModEntry) Log($"[Mod] 重复的 Mod 文件:{DumpMod.FileName} 与 {ModEntry.FileName},已忽略 {DisabledMod.FileName}", LogLevel.Debug) If DisabledMod Is ModEntry Then Continue For @@ -898,8 +889,8 @@ Finished: End If ModList.Add(ModEntry) '读取 Comp 缓存 - If ModEntry.State = LocalCompFile.LocalFileStatus.Unavailable Then Continue For - Dim CacheKey = ModEntry.ModrinthHash & Loader.Input.GameVersion.Version.McName & Loader.Input.Loaders.Join("") + If ModEntry.State = McMod.McModState.Unavailable Then Continue For + Dim CacheKey = ModEntry.ModrinthHash & PageVersionLeft.Version.Version.McName & GetTargetModLoaders().Join("") If Cache.ContainsKey(CacheKey) Then ModEntry.FromJson(Cache(CacheKey)) '如果缓存中的信息在 6 小时以内更新过,则无需重新获取 @@ -912,13 +903,13 @@ Finished: '排序 ModList = ModList.Sort( - Function(Left As LocalCompFile, Right As LocalCompFile) As Boolean - If (Left.State = LocalCompFile.LocalFileStatus.Unavailable) <> (Right.State = LocalCompFile.LocalFileStatus.Unavailable) Then - Return Left.State = LocalCompFile.LocalFileStatus.Unavailable - Else - Return Not Right.FileName.CompareTo(Left.FileName) - End If - End Function) + Function(Left As McMod, Right As McMod) As Boolean + If (Left.State = McMod.McModState.Unavailable) <> (Right.State = McMod.McModState.Unavailable) Then + Return Left.State = McMod.McModState.Unavailable + Else + Return Not Right.FileName.CompareTo(Left.FileName) + End If + End Function) '回设 If Loader.IsAborted Then Exit Sub @@ -927,8 +918,7 @@ Finished: '开始联网加载 If ModUpdateList.Any() Then 'TODO: 添加信息获取中提示 - Loader.Input.DetailInfo = New KeyValuePair(Of List(Of LocalCompFile), JObject)(ModUpdateList, Cache) - CompUpdateDetailLoader.Start(Loader.Input, IsForceRestart:=True) + McModDetailLoader.Start(New KeyValuePair(Of List(Of McMod), JObject)(ModUpdateList, Cache), IsForceRestart:=True) End If Catch ex As Exception @@ -937,190 +927,191 @@ Finished: End Try End Sub '联网加载 Mod 详情 - Public CompUpdateDetailLoader As New LoaderTask(Of CompLocalLoaderData, Integer)("Comp List Detail Loader", AddressOf CompUpdateDetailLoad) - Private Sub CompUpdateDetailLoad(Loader As LoaderTask(Of CompLocalLoaderData, Integer)) - Dim Mods As List(Of LocalCompFile) = Loader.Input.DetailInfo.Key - Dim Cache As JObject = Loader.Input.DetailInfo.Value + Public McModDetailLoader As New LoaderTask(Of KeyValuePair(Of List(Of McMod), JObject), Integer)("Mod List Detail Loader", AddressOf McModDetailLoad) + Private Sub McModDetailLoad(Loader As LoaderTask(Of KeyValuePair(Of List(Of McMod), JObject), Integer)) + Dim Mods As List(Of McMod) = Loader.Input.Key + Dim Cache As JObject = Loader.Input.Value '获取作为检查目标的加载器和版本 '此处不应向下扩展检查的 MC 小版本,例如 Mod 在更新 1.16.5 后,对早期的 1.16.2 版本发布了修补补丁,这会导致 PCL 将 1.16.5 版本的 Mod 降级到 1.16.2 - Dim ModLoaders = Loader.Input.Loaders - Dim McVersion = Loader.Input.GameVersion.Version.McName + Dim TargetMcVersion As McVersionInfo = PageVersionLeft.Version.Version + Dim ModLoaders = GetTargetModLoaders() + Dim McVersion = TargetMcVersion.McName '开始网络获取 Log($"[Mod] 目标加载器:{ModLoaders.Join("/")},版本:{McVersion}") Dim EndedThreadCount As Integer = 0, IsFailed As Boolean = False Dim MainThread As Thread = Thread.CurrentThread '从 Modrinth 获取信息 RunInNewThread( - Sub() - Try - '步骤 1:获取 Hash 与对应的工程 ID - Dim ModrinthHashes = Mods.Select(Function(m) m.ModrinthHash).ToList() - Dim ModrinthVersion = CType(GetJson(DlModRequest("https://api.modrinth.com/v2/version_files", "POST", - $"{{""hashes"": [""{ModrinthHashes.Join(""",""")}""], ""algorithm"": ""sha1""}}", "application/json")), JObject) - Log($"[Mod] 从 Modrinth 获取到 {ModrinthVersion.Count} 个本地 Mod 的对应信息") - '步骤 2:尝试读取工程信息缓存,构建其他 Mod 的对应关系 - If ModrinthVersion.Count = 0 Then Exit Sub - Dim ModrinthMapping As New Dictionary(Of String, List(Of LocalCompFile)) - For Each Entry In Mods - If Not ModrinthVersion.ContainsKey(Entry.ModrinthHash) Then Continue For - If ModrinthVersion(Entry.ModrinthHash)("files")(0)("hashes")("sha1") <> Entry.ModrinthHash Then Continue For - Dim ProjectId = ModrinthVersion(Entry.ModrinthHash)("project_id").ToString - If CompProjectCache.ContainsKey(ProjectId) AndAlso Entry.Comp Is Nothing Then Entry.Comp = CompProjectCache(ProjectId) '读取已加载的缓存,加快结果出现速度 - If Not ModrinthMapping.ContainsKey(ProjectId) Then ModrinthMapping(ProjectId) = New List(Of LocalCompFile) - ModrinthMapping(ProjectId).Add(Entry) - '记录对应的 CompFile - Dim File As New CompFile(ModrinthVersion(Entry.ModrinthHash), CompType.Mod) - If Entry.CompFile Is Nothing OrElse Entry.CompFile.ReleaseDate < File.ReleaseDate Then Entry.CompFile = File - Next - If Loader.IsAbortedWithThread(MainThread) Then Exit Sub - Log($"[Mod] 需要从 Modrinth 获取 {ModrinthMapping.Count} 个本地 Mod 的工程信息") - '步骤 3:获取工程信息 - If Not ModrinthMapping.Any() Then Exit Sub - Dim ModrinthProject = CType(GetJson(DlModRequest( - $"https://api.modrinth.com/v2/projects?ids=[""{ModrinthMapping.Keys.Join(""",""")}""]", - "GET", "", "application/json")), JArray) - For Each ProjectJson In ModrinthProject - Dim Project As New CompProject(ProjectJson) - For Each Entry In ModrinthMapping(Project.Id) - Entry.Comp = Project - Next + Sub() + Try + '步骤 1:获取 Hash 与对应的工程 ID + Dim ModrinthHashes = Mods.Select(Function(m) m.ModrinthHash).ToList() + Dim ModrinthVersion = CType(GetJson(DlModRequest("https://api.modrinth.com/v2/version_files", "POST", + $"{{""hashes"": [""{ModrinthHashes.Join(""",""")}""], ""algorithm"": ""sha1""}}", "application/json")), JObject) + Log($"[Mod] 从 Modrinth 获取到 {ModrinthVersion.Count} 个本地 Mod 的对应信息") + '步骤 2:尝试读取工程信息缓存,构建其他 Mod 的对应关系 + If ModrinthVersion.Count = 0 Then Exit Sub + Dim ModrinthMapping As New Dictionary(Of String, List(Of McMod)) + For Each Entry In Mods + If Not ModrinthVersion.ContainsKey(Entry.ModrinthHash) Then Continue For + If ModrinthVersion(Entry.ModrinthHash)("files")(0)("hashes")("sha1") <> Entry.ModrinthHash Then Continue For + Dim ProjectId = ModrinthVersion(Entry.ModrinthHash)("project_id").ToString + If CompProjectCache.ContainsKey(ProjectId) AndAlso Entry.Comp Is Nothing Then Entry.Comp = CompProjectCache(ProjectId) '读取已加载的缓存,加快结果出现速度 + If Not ModrinthMapping.ContainsKey(ProjectId) Then ModrinthMapping(ProjectId) = New List(Of McMod) + ModrinthMapping(ProjectId).Add(Entry) + '记录对应的 CompFile + Dim File As New CompFile(ModrinthVersion(Entry.ModrinthHash), CompType.Mod) + If Entry.CompFile Is Nothing OrElse Entry.CompFile.ReleaseDate < File.ReleaseDate Then Entry.CompFile = File + Next + If Loader.IsAbortedWithThread(MainThread) Then Exit Sub + Log($"[Mod] 需要从 Modrinth 获取 {ModrinthMapping.Count} 个本地 Mod 的工程信息") + '步骤 3:获取工程信息 + If Not ModrinthMapping.Any() Then Exit Sub + Dim ModrinthProject = CType(GetJson(DlModRequest( + $"https://api.modrinth.com/v2/projects?ids=[""{ModrinthMapping.Keys.Join(""",""")}""]", + "GET", "", "application/json")), JArray) + For Each ProjectJson In ModrinthProject + Dim Project As New CompProject(ProjectJson) + For Each Entry In ModrinthMapping(Project.Id) + Entry.Comp = Project Next - Log($"[Mod] 已从 Modrinth 获取本地 Mod 信息,继续获取更新信息") - '步骤 4:获取更新信息 - Dim ModrinthUpdate = CType(GetJson(DlModRequest("https://api.modrinth.com/v2/version_files/update", "POST", - $"{{""hashes"": [""{ModrinthMapping.SelectMany(Function(l) l.Value.Select(Function(m) m.ModrinthHash)).Join(""",""")}""], ""algorithm"": ""sha1"", + Next + Log($"[Mod] 已从 Modrinth 获取本地 Mod 信息,继续获取更新信息") + '步骤 4:获取更新信息 + Dim ModrinthUpdate = CType(GetJson(DlModRequest("https://api.modrinth.com/v2/version_files/update", "POST", + $"{{""hashes"": [""{ModrinthMapping.SelectMany(Function(l) l.Value.Select(Function(m) m.ModrinthHash)).Join(""",""")}""], ""algorithm"": ""sha1"", ""loaders"": [""{ModLoaders.Join(""",""").ToLower}""],""game_versions"": [""{McVersion}""]}}", "application/json")), JObject) - For Each Entry In Mods - If Not ModrinthUpdate.ContainsKey(Entry.ModrinthHash) OrElse Entry.CompFile Is Nothing Then Continue For - Dim UpdateFile As New CompFile(ModrinthUpdate(Entry.ModrinthHash), CompType.Mod) - If Not UpdateFile.Available Then Continue For - If ModeDebug Then Log($"[Mod] 本地文件 {Entry.CompFile.FileName} 在 Modrinth 上的最新版为 {UpdateFile.FileName}") - If Entry.CompFile.ReleaseDate >= UpdateFile.ReleaseDate OrElse Entry.CompFile.Hash = UpdateFile.Hash Then Continue For - '设置更新日志与更新文件 - If Entry.UpdateFile IsNot Nothing AndAlso UpdateFile.Hash = Entry.UpdateFile.Hash Then '合并 - Entry.ChangelogUrls.Add($"https://modrinth.com/mod/{ModrinthUpdate(Entry.ModrinthHash)("project_id")}/changelog?g={McVersion}") - UpdateFile.DownloadUrls.AddRange(Entry.UpdateFile.DownloadUrls) '合并下载源 - Entry.UpdateFile = UpdateFile '优先使用 Modrinth 的文件 - ElseIf Entry.UpdateFile Is Nothing OrElse UpdateFile.ReleaseDate >= Entry.UpdateFile.ReleaseDate Then '替换 - Entry.ChangelogUrls = New List(Of String) From {$"https://modrinth.com/mod/{ModrinthUpdate(Entry.ModrinthHash)("project_id")}/changelog?g={McVersion}"} - Entry.UpdateFile = UpdateFile - End If - Next - Log($"[Mod] 从 Modrinth 获取本地 Mod 信息结束") - Catch ex As Exception - Log(ex, "从 Modrinth 获取本地 Mod 信息失败") - IsFailed = True - Finally - EndedThreadCount += 1 - End Try - End Sub, "Mod List Detail Loader Modrinth") + For Each Entry In Mods + If Not ModrinthUpdate.ContainsKey(Entry.ModrinthHash) OrElse Entry.CompFile Is Nothing Then Continue For + Dim UpdateFile As New CompFile(ModrinthUpdate(Entry.ModrinthHash), CompType.Mod) + If Not UpdateFile.Available Then Continue For + If ModeDebug Then Log($"[Mod] 本地文件 {Entry.CompFile.FileName} 在 Modrinth 上的最新版为 {UpdateFile.FileName}") + If Entry.CompFile.ReleaseDate >= UpdateFile.ReleaseDate OrElse Entry.CompFile.Hash = UpdateFile.Hash Then Continue For + '设置更新日志与更新文件 + If Entry.UpdateFile IsNot Nothing AndAlso UpdateFile.Hash = Entry.UpdateFile.Hash Then '合并 + Entry.ChangelogUrls.Add($"https://modrinth.com/mod/{ModrinthUpdate(Entry.ModrinthHash)("project_id")}/changelog?g={McVersion}") + UpdateFile.DownloadUrls.AddRange(Entry.UpdateFile.DownloadUrls) '合并下载源 + Entry.UpdateFile = UpdateFile '优先使用 Modrinth 的文件 + ElseIf Entry.UpdateFile Is Nothing OrElse UpdateFile.ReleaseDate >= Entry.UpdateFile.ReleaseDate Then '替换 + Entry.ChangelogUrls = New List(Of String) From {$"https://modrinth.com/mod/{ModrinthUpdate(Entry.ModrinthHash)("project_id")}/changelog?g={McVersion}"} + Entry.UpdateFile = UpdateFile + End If + Next + Log($"[Mod] 从 Modrinth 获取本地 Mod 信息结束") + Catch ex As Exception + Log(ex, "从 Modrinth 获取本地 Mod 信息失败") + IsFailed = True + Finally + EndedThreadCount += 1 + End Try + End Sub, "Mod List Detail Loader Modrinth") '从 CurseForge 获取信息 RunInNewThread( - Sub() - Try - '步骤 1:获取 Hash 与对应的工程 ID - Dim CurseForgeHashes As New List(Of UInteger) + Sub() + Try + '步骤 1:获取 Hash 与对应的工程 ID + Dim CurseForgeHashes As New List(Of UInteger) + For Each Entry In Mods + CurseForgeHashes.Add(Entry.CurseForgeHash) + If Loader.IsAbortedWithThread(MainThread) Then Exit Sub + Next + Dim CurseForgeRaw = CType(CType(GetJson(DlModRequest("https://api.curseforge.com/v1/fingerprints/432", "POST", + $"{{""fingerprints"": [{CurseForgeHashes.Join(",")}]}}", "application/json")), JObject)("data")("exactMatches"), JContainer) + Log($"[Mod] 从 CurseForge 获取到 {CurseForgeRaw.Count} 个本地 Mod 的对应信息") + '步骤 2:尝试读取工程信息缓存,构建其他 Mod 的对应关系 + If Not CurseForgeRaw.Any() Then Exit Sub + Dim CurseForgeMapping As New Dictionary(Of Integer, List(Of McMod)) + For Each Project In CurseForgeRaw + Dim ProjectId = Project("id").ToString + Dim Hash As UInteger = Project("file")("fileFingerprint") For Each Entry In Mods - CurseForgeHashes.Add(Entry.CurseForgeHash) - If Loader.IsAbortedWithThread(MainThread) Then Exit Sub + If Entry.CurseForgeHash <> Hash Then Continue For + If CompProjectCache.ContainsKey(ProjectId) AndAlso Entry.Comp Is Nothing Then Entry.Comp = CompProjectCache(ProjectId) '读取已加载的缓存,加快结果出现速度 + If Not CurseForgeMapping.ContainsKey(ProjectId) Then CurseForgeMapping(ProjectId) = New List(Of McMod) + CurseForgeMapping(ProjectId).Add(Entry) + '记录对应的 CompFile + Dim File As New CompFile(Project("file"), CompType.Mod) + If Entry.CompFile Is Nothing OrElse Entry.CompFile.ReleaseDate < File.ReleaseDate Then Entry.CompFile = File Next - Dim CurseForgeRaw = CType(CType(GetJson(DlModRequest("https://api.curseforge.com/v1/fingerprints/432", "POST", - $"{{""fingerprints"": [{CurseForgeHashes.Join(",")}]}}", "application/json")), JObject)("data")("exactMatches"), JContainer) - Log($"[Mod] 从 CurseForge 获取到 {CurseForgeRaw.Count} 个本地 Mod 的对应信息") - '步骤 2:尝试读取工程信息缓存,构建其他 Mod 的对应关系 - If Not CurseForgeRaw.Any() Then Exit Sub - Dim CurseForgeMapping As New Dictionary(Of Integer, List(Of LocalCompFile)) - For Each Project In CurseForgeRaw - Dim ProjectId = Project("id").ToString - Dim Hash As UInteger = Project("file")("fileFingerprint") - For Each Entry In Mods - If Entry.CurseForgeHash <> Hash Then Continue For - If CompProjectCache.ContainsKey(ProjectId) AndAlso Entry.Comp Is Nothing Then Entry.Comp = CompProjectCache(ProjectId) '读取已加载的缓存,加快结果出现速度 - If Not CurseForgeMapping.ContainsKey(ProjectId) Then CurseForgeMapping(ProjectId) = New List(Of LocalCompFile) - CurseForgeMapping(ProjectId).Add(Entry) - '记录对应的 CompFile - Dim File As New CompFile(Project("file"), CompType.Mod) - If Entry.CompFile Is Nothing OrElse Entry.CompFile.ReleaseDate < File.ReleaseDate Then Entry.CompFile = File - Next + Next + If Loader.IsAbortedWithThread(MainThread) Then Exit Sub + Log($"[Mod] 需要从 CurseForge 获取 {CurseForgeMapping.Count} 个本地 Mod 的工程信息") + '步骤 3:获取工程信息 + If Not CurseForgeMapping.Any() Then Exit Sub + Dim CurseForgeProject = CType(GetJson(DlModRequest("https://api.curseforge.com/v1/mods", "POST", + $"{{""modIds"": [{CurseForgeMapping.Keys.Join(",")}]}}", "application/json")), JObject)("data") + Dim UpdateFileIds As New Dictionary(Of Integer, List(Of McMod)) 'FileId -> 本地 Mod 文件列表 + Dim FileIdToProjectSlug As New Dictionary(Of Integer, String) + For Each ProjectJson In CurseForgeProject + If ProjectJson("isAvailable") IsNot Nothing AndAlso Not ProjectJson("isAvailable").ToObject(Of Boolean) Then Continue For + '设置 Entry 中的工程信息 + Dim Project As New CompProject(ProjectJson) + For Each Entry In CurseForgeMapping(Project.Id) '倒查防止 CurseForge 返回的内容有漏 + If Entry.Comp IsNot Nothing AndAlso Not Entry.Comp.FromCurseForge Then + Entry.Comp = Entry.Comp '再次触发修改事件 + Continue For + End If + Entry.Comp = Project Next - If Loader.IsAbortedWithThread(MainThread) Then Exit Sub - Log($"[Mod] 需要从 CurseForge 获取 {CurseForgeMapping.Count} 个本地 Mod 的工程信息") - '步骤 3:获取工程信息 - If Not CurseForgeMapping.Any() Then Exit Sub - Dim CurseForgeProject = CType(GetJson(DlModRequest("https://api.curseforge.com/v1/mods", "POST", - $"{{""modIds"": [{CurseForgeMapping.Keys.Join(",")}]}}", "application/json")), JObject)("data") - Dim UpdateFileIds As New Dictionary(Of Integer, List(Of LocalCompFile)) 'FileId -> 本地 Mod 文件列表 - Dim FileIdToProjectSlug As New Dictionary(Of Integer, String) - For Each ProjectJson In CurseForgeProject - If ProjectJson("isAvailable") IsNot Nothing AndAlso Not ProjectJson("isAvailable").ToObject(Of Boolean) Then Continue For - '设置 Entry 中的工程信息 - Dim Project As New CompProject(ProjectJson) - For Each Entry In CurseForgeMapping(Project.Id) '倒查防止 CurseForge 返回的内容有漏 - If Entry.Comp IsNot Nothing AndAlso Not Entry.Comp.FromCurseForge Then - Entry.Comp = Entry.Comp '再次触发修改事件 - Continue For + '查找或许版本更新的文件列表 + If ModLoaders.Count = 1 Then + Dim NewestVersion As String = Nothing + Dim NewestFileIds As New List(Of Integer) + For Each IndexEntry In ProjectJson("latestFilesIndexes") + If IndexEntry("modLoader") Is Nothing OrElse ModLoaders.Single <> IndexEntry("modLoader").ToObject(Of Integer) Then Continue For 'ModLoader 唯一且匹配 + Dim IndexVersion As String = IndexEntry("gameVersion") + If IndexVersion <> McVersion Then Continue For 'MC 版本匹配 + '由于 latestFilesIndexes 是按时间从新到老排序的,所以只需取第一个;如果需要检查多个 releaseType 下的文件,将 > -1 改为 = 1,但这应当并不会获取到更新的文件 + If NewestVersion IsNot Nothing AndAlso VersionSortInteger(NewestVersion, IndexVersion) > -1 Then Continue For '只保留最新 MC 版本 + If NewestVersion <> IndexVersion Then + NewestVersion = IndexVersion + NewestFileIds.Clear() End If - Entry.Comp = Project + NewestFileIds.Add(IndexEntry("fileId").ToObject(Of Integer)) Next - '查找或许版本更新的文件列表 - If ModLoaders.Count = 1 Then - Dim NewestVersion As String = Nothing - Dim NewestFileIds As New List(Of Integer) - For Each IndexEntry In ProjectJson("latestFilesIndexes") - If IndexEntry("modLoader") Is Nothing OrElse ModLoaders.Single <> IndexEntry("modLoader").ToObject(Of Integer) Then Continue For 'ModLoader 唯一且匹配 - Dim IndexVersion As String = IndexEntry("gameVersion") - If IndexVersion <> McVersion Then Continue For 'MC 版本匹配 - '由于 latestFilesIndexes 是按时间从新到老排序的,所以只需取第一个;如果需要检查多个 releaseType 下的文件,将 > -1 改为 = 1,但这应当并不会获取到更新的文件 - If NewestVersion IsNot Nothing AndAlso VersionSortInteger(NewestVersion, IndexVersion) > -1 Then Continue For '只保留最新 MC 版本 - If NewestVersion <> IndexVersion Then - NewestVersion = IndexVersion - NewestFileIds.Clear() - End If - NewestFileIds.Add(IndexEntry("fileId").ToObject(Of Integer)) - Next - For Each FileId In NewestFileIds - If Not UpdateFileIds.ContainsKey(FileId) Then UpdateFileIds(FileId) = New List(Of LocalCompFile) - UpdateFileIds(FileId).AddRange(CurseForgeMapping(Project.Id)) - FileIdToProjectSlug(FileId) = Project.Slug - Next - End If - Next - Log($"[Mod] 已从 CurseForge 获取本地 Mod 信息,需要获取 {UpdateFileIds.Count} 个用于检查更新的文件信息") - '步骤 4:获取更新文件信息 - If Not UpdateFileIds.Any() Then Exit Sub - Dim CurseForgeFiles = CType(GetJson(DlModRequest("https://api.curseforge.com/v1/mods/files", "POST", - $"{{""fileIds"": [{UpdateFileIds.Keys.Join(",")}]}}", "application/json")), JObject)("data") - Dim UpdateFiles As New Dictionary(Of LocalCompFile, CompFile) - For Each FileJson In CurseForgeFiles - Dim File As New CompFile(FileJson, CompType.Mod) - If Not File.Available Then Continue For - For Each Entry As LocalCompFile In UpdateFileIds(File.Id) - If UpdateFiles.ContainsKey(Entry) AndAlso UpdateFiles(Entry).ReleaseDate >= File.ReleaseDate Then Continue For - UpdateFiles(Entry) = File + For Each FileId In NewestFileIds + If Not UpdateFileIds.ContainsKey(FileId) Then UpdateFileIds(FileId) = New List(Of McMod) + UpdateFileIds(FileId).AddRange(CurseForgeMapping(Project.Id)) + FileIdToProjectSlug(FileId) = Project.Slug Next + End If + Next + Log($"[Mod] 已从 CurseForge 获取本地 Mod 信息,需要获取 {UpdateFileIds.Count} 个用于检查更新的文件信息") + '步骤 4:获取更新文件信息 + If Not UpdateFileIds.Any() Then Exit Sub + Dim CurseForgeFiles = CType(GetJson(DlModRequest("https://api.curseforge.com/v1/mods/files", "POST", + $"{{""fileIds"": [{UpdateFileIds.Keys.Join(",")}]}}", "application/json")), JObject)("data") + Dim UpdateFiles As New Dictionary(Of McMod, CompFile) + For Each FileJson In CurseForgeFiles + Dim File As New CompFile(FileJson, CompType.Mod) + If Not File.Available Then Continue For + For Each Entry As McMod In UpdateFileIds(File.Id) + If UpdateFiles.ContainsKey(Entry) AndAlso UpdateFiles(Entry).ReleaseDate >= File.ReleaseDate Then Continue For + UpdateFiles(Entry) = File Next - For Each Pair In UpdateFiles - Dim Entry As LocalCompFile = Pair.Key - Dim UpdateFile As CompFile = Pair.Value - If ModeDebug Then Log($"[Mod] 本地文件 {Entry.CompFile.FileName} 在 CurseForge 上的最新版为 {UpdateFile.FileName}") - If Entry.CompFile.ReleaseDate >= UpdateFile.ReleaseDate OrElse Entry.CompFile.Hash = UpdateFile.Hash Then Continue For - '设置更新日志与更新文件 - If Entry.UpdateFile IsNot Nothing AndAlso UpdateFile.Hash = Entry.UpdateFile.Hash Then '合并 - Entry.ChangelogUrls.Add($"https://www.curseforge.com/minecraft/mc-mods/{FileIdToProjectSlug(UpdateFile.Id)}/files/{UpdateFile.Id}") - Entry.UpdateFile.DownloadUrls.AddRange(UpdateFile.DownloadUrls) '合并下载源 - ElseIf Entry.UpdateFile Is Nothing OrElse UpdateFile.ReleaseDate > Entry.UpdateFile.ReleaseDate Then '替换 - Entry.ChangelogUrls = New List(Of String) From {$"https://www.curseforge.com/minecraft/mc-mods/{FileIdToProjectSlug(UpdateFile.Id)}/files/{UpdateFile.Id}"} - Entry.UpdateFile = UpdateFile - End If - Next - Log($"[Mod] 从 CurseForge 获取 Mod 更新信息结束") - Catch ex As Exception - Log(ex, "从 CurseForge 获取本地 Mod 信息失败") - IsFailed = True - Finally - EndedThreadCount += 1 - End Try - End Sub, "Mod List Detail Loader CurseForge") + Next + For Each Pair In UpdateFiles + Dim Entry As McMod = Pair.Key + Dim UpdateFile As CompFile = Pair.Value + If ModeDebug Then Log($"[Mod] 本地文件 {Entry.CompFile.FileName} 在 CurseForge 上的最新版为 {UpdateFile.FileName}") + If Entry.CompFile.ReleaseDate >= UpdateFile.ReleaseDate OrElse Entry.CompFile.Hash = UpdateFile.Hash Then Continue For + '设置更新日志与更新文件 + If Entry.UpdateFile IsNot Nothing AndAlso UpdateFile.Hash = Entry.UpdateFile.Hash Then '合并 + Entry.ChangelogUrls.Add($"https://www.curseforge.com/minecraft/mc-mods/{FileIdToProjectSlug(UpdateFile.Id)}/files/{UpdateFile.Id}") + Entry.UpdateFile.DownloadUrls.AddRange(UpdateFile.DownloadUrls) '合并下载源 + ElseIf Entry.UpdateFile Is Nothing OrElse UpdateFile.ReleaseDate > Entry.UpdateFile.ReleaseDate Then '替换 + Entry.ChangelogUrls = New List(Of String) From {$"https://www.curseforge.com/minecraft/mc-mods/{FileIdToProjectSlug(UpdateFile.Id)}/files/{UpdateFile.Id}"} + Entry.UpdateFile = UpdateFile + End If + Next + Log($"[Mod] 从 CurseForge 获取 Mod 更新信息结束") + Catch ex As Exception + Log(ex, "从 CurseForge 获取本地 Mod 信息失败") + IsFailed = True + Finally + EndedThreadCount += 1 + End Try + End Sub, "Mod List Detail Loader CurseForge") '等待线程结束 Do Until EndedThreadCount = 2 If Loader.IsAborted Then Exit Sub @@ -1134,32 +1125,23 @@ Finished: Entry.CompLoaded = Not IsFailed Cache(Entry.ModrinthHash & McVersion & ModLoaders.Join("")) = Entry.ToJson() Next - WriteFile(PathTemp & "Cache\LocalComp.json", Cache.ToString(If(ModeDebug, Newtonsoft.Json.Formatting.Indented, Newtonsoft.Json.Formatting.None))) + WriteFile(PathTemp & "Cache\LocalMod.json", Cache.ToString(If(ModeDebug, Newtonsoft.Json.Formatting.Indented, Newtonsoft.Json.Formatting.None))) '刷新边栏 If FrmVersionMod?.Filter = PageVersionMod.FilterType.CanUpdate Then - RunInUi(Sub() Loader.Input.Frm?.RefreshUI()) '同步 “可更新” 列表 (#4677) + RunInUi(Sub() FrmVersionMod?.RefreshUI()) '同步 “可更新” 列表 (#4677) Else - RunInUi(Sub() Loader.Input.Frm?.RefreshBars()) + RunInUi(Sub() FrmVersionMod?.RefreshBars()) End If End Sub - - Public Function GetCurrentVersionModLoader() As List(Of CompLoaderType) - Dim ModLoaders As New List(Of CompLoaderType) - If PageVersionLeft.Version.Version.HasForge Then ModLoaders.Add(CompLoaderType.Forge) - If PageVersionLeft.Version.Version.HasNeoForge Then ModLoaders.Add(CompLoaderType.NeoForge) - If PageVersionLeft.Version.Version.HasFabric Then ModLoaders.Add(CompLoaderType.Fabric) - If PageVersionLeft.Version.Version.HasLiteLoader Then ModLoaders.Add(CompLoaderType.LiteLoader) - If Not ModLoaders.Any() Then ModLoaders.AddRange({CompLoaderType.Forge, CompLoaderType.NeoForge, CompLoaderType.Fabric, CompLoaderType.LiteLoader, CompLoaderType.Quilt}) + Public Function GetTargetModLoaders() As List(Of CompModLoaderType) + Dim ModLoaders As New List(Of CompModLoaderType) + If PageVersionLeft.Version.Version.HasForge Then ModLoaders.Add(CompModLoaderType.Forge) + If PageVersionLeft.Version.Version.HasNeoForge Then ModLoaders.Add(CompModLoaderType.NeoForge) + If PageVersionLeft.Version.Version.HasFabric Then ModLoaders.Add(CompModLoaderType.Fabric) + If PageVersionLeft.Version.Version.HasLiteLoader Then ModLoaders.Add(CompModLoaderType.LiteLoader) + If Not ModLoaders.Any() Then ModLoaders.AddRange({CompModLoaderType.Forge, CompModLoaderType.NeoForge, CompModLoaderType.Fabric, CompModLoaderType.LiteLoader, CompModLoaderType.Quilt}) Return ModLoaders End Function - Public Function GetPathNameByCompType(TheType As CompType) As String - Select Case TheType - Case CompType.Mod : Return "mods" - Case CompType.ResourcePack : Return "resourcepacks" - Case CompType.Shader : Return "shaderpacks" - End Select - Return "Nothing" - End Function #If DEBUG Then ''' diff --git a/Plain Craft Launcher 2/Modules/Minecraft/MyLocalCompItem.xaml b/Plain Craft Launcher 2/Modules/Minecraft/MyLocalCompItem.xaml deleted file mode 100644 index 35a4b7652..000000000 --- a/Plain Craft Launcher 2/Modules/Minecraft/MyLocalCompItem.xaml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Plain Craft Launcher 2/Modules/Minecraft/MyLocalCompItem.xaml.vb b/Plain Craft Launcher 2/Modules/Minecraft/MyLocalCompItem.xaml.vb deleted file mode 100644 index 10789fbce..000000000 --- a/Plain Craft Launcher 2/Modules/Minecraft/MyLocalCompItem.xaml.vb +++ /dev/null @@ -1,568 +0,0 @@ -Imports System.Windows.Forms - -Public Class MyLocalCompItem - -#Region "基础属性" - Public Uuid As Integer = GetUuid() - - 'Logo - Public Property Logo As String - Get - Return PathLogo.Source - End Get - Set(value As String) - PathLogo.Source = value - End Set - End Property - - '标题 - Private _Title As String - Public Property Title As String - Get - Return _Title - End Get - Set(value As String) - Dim RawValue = value - Select Case Entry.State - Case LocalCompFile.LocalFileStatus.Fine - LabTitle.TextDecorations = Nothing - Case LocalCompFile.LocalFileStatus.Disabled - LabTitle.TextDecorations = TextDecorations.Strikethrough - Case LocalCompFile.LocalFileStatus.Unavailable - LabTitle.TextDecorations = TextDecorations.Strikethrough - value &= " [错误]" - End Select - If LabTitle.Text = value Then Exit Property - LabTitle.Text = value - _Title = RawValue - End Set - End Property - - '副标题 - Public Property SubTitle As String - Get - Return If(LabSubtitle?.Text, "") - End Get - Set(value As String) - If LabSubtitle.Text = value Then Exit Property - LabSubtitle.Text = value - LabSubtitle.Visibility = If(value = "", Visibility.Collapsed, Visibility.Visible) - End Set - End Property - - '描述 - Public Property Description As String - Get - Return LabInfo.Text - End Get - Set(value As String) - If LabInfo.Text = value Then Exit Property - LabInfo.Text = value - End Set - End Property - - 'Tag - Public WriteOnly Property Tags As List(Of String) - Set(value As List(Of String)) - PanTags.Children.Clear() - PanTags.Visibility = If(value.Any(), Visibility.Visible, Visibility.Collapsed) - For Each TagText In value - Dim NewTag = GetObjectFromXML( - " - - ") - PanTags.Children.Add(NewTag) - Next - End Set - End Property - - '相关联的 Mod - Public Property Entry As LocalCompFile - Get - Return Tag - End Get - Set(value As LocalCompFile) - Tag = value - End Set - End Property - -#End Region - -#Region "点击与勾选" - - '触发点击事件 - Public Event Click(sender As Object, e As MouseButtonEventArgs) - Private Sub Button_MouseUp(sender As Object, e As MouseButtonEventArgs) Handles Me.PreviewMouseLeftButtonUp - If IsMouseDown Then - RaiseEvent Click(sender, e) - If e.Handled Then Exit Sub - Log("[Control] 按下本地 Mod 列表项:" & LabTitle.Text) - End If - End Sub - - '鼠标点击判定 - Private IsMouseDown As Boolean = False - Private Sub Button_MouseDown(sender As Object, e As MouseButtonEventArgs) Handles Me.PreviewMouseLeftButtonDown - If Not IsMouseDirectlyOver Then Exit Sub - IsMouseDown = True - If ButtonStack IsNot Nothing Then ButtonStack.IsHitTestVisible = False - End Sub - Private Sub Button_MouseLeave(sender As Object, e As Object) Handles Me.MouseLeave, Me.PreviewMouseLeftButtonUp - IsMouseDown = False - If ButtonStack IsNot Nothing Then ButtonStack.IsHitTestVisible = True - End Sub - - Public Class SwipeSelect - Public Property Start As Integer - Public Property [End] As Integer - Public Property Swiping As Boolean - Public Property SwipeToState As Boolean - Public Property TargetFrm As PageVersionCompResource - End Class - - Public Property CurrentSwipe As SwipeSelect - - '滑动选中 - Private Sub Button_MouseSwipeStart(sender As Object, e As Object) Handles Me.MouseLeftButtonDown - If Parent Is Nothing OrElse CurrentSwipe Is Nothing Then Exit Sub 'Mod 可能已被删除(#3824) - '开始滑动 - Dim Index = CType(Parent, StackPanel).Children.IndexOf(Me) - CurrentSwipe.Start = Index - CurrentSwipe.End = Index - CurrentSwipe.Swiping = True - CurrentSwipe.SwipeToState = Not Checked - CurrentSwipe.TargetFrm.CardSelect.IsHitTestVisible = False '暂时禁用下边栏 - End Sub - Private Sub Button_MouseSwipe(sender As Object, e As Object) Handles Me.MouseEnter, Me.MouseLeave, Me.MouseLeftButtonUp - If Parent Is Nothing OrElse CurrentSwipe Is Nothing Then Exit Sub 'Mod 可能已被删除(#3824) - '结束滑动 - If Mouse.LeftButton <> MouseButtonState.Pressed OrElse Not CurrentSwipe.Swiping Then - CurrentSwipe.Swiping = False - CurrentSwipe.TargetFrm.CardSelect.IsHitTestVisible = True - Exit Sub - End If - '计算滑动范围 - Dim Elements = CType(Parent, StackPanel).Children - Dim Index As Integer = Elements.IndexOf(Me) -<<<<<<<< HEAD:Plain Craft Launcher 2/Modules/Minecraft/MyLocalCompItem.xaml.vb - CurrentSwipe.Start = MathClamp(Math.Min(CurrentSwipe.Start, Index), 0, Elements.Count - 1) - CurrentSwipe.End = MathClamp(Math.Max(CurrentSwipe.End, Index), 0, Elements.Count - 1) - '勾选所有范围中的项 - If CurrentSwipe.Start = CurrentSwipe.End Then Exit Sub - For i = CurrentSwipe.Start To CurrentSwipe.End - Dim Item As MyLocalCompItem = Elements(i) -======== - SwipeStart = MathClamp(Math.Min(SwipeStart, Index), 0, Elements.Count - 1) - SwipeEnd = MathClamp(Math.Max(SwipeEnd, Index), 0, Elements.Count - 1) - '勾选所有范围中的项 - If SwipeStart = SwipeEnd Then Exit Sub - For i = SwipeStart To SwipeEnd - Dim Item As MyLocalModItem = Elements(i) ->>>>>>>> main:Plain Craft Launcher 2/Pages/PageVersion/MyLocalModItem.xaml.vb - Item.InitLate(Item, e) - Item.Checked = CurrentSwipe.SwipeToState - Next - End Sub - - '勾选状态 - Public Event Check(sender As Object, e As RouteEventArgs) - Public Event Changed(sender As Object, e As RouteEventArgs) - Private _Checked As Boolean = False - Public Property Checked As Boolean - Get - Return _Checked - End Get - Set(value As Boolean) - Try - '触发属性值修改 - Dim RawValue = _Checked - If value = _Checked Then Exit Property - _Checked = value - Dim ChangedEventArgs As New RouteEventArgs(False) - If IsInitialized Then - RaiseEvent Changed(Me, ChangedEventArgs) - If ChangedEventArgs.Handled Then - _Checked = RawValue - Exit Property - End If - End If - If value Then - Dim CheckEventArgs As New RouteEventArgs(False) - RaiseEvent Check(Me, CheckEventArgs) - If CheckEventArgs.Handled Then Exit Property - End If - '更改动画 - If IsVisibleInForm() Then - Dim Anim As New List(Of AniData) - If Checked Then - '由无变有 - Dim Delta = 32 - RectCheck.ActualHeight - Anim.Add(AaHeight(RectCheck, Delta * 0.4, 200,, New AniEaseOutFluent(AniEasePower.Weak))) - Anim.Add(AaHeight(RectCheck, Delta * 0.6, 300,, New AniEaseOutBack(AniEasePower.Weak))) - Anim.Add(AaOpacity(RectCheck, 1 - RectCheck.Opacity, 30)) - RectCheck.VerticalAlignment = VerticalAlignment.Center - RectCheck.Margin = New Thickness(-3, 0, 0, 0) - Anim.Add(AaColor(LabTitle, TextBlock.ForegroundProperty, If(Entry.State = LocalCompFile.LocalFileStatus.Fine, "ColorBrush2", "ColorBrush5"), 200)) - Else - '由有变无 - Anim.Add(AaHeight(RectCheck, -RectCheck.ActualHeight, 120,, New AniEaseInFluent(AniEasePower.Weak))) - Anim.Add(AaOpacity(RectCheck, -RectCheck.Opacity, 70, 40)) - RectCheck.VerticalAlignment = VerticalAlignment.Center - Anim.Add(AaColor(LabTitle, TextBlock.ForegroundProperty, If(LabTitle.TextDecorations Is Nothing, "ColorBrush1", "ColorBrushGray4"), 120)) - End If - AniStart(Anim, "MyLocalModItem Checked " & Uuid) - Else - '不在窗口上时直接设置 - RectCheck.VerticalAlignment = VerticalAlignment.Center - RectCheck.Margin = New Thickness(-3, 0, 0, 0) - If Checked Then - RectCheck.Height = 32 - RectCheck.Opacity = 1 - LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = LocalCompFile.LocalFileStatus.Fine, "ColorBrush2", "ColorBrush5")) - Else - RectCheck.Height = 0 - RectCheck.Opacity = 0 - LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = LocalCompFile.LocalFileStatus.Fine, "ColorBrush1", "ColorBrushGray4")) - End If - AniStop("MyLocalModItem Checked " & Uuid) - End If - Catch ex As Exception - Log(ex, "设置 Checked 失败") - End Try - End Set - End Property - - -#End Region - -#Region "后加载内容" - - '右下角状态指示图标 - Private ImgState As Image - - '指向背景 - Private _RectBack As Border = Nothing - Public ReadOnly Property RectBack As Border - Get - If _RectBack Is Nothing Then - Dim Rect As New Border With { - .Name = "RectBack", - .CornerRadius = New CornerRadius(3), - .RenderTransform = New ScaleTransform(0.8, 0.8), - .RenderTransformOrigin = New Point(0.5, 0.5), - .BorderThickness = New Thickness(GetWPFSize(1)), - .SnapsToDevicePixels = True, - .IsHitTestVisible = False, - .Opacity = 0 - } - Rect.SetResourceReference(Border.BackgroundProperty, "ColorBrush7") - Rect.SetResourceReference(Border.BorderBrushProperty, "ColorBrush6") - SetColumnSpan(Rect, 999) - SetRowSpan(Rect, 999) - Children.Insert(0, Rect) - _RectBack = Rect - ' - End If - Return _RectBack - End Get - End Property - - '按钮 - Public ButtonHandler As Action(Of MyLocalCompItem, EventArgs) - Public ButtonStack As FrameworkElement - Private _Buttons As IEnumerable(Of MyIconButton) - Public Property Buttons As IEnumerable(Of MyIconButton) - Get - Return _Buttons - End Get - Set(value As IEnumerable(Of MyIconButton)) - _Buttons = value - '移除原 Stack - If ButtonStack IsNot Nothing Then - Children.Remove(ButtonStack) - ButtonStack = Nothing - End If - If Not value.Any() Then Exit Property - '添加新 Stack - ButtonStack = New StackPanel With {.Opacity = 0, .Margin = New Thickness(0, 0, 5, 0), .SnapsToDevicePixels = False, .Orientation = Orientation.Horizontal, - .HorizontalAlignment = HorizontalAlignment.Right, .VerticalAlignment = VerticalAlignment.Center, .UseLayoutRounding = False} - SetColumnSpan(ButtonStack, 10) : SetRowSpan(ButtonStack, 10) - '构造按钮 - For Each Btn As MyIconButton In value - If Btn.Height.Equals(Double.NaN) Then Btn.Height = 25 - If Btn.Width.Equals(Double.NaN) Then Btn.Width = 25 - CType(ButtonStack, StackPanel).Children.Add(Btn) - Next - Children.Add(ButtonStack) - End Set - End Property - - '勾选条 - Private _RectCheck As Border - Public ReadOnly Property RectCheck As Border - Get - If _RectCheck Is Nothing Then - _RectCheck = New Border With {.Width = 5, .Height = If(Checked, Double.NaN, 0), .CornerRadius = New CornerRadius(2, 2, 2, 2), - .VerticalAlignment = If(Checked, VerticalAlignment.Stretch, VerticalAlignment.Center), - .HorizontalAlignment = HorizontalAlignment.Left, .UseLayoutRounding = False, .SnapsToDevicePixels = False, - .Margin = If(Checked, New Thickness(-3, 6, 0, 6), New Thickness(-3, 0, 0, 0))} - _RectCheck.SetResourceReference(Border.BackgroundProperty, "ColorBrush3") - SetRowSpan(_RectCheck, 10) - Children.Add(_RectCheck) - End If - Return _RectCheck - End Get - End Property - -#End Region - - Private Function GetUpdateCompareDescription() As String - Dim CurrentName = Entry.CompFile.FileName.Replace(".jar", "") - Dim NewestName = Entry.UpdateFile.FileName.Replace(".jar", "") - '简化名称对比 - Dim CurrentSegs = CurrentName.Split("-"c).ToList() - Dim NewestSegs = NewestName.Split("-"c).ToList() - Dim Shortened As Boolean = False - For Each Seg In CurrentSegs.ToList() - If Not NewestSegs.Contains(Seg) Then Continue For - CurrentSegs.Remove(Seg) - NewestSegs.Remove(Seg) - Shortened = True - Next - If Shortened AndAlso CurrentSegs.Any() AndAlso NewestSegs.Any() Then - CurrentName = Join(CurrentSegs, "-") - NewestName = Join(NewestSegs, "-") - Entry._Version = CurrentName '使用网络信息作为显示的版本号 - End If - Return $"当前版本:{CurrentName}({GetTimeSpanString(Entry.CompFile.ReleaseDate - Date.Now, False)}){vbCrLf}最新版本:{NewestName}({GetTimeSpanString(Entry.UpdateFile.ReleaseDate - Date.Now, False)})" - End Function - Public Sub Refresh() Handles Me.Loaded - RunInUi( - Sub() - '更新 - If Entry.CanUpdate Then - BtnUpdate.Visibility = Visibility.Visible - BtnUpdate.ToolTip = $"{GetUpdateCompareDescription()}{vbCrLf}点击以更新,右键查看更新日志。" - Else - BtnUpdate.Visibility = Visibility.Collapsed - End If - '标题与描述 - Dim DescFileName As String - Select Case Entry.State - Case LocalCompFile.LocalFileStatus.Fine - DescFileName = GetFileNameWithoutExtentionFromPath(Entry.Path) - Case LocalCompFile.LocalFileStatus.Disabled - DescFileName = GetFileNameWithoutExtentionFromPath(Entry.Path.Replace(".disabled", "").Replace(".old", "")) - Case Else 'McMod.McModState.Unavailable - DescFileName = GetFileNameFromPath(Entry.Path) - End Select - Dim NewDescription As String - If Setup.Get("ToolModLocalNameStyle") = 1 Then - '标题显示文件名,详情显示译名 - '标题 - Title = DescFileName - SubTitle = "" - '描述 - If Entry.Comp Is Nothing Then - NewDescription = Entry.Name - Else - Dim Titles = Entry.Comp.GetControlTitle(False) - NewDescription = Titles.Key & Titles.Value - End If - NewDescription = NewDescription.Replace(" | ", " / ") - If Entry.Version IsNot Nothing Then NewDescription &= $" ({Entry.Version})" - Else - '标题显示译名,详情显示文件名 - '标题 - If Entry.Comp Is Nothing Then - Title = Entry.Name - SubTitle = If(Entry.Version Is Nothing, "", " | " & Entry.Version) - Else - Dim Titles = Entry.Comp.GetControlTitle(False) - Title = Titles.Key - SubTitle = Titles.Value & If(Entry.Version Is Nothing, "", " | " & Entry.Version) - End If - '描述 - NewDescription = DescFileName - End If - If Entry.Comp IsNot Nothing Then - NewDescription += ": " & Entry.Comp.Description.Replace(vbCr, "").Replace(vbLf, "") - ElseIf Entry.Description IsNot Nothing Then - NewDescription += ": " & Entry.Description.Replace(vbCr, "").Replace(vbLf, "") - ElseIf Not Entry.IsFileAvailable Then - NewDescription += ": " & "存在错误,无法获取信息" - End If - Description = NewDescription - If Checked Then - LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = LocalCompFile.LocalFileStatus.Fine, "ColorBrush2", "ColorBrush5")) - Else - LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = LocalCompFile.LocalFileStatus.Fine, "ColorBrush1", "ColorBrushGray4")) - End If - '主 Logo - Logo = If(Entry.Comp Is Nothing, PathImage & "Icons/NoIcon.png", Entry.Comp.GetControlLogo()) - '图标右下角的 Logo - If Entry.State = LocalCompFile.LocalFileStatus.Fine Then - If ImgState IsNot Nothing Then - Children.Remove(ImgState) - ImgState = Nothing - End If - Else - If ImgState Is Nothing Then - ImgState = New Image With { - .Width = 20, .Height = 20, .Margin = New Thickness(0, 0, -5, -3), .IsHitTestVisible = False, - .HorizontalAlignment = HorizontalAlignment.Right, .VerticalAlignment = VerticalAlignment.Bottom - } - RenderOptions.SetBitmapScalingMode(ImgState, BitmapScalingMode.HighQuality) - SetColumn(ImgState, 1) : SetRow(ImgState, 1) : SetRowSpan(ImgState, 2) - Children.Add(ImgState) - ' - End If - ImgState.Source = New MyBitmap(PathImage & $"Icons/{Entry.State}.png") - End If - '标签 - If Entry.Comp IsNot Nothing Then Tags = Entry.Comp.Tags - End Sub) - End Sub - - Public Sub RefreshColor(sender As Object, e As EventArgs) Handles Me.MouseEnter, Me.MouseLeave, Me.MouseLeftButtonDown, Me.MouseLeftButtonUp, Me.Changed - InitLate(sender, e) - '触发颜色动画 - Dim Time As Integer = If(IsMouseOver, 120, 180) - Dim Ani As New List(Of AniData) - 'ButtonStack - If ButtonStack IsNot Nothing Then - If IsMouseOver Then - Ani.Add(AaOpacity(ButtonStack, 1 - ButtonStack.Opacity, Time * 0.7, Time * 0.3)) - Ani.Add(AaDouble(Sub(i) ColumnPaddingRight.Width = New GridLength(Math.Max(0, ColumnPaddingRight.Width.Value + i)), - 5 + Buttons.Count * 25 - ColumnPaddingRight.Width.Value, Time * 0.3, Time * 0.7)) - Else - Ani.Add(AaOpacity(ButtonStack, -ButtonStack.Opacity, Time * 0.4)) - Ani.Add(AaDouble(Sub(i) ColumnPaddingRight.Width = New GridLength(Math.Max(0, ColumnPaddingRight.Width.Value + i)), - 4 - ColumnPaddingRight.Width.Value, Time * 0.4)) - End If - End If - 'RectBack - If IsMouseOver OrElse Checked Then - Ani.AddRange({ - AaColor(RectBack, Border.BackgroundProperty, If(IsMouseDown, "ColorBrush6", "ColorBrushBg1"), Time), - AaOpacity(RectBack, 1 - RectBack.Opacity, Time,, New AniEaseOutFluent) - }) - If IsMouseDown Then - Ani.Add(AaScaleTransform(RectBack, 0.996 - CType(RectBack.RenderTransform, ScaleTransform).ScaleX, Time * 1.2,, New AniEaseOutFluent)) - Else - Ani.Add(AaScaleTransform(RectBack, 1 - CType(RectBack.RenderTransform, ScaleTransform).ScaleX, Time * 1.2,, New AniEaseOutFluent)) - End If - Else - Ani.AddRange({ - AaOpacity(RectBack, -RectBack.Opacity, Time), - AaScaleTransform(RectBack, 0.996 - CType(RectBack.RenderTransform, ScaleTransform).ScaleX, Time,, New AniEaseOutFluent), - AaScaleTransform(RectBack, -0.196, 1,,, True) - }) - End If - AniStart(Ani, "LocalModItem Color " & Uuid) - End Sub - - '触发虚拟化内容 - Private Sub InitLate(sender As Object, e As EventArgs) - If ButtonHandler IsNot Nothing Then - ButtonHandler(sender, e) - ButtonHandler = Nothing - End If - End Sub - - '显示更新日志 - Private Sub BtnUpdate_PreviewMouseRightButtonUp(sender As Object, e As MouseButtonEventArgs) Handles BtnUpdate.PreviewMouseRightButtonUp - e.Handled = True - ShowUpdateLog() - End Sub - Private Sub ShowUpdateLog() - Dim CurseForgeUrl As String = Entry.ChangelogUrls.FirstOrDefault(Function(x) x.Contains("curseforge.com")) - Dim ModrinthUrl As String = Entry.ChangelogUrls.FirstOrDefault(Function(x) x.Contains("modrinth.com")) - If CurseForgeUrl Is Nothing OrElse ModrinthUrl Is Nothing Then - OpenWebsite(Entry.ChangelogUrls.First) - Else - Select Case MyMsgBox("要在哪个网站上查看更新日志?", "查看更新日志", "Modrinth", "CurseForge", "取消") - Case 1 - OpenWebsite(ModrinthUrl) - Case 2 - OpenWebsite(CurseForgeUrl) - End Select - End If - End Sub - - '触发更新 - Private Sub BtnUpdate_Click(sender As Object, e As EventArgs) Handles BtnUpdate.Click -<<<<<<<< HEAD:Plain Craft Launcher 2/Modules/Minecraft/MyLocalCompItem.xaml.vb - If MyMsgBox($"是否要更新 {Entry.Name}?{vbCrLf}{vbCrLf}{GetUpdateCompareDescription()}", "更新确认", "更新", "取消") = 2 Then Return - Select Case Entry.Comp.Type - Case CompType.Mod : FrmVersionMod.UpdateResource({Entry}) - Case CompType.ResourcePack : FrmVersionResourcePack.UpdateResource({Entry}) - Case CompType.Shader : FrmVersionShader.UpdateResource({Entry}) -======== - Select Case MyMsgBox($"是否要更新 {Entry.Name}?{vbCrLf}{vbCrLf}{GetUpdateCompareDescription()}", "Mod 更新确认", "更新", "查看更新日志", "取消") - Case 1 '更新 - FrmVersionMod.UpdateMods({Entry}) - Case 2 '查看更新日志 - ShowUpdateLog() - Case 3 '取消 ->>>>>>>> main:Plain Craft Launcher 2/Pages/PageVersion/MyLocalModItem.xaml.vb - End Select - End Sub - - '自适应(#4465) - Private Sub PanTitle_SizeChanged() Handles PanTitle.SizeChanged - '0:全部舒展:Auto - Auto - (Auto) - 1* - '1:压缩 Subtitle:Auto - 1* - (Auto) - 0 - '2:继续压缩 Title:1* - 0 - (Auto) - 0 - Dim CurrentCompressLevel As Integer = - If(ColumnExtend.Width.IsStar, 0, If(ColumnTitle.Width.IsStar, 2, 1)) 'Subtitle 可能是 Collapsed - Dim NewCompressLevel As Integer - Select Case CurrentCompressLevel - Case 0 - If ColumnExtend.ActualWidth < 0.5 Then - NewCompressLevel = If(LabSubtitle.Visibility = Visibility.Collapsed, 2, 1) - Else - Return - End If - Case 1 - If ColumnSubtitle.ActualWidth < 0.5 Then - NewCompressLevel = 2 - ElseIf Not LabSubtitle.IsTextTrimmed Then - NewCompressLevel = 0 - Else - Return - End If - Case 2 - If Not LabTitle.IsTextTrimmed Then - NewCompressLevel = If(LabSubtitle.Visibility = Visibility.Collapsed, 0, 1) - Else - Return - End If - End Select - Select Case NewCompressLevel - Case 0 - '全部舒展:Auto - Auto - (Auto) - 1* - ColumnTitle.Width = GridLength.Auto - ColumnSubtitle.Width = GridLength.Auto - ColumnExtend.Width = New GridLength(1, GridUnitType.Star) - Case 1 - '压缩 Subtitle:Auto - 1* - (Auto) - 0 - ColumnTitle.Width = GridLength.Auto - ColumnSubtitle.Width = New GridLength(1, GridUnitType.Star) - ColumnExtend.Width = New GridLength(0, GridUnitType.Pixel) - Case 2 - '继续压缩 Title:1* - 0 - (Auto) - 0 - ColumnTitle.Width = New GridLength(1, GridUnitType.Star) - ColumnSubtitle.Width = New GridLength(0, GridUnitType.Pixel) - ColumnExtend.Width = New GridLength(0, GridUnitType.Pixel) - End Select - End Sub - -End Class diff --git a/Plain Craft Launcher 2/Modules/ModMain.vb b/Plain Craft Launcher 2/Modules/ModMain.vb index edaf014fe..2daca5220 100644 --- a/Plain Craft Launcher 2/Modules/ModMain.vb +++ b/Plain Craft Launcher 2/Modules/ModMain.vb @@ -434,12 +434,8 @@ EndHint: '版本设置页面声明 Public FrmVersionLeft As PageVersionLeft Public FrmVersionOverall As PageVersionOverall - Public FrmVersionMod As PageVersionCompResource + Public FrmVersionMod As PageVersionMod Public FrmVersionModDisabled As PageVersionModDisabled - Public FrmVersionScreenshot As PageVersionScreenshot - Public FrmVersionWorld As PageVersionWorld - Public FrmVersionShader As PageVersionCompResource - Public FrmVersionResourcePack As PageVersionCompResource Public FrmVersionSetup As PageVersionSetup Public FrmVersionExport As PageVersionExport diff --git a/Plain Craft Launcher 2/Pages/PageDownload/Comp/PageComp.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/Comp/PageComp.xaml.vb index 7a4be2e3e..f5c48e696 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/Comp/PageComp.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/Comp/PageComp.xaml.vb @@ -112,8 +112,8 @@ Public Class PageComp If PageType = CompType.Mod Then '只有 Mod 考虑加载器 ModLoader = Val(ComboSearchLoader.SelectedItem.Tag) If GameVersion IsNot Nothing AndAlso GameVersion.Contains(".") AndAlso Val(GameVersion.Split(".")(1)) < 14 AndAlso '1.14- - ModLoader = CompLoaderType.Forge Then '选择了 Forge - ModLoader = CompLoaderType.Any '此时,视作没有筛选 Mod Loader(因为部分老 Mod 没有设置自己支持的加载器) + ModLoader = CompModLoaderType.Forge Then '选择了 Forge + ModLoader = CompModLoaderType.Any '此时,视作没有筛选 Mod Loader(因为部分老 Mod 没有设置自己支持的加载器) End If End If With Request diff --git a/Plain Craft Launcher 2/Pages/PageDownload/Comp/PageDownloadCompDetail.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/Comp/PageDownloadCompDetail.xaml.vb index eb05d6146..2da61ccd9 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/Comp/PageDownloadCompDetail.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/Comp/PageDownloadCompDetail.xaml.vb @@ -157,7 +157,7 @@ Version.Type = CompType.Mod AndAlso '是 Mod VerName.StartsWith("1.") Then '不是 “快照版本” 之类的 For Each Loader In Version.ModLoaders - If Loader = CompLoaderType.Quilt AndAlso Setup.Get("ToolDownloadIgnoreQuilt") Then Continue For + If Loader = CompModLoaderType.Quilt AndAlso Setup.Get("ToolDownloadIgnoreQuilt") Then Continue For If SupportedLoaders.Contains(Loader) Then Loaders.Add(Loader.ToString & " ") Next End If @@ -175,7 +175,7 @@ Dict.Add(TargetCardName, New List(Of CompFile)) For Each Version As CompFile In Results If Version.GameVersions.Contains(TargetVersion) AndAlso - (TargetLoader = CompLoaderType.Any OrElse Version.ModLoaders.Contains(TargetLoader)) Then + (TargetLoader = CompModLoaderType.Any OrElse Version.ModLoaders.Contains(TargetLoader)) Then '检查是否符合版本筛选器 If VersionFilter IsNot Nothing AndAlso Not Version.GameVersions.Any(Function(v) GetGroupedVersionName(v, IsMajorVersionFilter, True) = VersionFilter) Then Continue For @@ -323,11 +323,11 @@ '获取 Mod 所需的加载器种类 Dim AllowForge As Boolean? = Nothing, AllowFabric As Boolean? = Nothing If File.ModLoaders.Any Then '从文件中获取 - AllowForge = File.ModLoaders.Contains(CompLoaderType.Forge) OrElse File.ModLoaders.Contains(CompLoaderType.NeoForge) - AllowFabric = File.ModLoaders.Contains(CompLoaderType.Fabric) + AllowForge = File.ModLoaders.Contains(CompModLoaderType.Forge) OrElse File.ModLoaders.Contains(CompModLoaderType.NeoForge) + AllowFabric = File.ModLoaders.Contains(CompModLoaderType.Fabric) ElseIf Project.ModLoaders.Any Then '从工程中获取 - AllowForge = Project.ModLoaders.Contains(CompLoaderType.Forge) OrElse File.ModLoaders.Contains(CompLoaderType.NeoForge) - AllowFabric = Project.ModLoaders.Contains(CompLoaderType.Fabric) + AllowForge = Project.ModLoaders.Contains(CompModLoaderType.Forge) OrElse File.ModLoaders.Contains(CompModLoaderType.NeoForge) + AllowFabric = Project.ModLoaders.Contains(CompModLoaderType.Fabric) End If If AllowForge IsNot Nothing AndAlso Not AllowForge AndAlso AllowFabric IsNot Nothing AndAlso Not AllowFabric Then diff --git a/Plain Craft Launcher 2/Pages/PageVersion/MyLocalModItem.xaml b/Plain Craft Launcher 2/Pages/PageVersion/MyLocalModItem.xaml index 35a4b7652..445f44b8d 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/MyLocalModItem.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/MyLocalModItem.xaml @@ -1,4 +1,4 @@ - MouseButtonState.Pressed OrElse Not CurrentSwipe.Swiping Then - CurrentSwipe.Swiping = False - CurrentSwipe.TargetFrm.CardSelect.IsHitTestVisible = True + If Mouse.LeftButton <> MouseButtonState.Pressed OrElse Not Swiping Then + Swiping = False + FrmVersionMod.CardSelect.IsHitTestVisible = True Exit Sub End If '计算滑动范围 Dim Elements = CType(Parent, StackPanel).Children Dim Index As Integer = Elements.IndexOf(Me) -<<<<<<<< HEAD:Plain Craft Launcher 2/Modules/Minecraft/MyLocalCompItem.xaml.vb - CurrentSwipe.Start = MathClamp(Math.Min(CurrentSwipe.Start, Index), 0, Elements.Count - 1) - CurrentSwipe.End = MathClamp(Math.Max(CurrentSwipe.End, Index), 0, Elements.Count - 1) - '勾选所有范围中的项 - If CurrentSwipe.Start = CurrentSwipe.End Then Exit Sub - For i = CurrentSwipe.Start To CurrentSwipe.End - Dim Item As MyLocalCompItem = Elements(i) -======== SwipeStart = MathClamp(Math.Min(SwipeStart, Index), 0, Elements.Count - 1) SwipeEnd = MathClamp(Math.Max(SwipeEnd, Index), 0, Elements.Count - 1) '勾选所有范围中的项 If SwipeStart = SwipeEnd Then Exit Sub For i = SwipeStart To SwipeEnd Dim Item As MyLocalModItem = Elements(i) ->>>>>>>> main:Plain Craft Launcher 2/Pages/PageVersion/MyLocalModItem.xaml.vb Item.InitLate(Item, e) - Item.Checked = CurrentSwipe.SwipeToState + Item.Checked = SwipToState Next End Sub @@ -204,7 +188,7 @@ Public Class MyLocalCompItem Anim.Add(AaOpacity(RectCheck, 1 - RectCheck.Opacity, 30)) RectCheck.VerticalAlignment = VerticalAlignment.Center RectCheck.Margin = New Thickness(-3, 0, 0, 0) - Anim.Add(AaColor(LabTitle, TextBlock.ForegroundProperty, If(Entry.State = LocalCompFile.LocalFileStatus.Fine, "ColorBrush2", "ColorBrush5"), 200)) + Anim.Add(AaColor(LabTitle, TextBlock.ForegroundProperty, If(Entry.State = McMod.McModState.Fine, "ColorBrush2", "ColorBrush5"), 200)) Else '由有变无 Anim.Add(AaHeight(RectCheck, -RectCheck.ActualHeight, 120,, New AniEaseInFluent(AniEasePower.Weak))) @@ -220,11 +204,11 @@ Public Class MyLocalCompItem If Checked Then RectCheck.Height = 32 RectCheck.Opacity = 1 - LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = LocalCompFile.LocalFileStatus.Fine, "ColorBrush2", "ColorBrush5")) + LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = McMod.McModState.Fine, "ColorBrush2", "ColorBrush5")) Else RectCheck.Height = 0 RectCheck.Opacity = 0 - LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = LocalCompFile.LocalFileStatus.Fine, "ColorBrush1", "ColorBrushGray4")) + LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = McMod.McModState.Fine, "ColorBrush1", "ColorBrushGray4")) End If AniStop("MyLocalModItem Checked " & Uuid) End If @@ -272,7 +256,7 @@ Public Class MyLocalCompItem End Property '按钮 - Public ButtonHandler As Action(Of MyLocalCompItem, EventArgs) + Public ButtonHandler As Action(Of MyLocalModItem, EventArgs) Public ButtonStack As FrameworkElement Private _Buttons As IEnumerable(Of MyIconButton) Public Property Buttons As IEnumerable(Of MyIconButton) @@ -353,9 +337,9 @@ Public Class MyLocalCompItem '标题与描述 Dim DescFileName As String Select Case Entry.State - Case LocalCompFile.LocalFileStatus.Fine + Case McMod.McModState.Fine DescFileName = GetFileNameWithoutExtentionFromPath(Entry.Path) - Case LocalCompFile.LocalFileStatus.Disabled + Case McMod.McModState.Disabled DescFileName = GetFileNameWithoutExtentionFromPath(Entry.Path.Replace(".disabled", "").Replace(".old", "")) Case Else 'McMod.McModState.Unavailable DescFileName = GetFileNameFromPath(Entry.Path) @@ -398,14 +382,14 @@ Public Class MyLocalCompItem End If Description = NewDescription If Checked Then - LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = LocalCompFile.LocalFileStatus.Fine, "ColorBrush2", "ColorBrush5")) + LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = McMod.McModState.Fine, "ColorBrush2", "ColorBrush5")) Else - LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = LocalCompFile.LocalFileStatus.Fine, "ColorBrush1", "ColorBrushGray4")) + LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = McMod.McModState.Fine, "ColorBrush1", "ColorBrushGray4")) End If '主 Logo Logo = If(Entry.Comp Is Nothing, PathImage & "Icons/NoIcon.png", Entry.Comp.GetControlLogo()) '图标右下角的 Logo - If Entry.State = LocalCompFile.LocalFileStatus.Fine Then + If Entry.State = McMod.McModState.Fine Then If ImgState IsNot Nothing Then Children.Remove(ImgState) ImgState = Nothing @@ -499,20 +483,12 @@ Public Class MyLocalCompItem '触发更新 Private Sub BtnUpdate_Click(sender As Object, e As EventArgs) Handles BtnUpdate.Click -<<<<<<<< HEAD:Plain Craft Launcher 2/Modules/Minecraft/MyLocalCompItem.xaml.vb - If MyMsgBox($"是否要更新 {Entry.Name}?{vbCrLf}{vbCrLf}{GetUpdateCompareDescription()}", "更新确认", "更新", "取消") = 2 Then Return - Select Case Entry.Comp.Type - Case CompType.Mod : FrmVersionMod.UpdateResource({Entry}) - Case CompType.ResourcePack : FrmVersionResourcePack.UpdateResource({Entry}) - Case CompType.Shader : FrmVersionShader.UpdateResource({Entry}) -======== Select Case MyMsgBox($"是否要更新 {Entry.Name}?{vbCrLf}{vbCrLf}{GetUpdateCompareDescription()}", "Mod 更新确认", "更新", "查看更新日志", "取消") Case 1 '更新 FrmVersionMod.UpdateMods({Entry}) Case 2 '查看更新日志 ShowUpdateLog() Case 3 '取消 ->>>>>>>> main:Plain Craft Launcher 2/Pages/PageVersion/MyLocalModItem.xaml.vb End Select End Sub diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml index 679054fbb..b145e25a2 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml @@ -13,48 +13,16 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb index 8c1cfbb44..03831112e 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb @@ -1,6 +1,4 @@ -Imports PCL.PageLinkHiper - -Public Class PageVersionLeft +Public Class PageVersionLeft Implements IRefreshable ''' @@ -28,7 +26,7 @@ Public Class PageVersionLeft ''' ''' 勾选事件改变页面。 ''' - Private Sub PageCheck(sender As MyListItem, e As RouteEventArgs) Handles ItemOverall.Check, ItemMod.Check, ItemModDisabled.Check, ItemSetup.Check, ItemScreenshot.Check, ItemWorld.Check, ItemResourcePack.Check, ItemShader.Check, ItemExport.Check + Private Sub PageCheck(sender As MyListItem, e As RouteEventArgs) Handles ItemOverall.Check, ItemMod.Check, ItemModDisabled.Check, ItemSetup.Check, ItemExport.Check '尚未初始化控件属性时,sender.Tag 为 Nothing,会导致切换到页面 0 '若使用 IsLoaded,则会导致模拟点击不被执行(模拟点击切换页面时,控件的 IsLoaded 为 False) If sender.Tag IsNot Nothing Then PageChange(Val(sender.Tag)) @@ -41,7 +39,7 @@ Public Class PageVersionLeft If FrmVersionOverall Is Nothing Then FrmVersionOverall = New PageVersionOverall Return FrmVersionOverall Case FormMain.PageSubType.VersionMod - If FrmVersionMod Is Nothing Then FrmVersionMod = New PageVersionCompResource(CompType.Mod) + If FrmVersionMod Is Nothing Then FrmVersionMod = New PageVersionMod Return FrmVersionMod Case FormMain.PageSubType.VersionModDisabled If FrmVersionModDisabled Is Nothing Then FrmVersionModDisabled = New PageVersionModDisabled @@ -49,18 +47,6 @@ Public Class PageVersionLeft Case FormMain.PageSubType.VersionSetup If IsNothing(FrmVersionSetup) Then FrmVersionSetup = New PageVersionSetup Return FrmVersionSetup - Case FormMain.PageSubType.VersionWorld - If FrmVersionWorld Is Nothing Then FrmVersionWorld = New PageVersionWorld - Return FrmVersionWorld - Case FormMain.PageSubType.VersionScreenshot - If FrmVersionScreenshot Is Nothing Then FrmVersionScreenshot = New PageVersionScreenshot - Return FrmVersionScreenshot - Case FormMain.PageSubType.VersionResourcePack - If FrmVersionResourcePack Is Nothing Then FrmVersionResourcePack = New PageVersionCompResource(CompType.ResourcePack) - Return FrmVersionResourcePack - Case FormMain.PageSubType.VersionShader - If FrmVersionShader Is Nothing Then FrmVersionShader = New PageVersionCompResource(CompType.Shader) - Return FrmVersionShader Case FormMain.PageSubType.VersionExport If FrmVersionExport Is Nothing Then FrmVersionExport = New PageVersionExport Return FrmVersionExport @@ -114,18 +100,8 @@ Public Class PageVersionLeft Public Sub Refresh(SubType As FormMain.PageSubType) Select Case SubType Case FormMain.PageSubType.VersionMod - Select Case Val(sender.Tag) - Case FormMain.PageSubType.VersionMod - PageVersionCompResource.Refresh(CompType.Mod) + PageVersionMod.Refresh() ItemMod.Checked = True - Case FormMain.PageSubType.VersionScreenshot - PageVersionScreenshot.Refresh() - Case FormMain.PageSubType.VersionWorld - PageVersionWorld.Refresh() - Case FormMain.PageSubType.VersionResourcePack - PageVersionCompResource.Refresh(CompType.ResourcePack) - Case FormMain.PageSubType.VersionShader - PageVersionCompResource.Refresh(CompType.Shader) Case FormMain.PageSubType.VersionExport If FrmVersionExport IsNot Nothing Then FrmVersionExport.RefreshAll() ItemExport.Checked = True diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionCompResource.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml similarity index 87% rename from Plain Craft Launcher 2/Pages/PageVersion/PageVersionCompResource.xaml rename to Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml index 5b14cbe9b..d00296d69 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionCompResource.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml @@ -2,13 +2,13 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:PCL" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - mc:Ignorable="d" x:Class="PageVersionCompResource" + mc:Ignorable="d" x:Class="PageVersionMod" PanScroll="{Binding ElementName=PanBack}"> - + @@ -20,9 +20,9 @@ - + - + @@ -39,24 +39,24 @@ - + - + - - - + + + - + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionCompResource.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb similarity index 75% rename from Plain Craft Launcher 2/Pages/PageVersion/PageVersionCompResource.xaml.vb rename to Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb index a5c6faf6a..35044a33c 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionCompResource.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb @@ -1,53 +1,15 @@ -Public Class PageVersionCompResource +Public Class PageVersionMod Implements IRefreshable #Region "初始化" - Private CurrentCompType As CompType = CompType.Mod - - Private CurrentSwipSelect As MyLocalCompItem.SwipeSelect - - Public Sub New(LoadCompType As CompType) - CurrentCompType = LoadCompType - CurrentSwipSelect = New MyLocalCompItem.SwipeSelect() With {.TargetFrm = Me} - - ' 此调用是设计器所必需的。 - InitializeComponent() - - ' 在 InitializeComponent() 调用之后添加任何初始化。 - - If {CompType.Shader, CompType.ResourcePack}.Contains(CurrentCompType) Then - BtnSelectEnable.Visibility = Visibility.Collapsed - BtnSelectDisable.Visibility = Visibility.Collapsed - End If - - End Sub - - Private Function GetRequireLoaderData() As CompLocalLoaderData - Dim res As New CompLocalLoaderData - res.GameVersion = PageVersionLeft.Version - res.Frm = Me - Dim RequireLoaders As New List(Of CompLoaderType) - Select Case CurrentCompType - Case CompType.Mod - RequireLoaders = GetCurrentVersionModLoader() - Case CompType.ResourcePack - RequireLoaders = {CompLoaderType.Minecraft}.ToList() - Case CompType.Shader - RequireLoaders = {CompLoaderType.OptiFine, CompLoaderType.Iris, CompLoaderType.Vanilla, CompLoaderType.Canvas}.ToList() - End Select - res.Loaders = RequireLoaders - res.CompPath = PageVersionLeft.Version.PathIndie & GetPathNameByCompType(CurrentCompType) & "\" - Return res - End Function - Private IsLoad As Boolean = False Public Sub PageOther_Loaded() Handles Me.Loaded If FrmMain.PageLast.Page <> FormMain.PageType.CompDetail Then PanBack.ScrollToHome() AniControlEnabled += 1 SelectedMods.Clear() - ReloadCompFileList() + ReloadModList() ChangeAllSelected(False) AniControlEnabled -= 1 @@ -68,7 +30,7 @@ ''' ''' 刷新 Mod 列表。 ''' - Public Sub ReloadCompFileList(Optional ForceReload As Boolean = False) + Public Sub ReloadModList(Optional ForceReload As Boolean = False) If LoaderRun(If(ForceReload, LoaderFolderRunType.ForceRun, LoaderFolderRunType.RunOnUpdated)) Then Log("[System] 已刷新 Mod 列表") Filter = FilterType.All @@ -78,43 +40,33 @@ End Sub '强制刷新 Private Sub RefreshSelf() Implements IRefreshable.Refresh - Refresh(CurrentCompType) + Refresh() End Sub - Public Shared Sub Refresh(WhichPage As CompType) + Public Shared Sub Refresh() '强制刷新 Try CompProjectCache.Clear() CompFilesCache.Clear() - File.Delete(PathTemp & "Cache\LocalComp.json") - Log("[CompResource] 由于点击刷新按钮,清理本地工程信息缓存") + File.Delete(PathTemp & "Cache\LocalMod.json") + Log("[Mod] 由于点击刷新按钮,清理本地 Mod 信息缓存") Catch ex As Exception - Log(ex, "强制刷新时清理本地工程信息缓存失败") + Log(ex, "强制刷新时清理本地 Mod 信息缓存失败") End Try - Select Case WhichPage - Case CompType.Mod - If FrmVersionMod IsNot Nothing Then FrmVersionMod.ReloadCompFileList(True) '无需 Else,还没加载刷个鬼的新 - FrmVersionLeft.ItemMod.Checked = True - Case CompType.ResourcePack - If FrmVersionResourcePack IsNot Nothing Then FrmVersionResourcePack.ReloadCompFileList(True) - FrmVersionLeft.ItemResourcePack.Checked = True - Case CompType.Shader - If FrmVersionShader IsNot Nothing Then FrmVersionShader.ReloadCompFileList(True) - FrmVersionLeft.ItemShader.Checked = True - End Select + If FrmVersionMod IsNot Nothing Then FrmVersionMod.ReloadModList(True) '无需 Else,还没加载刷个鬼的新 + FrmVersionLeft.ItemMod.Checked = True Hint("正在刷新……", Log:=False) End Sub Private Sub LoaderInit() Handles Me.Initialized - PageLoaderInit(Load, PanLoad, PanAllBack, Nothing, CompResourceListLoader, AddressOf LoadUIFromLoaderOutput, Function() CurrentCompType, AutoRun:=False) + PageLoaderInit(Load, PanLoad, PanAllBack, Nothing, McModLoader, AddressOf LoadUIFromLoaderOutput, AutoRun:=False) End Sub Private Sub Load_Click(sender As Object, e As MouseButtonEventArgs) Handles Load.Click - If CompResourceListLoader.State = LoadState.Failed Then + If McModLoader.State = LoadState.Failed Then LoaderRun(LoaderFolderRunType.ForceRun) End If End Sub Public Function LoaderRun(Type As LoaderFolderRunType) As Boolean - Dim CompResourcePath As String = PageVersionLeft.Version.PathIndie & GetPathNameByCompType(CurrentCompType) & "\" - Return LoaderFolderRun(CompResourceListLoader, CompResourcePath, Type, LoaderInput:=GetRequireLoaderData()) + Return LoaderFolderRun(McModLoader, PageVersionLeft.Version.PathIndie & "mods\", Type) End Function #End Region @@ -124,14 +76,14 @@ ''' ''' 已加载的 Mod UI 缓存,不确保按显示顺序排列。Key 为 Mod 的 RawFileName。 ''' - Public ModItems As New Dictionary(Of String, MyLocalCompItem) + Public ModItems As New Dictionary(Of String, MyLocalModItem) ''' ''' 将加载器结果的 Mod 列表加载为 UI。 ''' Private Sub LoadUIFromLoaderOutput() Try '判断应该显示哪一个页面 - If CompResourceListLoader.Output.Any() Then + If McModLoader.Output.Any() Then PanBack.Visibility = Visibility.Visible PanEmpty.Visibility = Visibility.Collapsed Else @@ -141,8 +93,8 @@ End If '修改缓存 ModItems.Clear() - For Each ModEntity As LocalCompFile In CompResourceListLoader.Output - ModItems(ModEntity.RawFileName) = BuildLocalCompItem(ModEntity) + For Each ModEntity As McMod In McModLoader.Output + ModItems(ModEntity.RawFileName) = McModListItem(ModEntity) Next '显示结果 Filter = FilterType.All @@ -152,20 +104,19 @@ Log(ex, "加载 Mod 列表 UI 失败", LogLevel.Feedback) End Try End Sub - Private Function BuildLocalCompItem(Entry As LocalCompFile) As MyLocalCompItem + Private Function McModListItem(Entry As McMod) As MyLocalModItem AniControlEnabled += 1 - Dim NewItem As New MyLocalCompItem With {.SnapsToDevicePixels = True, .Entry = Entry, - .ButtonHandler = AddressOf BuildLocalCompItemBtnHandler, .Checked = SelectedMods.Contains(Entry.RawFileName)} - NewItem.CurrentSwipe = CurrentSwipSelect + Dim NewItem As New MyLocalModItem With {.SnapsToDevicePixels = True, .Entry = Entry, + .ButtonHandler = AddressOf McModContent, .Checked = SelectedMods.Contains(Entry.RawFileName)} AddHandler Entry.OnCompUpdate, AddressOf NewItem.Refresh NewItem.Refresh() AniControlEnabled -= 1 Return NewItem End Function - Private Sub BuildLocalCompItemBtnHandler(sender As MyLocalCompItem, e As EventArgs) + Private Sub McModContent(sender As MyLocalModItem, e As EventArgs) '点击事件 AddHandler sender.Changed, AddressOf CheckChanged - AddHandler sender.Click, Sub(ss As MyLocalCompItem, ee As EventArgs) ss.Checked = Not ss.Checked + AddHandler sender.Click, Sub(ss As MyLocalModItem, ee As EventArgs) ss.Checked = Not ss.Checked '图标按钮 Dim BtnOpen As New MyIconButton With {.LogoScale = 1.05, .Logo = Logo.IconButtonOpen, .Tag = sender} BtnOpen.ToolTip = "打开文件位置" @@ -186,15 +137,15 @@ ToolTipService.SetVerticalOffset(BtnDelete, 30) ToolTipService.SetHorizontalOffset(BtnDelete, 2) AddHandler BtnDelete.Click, AddressOf Delete_Click - If CurrentCompType <> CompType.Mod OrElse sender.Entry.State = LocalCompFile.LocalFileStatus.Unavailable Then + Dim BtnED As New MyIconButton With {.LogoScale = 1, .Logo = If(sender.Entry.State = McMod.McModState.Fine, Logo.IconButtonStop, Logo.IconButtonCheck), .Tag = sender} + BtnED.ToolTip = If(sender.Entry.State = McMod.McModState.Fine, "禁用", "启用") + ToolTipService.SetPlacement(BtnED, Primitives.PlacementMode.Center) + ToolTipService.SetVerticalOffset(BtnED, 30) + ToolTipService.SetHorizontalOffset(BtnED, 2) + AddHandler BtnED.Click, AddressOf ED_Click + If sender.Entry.State = McMod.McModState.Unavailable Then sender.Buttons = {BtnCont, BtnOpen, BtnDelete} Else - Dim BtnED As New MyIconButton With {.LogoScale = 1, .Logo = If(sender.Entry.State = LocalCompFile.LocalFileStatus.Fine, Logo.IconButtonStop, Logo.IconButtonCheck), .Tag = sender} - BtnED.ToolTip = If(sender.Entry.State = LocalCompFile.LocalFileStatus.Fine, "禁用", "启用") - ToolTipService.SetPlacement(BtnED, Primitives.PlacementMode.Center) - ToolTipService.SetVerticalOffset(BtnED, 30) - ToolTipService.SetHorizontalOffset(BtnED, 2) - AddHandler BtnED.Click, AddressOf ED_Click sender.Buttons = {BtnCont, BtnOpen, BtnED, BtnDelete} End If End Sub @@ -204,14 +155,14 @@ ''' Public Sub RefreshUI() If PanList Is Nothing Then Exit Sub - Dim ShowingMods = If(IsSearching, SearchResult, If(CompResourceListLoader.Output, New List(Of LocalCompFile))).Where(Function(m) CanPassFilter(m)).ToList + Dim ShowingMods = If(IsSearching, SearchResult, If(McModLoader.Output, New List(Of McMod))).Where(Function(m) CanPassFilter(m)).ToList '重新列出列表 AniControlEnabled += 1 If ShowingMods.Any() Then PanList.Visibility = Visibility.Visible PanList.Children.Clear() For Each TargetMod In ShowingMods - Dim Item As MyLocalCompItem = ModItems(TargetMod.RawFileName) + Dim Item As MyLocalModItem = ModItems(TargetMod.RawFileName) Item.Checked = SelectedMods.Contains(TargetMod.RawFileName) '更新选中状态 PanList.Children.Add(Item) Next @@ -237,12 +188,12 @@ Dim DisabledCount As Integer = 0 Dim UpdateCount As Integer = 0 Dim UnavalialeCount As Integer = 0 - For Each ModItem In If(IsSearching, SearchResult, If(CompResourceListLoader.Output, New List(Of LocalCompFile))) + For Each ModItem In If(IsSearching, SearchResult, If(McModLoader.Output, New List(Of McMod))) AnyCount += 1 If ModItem.CanUpdate Then UpdateCount += 1 - If ModItem.State.Equals(LocalCompFile.LocalFileStatus.Fine) Then EnabledCount += 1 - If ModItem.State.Equals(LocalCompFile.LocalFileStatus.Disabled) Then DisabledCount += 1 - If ModItem.State.Equals(LocalCompFile.LocalFileStatus.Unavailable) Then UnavalialeCount += 1 + If ModItem.State.Equals(McMod.McModState.Fine) Then EnabledCount += 1 + If ModItem.State.Equals(McMod.McModState.Disabled) Then DisabledCount += 1 + If ModItem.State.Equals(McMod.McModState.Unavailable) Then UnavalialeCount += 1 Next '显示 BtnFilterAll.Text = If(IsSearching, "搜索结果", "全部") & $" ({AnyCount})" @@ -268,12 +219,12 @@ Dim HasUpdate As Boolean = False Dim HasEnabled As Boolean = False Dim HasDisabled As Boolean = False - For Each ModEntity In CompResourceListLoader.Output + For Each ModEntity In McModLoader.Output If SelectedMods.Contains(ModEntity.RawFileName) Then If ModEntity.CanUpdate Then HasUpdate = True - If ModEntity.State = LocalCompFile.LocalFileStatus.Fine Then + If ModEntity.State = McMod.McModState.Fine Then HasEnabled = True - ElseIf ModEntity.State = LocalCompFile.LocalFileStatus.Disabled Then + ElseIf ModEntity.State = McMod.McModState.Disabled Then HasDisabled = True End If End If @@ -337,9 +288,8 @@ ''' Private Sub BtnManageOpen_Click(sender As Object, e As EventArgs) Handles BtnManageOpen.Click, BtnHintOpen.Click Try - Dim CompFilePath = PageVersionLeft.Version.PathIndie & GetPathNameByCompType(CurrentCompType) & "\" - Directory.CreateDirectory(CompFilePath) - OpenExplorer(CompFilePath) + Directory.CreateDirectory(PageVersionLeft.Version.PathIndie & "mods\") + OpenExplorer(PageVersionLeft.Version.PathIndie & "mods\") Catch ex As Exception Log(ex, "打开 Mods 文件夹失败", LogLevel.Msgbox) End Try @@ -374,13 +324,8 @@ ''' 安装 Mod。 ''' Private Sub BtnManageInstall_Click(sender As Object, e As MouseButtonEventArgs) Handles BtnManageInstall.Click, BtnHintInstall.Click - Dim FileList As String() = Nothing - Select Case CurrentCompType - Case CompType.Mod : FileList = SelectFiles("Mod 文件(*.jar;*.litemod;*.disabled;*.old)|*.jar;*.litemod;*.disabled;*.old", "选择要安装的 Mod") - Case CompType.ResourcePack : FileList = SelectFiles("资源包文件(*.zip)|*.zip", "选择要安装的资源包") - Case CompType.Shader : FileList = SelectFiles("光影包文件(*.zip)|*.zip", "选择要安装的光影包") - End Select - If FileList Is Nothing OrElse Not FileList.Any Then Exit Sub + Dim FileList = SelectFiles("Mod 文件(*.jar;*.litemod;*.disabled;*.old)|*.jar;*.litemod;*.disabled;*.old", "选择要安装的 Mod") + If Not FileList.Any Then Return InstallMods(FileList) End Sub ''' @@ -422,7 +367,7 @@ Install: End If '刷新列表 If FrmMain.PageCurrent = FormMain.PageType.VersionSetup AndAlso FrmMain.PageCurrentSub = FormMain.PageSubType.VersionMod Then - LoaderFolderRun(CompResourceListLoader, TargetVersion.PathIndie & "mods\", LoaderFolderRunType.ForceRun, LoaderInput:=FrmVersionMod?.GetRequireLoaderData()) + LoaderFolderRun(McModLoader, TargetVersion.PathIndie & "mods\", LoaderFolderRunType.ForceRun) End If Catch ex As Exception Log(ex, "复制 Mod 文件失败", LogLevel.Msgbox) @@ -435,11 +380,8 @@ Install: ''' 下载 Mod。 ''' Private Sub BtnManageDownload_Click(sender As Object, e As MouseButtonEventArgs) Handles BtnManageDownload.Click, BtnHintDownload.Click - Select Case CurrentCompType - Case CompType.Mod : FrmMain.PageChange(FormMain.PageType.Download, FormMain.PageSubType.DownloadMod) - Case CompType.ResourcePack : FrmMain.PageChange(FormMain.PageType.Download, FormMain.PageSubType.DownloadResourcePack) - Case CompType.Shader : FrmMain.PageChange(FormMain.PageType.Download, FormMain.PageSubType.DownloadShader) - End Select + PageComp.TargetVersion = PageVersionLeft.Version '将当前版本设置为筛选器 + FrmMain.PageChange(FormMain.PageType.Download, FormMain.PageSubType.DownloadMod) End Sub #End Region @@ -450,7 +392,7 @@ Install: Public SelectedMods As New List(Of String) '单项切换选择状态 - Public Sub CheckChanged(sender As MyLocalCompItem, e As RouteEventArgs) + Public Sub CheckChanged(sender As MyLocalModItem, e As RouteEventArgs) If AniControlEnabled <> 0 Then Return '更新选择了的内容 Dim SelectedKey As String = sender.Entry.RawFileName @@ -466,7 +408,7 @@ Install: Private Sub ChangeAllSelected(Value As Boolean) AniControlEnabled += 1 SelectedMods.Clear() - For Each Item As MyLocalCompItem In ModItems.Values + For Each Item As MyLocalModItem In ModItems.Values '#4992,Mod 从过滤器看可能不应在列表中,但因为刚切换状态所以依然保留在列表中,所以应该从列表 UI 判断,而非从过滤器判断 Dim ShouldSelected As Boolean = Value AndAlso PanList.Children.Contains(Item) Item.Checked = ShouldSelected @@ -523,18 +465,18 @@ Install: ''' ''' 检查该 Mod 项是否符合当前筛选的类别。 ''' - Private Function CanPassFilter(CheckingMod As LocalCompFile) As Boolean + Private Function CanPassFilter(CheckingMod As McMod) As Boolean Select Case Filter Case FilterType.All Return True Case FilterType.Enabled - Return CheckingMod.State = LocalCompFile.LocalFileStatus.Fine + Return CheckingMod.State = McMod.McModState.Fine Case FilterType.Disabled - Return CheckingMod.State = LocalCompFile.LocalFileStatus.Disabled + Return CheckingMod.State = McMod.McModState.Disabled Case FilterType.CanUpdate Return CheckingMod.CanUpdate Case FilterType.Unavailable - Return CheckingMod.State = LocalCompFile.LocalFileStatus.Unavailable + Return CheckingMod.State = McMod.McModState.Unavailable Case Else Return False End Select @@ -552,19 +494,19 @@ Install: '启用 / 禁用 Private Sub BtnSelectED_Click(sender As MyIconTextButton, e As RouteEventArgs) Handles BtnSelectEnable.Click, BtnSelectDisable.Click - EDMods(CompResourceListLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName)), + EDMods(McModLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName)), Not sender.Equals(BtnSelectDisable)) ChangeAllSelected(False) End Sub - Private Sub EDMods(ModList As IEnumerable(Of LocalCompFile), IsEnable As Boolean) + Private Sub EDMods(ModList As IEnumerable(Of McMod), IsEnable As Boolean) Dim IsSuccessful As Boolean = True For Each ModE In ModList.ToList Dim ModEntity = ModE '仅用于去除迭代变量无法修改的限制 Dim NewPath As String = Nothing - If ModEntity.State = LocalCompFile.LocalFileStatus.Fine AndAlso Not IsEnable Then + If ModEntity.State = McMod.McModState.Fine AndAlso Not IsEnable Then '禁用 NewPath = ModEntity.Path & If(File.Exists(ModEntity.Path & ".old"), ".old", ".disabled") - ElseIf ModEntity.State = LocalCompFile.LocalFileStatus.Disabled AndAlso IsEnable Then + ElseIf ModEntity.State = McMod.McModState.Disabled AndAlso IsEnable Then '启用 NewPath = ModEntity.RawPath Else @@ -589,19 +531,19 @@ Install: FileSystem.Rename(ModEntity.Path, NewPath) Catch ex As FileNotFoundException Log(ex, $"未找到需要重命名的 Mod({If(ModEntity.Path, "null")})", LogLevel.Feedback) - ReloadCompFileList(True) + ReloadModList(True) Return Catch ex As Exception Log(ex, $"重命名 Mod 失败({If(ModEntity.Path, "null")})") IsSuccessful = False End Try '更改 Loader 中的列表 - Dim NewModEntity As New LocalCompFile(NewPath) + Dim NewModEntity As New McMod(NewPath) NewModEntity.FromJson(ModEntity.ToJson) - If CompResourceListLoader.Output.Contains(ModEntity) Then - Dim IndexOfLoader As Integer = CompResourceListLoader.Output.IndexOf(ModEntity) - CompResourceListLoader.Output.RemoveAt(IndexOfLoader) - CompResourceListLoader.Output.Insert(IndexOfLoader, NewModEntity) + If McModLoader.Output.Contains(ModEntity) Then + Dim IndexOfLoader As Integer = McModLoader.Output.IndexOf(ModEntity) + McModLoader.Output.RemoveAt(IndexOfLoader) + McModLoader.Output.Insert(IndexOfLoader, NewModEntity) End If If SearchResult IsNot Nothing AndAlso SearchResult.Contains(ModEntity) Then '#4862 Dim IndexOfResult As Integer = SearchResult.IndexOf(ModEntity) @@ -609,9 +551,9 @@ Install: SearchResult.Insert(IndexOfResult, NewModEntity) End If '更改 UI 中的列表 - Dim NewItem As MyLocalCompItem = BuildLocalCompItem(NewModEntity) + Dim NewItem As MyLocalModItem = McModListItem(NewModEntity) ModItems(ModEntity.RawFileName) = NewItem - Dim IndexOfUi As Integer = PanList.Children.IndexOf(PanList.Children.OfType(Of MyLocalCompItem).FirstOrDefault(Function(i) i.Entry Is ModEntity)) + Dim IndexOfUi As Integer = PanList.Children.IndexOf(PanList.Children.OfType(Of MyLocalModItem).FirstOrDefault(Function(i) i.Entry Is ModEntity)) If IndexOfUi = -1 Then Continue For '因为未知原因 Mod 的状态已经切换完了 PanList.Children.RemoveAt(IndexOfUi) PanList.Children.Insert(IndexOfUi, NewItem) @@ -620,25 +562,25 @@ Install: RefreshBars() Else Hint("由于文件被占用,Mod 的状态切换失败,请尝试关闭正在运行的游戏后再试!", HintType.Critical) - ReloadCompFileList(True) + ReloadModList(True) End If LoaderRun(LoaderFolderRunType.UpdateOnly) End Sub '更新 Private Sub BtnSelectUpdate_Click() Handles BtnSelectUpdate.Click - Dim UpdateList As List(Of LocalCompFile) = CompResourceListLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName) AndAlso m.CanUpdate).ToList() + Dim UpdateList As List(Of McMod) = McModLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName) AndAlso m.CanUpdate).ToList() If Not UpdateList.Any() Then Return - UpdateResource(UpdateList) + UpdateMods(UpdateList) ChangeAllSelected(False) End Sub ''' ''' 记录正在进行 Mod 更新的 mods 文件夹路径。 ''' Public Shared UpdatingVersions As New List(Of String) - Public Sub UpdateResource(ModList As IEnumerable(Of LocalCompFile)) + Public Sub UpdateMods(ModList As IEnumerable(Of McMod)) '更新前警告 - If CurrentCompType = CompType.Mod AndAlso ((Not Setup.Get("HintUpdateMod")) OrElse ModList.Count >= 15) Then + If Not Setup.Get("HintUpdateMod") OrElse ModList.Count >= 15 Then If MyMsgBox($"新版本 Mod 可能不兼容旧存档或者其他 Mod,这可能导致游戏崩溃,甚至永久损坏存档!{vbCrLf}如果你在游玩整合包,请千万不要自行更新 Mod!{vbCrLf}{vbCrLf}在更新前,请先备份存档,并检查 Mod 的更新日志。{vbCrLf}如果更新后出现问题,你也可以在回收站找回更新前的 Mod。", "Mod 更新警告", "我已了解风险,继续更新", "取消", IsWarn:=True) = 1 Then Setup.Set("HintUpdateMod", True) Else @@ -650,7 +592,7 @@ Install: ModList = ModList.ToList() '防止刷新影响迭代器 Dim FileList As New List(Of NetFile) Dim FileCopyList As New Dictionary(Of String, String) - For Each Entry As LocalCompFile In ModList + For Each Entry As McMod In ModList Dim File As CompFile = Entry.UpdateFile If Not File.Available Then Continue For '确认更新后的文件名 @@ -678,7 +620,7 @@ Install: NewestReplaceName = Join(NewestSegs, "-") End If '添加到下载列表 - Dim TempAddress As String = PathTemp & "DownloadedComp\" & Entry.FileName.Replace(CurrentReplaceName, NewestReplaceName) + Dim TempAddress As String = PathTemp & "DownloadedMods\" & Entry.FileName.Replace(CurrentReplaceName, NewestReplaceName) Dim RealAddress As String = GetPathFromFullPath(Entry.Path) & Entry.FileName.Replace(CurrentReplaceName, NewestReplaceName) FileList.Add(File.ToNetFile(TempAddress)) FileCopyList(TempAddress) = RealAddress @@ -686,21 +628,21 @@ Install: '构造加载器 Dim InstallLoaders As New List(Of LoaderBase) Dim FinishedFileNames As New List(Of String) - InstallLoaders.Add(New LoaderDownload("下载新版资源文件", FileList) With {.ProgressWeight = ModList.Count * 1.5}) '每个 Mod 需要 1.5s - InstallLoaders.Add(New LoaderTask(Of Integer, Integer)("替换旧版资源文件", + InstallLoaders.Add(New LoaderDownload("下载新版 Mod 文件", FileList) With {.ProgressWeight = ModList.Count * 1.5}) '每个 Mod 需要 1.5s + InstallLoaders.Add(New LoaderTask(Of Integer, Integer)("替换旧版 Mod 文件", Sub() Try - For Each Entry As LocalCompFile In ModList + For Each Entry As McMod In ModList If File.Exists(Entry.Path) Then My.Computer.FileSystem.DeleteFile(Entry.Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) Else - Log($"[Mod] 未找到更新前的资源文件,跳过对它的删除:{Entry.Path}", LogLevel.Debug) + Log($"[Mod] 未找到更新前的 Mod 文件,跳过对它的删除:{Entry.Path}", LogLevel.Debug) End If Next For Each Entry As KeyValuePair(Of String, String) In FileCopyList If File.Exists(Entry.Value) Then My.Computer.FileSystem.DeleteFile(Entry.Value, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) - Log($"[Mod] 更新后的资源文件已存在,将会把它放入回收站:{Entry.Value}", LogLevel.Debug) + Log($"[Mod] 更新后的 Mod 文件已存在,将会把它放入回收站:{Entry.Value}", LogLevel.Debug) End If If Directory.Exists(GetPathFromFullPath(Entry.Value)) Then File.Move(Entry.Key, Entry.Value) @@ -710,12 +652,12 @@ Install: End If Next Catch ex As OperationCanceledException - Log(ex, "替换旧版资源文件时被主动取消") + Log(ex, "替换旧版 Mod 文件时被主动取消") End Try End Sub)) '结束处理 - Dim Loader As New LoaderCombo(Of IEnumerable(Of LocalCompFile))("资源更新:" & PageVersionLeft.Version.Name, InstallLoaders) - Dim PathMods As String = PageVersionLeft.Version.PathIndie & GetPathNameByCompType(CurrentCompType) & "\" + Dim Loader As New LoaderCombo(Of IEnumerable(Of McMod))("Mod 更新:" & PageVersionLeft.Version.Name, InstallLoaders) + Dim PathMods As String = PageVersionLeft.Version.PathIndie & "mods\" Loader.OnStateChanged = Sub() '结果提示 @@ -723,20 +665,20 @@ Install: Case LoadState.Finished Select Case FinishedFileNames.Count Case 0 '一般是由于 Mod 文件被占用,然后玩家主动取消 - Log($"[Mod] 没有资源被成功更新") + Log($"[Mod] 没有 Mod 被成功更新") Case 1 Hint($"已成功更新 {FinishedFileNames.Single}!", HintType.Finish) Case Else - Hint($"已成功更新 {FinishedFileNames.Count} 个资源!", HintType.Finish) + Hint($"已成功更新 {FinishedFileNames.Count} 个 Mod!", HintType.Finish) End Select Case LoadState.Failed - Hint("资源更新失败:" & GetExceptionSummary(Loader.Error), HintType.Critical) + Hint("Mod 更新失败:" & GetExceptionSummary(Loader.Error), HintType.Critical) Case LoadState.Aborted - Hint("资源更新已中止!", HintType.Info) + Hint("Mod 更新已中止!", HintType.Info) Case Else Exit Sub End Select - Log($"[Mod] 已从正在进行资源更新的文件夹列表移除:{PathMods}") + Log($"[Mod] 已从正在进行 Mod 更新的文件夹列表移除:{PathMods}") UpdatingVersions.Remove(PathMods) '清理缓存 RunInNewThread( @@ -746,41 +688,41 @@ Install: If File.Exists(TempFile) Then File.Delete(TempFile) Next Catch ex As Exception - Log(ex, "清理资源更新缓存失败") + Log(ex, "清理 Mod 更新缓存失败") End Try - End Sub, "Clean Comp Update Cache", ThreadPriority.BelowNormal) + End Sub, "Clean Mod Update Cache", ThreadPriority.BelowNormal) End Sub '启动加载器 - Log($"[Mod] 开始更新 {ModList.Count} 个资源:{PathMods}") + Log($"[Mod] 开始更新 {ModList.Count} 个 Mod:{PathMods}") UpdatingVersions.Add(PathMods) Loader.Start() LoaderTaskbarAdd(Loader) FrmMain.BtnExtraDownload.ShowRefresh() FrmMain.BtnExtraDownload.Ribble() - ReloadCompFileList(True) + ReloadModList(True) Catch ex As Exception - Log(ex, "初始化资源更新失败") + Log(ex, "初始化 Mod 更新失败") End Try End Sub '删除 Private Sub BtnSelectDelete_Click() Handles BtnSelectDelete.Click - DeleteMods(CompResourceListLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName))) + DeleteMods(McModLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName))) ChangeAllSelected(False) End Sub - Private Sub DeleteMods(ModList As IEnumerable(Of LocalCompFile)) + Private Sub DeleteMods(ModList As IEnumerable(Of McMod)) Try Dim IsSuccessful As Boolean = True Dim IsShiftPressed As Boolean = My.Computer.Keyboard.ShiftKeyDown '确认需要删除的文件 ModList = ModList.SelectMany( - Function(Target As LocalCompFile) - If Target.State = LocalCompFile.LocalFileStatus.Fine Then + Function(Target As McMod) + If Target.State = McMod.McModState.Fine Then Return {Target.Path, Target.Path & If(File.Exists(Target.Path & ".old"), ".old", ".disabled")} Else Return {Target.Path, Target.RawPath} End If - End Function).Distinct.Where(Function(m) File.Exists(m)).Select(Function(m) New LocalCompFile(m)).ToList() + End Function).Distinct.Where(Function(m) File.Exists(m)).Select(Function(m) New McMod(m)).ToList() '实际删除文件 For Each ModEntity In ModList '删除 @@ -792,7 +734,7 @@ Install: End If Catch ex As OperationCanceledException Log(ex, "删除 Mod 被主动取消") - ReloadCompFileList(True) + ReloadModList(True) Return Catch ex As Exception Log(ex, $"删除 Mod 失败({ModEntity.Path})", LogLevel.Msgbox) @@ -801,18 +743,18 @@ Install: '取消选中 SelectedMods.Remove(ModEntity.RawFileName) '更改 Loader 和 UI 中的列表 - CompResourceListLoader.Output.Remove(ModEntity) + McModLoader.Output.Remove(ModEntity) SearchResult?.Remove(ModEntity) ModItems.Remove(ModEntity.RawFileName) - Dim IndexOfUi As Integer = PanList.Children.IndexOf(PanList.Children.OfType(Of MyLocalCompItem).FirstOrDefault(Function(i) i.Entry.Equals(ModEntity))) + Dim IndexOfUi As Integer = PanList.Children.IndexOf(PanList.Children.OfType(Of MyLocalModItem).FirstOrDefault(Function(i) i.Entry.Equals(ModEntity))) If IndexOfUi >= 0 Then PanList.Children.RemoveAt(IndexOfUi) Next RefreshBars() If Not IsSuccessful Then Hint("由于文件被占用,Mod 删除失败,请尝试关闭正在运行的游戏后再试!", HintType.Critical) - ReloadCompFileList(True) + ReloadModList(True) ElseIf PanList.Children.Count = 0 Then - ReloadCompFileList(True) '删除了全部文件 + ReloadModList(True) '删除了全部文件 Else RefreshBars() End If @@ -833,10 +775,10 @@ Install: End If Catch ex As OperationCanceledException Log(ex, "删除 Mod 被主动取消") - ReloadCompFileList(True) + ReloadModList(True) Catch ex As Exception Log(ex, "删除 Mod 出现未知错误", LogLevel.Feedback) - ReloadCompFileList(True) + ReloadModList(True) End Try LoaderRun(LoaderFolderRunType.UpdateOnly) End Sub @@ -854,9 +796,9 @@ Install: Public Sub Info_Click(sender As Object, e As EventArgs) Try - Dim ModEntry As LocalCompFile = CType(If(TypeOf sender Is MyIconButton, sender.Tag, sender), MyLocalCompItem).Entry + Dim ModEntry As McMod = CType(If(TypeOf sender Is MyIconButton, sender.Tag, sender), MyLocalModItem).Entry '加载失败信息 - If ModEntry.State = LocalCompFile.LocalFileStatus.Unavailable Then + If ModEntry.State = McMod.McModState.Unavailable Then MyMsgBox("无法读取此 Mod 的信息。" & vbCrLf & vbCrLf & "详细的错误信息:" & GetExceptionDetail(ModEntry.FileUnavailableReason), "Mod 读取失败") Return End If @@ -864,9 +806,9 @@ Install: '跳转到 Mod 下载页面 FrmMain.PageChange(New FormMain.PageStackData With {.Page = FormMain.PageType.CompDetail, .Additional = {ModEntry.Comp, New List(Of String), PageVersionLeft.Version.Version.McName, - If(PageVersionLeft.Version.Version.HasForge, CompLoaderType.Forge, - If(PageVersionLeft.Version.Version.HasNeoForge, CompLoaderType.NeoForge, - If(PageVersionLeft.Version.Version.HasFabric, CompLoaderType.Fabric, CompLoaderType.Any))), + If(PageVersionLeft.Version.Version.HasForge, CompModLoaderType.Forge, + If(PageVersionLeft.Version.Version.HasNeoForge, CompModLoaderType.NeoForge, + If(PageVersionLeft.Version.Version.HasFabric, CompModLoaderType.Fabric, CompModLoaderType.Any))), CompType.Mod}}) Else '获取信息 @@ -923,7 +865,7 @@ Install: '打开文件所在的位置 Public Sub Open_Click(sender As MyIconButton, e As EventArgs) Try - Dim ListItem As MyLocalCompItem = sender.Tag + Dim ListItem As MyLocalModItem = sender.Tag OpenExplorer(ListItem.Entry.Path) Catch ex As Exception Log(ex, "打开 Mod 文件位置失败", LogLevel.Feedback) @@ -931,13 +873,13 @@ Install: End Sub '删除 Public Sub Delete_Click(sender As MyIconButton, e As EventArgs) - Dim ListItem As MyLocalCompItem = sender.Tag + Dim ListItem As MyLocalModItem = sender.Tag DeleteMods({ListItem.Entry}) End Sub '启用 / 禁用 Public Sub ED_Click(sender As MyIconButton, e As EventArgs) - Dim ListItem As MyLocalCompItem = sender.Tag - EDMods({ListItem.Entry}, ListItem.Entry.State = LocalCompFile.LocalFileStatus.Disabled) + Dim ListItem As MyLocalModItem = sender.Tag + EDMods({ListItem.Entry}, ListItem.Entry.State = McMod.McModState.Disabled) End Sub #End Region @@ -949,13 +891,12 @@ Install: Return Not String.IsNullOrWhiteSpace(SearchBox.Text) End Get End Property - Private SearchResult As List(Of LocalCompFile) - + Private SearchResult As List(Of McMod) Public Sub SearchRun() Handles SearchBox.TextChanged If IsSearching Then '构造请求 - Dim QueryList As New List(Of SearchEntry(Of LocalCompFile)) - For Each Entry As LocalCompFile In CompResourceListLoader.Output + Dim QueryList As New List(Of SearchEntry(Of McMod)) + For Each Entry As McMod In McModLoader.Output Dim SearchSource As New List(Of KeyValuePair(Of String, Double)) SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.Name, 1)) SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.FileName, 1)) @@ -971,7 +912,7 @@ Install: If Entry.Comp.Description <> Entry.Description Then SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.Comp.Description, 0.4)) SearchSource.Add(New KeyValuePair(Of String, Double)(String.Join("", Entry.Comp.Tags), 0.2)) End If - QueryList.Add(New SearchEntry(Of LocalCompFile) With {.Item = Entry, .SearchSource = SearchSource}) + QueryList.Add(New SearchEntry(Of McMod) With {.Item = Entry, .SearchSource = SearchSource}) Next '进行搜索 SearchResult = Search(QueryList, SearchBox.Text, MaxBlurCount:=6, MinBlurSimilarity:=0.35).Select(Function(r) r.Item).ToList diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml deleted file mode 100644 index 77f7ae740..000000000 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb deleted file mode 100644 index 87eb39af6..000000000 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb +++ /dev/null @@ -1,311 +0,0 @@ -Public Class PageVersionScreenshot - Implements IRefreshable - Private Sub RefreshSelf() Implements IRefreshable.Refresh - Refresh() - End Sub - Public Shared Sub Refresh() - If FrmVersionScreenshot IsNot Nothing Then FrmVersionScreenshot.Reload() - FrmVersionLeft.ItemScreenshot.Checked = True - End Sub - - Private Sub LoaderInit() Handles Me.Initialized - PageLoaderInit(Load, PanLoad, PanContent, PanAlways, ScreenshotLoader, AddressOf UpdateList, AutoRun:=False) - End Sub - - Public ScreenshotLoader As New LoaderTask(Of Integer, List(Of MyCard))("Screenshot file loader", AddressOf LoadImages) - Private Page As Integer = 0 - Private MaxPage As Integer = 1 - Private SingleLoadCount As Integer = 20 - - Private IsLoad As Boolean = False - Private Sub PageSetupLaunch_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded - - '重复加载部分 - PanBack.ScrollToHome() - ScreenshotPath = PageVersionLeft.Version.PathIndie + "screenshots\" - If Not Directory.Exists(ScreenshotPath) Then Directory.CreateDirectory(ScreenshotPath) - Reload() - - - '非重复加载部分 - If IsLoad Then Exit Sub - IsLoad = True - - End Sub - - Dim FileList As List(Of String) = New List(Of String) - Dim ScreenshotPath As String - - ''' - ''' 确保当前页面上的信息已正确显示。 - ''' - Public Sub Reload() - AniControlEnabled += 1 - PanBack.ScrollToHome() - - '加载文件列表 - Log("[Screenshot] 刷新截图文件") - FileList.Clear() - If Directory.Exists(ScreenshotPath) Then FileList = Directory.EnumerateFiles(ScreenshotPath, "*", SearchOption.TopDirectoryOnly).ToList() - Log("[Screenshot] 共发现 " & FileList.Count & " 个截图文件") - 'FileList.RemoveAll(Function(c) c.ContainsF("\debug\")) '排除资源包调试输出 - FileList.RemoveAll(Function(c) - If File.GetAttributes(c).HasFlag(FileAttributes.Hidden) Then Return True '排除隐藏文件 - Dim info As New FileInfo(c) - If info Is Nothing Then Return True - If info.Length < 1024 Then Return True '小于 1 KB 可能为无效文件 - Dim AllowedSuffix As String() = {".png", ".jpg", ".jpeg", ".bmp", ".webp", ".tiff"} - If Not AllowedSuffix.Contains(info.Extension.ToLower()) Then Return True '只允许指定后缀的文件 - Return False - End Function) - FileList = FileList.Sort(Function(a, b) New FileInfo(a).CreationTime > New FileInfo(b).CreationTime) - Log("[Screenshot] 筛选后得到 " & FileList.Count & " 个截图文件") - RefreshTip() - Page = 1 - MaxPage = Math.Ceiling(FileList.Count / SingleLoadCount) - PanList.Children.Clear() - If FileList.Count > 0 Then - SetPageButton() - PanContent.Visibility = Visibility.Collapsed '龙猫别删这行 - ScreenshotLoader.Start(IsForceRestart:=True) - End If - - AniControlEnabled -= 1 - End Sub - - Private Sub LoadImages(Loader As LoaderTask(Of Integer, List(Of MyCard))) - Dim StartIndex = (Page - 1) * SingleLoadCount - If StartIndex >= FileList.Count Then Exit Sub - Dim EndIndex = Math.Min(Page * SingleLoadCount - 1, FileList.Count - 1) - Dim res As New List(Of MyCard) - For i = StartIndex To EndIndex - Dim card As MyCard = Nothing - Dim FilePath = FileList.ElementAt(i) - Dim loadSource = FilePath - Using fs As New FileStream(FilePath, FileMode.Open, FileAccess.Read) - Dim Header(1) As Byte - fs.Read(Header, 0, 2) - fs.Seek(0, SeekOrigin.Begin) - If Header(0) = 82 AndAlso Header(1) = 73 Then - 'WebP 格式,需要转换 - Dim FileBytes(fs.Length - 1) As Byte - fs.Read(FileBytes, 0, FileBytes.Length) - Dim Pic = MyBitmap.WebPDecoder.DecodeFromBytes(FileBytes) - Dim picTempPath = PathTemp & "Screenshot\" - Directory.CreateDirectory(picTempPath) - loadSource = picTempPath & GetHash(i) & ".png" - Pic.Save(loadSource) - End If - End Using - Dim buildTask As New Tasks.Task(Of MyCard)(Function() - Dim out As MyCard = Nothing - RunInUiWait(Sub() out = BuildImageCard(loadSource)) - Return out - End Function) - buildTask.Start() - buildTask.Wait() - card = buildTask.Result - If card IsNot Nothing Then - res.Add(card) - End If - Next - Loader.Output = res - End Sub - - Private Sub SetPageButton() - Dim LeftRange = 3, RightRange = 3 - Dim StartPage = Math.Max(1, Page - LeftRange) - Dim EndPage = Math.Min(MaxPage, Page + RightRange) - Dim BuildButton = Function(Num As Integer) - Dim labPage As New MyTextButton - labPage.Text = Num.ToString() - labPage.Margin = New Thickness(8, 0, 13, 0) - labPage.FontSize = 15 - labPage.VerticalAlignment = VerticalAlignment.Center - - AddHandler labPage.Click, Sub() ChangePage(Num) - - Return labPage - End Function - CardPageBtns.Children.Clear() - For i = StartPage To EndPage - CardPageBtns.Children.Add(BuildButton(i)) - Next - BtnPageLeft.Opacity = If(Page = 1, 0.2, 1) - BtnPageRight.Opacity = If(Page = MaxPage, 0.2, 1) - End Sub - - Private Sub ChangePage(Num As Integer) - Page = Math.Max(1, Math.Min(Num, MaxPage)) - If Page <> Num Then - Hint("再怎么翻也没有了呀……") - Exit Sub - End If - PanScroll.ScrollToTop() - ScreenshotLoader.Start(IsForceRestart:=True) - End Sub - - Private Sub ChangePageBtn(sender As Object, e As EventArgs) Handles BtnPageLeft.Click, BtnPageRight.Click - If (CType(sender, MyIconButton)).Name = "BtnPageLeft" Then ChangePage(Page - 1) - If (CType(sender, MyIconButton)).Name = "BtnPageRight" Then ChangePage(Page + 1) - End Sub - - Private Sub RefreshTip() - If FileList.Count.Equals(0) Then - PanNoPic.Visibility = Visibility.Visible - PanContent.Visibility = Visibility.Collapsed - CardPages.Visibility = Visibility.Collapsed - Else - PanNoPic.Visibility = Visibility.Collapsed - PanContent.Visibility = Visibility.Visible - CardPages.Visibility = Visibility.Visible - End If - End Sub - - Private Sub UpdateList() - PanList.Children.Clear() - For Each item In ScreenshotLoader.Output - PanList.Children.Add(item) - item.Opacity = 0 - AniStart({AaOpacity(item, 1)}) - Next - SetPageButton() - End Sub - - Private Shared ImageCardCache As New Dictionary(Of String, MyCard) - - Private Function BuildImageCard(FilePath As String) As MyCard - Try - If Not File.Exists(FilePath) Then Return Nothing ' 文件在加载途中消失了 - If ImageCardCache.Keys.Contains(FilePath) Then Return ImageCardCache(FilePath) - Dim myCard As New MyCard With { - .Height = Double.NaN, ' 允许高度自适应 - .Width = Double.NaN, ' 允许宽度自适应 - .Margin = New Thickness(7), - .Tag = FilePath, - .ToolTip = FilePath.Replace(ScreenshotPath, "") - } - Dim grid As New Grid - myCard.Children.Add(grid) - - grid.RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(9)}) - grid.RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(120)}) - grid.RowDefinitions.Add(New RowDefinition) - - '图片 - Dim image As New Image - Dim bitmapImage As New BitmapImage() - Using fs As New FileStream(FilePath, FileMode.Open, FileAccess.Read) - bitmapImage.BeginInit() - bitmapImage.DecodePixelHeight = 200 - bitmapImage.DecodePixelWidth = 400 - bitmapImage.CacheOption = BitmapCacheOption.OnLoad - bitmapImage.StreamSource = fs - bitmapImage.EndInit() - bitmapImage.Freeze() - End Using - image.Source = bitmapImage - image.Stretch = Stretch.Uniform ' 使图片自适应控件大小 - Grid.SetRow(image, 1) - grid.Children.Add(image) - - '按钮 - Dim stackPanel As New StackPanel - stackPanel.Orientation = Orientation.Horizontal - stackPanel.HorizontalAlignment = HorizontalAlignment.Center - stackPanel.Margin = New Thickness(3, 5, 3, 5) - Grid.SetRow(stackPanel, 2) - grid.Children.Add(stackPanel) - - Dim btnOpen As New MyIconTextButton With { - .Name = "BtnOpen", - .Text = "打开", - .LogoScale = 0.8, - .Logo = Logo.IconButtonOpen, - .Tag = FilePath - } - AddHandler btnOpen.Click, AddressOf btnOpen_Click - stackPanel.Children.Add(btnOpen) - Dim btnDelete As New MyIconTextButton With { - .Name = "BtnDelete", - .Text = "删除", - .LogoScale = 0.8, - .Logo = Logo.IconButtonDelete, - .Tag = FilePath - } - AddHandler btnDelete.Click, AddressOf btnDelete_Click - stackPanel.Children.Add(btnDelete) - Dim btnCopy As New MyIconTextButton With { - .Name = "BtnCopy", - .Text = "复制", - .LogoScale = 0.8, - .Logo = Logo.IconButtonCopy, - .Tag = FilePath - } - AddHandler btnCopy.Click, AddressOf btnCopy_Click - stackPanel.Children.Add(btnCopy) - ImageCardCache.Add(FilePath, myCard) - Return myCard - Catch ex As Exception - Log(ex, $"[Screenshot] 加载图片 {FilePath} 失败", LogLevel.Hint) - End Try - Return Nothing - End Function - - Private Sub RemoveItem(Path As String) - Try - For Each i In PanList.Children - If CType(i, MyCard).Tag.Equals(Path) Then - PanList.Children.Remove(i) - Exit For - End If - Next - Catch ex As Exception - Log(ex, "[Screenshot] 未能找到对应 UI") - End Try - End Sub - - Private Function GetPathFromSender(sender As MyIconTextButton) As String - Return sender.Tag - End Function - - Private Sub btnOpen_Click(sender As MyIconTextButton, e As EventArgs) - OpenExplorerAndSelect(GetPathFromSender(sender)) - End Sub - Private Sub btnDelete_Click(sender As MyIconTextButton, e As EventArgs) - Path = GetPathFromSender(sender) - RemoveItem(Path) - Try - My.Computer.FileSystem.DeleteFile(Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) - Hint("已将截图移至回收站!") - Catch ex As Exception - Log(ex, "删除截图失败!", LogLevel.Hint) - End Try - End Sub - Private Sub btnCopy_Click(sender As MyIconTextButton, e As EventArgs) - Dim imagePath As String = GetPathFromSender(sender) - If File.Exists(imagePath) Then - Dim TryTime = 0 - While TryTime <= 5 - Try - Log("[Screenshot] 尝试复制" & imagePath & "到剪贴板") - Clipboard.SetImage(New BitmapImage(New Uri(imagePath))) - Hint("已复制截图到剪贴板!") - TryTime = 6 - Exit Sub - Catch ex As Exception - TryTime += 1 - Log(ex, $"[Screenshot]第 {TryTime} 次复制尝试失败") - End Try - End While - Hint("截图复制失败!", HintType.Critical) - Else - Hint("截图文件不存在!") - End If - End Sub - - Private Sub BtnOpenFolder_Click(sender As Object, e As MouseButtonEventArgs) - If Not Directory.Exists(ScreenshotPath) Then Directory.CreateDirectory(ScreenshotPath) - OpenExplorer("""" & ScreenshotPath & """") - End Sub -End Class diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml deleted file mode 100644 index d0b5c6de7..000000000 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb deleted file mode 100644 index 73c0ea037..000000000 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionWorld.xaml.vb +++ /dev/null @@ -1,190 +0,0 @@ -Imports System.Security.Principal - -Public Class PageVersionWorld - Implements IRefreshable - Private Sub RefreshSelf() Implements IRefreshable.Refresh - Refresh() - End Sub - Public Shared Sub Refresh() - If FrmVersionWorld IsNot Nothing Then FrmVersionWorld.Reload() - FrmVersionLeft.ItemWorld.Checked = True - Hint("正在刷新……", Log:=False) - End Sub - Private IsLoad As Boolean = False - Private Sub PageSetupLaunch_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded - - '重复加载部分 - PanBack.ScrollToHome() - WorldPath = PageVersionLeft.Version.PathIndie + "saves\" - If Not Directory.Exists(WorldPath) Then Directory.CreateDirectory(WorldPath) - Reload() - - '非重复加载部分 - If IsLoad Then Exit Sub - IsLoad = True - - End Sub - - Dim FileList As List(Of String) = New List(Of String) - Dim WorldPath As String - - ''' - ''' 确保当前页面上的信息已正确显示。 - ''' - Public Sub Reload() - AniControlEnabled += 1 - PanBack.ScrollToHome() - LoadFileList() - AniControlEnabled -= 1 - End Sub - - Private Sub RefreshUI() - PanCard.Title = $"存档列表 ({FileList.Count})" - If FileList.Count.Equals(0) Then - PanNoWorld.Visibility = Visibility.Visible - PanContent.Visibility = Visibility.Collapsed - PanNoWorld.UpdateLayout() - Else - PanNoWorld.Visibility = Visibility.Collapsed - PanContent.Visibility = Visibility.Visible - PanContent.UpdateLayout() - End If - End Sub - - Private Sub LoadFileList() - Log("[World] 刷新存档文件") - FileList.Clear() - FileList = Directory.EnumerateDirectories(WorldPath).ToList() - If ModeDebug Then Log("[World] 共发现 " & FileList.Count & " 个存档文件夹", LogLevel.Debug) - PanList.Children.Clear() - For Each i In FileList - Try - Dim SaveLogo = i + "\icon.png" - If Not File.Exists(SaveLogo) Then SaveLogo = PathImage & "Icons/NoIcon.png" - Dim worldItem As MyListItem = New MyListItem With { - .Logo = SaveLogo, - .Title = GetFolderNameFromPath(i), - .Info = $"创建时间:{ Directory.GetCreationTime(i).ToString("yyyy'/'MM'/'dd")},最后修改时间:{Directory.GetLastWriteTime(i).ToString("yyyy'/'MM'/'dd")}", - .Tag = i - } - Dim BtnOpen As MyIconButton = New MyIconButton With { - .Logo = Logo.IconButtonOpen, - .ToolTip = "打开", - .Tag = i - } - AddHandler BtnOpen.Click, AddressOf BtnOpen_Click - Dim BtnDelete As MyIconButton = New MyIconButton With { - .Logo = Logo.IconButtonDelete, - .ToolTip = "删除", - .Tag = i - } - AddHandler BtnDelete.Click, AddressOf BtnDelete_Click - Dim BtnCopy As MyIconButton = New MyIconButton With { - .Logo = Logo.IconButtonCopy, - .ToolTip = "复制", - .Tag = i - } - AddHandler BtnCopy.Click, AddressOf BtnCopy_Click - Dim BtnInfo As MyIconButton = New MyIconButton With { - .Logo = Logo.IconButtonInfo, - .ToolTip = "详情", - .Tag = i - } - AddHandler BtnInfo.Click, AddressOf BtnInfo_Click - worldItem.Buttons = {BtnOpen, BtnDelete, BtnCopy, BtnInfo} - PanList.Children.Add(worldItem) - Catch ex As Exception - Log(ex, $"[World] 读取 {i} 数据错误", LogLevel.Hint) - End Try - Next - RefreshUI() - End Sub - - Private Function GetPathFromSender(sender As Object) As String - Return sender.Tag - End Function - - Private Sub RemoveItem(Path As String) - Try - For Each i In PanList.Children - If CType(i, MyListItem).Tag.Equals(Path) Then - PanList.Children.Remove(CType(i, MyListItem)) - FileList.Remove(Path) - Exit For - End If - Next - Catch ex As Exception - Log(ex, "未能找到对应 UI") - End Try - RefreshUI() - End Sub - - Private Sub BtnDelete_Click(sender As Object, e As MouseButtonEventArgs) - Path = GetPathFromSender(sender) - RemoveItem(Path) - Try - My.Computer.FileSystem.DeleteDirectory(Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) - Hint("已将存档移至回收站!") - Catch ex As Exception - Log(ex, "删除存档失败!", LogLevel.Hint) - End Try - End Sub - Private Sub BtnCopy_Click(sender As Object, e As MouseButtonEventArgs) - Dim Path As String = GetPathFromSender(sender) - Try - If Directory.Exists(Path) Then - Clipboard.SetFileDropList(New Specialized.StringCollection() From {Path}) - Hint("已复制存档文件夹到剪贴板!") - Else - Hint("存档文件夹不存在!") - End If - Catch ex As Exception - Log(ex, "复制失败……", LogLevel.Hint) - End Try - End Sub - Private Sub BtnInfo_Click(sender As Object, e As MouseButtonEventArgs) - Try - Dim Path As String = GetPathFromSender(sender) - Dim infos As List(Of String) = New List(Of String) - infos.Add("名称:" & GetFileNameFromPath(Path)) - infos.Add("创建日期:" & Directory.GetCreationTime(Path).ToString("yyyy'/'MM'/'dd")) - infos.Add("最后一次修改日期:" & Directory.GetLastWriteTime(Path).ToString("yyyy'/'MM'/'dd")) - Directory.CreateDirectory(Path & "\playerdata") - infos.Add("玩家数量:" & Directory.GetFiles(Path & "\playerdata", "*.dat", SearchOption.TopDirectoryOnly).Count()) - Directory.CreateDirectory(Path + "\datapacks") - infos.Add("数据包数量:" & (Directory.GetDirectories(Path + "\datapacks").Count() + Directory.GetFiles(Path + "\datapacks").Count()).ToString()) - MyMsgBox(infos.Join(vbCrLf), "存档详细信息") - Catch ex As Exception - Log(ex, "获取存档详细信息失败……", LogLevel.Hint) - End Try - End Sub - Private Sub BtnOpenFolder_Click(sender As Object, e As MouseButtonEventArgs) - OpenExplorer("""" & WorldPath & """") - End Sub - Private Sub BtnOpen_Click(sender As Object, e As MouseButtonEventArgs) - OpenExplorer("""" & sender.Tag & """") - End Sub - Private Sub BtnPaste_Click(sender As Object, e As MouseButtonEventArgs) - Dim files As Specialized.StringCollection = Clipboard.GetFileDropList() - Dim Copied = 0 - For Each i In files - Try - If Directory.Exists(i) Then - If (Directory.Exists(WorldPath & GetFolderNameFromPath(i))) Then - Hint("发现同名文件夹,无法粘贴:" & GetFolderNameFromPath(i)) - Else - CopyDirectory(i, WorldPath & GetFolderNameFromPath(i)) - Copied += 1 - End If - Else - Hint("源文件夹不存在或源目标不是文件夹") - End If - Catch ex As Exception - Log(ex, "粘贴存档文件夹失败", LogLevel.Hint) - Continue For - End Try - Next - Hint("已粘贴 " & Copied & " 个文件夹") - LoadFileList() - End Sub -End Class diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index c7e6cd8f0..e7d395eb3 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj @@ -195,12 +195,15 @@ MyIconTextButton.xaml + + + - + - - MyLocalCompItem.xaml + + MyLocalModItem.xaml @@ -308,18 +311,12 @@ PageVersionLeft.xaml - - PageVersionCompResource.xaml + + PageVersionMod.xaml PageVersionModDisabled.xaml - - PageVersionWorld.xaml - - - PageVersionScreenshot.xaml - PageVersionOverall.xaml @@ -504,7 +501,8 @@ FormMain.xaml Code - + + MSBuild:Compile Designer @@ -601,14 +599,6 @@ MSBuild:Compile Designer - - MSBuild:Compile - Designer - - - MSBuild:Compile - Designer - Designer MSBuild:Compile @@ -717,7 +707,7 @@ Designer MSBuild:Compile - + Designer MSBuild:Compile @@ -967,6 +957,7 @@ + From 3df78ca7f2cd72619c3733dd17cc90e6cb94637d Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 3 May 2025 21:10:16 +0800 Subject: [PATCH 52/54] =?UTF-8?q?refactor:=20=E5=AE=8C=E6=88=90=E6=88=AA?= =?UTF-8?q?=E5=9B=BE=E7=95=8C=E9=9D=A2=E7=9A=84=E5=BC=95=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/FormMain.xaml.vb | 21 +- .../Modules/Base/ModBase.vb | 4 + .../Minecraft/{ModMod.vb => ModLocalComp.vb} | 64 ++-- Plain Craft Launcher 2/Modules/ModMain.vb | 3 +- .../Pages/PageVersion/MyLocalModItem.xaml.vb | 26 +- ...geVersionMod.xaml => PageVersionComp.xaml} | 2 +- ...ionMod.xaml.vb => PageVersionComp.xaml.vb} | 83 +++-- .../PageVersion/PageVersionExport.xaml.vb | 22 +- .../Pages/PageVersion/PageVersionLeft.xaml | 22 +- .../Pages/PageVersion/PageVersionLeft.xaml.vb | 9 +- .../PageVersion/PageVersionScreenshot.xaml | 72 ++++ .../PageVersion/PageVersionScreenshot.xaml.vb | 315 ++++++++++++++++++ .../Plain Craft Launcher 2.vbproj | 20 +- 13 files changed, 545 insertions(+), 118 deletions(-) rename Plain Craft Launcher 2/Modules/Minecraft/{ModMod.vb => ModLocalComp.vb} (97%) rename Plain Craft Launcher 2/Pages/PageVersion/{PageVersionMod.xaml => PageVersionComp.xaml} (99%) rename Plain Craft Launcher 2/Pages/PageVersion/{PageVersionMod.xaml.vb => PageVersionComp.xaml.vb} (93%) create mode 100644 Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml create mode 100644 Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb index 7cbbc0f9b..7fc61f96b 100644 --- a/Plain Craft Launcher 2/FormMain.xaml.vb +++ b/Plain Craft Launcher 2/FormMain.xaml.vb @@ -774,7 +774,7 @@ Public Class FormMain Exit Sub End If '安装 Mod - If PageVersionMod.InstallMods(FilePathList) Then Exit Sub + If PageVersionComp.InstallMods(FilePathList) Then Exit Sub '安装整合包 If {"zip", "rar", "mrpack"}.Any(Function(t) t = Extension) Then '部分压缩包是 zip 格式但后缀为 rar,总之试一试 Log("[System] 文件为压缩包,尝试作为整合包安装") @@ -956,9 +956,12 @@ Public Class FormMain OtherTest = 2 VersionOverall = 0 VersionSetup = 1 - VersionMod = 2 - VersionModDisabled = 3 - VersionExport = 4 + VersionExport = 2 + VersionScreenshot = 3 + VersionMod = 4 + VersionModDisabled = 5 + VersionResourcepack = 6 + VersionShader = 7 End Enum ''' ''' 获取次级页面的名称。若并非次级页面则返回空字符串,故可以以此判断是否为次级页面。 @@ -1094,7 +1097,15 @@ Public Class FormMain Select Case Stack.Page Case PageType.VersionSetup If FrmVersionLeft Is Nothing Then FrmVersionLeft = New PageVersionLeft - CType(FrmVersionLeft.PanItem.Children(SubType), MyListItem).SetChecked(True, True, Stack = PageCurrent) + For Each item In FrmVersionLeft.PanItem.Children + If item.GetType() = GetType(MyListItem) Then + Dim target As MyListItem = item + If CType(target.Tag, PageSubType) = SubType Then + target.SetChecked(True, True, Stack = PageCurrent) + Exit For + End If + End If + Next End Select PageChangeActual(Stack, SubType) End If diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb index e444e9f97..f4adca457 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModBase.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModBase.vb @@ -188,6 +188,10 @@ Public Module ModBase ''' 图标,播放,0.8x ''' Public Const IconPlay As String = "M803.904 463.936a55.168 55.168 0 0 1 0 96.128l-463.616 264.448C302.848 845.888 256 819.136 256 776.448V247.616c0-42.752 46.848-69.44 84.288-48.064l463.616 264.384z" + ''' + ''' 图标按钮,复制 + ''' + Public Const IconButtonCopy As String = "M394.666667 106.666667h448a74.666667 74.666667 0 0 1 74.666666 74.666666v448a74.666667 74.666667 0 0 1-74.666666 74.666667H394.666667a74.666667 74.666667 0 0 1-74.666667-74.666667V181.333333a74.666667 74.666667 0 0 1 74.666667-74.666666z m0 64a10.666667 10.666667 0 0 0-10.666667 10.666666v448a10.666667 10.666667 0 0 0 10.666667 10.666667h448a10.666667 10.666667 0 0 0 10.666666-10.666667V181.333333a10.666667 10.666667 0 0 0-10.666666-10.666666H394.666667z m245.333333 597.333333a32 32 0 0 1 64 0v74.666667a74.666667 74.666667 0 0 1-74.666667 74.666666H181.333333a74.666667 74.666667 0 0 1-74.666666-74.666666V394.666667a74.666667 74.666667 0 0 1 74.666666-74.666667h74.666667a32 32 0 0 1 0 64h-74.666667a10.666667 10.666667 0 0 0-10.666666 10.666667v448a10.666667 10.666667 0 0 0 10.666666 10.666666h448a10.666667 10.666667 0 0 0 10.666667-10.666666v-74.666667z" End Class #End Region diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModLocalComp.vb similarity index 97% rename from Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb rename to Plain Craft Launcher 2/Modules/Minecraft/ModLocalComp.vb index 9f6eedafd..9c9994791 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModLocalComp.vb @@ -1,9 +1,9 @@ Imports System.IO.Compression -Public Module ModMod +Public Module ModLocalComp Private Const LocalModCacheVersion As Integer = 7 - Public Class McMod + Public Class McComp #Region "基础" @@ -616,7 +616,7 @@ Finished: ''' ''' 当任何网络信息更新时触发。 ''' - Public Event OnCompUpdate(sender As McMod) + Public Event OnCompUpdate(sender As McComp) ''' ''' 该 Mod 关联的网络项目。 @@ -780,7 +780,7 @@ Finished: Return $"{State} - {Path}" End Function Public Overrides Function Equals(obj As Object) As Boolean - Dim target = TryCast(obj, McMod) + Dim target = TryCast(obj, McComp) Return target IsNot Nothing AndAlso Path = target.Path End Function @@ -808,17 +808,17 @@ Finished: End Class '加载 Mod 列表 - Public McModLoader As New LoaderTask(Of String, List(Of McMod))("Mod List Loader", AddressOf McModLoad) - Private Sub McModLoad(Loader As LoaderTask(Of String, List(Of McMod))) + Public McModLoader As New LoaderTask(Of String, List(Of McComp))("Mod List Loader", AddressOf McModLoad) + Private Sub McModLoad(Loader As LoaderTask(Of String, List(Of McComp))) Try RunInUiWait(Sub() If FrmVersionMod IsNot Nothing Then FrmVersionMod.Load.ShowProgress = False) '等待 Mod 更新完成 - If PageVersionMod.UpdatingVersions.Contains(Loader.Input) Then + If PageVersionComp.UpdatingVersions.Contains(Loader.Input) Then Log($"[Mod] 等待 Mod 更新完成后才能继续加载 Mod 列表:" & Loader.Input) Try RunInUiWait(Sub() If FrmVersionMod IsNot Nothing Then FrmVersionMod.Load.Text = "正在更新 Mod") - Do Until Not PageVersionMod.UpdatingVersions.Contains(Loader.Input) + Do Until Not PageVersionComp.UpdatingVersions.Contains(Loader.Input) If Loader.IsAborted Then Exit Sub Thread.Sleep(100) Loop @@ -841,7 +841,7 @@ Finished: Continue For End If End If - If McMod.IsModFile(File.FullName) Then ModFileList.Add(File) + If McComp.IsModFile(File.FullName) Then ModFileList.Add(File) Next End If @@ -868,17 +868,17 @@ Finished: Cache("version") = LocalModCacheVersion '加载 Mod 列表 - Dim ModList As New List(Of McMod) - Dim ModUpdateList As New List(Of McMod) + Dim ModList As New List(Of McComp) + Dim ModUpdateList As New List(Of McComp) For Each ModFile As FileInfo In ModFileList Loader.Progress += 0.94 / ModFileList.Count If Loader.IsAborted Then Exit Sub '加载 McMod 对象 - Dim ModEntry As New McMod(ModFile.FullName) + Dim ModEntry As New McComp(ModFile.FullName) ModEntry.Load() - Dim DumpMod As McMod = ModList.FirstOrDefault(Function(m) m.RawFileName = ModEntry.RawFileName) + Dim DumpMod As McComp = ModList.FirstOrDefault(Function(m) m.RawFileName = ModEntry.RawFileName) If DumpMod IsNot Nothing Then - Dim DisabledMod As McMod = If(DumpMod.State = McMod.McModState.Disabled, DumpMod, ModEntry) + Dim DisabledMod As McComp = If(DumpMod.State = McComp.McModState.Disabled, DumpMod, ModEntry) Log($"[Mod] 重复的 Mod 文件:{DumpMod.FileName} 与 {ModEntry.FileName},已忽略 {DisabledMod.FileName}", LogLevel.Debug) If DisabledMod Is ModEntry Then Continue For @@ -889,7 +889,7 @@ Finished: End If ModList.Add(ModEntry) '读取 Comp 缓存 - If ModEntry.State = McMod.McModState.Unavailable Then Continue For + If ModEntry.State = McComp.McModState.Unavailable Then Continue For Dim CacheKey = ModEntry.ModrinthHash & PageVersionLeft.Version.Version.McName & GetTargetModLoaders().Join("") If Cache.ContainsKey(CacheKey) Then ModEntry.FromJson(Cache(CacheKey)) @@ -903,9 +903,9 @@ Finished: '排序 ModList = ModList.Sort( - Function(Left As McMod, Right As McMod) As Boolean - If (Left.State = McMod.McModState.Unavailable) <> (Right.State = McMod.McModState.Unavailable) Then - Return Left.State = McMod.McModState.Unavailable + Function(Left As McComp, Right As McComp) As Boolean + If (Left.State = McComp.McModState.Unavailable) <> (Right.State = McComp.McModState.Unavailable) Then + Return Left.State = McComp.McModState.Unavailable Else Return Not Right.FileName.CompareTo(Left.FileName) End If @@ -918,7 +918,7 @@ Finished: '开始联网加载 If ModUpdateList.Any() Then 'TODO: 添加信息获取中提示 - McModDetailLoader.Start(New KeyValuePair(Of List(Of McMod), JObject)(ModUpdateList, Cache), IsForceRestart:=True) + McModDetailLoader.Start(New KeyValuePair(Of List(Of McComp), JObject)(ModUpdateList, Cache), IsForceRestart:=True) End If Catch ex As Exception @@ -927,9 +927,9 @@ Finished: End Try End Sub '联网加载 Mod 详情 - Public McModDetailLoader As New LoaderTask(Of KeyValuePair(Of List(Of McMod), JObject), Integer)("Mod List Detail Loader", AddressOf McModDetailLoad) - Private Sub McModDetailLoad(Loader As LoaderTask(Of KeyValuePair(Of List(Of McMod), JObject), Integer)) - Dim Mods As List(Of McMod) = Loader.Input.Key + Public McModDetailLoader As New LoaderTask(Of KeyValuePair(Of List(Of McComp), JObject), Integer)("Mod List Detail Loader", AddressOf McModDetailLoad) + Private Sub McModDetailLoad(Loader As LoaderTask(Of KeyValuePair(Of List(Of McComp), JObject), Integer)) + Dim Mods As List(Of McComp) = Loader.Input.Key Dim Cache As JObject = Loader.Input.Value '获取作为检查目标的加载器和版本 '此处不应向下扩展检查的 MC 小版本,例如 Mod 在更新 1.16.5 后,对早期的 1.16.2 版本发布了修补补丁,这会导致 PCL 将 1.16.5 版本的 Mod 降级到 1.16.2 @@ -951,13 +951,13 @@ Finished: Log($"[Mod] 从 Modrinth 获取到 {ModrinthVersion.Count} 个本地 Mod 的对应信息") '步骤 2:尝试读取工程信息缓存,构建其他 Mod 的对应关系 If ModrinthVersion.Count = 0 Then Exit Sub - Dim ModrinthMapping As New Dictionary(Of String, List(Of McMod)) + Dim ModrinthMapping As New Dictionary(Of String, List(Of McComp)) For Each Entry In Mods If Not ModrinthVersion.ContainsKey(Entry.ModrinthHash) Then Continue For If ModrinthVersion(Entry.ModrinthHash)("files")(0)("hashes")("sha1") <> Entry.ModrinthHash Then Continue For Dim ProjectId = ModrinthVersion(Entry.ModrinthHash)("project_id").ToString If CompProjectCache.ContainsKey(ProjectId) AndAlso Entry.Comp Is Nothing Then Entry.Comp = CompProjectCache(ProjectId) '读取已加载的缓存,加快结果出现速度 - If Not ModrinthMapping.ContainsKey(ProjectId) Then ModrinthMapping(ProjectId) = New List(Of McMod) + If Not ModrinthMapping.ContainsKey(ProjectId) Then ModrinthMapping(ProjectId) = New List(Of McComp) ModrinthMapping(ProjectId).Add(Entry) '记录对应的 CompFile Dim File As New CompFile(ModrinthVersion(Entry.ModrinthHash), CompType.Mod) @@ -1020,14 +1020,14 @@ Finished: Log($"[Mod] 从 CurseForge 获取到 {CurseForgeRaw.Count} 个本地 Mod 的对应信息") '步骤 2:尝试读取工程信息缓存,构建其他 Mod 的对应关系 If Not CurseForgeRaw.Any() Then Exit Sub - Dim CurseForgeMapping As New Dictionary(Of Integer, List(Of McMod)) + Dim CurseForgeMapping As New Dictionary(Of Integer, List(Of McComp)) For Each Project In CurseForgeRaw Dim ProjectId = Project("id").ToString Dim Hash As UInteger = Project("file")("fileFingerprint") For Each Entry In Mods If Entry.CurseForgeHash <> Hash Then Continue For If CompProjectCache.ContainsKey(ProjectId) AndAlso Entry.Comp Is Nothing Then Entry.Comp = CompProjectCache(ProjectId) '读取已加载的缓存,加快结果出现速度 - If Not CurseForgeMapping.ContainsKey(ProjectId) Then CurseForgeMapping(ProjectId) = New List(Of McMod) + If Not CurseForgeMapping.ContainsKey(ProjectId) Then CurseForgeMapping(ProjectId) = New List(Of McComp) CurseForgeMapping(ProjectId).Add(Entry) '记录对应的 CompFile Dim File As New CompFile(Project("file"), CompType.Mod) @@ -1040,7 +1040,7 @@ Finished: If Not CurseForgeMapping.Any() Then Exit Sub Dim CurseForgeProject = CType(GetJson(DlModRequest("https://api.curseforge.com/v1/mods", "POST", $"{{""modIds"": [{CurseForgeMapping.Keys.Join(",")}]}}", "application/json")), JObject)("data") - Dim UpdateFileIds As New Dictionary(Of Integer, List(Of McMod)) 'FileId -> 本地 Mod 文件列表 + Dim UpdateFileIds As New Dictionary(Of Integer, List(Of McComp)) 'FileId -> 本地 Mod 文件列表 Dim FileIdToProjectSlug As New Dictionary(Of Integer, String) For Each ProjectJson In CurseForgeProject If ProjectJson("isAvailable") IsNot Nothing AndAlso Not ProjectJson("isAvailable").ToObject(Of Boolean) Then Continue For @@ -1070,7 +1070,7 @@ Finished: NewestFileIds.Add(IndexEntry("fileId").ToObject(Of Integer)) Next For Each FileId In NewestFileIds - If Not UpdateFileIds.ContainsKey(FileId) Then UpdateFileIds(FileId) = New List(Of McMod) + If Not UpdateFileIds.ContainsKey(FileId) Then UpdateFileIds(FileId) = New List(Of McComp) UpdateFileIds(FileId).AddRange(CurseForgeMapping(Project.Id)) FileIdToProjectSlug(FileId) = Project.Slug Next @@ -1081,17 +1081,17 @@ Finished: If Not UpdateFileIds.Any() Then Exit Sub Dim CurseForgeFiles = CType(GetJson(DlModRequest("https://api.curseforge.com/v1/mods/files", "POST", $"{{""fileIds"": [{UpdateFileIds.Keys.Join(",")}]}}", "application/json")), JObject)("data") - Dim UpdateFiles As New Dictionary(Of McMod, CompFile) + Dim UpdateFiles As New Dictionary(Of McComp, CompFile) For Each FileJson In CurseForgeFiles Dim File As New CompFile(FileJson, CompType.Mod) If Not File.Available Then Continue For - For Each Entry As McMod In UpdateFileIds(File.Id) + For Each Entry As McComp In UpdateFileIds(File.Id) If UpdateFiles.ContainsKey(Entry) AndAlso UpdateFiles(Entry).ReleaseDate >= File.ReleaseDate Then Continue For UpdateFiles(Entry) = File Next Next For Each Pair In UpdateFiles - Dim Entry As McMod = Pair.Key + Dim Entry As McComp = Pair.Key Dim UpdateFile As CompFile = Pair.Value If ModeDebug Then Log($"[Mod] 本地文件 {Entry.CompFile.FileName} 在 CurseForge 上的最新版为 {UpdateFile.FileName}") If Entry.CompFile.ReleaseDate >= UpdateFile.ReleaseDate OrElse Entry.CompFile.Hash = UpdateFile.Hash Then Continue For @@ -1127,7 +1127,7 @@ Finished: Next WriteFile(PathTemp & "Cache\LocalMod.json", Cache.ToString(If(ModeDebug, Newtonsoft.Json.Formatting.Indented, Newtonsoft.Json.Formatting.None))) '刷新边栏 - If FrmVersionMod?.Filter = PageVersionMod.FilterType.CanUpdate Then + If FrmVersionMod?.Filter = PageVersionComp.FilterType.CanUpdate Then RunInUi(Sub() FrmVersionMod?.RefreshUI()) '同步 “可更新” 列表 (#4677) Else RunInUi(Sub() FrmVersionMod?.RefreshBars()) diff --git a/Plain Craft Launcher 2/Modules/ModMain.vb b/Plain Craft Launcher 2/Modules/ModMain.vb index 2daca5220..43028ea4e 100644 --- a/Plain Craft Launcher 2/Modules/ModMain.vb +++ b/Plain Craft Launcher 2/Modules/ModMain.vb @@ -434,10 +434,11 @@ EndHint: '版本设置页面声明 Public FrmVersionLeft As PageVersionLeft Public FrmVersionOverall As PageVersionOverall - Public FrmVersionMod As PageVersionMod + Public FrmVersionMod As PageVersionComp Public FrmVersionModDisabled As PageVersionModDisabled Public FrmVersionSetup As PageVersionSetup Public FrmVersionExport As PageVersionExport + Public FrmVersionScreenshot As PageVersionScreenshot '资源信息分页声明 Public FrmDownloadCompDetail As PageDownloadCompDetail diff --git a/Plain Craft Launcher 2/Pages/PageVersion/MyLocalModItem.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/MyLocalModItem.xaml.vb index a7bc54bd0..139881b55 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/MyLocalModItem.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/MyLocalModItem.xaml.vb @@ -24,11 +24,11 @@ Public Class MyLocalModItem Set(value As String) Dim RawValue = value Select Case Entry.State - Case McMod.McModState.Fine + Case McComp.McModState.Fine LabTitle.TextDecorations = Nothing - Case McMod.McModState.Disabled + Case McComp.McModState.Disabled LabTitle.TextDecorations = TextDecorations.Strikethrough - Case McMod.McModState.Unavailable + Case McComp.McModState.Unavailable LabTitle.TextDecorations = TextDecorations.Strikethrough value &= " [错误]" End Select @@ -79,11 +79,11 @@ Public Class MyLocalModItem End Property '相关联的 Mod - Public Property Entry As McMod + Public Property Entry As McComp Get Return Tag End Get - Set(value As McMod) + Set(value As McComp) Tag = value End Set End Property @@ -188,7 +188,7 @@ Public Class MyLocalModItem Anim.Add(AaOpacity(RectCheck, 1 - RectCheck.Opacity, 30)) RectCheck.VerticalAlignment = VerticalAlignment.Center RectCheck.Margin = New Thickness(-3, 0, 0, 0) - Anim.Add(AaColor(LabTitle, TextBlock.ForegroundProperty, If(Entry.State = McMod.McModState.Fine, "ColorBrush2", "ColorBrush5"), 200)) + Anim.Add(AaColor(LabTitle, TextBlock.ForegroundProperty, If(Entry.State = McComp.McModState.Fine, "ColorBrush2", "ColorBrush5"), 200)) Else '由有变无 Anim.Add(AaHeight(RectCheck, -RectCheck.ActualHeight, 120,, New AniEaseInFluent(AniEasePower.Weak))) @@ -204,11 +204,11 @@ Public Class MyLocalModItem If Checked Then RectCheck.Height = 32 RectCheck.Opacity = 1 - LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = McMod.McModState.Fine, "ColorBrush2", "ColorBrush5")) + LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = McComp.McModState.Fine, "ColorBrush2", "ColorBrush5")) Else RectCheck.Height = 0 RectCheck.Opacity = 0 - LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = McMod.McModState.Fine, "ColorBrush1", "ColorBrushGray4")) + LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = McComp.McModState.Fine, "ColorBrush1", "ColorBrushGray4")) End If AniStop("MyLocalModItem Checked " & Uuid) End If @@ -337,9 +337,9 @@ Public Class MyLocalModItem '标题与描述 Dim DescFileName As String Select Case Entry.State - Case McMod.McModState.Fine + Case McComp.McModState.Fine DescFileName = GetFileNameWithoutExtentionFromPath(Entry.Path) - Case McMod.McModState.Disabled + Case McComp.McModState.Disabled DescFileName = GetFileNameWithoutExtentionFromPath(Entry.Path.Replace(".disabled", "").Replace(".old", "")) Case Else 'McMod.McModState.Unavailable DescFileName = GetFileNameFromPath(Entry.Path) @@ -382,14 +382,14 @@ Public Class MyLocalModItem End If Description = NewDescription If Checked Then - LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = McMod.McModState.Fine, "ColorBrush2", "ColorBrush5")) + LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = McComp.McModState.Fine, "ColorBrush2", "ColorBrush5")) Else - LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = McMod.McModState.Fine, "ColorBrush1", "ColorBrushGray4")) + LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = McComp.McModState.Fine, "ColorBrush1", "ColorBrushGray4")) End If '主 Logo Logo = If(Entry.Comp Is Nothing, PathImage & "Icons/NoIcon.png", Entry.Comp.GetControlLogo()) '图标右下角的 Logo - If Entry.State = McMod.McModState.Fine Then + If Entry.State = McComp.McModState.Fine Then If ImgState IsNot Nothing Then Children.Remove(ImgState) ImgState = Nothing diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionComp.xaml similarity index 99% rename from Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml rename to Plain Craft Launcher 2/Pages/PageVersion/PageVersionComp.xaml index d00296d69..4aae3e1e8 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionComp.xaml @@ -2,7 +2,7 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:PCL" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - mc:Ignorable="d" x:Class="PageVersionMod" + mc:Ignorable="d" x:Class="PageVersionComp" PanScroll="{Binding ElementName=PanBack}"> diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionComp.xaml.vb similarity index 93% rename from Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb rename to Plain Craft Launcher 2/Pages/PageVersion/PageVersionComp.xaml.vb index 35044a33c..ee6f71525 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionComp.xaml.vb @@ -1,8 +1,17 @@ -Public Class PageVersionMod +Public Class PageVersionComp Implements IRefreshable #Region "初始化" + Public Sub New(ResourceType As CompType) + + ' 此调用是设计器所必需的。 + InitializeComponent() + + ' 在 InitializeComponent() 调用之后添加任何初始化。 + + End Sub + Private IsLoad As Boolean = False Public Sub PageOther_Loaded() Handles Me.Loaded @@ -93,7 +102,7 @@ End If '修改缓存 ModItems.Clear() - For Each ModEntity As McMod In McModLoader.Output + For Each ModEntity As McComp In McModLoader.Output ModItems(ModEntity.RawFileName) = McModListItem(ModEntity) Next '显示结果 @@ -104,7 +113,7 @@ Log(ex, "加载 Mod 列表 UI 失败", LogLevel.Feedback) End Try End Sub - Private Function McModListItem(Entry As McMod) As MyLocalModItem + Private Function McModListItem(Entry As McComp) As MyLocalModItem AniControlEnabled += 1 Dim NewItem As New MyLocalModItem With {.SnapsToDevicePixels = True, .Entry = Entry, .ButtonHandler = AddressOf McModContent, .Checked = SelectedMods.Contains(Entry.RawFileName)} @@ -137,13 +146,13 @@ ToolTipService.SetVerticalOffset(BtnDelete, 30) ToolTipService.SetHorizontalOffset(BtnDelete, 2) AddHandler BtnDelete.Click, AddressOf Delete_Click - Dim BtnED As New MyIconButton With {.LogoScale = 1, .Logo = If(sender.Entry.State = McMod.McModState.Fine, Logo.IconButtonStop, Logo.IconButtonCheck), .Tag = sender} - BtnED.ToolTip = If(sender.Entry.State = McMod.McModState.Fine, "禁用", "启用") + Dim BtnED As New MyIconButton With {.LogoScale = 1, .Logo = If(sender.Entry.State = McComp.McModState.Fine, Logo.IconButtonStop, Logo.IconButtonCheck), .Tag = sender} + BtnED.ToolTip = If(sender.Entry.State = McComp.McModState.Fine, "禁用", "启用") ToolTipService.SetPlacement(BtnED, Primitives.PlacementMode.Center) ToolTipService.SetVerticalOffset(BtnED, 30) ToolTipService.SetHorizontalOffset(BtnED, 2) AddHandler BtnED.Click, AddressOf ED_Click - If sender.Entry.State = McMod.McModState.Unavailable Then + If sender.Entry.State = McComp.McModState.Unavailable Then sender.Buttons = {BtnCont, BtnOpen, BtnDelete} Else sender.Buttons = {BtnCont, BtnOpen, BtnED, BtnDelete} @@ -155,7 +164,7 @@ ''' Public Sub RefreshUI() If PanList Is Nothing Then Exit Sub - Dim ShowingMods = If(IsSearching, SearchResult, If(McModLoader.Output, New List(Of McMod))).Where(Function(m) CanPassFilter(m)).ToList + Dim ShowingMods = If(IsSearching, SearchResult, If(McModLoader.Output, New List(Of McComp))).Where(Function(m) CanPassFilter(m)).ToList '重新列出列表 AniControlEnabled += 1 If ShowingMods.Any() Then @@ -188,12 +197,12 @@ Dim DisabledCount As Integer = 0 Dim UpdateCount As Integer = 0 Dim UnavalialeCount As Integer = 0 - For Each ModItem In If(IsSearching, SearchResult, If(McModLoader.Output, New List(Of McMod))) + For Each ModItem In If(IsSearching, SearchResult, If(McModLoader.Output, New List(Of McComp))) AnyCount += 1 If ModItem.CanUpdate Then UpdateCount += 1 - If ModItem.State.Equals(McMod.McModState.Fine) Then EnabledCount += 1 - If ModItem.State.Equals(McMod.McModState.Disabled) Then DisabledCount += 1 - If ModItem.State.Equals(McMod.McModState.Unavailable) Then UnavalialeCount += 1 + If ModItem.State.Equals(McComp.McModState.Fine) Then EnabledCount += 1 + If ModItem.State.Equals(McComp.McModState.Disabled) Then DisabledCount += 1 + If ModItem.State.Equals(McComp.McModState.Unavailable) Then UnavalialeCount += 1 Next '显示 BtnFilterAll.Text = If(IsSearching, "搜索结果", "全部") & $" ({AnyCount})" @@ -222,9 +231,9 @@ For Each ModEntity In McModLoader.Output If SelectedMods.Contains(ModEntity.RawFileName) Then If ModEntity.CanUpdate Then HasUpdate = True - If ModEntity.State = McMod.McModState.Fine Then + If ModEntity.State = McComp.McModState.Fine Then HasEnabled = True - ElseIf ModEntity.State = McMod.McModState.Disabled Then + ElseIf ModEntity.State = McComp.McModState.Disabled Then HasDisabled = True End If End If @@ -465,18 +474,18 @@ Install: ''' ''' 检查该 Mod 项是否符合当前筛选的类别。 ''' - Private Function CanPassFilter(CheckingMod As McMod) As Boolean + Private Function CanPassFilter(CheckingMod As McComp) As Boolean Select Case Filter Case FilterType.All Return True Case FilterType.Enabled - Return CheckingMod.State = McMod.McModState.Fine + Return CheckingMod.State = McComp.McModState.Fine Case FilterType.Disabled - Return CheckingMod.State = McMod.McModState.Disabled + Return CheckingMod.State = McComp.McModState.Disabled Case FilterType.CanUpdate Return CheckingMod.CanUpdate Case FilterType.Unavailable - Return CheckingMod.State = McMod.McModState.Unavailable + Return CheckingMod.State = McComp.McModState.Unavailable Case Else Return False End Select @@ -498,15 +507,15 @@ Install: Not sender.Equals(BtnSelectDisable)) ChangeAllSelected(False) End Sub - Private Sub EDMods(ModList As IEnumerable(Of McMod), IsEnable As Boolean) + Private Sub EDMods(ModList As IEnumerable(Of McComp), IsEnable As Boolean) Dim IsSuccessful As Boolean = True For Each ModE In ModList.ToList Dim ModEntity = ModE '仅用于去除迭代变量无法修改的限制 Dim NewPath As String = Nothing - If ModEntity.State = McMod.McModState.Fine AndAlso Not IsEnable Then + If ModEntity.State = McComp.McModState.Fine AndAlso Not IsEnable Then '禁用 NewPath = ModEntity.Path & If(File.Exists(ModEntity.Path & ".old"), ".old", ".disabled") - ElseIf ModEntity.State = McMod.McModState.Disabled AndAlso IsEnable Then + ElseIf ModEntity.State = McComp.McModState.Disabled AndAlso IsEnable Then '启用 NewPath = ModEntity.RawPath Else @@ -538,7 +547,7 @@ Install: IsSuccessful = False End Try '更改 Loader 中的列表 - Dim NewModEntity As New McMod(NewPath) + Dim NewModEntity As New McComp(NewPath) NewModEntity.FromJson(ModEntity.ToJson) If McModLoader.Output.Contains(ModEntity) Then Dim IndexOfLoader As Integer = McModLoader.Output.IndexOf(ModEntity) @@ -569,7 +578,7 @@ Install: '更新 Private Sub BtnSelectUpdate_Click() Handles BtnSelectUpdate.Click - Dim UpdateList As List(Of McMod) = McModLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName) AndAlso m.CanUpdate).ToList() + Dim UpdateList As List(Of McComp) = McModLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName) AndAlso m.CanUpdate).ToList() If Not UpdateList.Any() Then Return UpdateMods(UpdateList) ChangeAllSelected(False) @@ -578,7 +587,7 @@ Install: ''' 记录正在进行 Mod 更新的 mods 文件夹路径。 ''' Public Shared UpdatingVersions As New List(Of String) - Public Sub UpdateMods(ModList As IEnumerable(Of McMod)) + Public Sub UpdateMods(ModList As IEnumerable(Of McComp)) '更新前警告 If Not Setup.Get("HintUpdateMod") OrElse ModList.Count >= 15 Then If MyMsgBox($"新版本 Mod 可能不兼容旧存档或者其他 Mod,这可能导致游戏崩溃,甚至永久损坏存档!{vbCrLf}如果你在游玩整合包,请千万不要自行更新 Mod!{vbCrLf}{vbCrLf}在更新前,请先备份存档,并检查 Mod 的更新日志。{vbCrLf}如果更新后出现问题,你也可以在回收站找回更新前的 Mod。", "Mod 更新警告", "我已了解风险,继续更新", "取消", IsWarn:=True) = 1 Then @@ -592,7 +601,7 @@ Install: ModList = ModList.ToList() '防止刷新影响迭代器 Dim FileList As New List(Of NetFile) Dim FileCopyList As New Dictionary(Of String, String) - For Each Entry As McMod In ModList + For Each Entry As McComp In ModList Dim File As CompFile = Entry.UpdateFile If Not File.Available Then Continue For '确认更新后的文件名 @@ -632,7 +641,7 @@ Install: InstallLoaders.Add(New LoaderTask(Of Integer, Integer)("替换旧版 Mod 文件", Sub() Try - For Each Entry As McMod In ModList + For Each Entry As McComp In ModList If File.Exists(Entry.Path) Then My.Computer.FileSystem.DeleteFile(Entry.Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) Else @@ -656,7 +665,7 @@ Install: End Try End Sub)) '结束处理 - Dim Loader As New LoaderCombo(Of IEnumerable(Of McMod))("Mod 更新:" & PageVersionLeft.Version.Name, InstallLoaders) + Dim Loader As New LoaderCombo(Of IEnumerable(Of McComp))("Mod 更新:" & PageVersionLeft.Version.Name, InstallLoaders) Dim PathMods As String = PageVersionLeft.Version.PathIndie & "mods\" Loader.OnStateChanged = Sub() @@ -710,19 +719,19 @@ Install: DeleteMods(McModLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName))) ChangeAllSelected(False) End Sub - Private Sub DeleteMods(ModList As IEnumerable(Of McMod)) + Private Sub DeleteMods(ModList As IEnumerable(Of McComp)) Try Dim IsSuccessful As Boolean = True Dim IsShiftPressed As Boolean = My.Computer.Keyboard.ShiftKeyDown '确认需要删除的文件 ModList = ModList.SelectMany( - Function(Target As McMod) - If Target.State = McMod.McModState.Fine Then + Function(Target As McComp) + If Target.State = McComp.McModState.Fine Then Return {Target.Path, Target.Path & If(File.Exists(Target.Path & ".old"), ".old", ".disabled")} Else Return {Target.Path, Target.RawPath} End If - End Function).Distinct.Where(Function(m) File.Exists(m)).Select(Function(m) New McMod(m)).ToList() + End Function).Distinct.Where(Function(m) File.Exists(m)).Select(Function(m) New McComp(m)).ToList() '实际删除文件 For Each ModEntity In ModList '删除 @@ -796,9 +805,9 @@ Install: Public Sub Info_Click(sender As Object, e As EventArgs) Try - Dim ModEntry As McMod = CType(If(TypeOf sender Is MyIconButton, sender.Tag, sender), MyLocalModItem).Entry + Dim ModEntry As McComp = CType(If(TypeOf sender Is MyIconButton, sender.Tag, sender), MyLocalModItem).Entry '加载失败信息 - If ModEntry.State = McMod.McModState.Unavailable Then + If ModEntry.State = McComp.McModState.Unavailable Then MyMsgBox("无法读取此 Mod 的信息。" & vbCrLf & vbCrLf & "详细的错误信息:" & GetExceptionDetail(ModEntry.FileUnavailableReason), "Mod 读取失败") Return End If @@ -879,7 +888,7 @@ Install: '启用 / 禁用 Public Sub ED_Click(sender As MyIconButton, e As EventArgs) Dim ListItem As MyLocalModItem = sender.Tag - EDMods({ListItem.Entry}, ListItem.Entry.State = McMod.McModState.Disabled) + EDMods({ListItem.Entry}, ListItem.Entry.State = McComp.McModState.Disabled) End Sub #End Region @@ -891,12 +900,12 @@ Install: Return Not String.IsNullOrWhiteSpace(SearchBox.Text) End Get End Property - Private SearchResult As List(Of McMod) + Private SearchResult As List(Of McComp) Public Sub SearchRun() Handles SearchBox.TextChanged If IsSearching Then '构造请求 - Dim QueryList As New List(Of SearchEntry(Of McMod)) - For Each Entry As McMod In McModLoader.Output + Dim QueryList As New List(Of SearchEntry(Of McComp)) + For Each Entry As McComp In McModLoader.Output Dim SearchSource As New List(Of KeyValuePair(Of String, Double)) SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.Name, 1)) SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.FileName, 1)) @@ -912,7 +921,7 @@ Install: If Entry.Comp.Description <> Entry.Description Then SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.Comp.Description, 0.4)) SearchSource.Add(New KeyValuePair(Of String, Double)(String.Join("", Entry.Comp.Tags), 0.2)) End If - QueryList.Add(New SearchEntry(Of McMod) With {.Item = Entry, .SearchSource = SearchSource}) + QueryList.Add(New SearchEntry(Of McComp) With {.Item = Entry, .SearchSource = SearchSource}) Next '进行搜索 SearchResult = Search(QueryList, SearchBox.Text, MaxBlurCount:=6, MinBlurSimilarity:=0.35).Select(Function(r) r.Item).ToList diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index 7473e8667..4ad699799 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -460,9 +460,9 @@ Public Class PageVersionExport #Region "复制文件" - Loaders.Add(New LoaderTask(Of Integer, List(Of McMod))("复制导出内容", - Sub(Loader As LoaderTask(Of Integer, List(Of McMod))) - Loader.Output = New List(Of McMod) + Loaders.Add(New LoaderTask(Of Integer, List(Of McComp))("复制导出内容", + Sub(Loader As LoaderTask(Of Integer, List(Of McComp))) + Loader.Output = New List(Of McComp) '复制版本文件 Dim Progress As Integer = 0 Dim SearchFolder As Action(Of DirectoryInfo) @@ -491,7 +491,7 @@ Public Class PageVersionExport If CheckHostedAssets AndAlso {".zip", ".rar", ".jar", ".disabled", ".old"}.Contains(Entry.Extension.ToLower) AndAlso {"mods", "packs", "openloader", "resource"}.Any(Function(s) RelativePath.Contains(s)) Then - Dim ModFile As New McMod(TargetPath) + Dim ModFile As New McComp(TargetPath) Dim Unused = ModFile.ModrinthHash '提前计算 Hash Unused = ModFile.CurseForgeHash Loader.Output.Add(ModFile) @@ -547,9 +547,9 @@ Public Class PageVersionExport #Region "联网检查" - Loaders.Add(New LoaderTask(Of List(Of McMod), Dictionary(Of McMod, List(Of String)))("联网获取文件信息", - Sub(Loader As LoaderTask(Of List(Of McMod), Dictionary(Of McMod, List(Of String)))) - Loader.Output = New Dictionary(Of McMod, List(Of String)) + Loaders.Add(New LoaderTask(Of List(Of McComp), Dictionary(Of McComp, List(Of String)))("联网获取文件信息", + Sub(Loader As LoaderTask(Of List(Of McComp), Dictionary(Of McComp, List(Of String)))) + Loader.Output = New Dictionary(Of McComp, List(Of String)) If Not CheckHostedAssets Then Log($"[Export] 要求跳过联网获取步骤") : Return If Not Loader.Input.Any Then Log($"[Export] 没有需要联网检查的文件,跳过联网获取步骤") : Return @@ -593,7 +593,7 @@ Public Class PageVersionExport Dim File As JObject = ResultJson("file") If String.IsNullOrEmpty(File("downloadUrl")) Then Continue For '查找对应的文件 - Dim ModFile As McMod = Loader.Input.FirstOrDefault(Function(m) m.CurseForgeHash = File("fileFingerprint").ToObject(Of UInteger)) + Dim ModFile As McComp = Loader.Input.FirstOrDefault(Function(m) m.CurseForgeHash = File("fileFingerprint").ToObject(Of UInteger)) If ModFile Is Nothing Then Continue For '写入下载地址 For Each Address In CompFile.HandleCurseForgeDownloadUrls(File("downloadUrl").ToString) @@ -634,12 +634,12 @@ Public Class PageVersionExport #Region "生成压缩包" - Loaders.Add(New LoaderTask(Of Dictionary(Of McMod, List(Of String)), Integer)("生成压缩包", - Sub(Loader As LoaderTask(Of Dictionary(Of McMod, List(Of String)), Integer)) + Loaders.Add(New LoaderTask(Of Dictionary(Of McComp, List(Of String)), Integer)("生成压缩包", + Sub(Loader As LoaderTask(Of Dictionary(Of McComp, List(Of String)), Integer)) '整理文件列表 Dim Files As New JArray For Each Pair In Loader.Input - Dim ModFile As McMod = Pair.Key + Dim ModFile As McComp = Pair.Key Files.Add(New JObject From { {"path", ModFile.Path.AfterFirst(OverridesFolder).Replace("\", "/")}, {"hashes", New JObject From {{"sha1", ModFile.ModrinthHash}, {"sha512", GetFileSHA512(ModFile.Path)}}}, diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml index b145e25a2..f0283b880 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml @@ -3,6 +3,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:PCL" AnimatedControl="{Binding ElementName=PanItem, Mode=OneWay}"> + - + - - + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb index 03831112e..db244f1df 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb @@ -26,7 +26,7 @@ ''' ''' 勾选事件改变页面。 ''' - Private Sub PageCheck(sender As MyListItem, e As RouteEventArgs) Handles ItemOverall.Check, ItemMod.Check, ItemModDisabled.Check, ItemSetup.Check, ItemExport.Check + Private Sub PageCheck(sender As MyListItem, e As RouteEventArgs) Handles ItemOverall.Check, ItemMod.Check, ItemModDisabled.Check, ItemSetup.Check, ItemExport.Check, ItemScreenshot.Check '尚未初始化控件属性时,sender.Tag 为 Nothing,会导致切换到页面 0 '若使用 IsLoaded,则会导致模拟点击不被执行(模拟点击切换页面时,控件的 IsLoaded 为 False) If sender.Tag IsNot Nothing Then PageChange(Val(sender.Tag)) @@ -39,7 +39,7 @@ If FrmVersionOverall Is Nothing Then FrmVersionOverall = New PageVersionOverall Return FrmVersionOverall Case FormMain.PageSubType.VersionMod - If FrmVersionMod Is Nothing Then FrmVersionMod = New PageVersionMod + If FrmVersionMod Is Nothing Then FrmVersionMod = New PageVersionComp(CompType.Mod) Return FrmVersionMod Case FormMain.PageSubType.VersionModDisabled If FrmVersionModDisabled Is Nothing Then FrmVersionModDisabled = New PageVersionModDisabled @@ -50,6 +50,9 @@ Case FormMain.PageSubType.VersionExport If FrmVersionExport Is Nothing Then FrmVersionExport = New PageVersionExport Return FrmVersionExport + Case FormMain.PageSubType.VersionScreenshot + If FrmVersionScreenshot Is Nothing Then FrmVersionScreenshot = New PageVersionScreenshot + Return FrmVersionScreenshot Case Else Throw New Exception("未知的版本设置子页面种类:" & ID) End Select @@ -100,7 +103,7 @@ Public Sub Refresh(SubType As FormMain.PageSubType) Select Case SubType Case FormMain.PageSubType.VersionMod - PageVersionMod.Refresh() + PageVersionComp.Refresh() ItemMod.Checked = True Case FormMain.PageSubType.VersionExport If FrmVersionExport IsNot Nothing Then FrmVersionExport.RefreshAll() diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml new file mode 100644 index 000000000..b62c36cd9 --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb new file mode 100644 index 000000000..44c9dabe9 --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionScreenshot.xaml.vb @@ -0,0 +1,315 @@ +Public Class PageVersionScreenshot + Implements IRefreshable + Private Sub RefreshSelf() Implements IRefreshable.Refresh + Refresh() + End Sub + Public Shared Sub Refresh() + If FrmVersionScreenshot IsNot Nothing Then FrmVersionScreenshot.Reload() + FrmVersionLeft.ItemScreenshot.Checked = True + End Sub + + Private Sub LoaderInit() Handles Me.Initialized + PageLoaderInit(Load, PanLoad, PanContent, PanAlways, ScreenshotLoader, AddressOf UpdateList, AutoRun:=False) + End Sub + + Public ScreenshotLoader As New LoaderTask(Of Integer, List(Of MyCard))("Screenshot file loader", AddressOf LoadImages) + Private Page As Integer = 0 + Private MaxPage As Integer = 1 + Private SingleLoadCount As Integer = 20 + + Private IsLoad As Boolean = False + Private Sub PageSetupLaunch_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded + + '重复加载部分 + PanBack.ScrollToHome() + ScreenshotPath = PageVersionLeft.Version.PathIndie + "screenshots\" + If Not Directory.Exists(ScreenshotPath) Then Directory.CreateDirectory(ScreenshotPath) + Reload() + + + '非重复加载部分 + If IsLoad Then Exit Sub + IsLoad = True + + End Sub + + Dim FileList As List(Of String) = New List(Of String) + Dim ScreenshotPath As String + + ''' + ''' 确保当前页面上的信息已正确显示。 + ''' + Public Sub Reload() + AniControlEnabled += 1 + PanBack.ScrollToHome() + + '加载文件列表 + Log("[Screenshot] 刷新截图文件") + FileList.Clear() + If Directory.Exists(ScreenshotPath) Then FileList = Directory.EnumerateFiles(ScreenshotPath, "*", SearchOption.TopDirectoryOnly).ToList() + Log("[Screenshot] 共发现 " & FileList.Count & " 个截图文件") + 'FileList.RemoveAll(Function(c) c.ContainsF("\debug\")) '排除资源包调试输出 + FileList.RemoveAll(Function(c) + If File.GetAttributes(c).HasFlag(FileAttributes.Hidden) Then Return True '排除隐藏文件 + Dim info As New FileInfo(c) + If info Is Nothing Then Return True + If info.Length < 1024 Then Return True '小于 1 KB 可能为无效文件 + Dim AllowedSuffix As String() = {".png", ".jpg", ".jpeg", ".bmp", ".tiff"} + 'Dim AllowedSuffix As String() = {".png", ".jpg", ".jpeg", ".bmp", ".webp", ".tiff"} + If Not AllowedSuffix.Contains(info.Extension.ToLower()) Then Return True '只允许指定后缀的文件 + Return False + End Function) + FileList = FileList.Sort(Function(a, b) New FileInfo(a).CreationTime > New FileInfo(b).CreationTime) + Log("[Screenshot] 筛选后得到 " & FileList.Count & " 个截图文件") + RefreshTip() + Page = 1 + MaxPage = Math.Ceiling(FileList.Count / SingleLoadCount) + PanList.Children.Clear() + If FileList.Count > 0 Then + SetPageButton() + PanContent.Visibility = Visibility.Collapsed '这行不能删 + ScreenshotLoader.Start(IsForceRestart:=True) + End If + + AniControlEnabled -= 1 + End Sub + + Private Sub LoadImages(Loader As LoaderTask(Of Integer, List(Of MyCard))) + Dim StartIndex = (Page - 1) * SingleLoadCount + If StartIndex >= FileList.Count Then Exit Sub + Dim EndIndex = Math.Min(Page * SingleLoadCount - 1, FileList.Count - 1) + Dim res As New List(Of MyCard) + For i = StartIndex To EndIndex + Dim card As MyCard = Nothing + Dim FilePath = FileList.ElementAt(i) + Dim loadSource = FilePath + 'Using fs As New FileStream(FilePath, FileMode.Open, FileAccess.Read) + ' Dim Header(1) As Byte + ' fs.Read(Header, 0, 2) + ' fs.Seek(0, SeekOrigin.Begin) + ' If Header(0) = 82 AndAlso Header(1) = 73 Then + ' 'WebP 格式,需要转换 + ' Dim FileBytes(fs.Length - 1) As Byte + ' fs.Read(FileBytes, 0, FileBytes.Length) + ' Dim Pic = MyBitmap.WebPDecoder.DecodeFromBytes(FileBytes) + ' Dim picTempPath = PathTemp & "Screenshot\" + ' Directory.CreateDirectory(picTempPath) + ' loadSource = picTempPath & GetHash(i) & ".png" + ' Pic.Save(loadSource) + ' End If + 'End Using + '由于高清截图模组可以生成不同格式的图片,此处可选支持 WebP 格式图片 + Dim buildTask As New Tasks.Task(Of MyCard)(Function() + Dim out As MyCard = Nothing + RunInUiWait(Sub() out = BuildImageCard(loadSource)) + Return out + End Function) + buildTask.Start() + buildTask.Wait() + card = buildTask.Result + If card IsNot Nothing Then + res.Add(card) + End If + Next + Loader.Output = res + End Sub + + Private Sub SetPageButton() + Dim LeftRange = 3, RightRange = 3 + Dim StartPage = Math.Max(1, Page - LeftRange) + Dim EndPage = Math.Min(MaxPage, Page + RightRange) + Dim BuildButton = Function(Num As Integer) + Dim labPage As New MyTextButton + labPage.Text = Num.ToString() + labPage.Margin = New Thickness(8, 0, 13, 0) + labPage.FontSize = 15 + labPage.VerticalAlignment = VerticalAlignment.Center + + AddHandler labPage.Click, Sub() ChangePage(Num) + + Return labPage + End Function + CardPageBtns.Children.Clear() + For i = StartPage To EndPage + Dim btn = BuildButton(i) + 'btn.SetResourceReference(MyTextButton.ForegroundProperty, "ColorBrush5") + CardPageBtns.Children.Add(btn) + Next + BtnPageLeft.Opacity = If(Page = 1, 0.2, 1) + BtnPageRight.Opacity = If(Page = MaxPage, 0.2, 1) + End Sub + + Private Sub ChangePage(Num As Integer) + Page = Math.Max(1, Math.Min(Num, MaxPage)) + If Page <> Num Then + Hint("再怎么翻也没有了呀……") + Exit Sub + End If + PanScroll.ScrollToTop() + ScreenshotLoader.Start(IsForceRestart:=True) + End Sub + + Private Sub ChangePageBtn(sender As Object, e As EventArgs) Handles BtnPageLeft.Click, BtnPageRight.Click + If (CType(sender, MyIconButton)).Name = "BtnPageLeft" Then ChangePage(Page - 1) + If (CType(sender, MyIconButton)).Name = "BtnPageRight" Then ChangePage(Page + 1) + End Sub + + Private Sub RefreshTip() + If FileList.Count.Equals(0) Then + PanNoPic.Visibility = Visibility.Visible + PanContent.Visibility = Visibility.Collapsed + CardPages.Visibility = Visibility.Collapsed + Else + PanNoPic.Visibility = Visibility.Collapsed + PanContent.Visibility = Visibility.Visible + CardPages.Visibility = Visibility.Visible + End If + End Sub + + Private Sub UpdateList() + PanList.Children.Clear() + For Each item In ScreenshotLoader.Output + PanList.Children.Add(item) + item.Opacity = 0 + AniStart({AaOpacity(item, 1)}) + Next + SetPageButton() + End Sub + + Private Shared ImageCardCache As New Dictionary(Of String, MyCard) + + Private Function BuildImageCard(FilePath As String) As MyCard + Try + If Not File.Exists(FilePath) Then Return Nothing ' 文件在加载途中消失了 + If ImageCardCache.Keys.Contains(FilePath) Then Return ImageCardCache(FilePath) + Dim myCard As New MyCard With { + .Height = Double.NaN, ' 允许高度自适应 + .Width = Double.NaN, ' 允许宽度自适应 + .Margin = New Thickness(7), + .Tag = FilePath, + .ToolTip = FilePath.Replace(ScreenshotPath, "") + } + Dim grid As New Grid + myCard.Children.Add(grid) + + grid.RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(9)}) + grid.RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(120)}) + grid.RowDefinitions.Add(New RowDefinition) + + '图片 + Dim image As New Image + Dim bitmapImage As New BitmapImage() + Using fs As New FileStream(FilePath, FileMode.Open, FileAccess.Read) + bitmapImage.BeginInit() + bitmapImage.DecodePixelHeight = 200 + bitmapImage.DecodePixelWidth = 400 + bitmapImage.CacheOption = BitmapCacheOption.OnLoad + bitmapImage.StreamSource = fs + bitmapImage.EndInit() + bitmapImage.Freeze() + End Using + image.Source = bitmapImage + image.Stretch = Stretch.Uniform ' 使图片自适应控件大小 + Grid.SetRow(image, 1) + grid.Children.Add(image) + + '按钮 + Dim stackPanel As New StackPanel + stackPanel.Orientation = Orientation.Horizontal + stackPanel.HorizontalAlignment = HorizontalAlignment.Center + stackPanel.Margin = New Thickness(3, 5, 3, 5) + Grid.SetRow(stackPanel, 2) + grid.Children.Add(stackPanel) + + Dim btnOpen As New MyIconTextButton With { + .Name = "BtnOpen", + .Text = "打开", + .LogoScale = 0.8, + .Logo = Logo.IconButtonOpen, + .Tag = FilePath + } + AddHandler btnOpen.Click, AddressOf btnOpen_Click + stackPanel.Children.Add(btnOpen) + Dim btnDelete As New MyIconTextButton With { + .Name = "BtnDelete", + .Text = "删除", + .LogoScale = 0.8, + .Logo = Logo.IconButtonDelete, + .Tag = FilePath + } + AddHandler btnDelete.Click, AddressOf btnDelete_Click + stackPanel.Children.Add(btnDelete) + Dim btnCopy As New MyIconTextButton With { + .Name = "BtnCopy", + .Text = "复制", + .LogoScale = 0.8, + .Logo = Logo.IconButtonCopy, + .Tag = FilePath + } + AddHandler btnCopy.Click, AddressOf btnCopy_Click + stackPanel.Children.Add(btnCopy) + ImageCardCache.Add(FilePath, myCard) + Return myCard + Catch ex As Exception + Log(ex, $"[Screenshot] 加载图片 {FilePath} 失败", LogLevel.Hint) + End Try + Return Nothing + End Function + + Private Sub RemoveItem(Path As String) + Try + For Each i In PanList.Children + If CType(i, MyCard).Tag.Equals(Path) Then + PanList.Children.Remove(i) + Exit For + End If + Next + Catch ex As Exception + Log(ex, "[Screenshot] 未能找到对应 UI") + End Try + End Sub + + Private Function GetPathFromSender(sender As MyIconTextButton) As String + Return sender.Tag + End Function + + Private Sub btnOpen_Click(sender As MyIconTextButton, e As EventArgs) + OpenExplorer(GetPathFromSender(sender)) + End Sub + Private Sub btnDelete_Click(sender As MyIconTextButton, e As EventArgs) + Path = GetPathFromSender(sender) + RemoveItem(Path) + Try + My.Computer.FileSystem.DeleteFile(Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) + Hint("已将截图移至回收站!") + Catch ex As Exception + Log(ex, "删除截图失败!", LogLevel.Hint) + End Try + End Sub + Private Sub btnCopy_Click(sender As MyIconTextButton, e As EventArgs) + Dim imagePath As String = GetPathFromSender(sender) + If File.Exists(imagePath) Then + Dim TryTime = 0 + While TryTime <= 5 + Try + Log("[Screenshot] 尝试复制" & imagePath & "到剪贴板") + Clipboard.SetImage(New BitmapImage(New Uri(imagePath))) + Hint("已复制截图到剪贴板!") + TryTime = 6 + Exit Sub + Catch ex As Exception + TryTime += 1 + Log(ex, $"[Screenshot]第 {TryTime} 次复制尝试失败") + End Try + End While + Hint("截图复制失败!", HintType.Critical) + Else + Hint("截图文件不存在!") + End If + End Sub + + Private Sub BtnOpenFolder_Click(sender As Object, e As MouseButtonEventArgs) + If Not Directory.Exists(ScreenshotPath) Then Directory.CreateDirectory(ScreenshotPath) + OpenExplorer("""" & ScreenshotPath & """") + End Sub +End Class \ No newline at end of file diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index e7d395eb3..1b6c3224c 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj @@ -195,12 +195,9 @@ MyIconTextButton.xaml - - - - + MyLocalModItem.xaml @@ -311,8 +308,8 @@ PageVersionLeft.xaml - - PageVersionMod.xaml + + PageVersionComp.xaml PageVersionModDisabled.xaml @@ -320,6 +317,9 @@ PageVersionOverall.xaml + + PageVersionScreenshot.xaml + PageVersionSetup.xaml @@ -501,7 +501,6 @@ FormMain.xaml Code - MSBuild:Compile Designer @@ -603,6 +602,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + Designer MSBuild:Compile @@ -707,7 +710,7 @@ Designer MSBuild:Compile - + Designer MSBuild:Compile @@ -957,7 +960,6 @@ - From 186324fcf3cf80a5add6de23e311f1f3deb7fc64 Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sun, 4 May 2025 15:52:12 +0800 Subject: [PATCH 53/54] =?UTF-8?q?chore:=20=E4=BF=AE=E6=94=B9=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E6=96=87=E4=BB=B6=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Modules/Minecraft/ModLocalComp.vb | 4 ++-- .../Pages/PageVersion/PageVersionComp.xaml.vb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModLocalComp.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModLocalComp.vb index 9c9994791..5c55c8b5f 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModLocalComp.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModLocalComp.vb @@ -850,7 +850,7 @@ Finished: If ModFileList.Count > 50 Then RunInUi(Sub() If FrmVersionMod IsNot Nothing Then FrmVersionMod.Load.ShowProgress = True) '获取本地文件缓存 - Dim CachePath As String = PathTemp & "Cache\LocalMod.json" + Dim CachePath As String = PathTemp & "Cache\LocalComp.json" Dim Cache As New JObject Try Dim CacheContent As String = ReadFile(CachePath) @@ -1125,7 +1125,7 @@ Finished: Entry.CompLoaded = Not IsFailed Cache(Entry.ModrinthHash & McVersion & ModLoaders.Join("")) = Entry.ToJson() Next - WriteFile(PathTemp & "Cache\LocalMod.json", Cache.ToString(If(ModeDebug, Newtonsoft.Json.Formatting.Indented, Newtonsoft.Json.Formatting.None))) + WriteFile(PathTemp & "Cache\LocalComp.json", Cache.ToString(If(ModeDebug, Newtonsoft.Json.Formatting.Indented, Newtonsoft.Json.Formatting.None))) '刷新边栏 If FrmVersionMod?.Filter = PageVersionComp.FilterType.CanUpdate Then RunInUi(Sub() FrmVersionMod?.RefreshUI()) '同步 “可更新” 列表 (#4677) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionComp.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionComp.xaml.vb index ee6f71525..0e5a0f2bf 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionComp.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionComp.xaml.vb @@ -56,7 +56,7 @@ Try CompProjectCache.Clear() CompFilesCache.Clear() - File.Delete(PathTemp & "Cache\LocalMod.json") + File.Delete(PathTemp & "Cache\LocalComp.json") Log("[Mod] 由于点击刷新按钮,清理本地 Mod 信息缓存") Catch ex As Exception Log(ex, "强制刷新时清理本地 Mod 信息缓存失败") From 1d6e5db7af997ffe238c05dffccf59f9de6e0820 Mon Sep 17 00:00:00 2001 From: tangge233 Date: Sat, 24 May 2025 22:30:26 +0800 Subject: [PATCH 54/54] =?UTF-8?q?refactor:=20=E7=AE=80=E5=8D=95=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E4=BA=86=E9=BE=99=E7=8C=AB=E7=9A=84=E5=88=86=E7=A6=BB?= =?UTF-8?q?=E8=A6=81=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/FormMain.xaml.vb | 2 +- .../Modules/Base/ModLoader.vb | 6 +- .../Modules/Minecraft/ModLocalComp.vb | 79 ++++----- Plain Craft Launcher 2/Modules/ModMain.vb | 5 +- .../PageVersion/Comp/PageVersionComp.xaml | 82 +++++++++ .../{ => Comp}/PageVersionComp.xaml.vb | 166 ++++++++++-------- .../PageVersion/Comp/PageVersionMod.xaml | 8 + .../PageVersion/Comp/PageVersionMod.xaml.vb | 3 + .../Comp/PageVersionResourcepack.xaml | 7 + .../Comp/PageVersionResourcepack.xaml.vb | 3 + .../PageVersion/Comp/PageVersionShader.xaml | 7 + .../Comp/PageVersionShader.xaml.vb | 3 + .../Pages/PageVersion/MyLocalModItem.xaml.vb | 6 +- .../Pages/PageVersion/PageVersionComp.xaml | 81 --------- .../Pages/PageVersion/PageVersionLeft.xaml | 18 +- .../Pages/PageVersion/PageVersionLeft.xaml.vb | 20 ++- .../Plain Craft Launcher 2.vbproj | 25 ++- 17 files changed, 304 insertions(+), 217 deletions(-) create mode 100644 Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionComp.xaml rename Plain Craft Launcher 2/Pages/PageVersion/{ => Comp}/PageVersionComp.xaml.vb (86%) create mode 100644 Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionMod.xaml create mode 100644 Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionMod.xaml.vb create mode 100644 Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionResourcepack.xaml create mode 100644 Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionResourcepack.xaml.vb create mode 100644 Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionShader.xaml create mode 100644 Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionShader.xaml.vb delete mode 100644 Plain Craft Launcher 2/Pages/PageVersion/PageVersionComp.xaml diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb index 7fc61f96b..17f8af59d 100644 --- a/Plain Craft Launcher 2/FormMain.xaml.vb +++ b/Plain Craft Launcher 2/FormMain.xaml.vb @@ -640,7 +640,7 @@ Public Class FormMain Try If PageCurrent = PageType.VersionSetup AndAlso PageCurrentSub = PageSubType.VersionMod Then 'Mod 管理自动刷新 - FrmVersionMod.ReloadModList() + FrmVersionMod.Content.ReloadList() ElseIf PageCurrent = PageType.VersionSelect Then '版本选择自动刷新 LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.RunOnUpdated, MaxDepth:=1, ExtraPath:="versions\") diff --git a/Plain Craft Launcher 2/Modules/Base/ModLoader.vb b/Plain Craft Launcher 2/Modules/Base/ModLoader.vb index 45f7bd5d3..053648970 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModLoader.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModLoader.vb @@ -655,7 +655,7 @@ Restart: ''' 返回是否执行了加载器。 ''' ''' 用于检查文件夹修改的额外路径。该路径不会传入加载器。 - Public Function LoaderFolderRun(Loader As LoaderBase, FolderPath As String, Type As LoaderFolderRunType, Optional MaxDepth As Integer = 0, Optional ExtraPath As String = "", Optional WaitForExit As Boolean = False) As Boolean + Public Function LoaderFolderRun(Loader As LoaderBase, FolderPath As String, Type As LoaderFolderRunType, Optional MaxDepth As Integer = 0, Optional ExtraPath As String = "", Optional WaitForExit As Boolean = False, Optional DataInput As Object = Nothing) As Boolean Dim FolderInfo As DirectoryInfo Dim Value As New LoaderFolderDictionaryEntry With {.FolderPath = FolderPath & ExtraPath, .LastCheckTime = Nothing} Try @@ -679,9 +679,9 @@ Restart: '开始检查 If Type = LoaderFolderRunType.UpdateOnly Then Return False If WaitForExit Then - Loader.WaitForExit(FolderPath, IsForceRestart:=True) + Loader.WaitForExit(If(DataInput, FolderPath), IsForceRestart:=True) Else - Loader.Start(FolderPath, IsForceRestart:=True) + Loader.Start(If(DataInput, FolderPath), IsForceRestart:=True) End If Return True End Function diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModLocalComp.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModLocalComp.vb index 5c55c8b5f..5d67d0088 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModLocalComp.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModLocalComp.vb @@ -796,59 +796,46 @@ Finished: ''' ''' 根据完整文件路径的文件扩展名判断是否为 Mod 文件。 ''' - Public Shared Function IsModFile(Path As String) + Public Shared Function IsCompFile(Path As String, Optional Type As CompType = CompType.Mod) If Path Is Nothing OrElse Not Path.Contains(".") Then Return False Path = Path.ToLower - If Path.EndsWithF(".jar", True) OrElse Path.EndsWithF(".zip", True) OrElse Path.EndsWithF(".litemod", True) OrElse - Path.EndsWithF(".jar.disabled", True) OrElse Path.EndsWithF(".zip.disabled", True) OrElse Path.EndsWithF(".litemod.disabled", True) OrElse - Path.EndsWithF(".jar.old", True) OrElse Path.EndsWithF(".zip.old", True) OrElse Path.EndsWithF(".litemod.old", True) Then Return True + Dim AllowSurfix As New List(Of String) + If Type = CompType.Mod Then + AllowSurfix.AddRange({".jar", ".zip", ".litemod", ".jar.disabled", ".zip.disabled", ".litemod.disabled", ".jar.old", ".zip.old", ".litemod.old"}) + Else + AllowSurfix.AddRange({".zip"}) + End If + For Each Surfix In AllowSurfix + If Path.EndsWithF(Surfix) Then Return True + Next Return False End Function End Class - '加载 Mod 列表 - Public McModLoader As New LoaderTask(Of String, List(Of McComp))("Mod List Loader", AddressOf McModLoad) - Private Sub McModLoad(Loader As LoaderTask(Of String, List(Of McComp))) + '加载资源列表 + Public McLocalCompLoader As New LoaderTask(Of Tuple(Of CompType, String), List(Of McComp))("Local Comp Loader", AddressOf McLocalCompLoad) + Private Sub McLocalCompLoad(Loader As LoaderTask(Of Tuple(Of CompType, String), List(Of McComp))) Try - RunInUiWait(Sub() If FrmVersionMod IsNot Nothing Then FrmVersionMod.Load.ShowProgress = False) - - '等待 Mod 更新完成 - If PageVersionComp.UpdatingVersions.Contains(Loader.Input) Then - Log($"[Mod] 等待 Mod 更新完成后才能继续加载 Mod 列表:" & Loader.Input) - Try - RunInUiWait(Sub() If FrmVersionMod IsNot Nothing Then FrmVersionMod.Load.Text = "正在更新 Mod") - Do Until Not PageVersionComp.UpdatingVersions.Contains(Loader.Input) - If Loader.IsAborted Then Exit Sub - Thread.Sleep(100) - Loop - Finally - RunInUiWait(Sub() If FrmVersionMod IsNot Nothing Then FrmVersionMod.Load.Text = "正在加载 Mod 列表") - End Try - FrmVersionMod.LoaderRun(LoaderFolderRunType.UpdateOnly) - End If - + Dim TargetType = Loader.Input.Item1 + Dim SearchFolder = Loader.Input.Item2 '获取 Mod 文件夹下的可用文件列表 - Dim ModFileList As New List(Of FileInfo) - If Directory.Exists(Loader.Input) Then - Dim RawName As String = Loader.Input.ToLower - For Each File As FileInfo In EnumerateFiles(Loader.Input) + Dim SearchedCompFileList As New List(Of FileInfo) + If Directory.Exists(SearchFolder) Then + Dim RawName As String = SearchFolder.ToLower() + For Each File As FileInfo In EnumerateFiles(SearchFolder) If File.DirectoryName.ToLower & "\" <> RawName Then '仅当 Forge 1.13- 且文件夹名与版本号相同时,才加载该子文件夹下的 Mod - If Not (PageVersionLeft.Version IsNot Nothing AndAlso PageVersionLeft.Version.Version.HasForge AndAlso + If TargetType = CompType.Mod AndAlso Not (PageVersionLeft.Version IsNot Nothing AndAlso PageVersionLeft.Version.Version.HasForge AndAlso PageVersionLeft.Version.Version.McCodeMain < 13 AndAlso File.Directory.Name = $"1.{PageVersionLeft.Version.Version.McCodeMain}.{PageVersionLeft.Version.Version.McCodeSub}") Then Continue For End If End If - If McComp.IsModFile(File.FullName) Then ModFileList.Add(File) + If McComp.IsCompFile(File.FullName, TargetType) Then SearchedCompFileList.Add(File) Next End If - '确定是否显示进度 - Loader.Progress = 0.05 - If ModFileList.Count > 50 Then RunInUi(Sub() If FrmVersionMod IsNot Nothing Then FrmVersionMod.Load.ShowProgress = True) - '获取本地文件缓存 Dim CachePath As String = PathTemp & "Cache\LocalComp.json" Dim Cache As New JObject @@ -870,16 +857,16 @@ Finished: '加载 Mod 列表 Dim ModList As New List(Of McComp) Dim ModUpdateList As New List(Of McComp) - For Each ModFile As FileInfo In ModFileList - Loader.Progress += 0.94 / ModFileList.Count + For Each ModFile As FileInfo In SearchedCompFileList + Loader.Progress += 0.94 / SearchedCompFileList.Count If Loader.IsAborted Then Exit Sub - '加载 McMod 对象 + '加载 McComp 对象 Dim ModEntry As New McComp(ModFile.FullName) ModEntry.Load() Dim DumpMod As McComp = ModList.FirstOrDefault(Function(m) m.RawFileName = ModEntry.RawFileName) If DumpMod IsNot Nothing Then Dim DisabledMod As McComp = If(DumpMod.State = McComp.McModState.Disabled, DumpMod, ModEntry) - Log($"[Mod] 重复的 Mod 文件:{DumpMod.FileName} 与 {ModEntry.FileName},已忽略 {DisabledMod.FileName}", LogLevel.Debug) + Log($"[Mod] 重复的资源文件:{DumpMod.FileName} 与 {ModEntry.FileName},已忽略 {DisabledMod.FileName}", LogLevel.Debug) If DisabledMod Is ModEntry Then Continue For Else @@ -918,7 +905,7 @@ Finished: '开始联网加载 If ModUpdateList.Any() Then 'TODO: 添加信息获取中提示 - McModDetailLoader.Start(New KeyValuePair(Of List(Of McComp), JObject)(ModUpdateList, Cache), IsForceRestart:=True) + McCompDetailLoader.Start(New KeyValuePair(Of List(Of McComp), JObject)(ModUpdateList, Cache), IsForceRestart:=True) End If Catch ex As Exception @@ -927,8 +914,8 @@ Finished: End Try End Sub '联网加载 Mod 详情 - Public McModDetailLoader As New LoaderTask(Of KeyValuePair(Of List(Of McComp), JObject), Integer)("Mod List Detail Loader", AddressOf McModDetailLoad) - Private Sub McModDetailLoad(Loader As LoaderTask(Of KeyValuePair(Of List(Of McComp), JObject), Integer)) + Public McCompDetailLoader As New LoaderTask(Of KeyValuePair(Of List(Of McComp), JObject), Integer)("Comp List Detail Loader", AddressOf McCompDetailLoad) + Private Sub McCompDetailLoad(Loader As LoaderTask(Of KeyValuePair(Of List(Of McComp), JObject), Integer)) Dim Mods As List(Of McComp) = Loader.Input.Key Dim Cache As JObject = Loader.Input.Value '获取作为检查目标的加载器和版本 @@ -1082,7 +1069,7 @@ Finished: Dim CurseForgeFiles = CType(GetJson(DlModRequest("https://api.curseforge.com/v1/mods/files", "POST", $"{{""fileIds"": [{UpdateFileIds.Keys.Join(",")}]}}", "application/json")), JObject)("data") Dim UpdateFiles As New Dictionary(Of McComp, CompFile) - For Each FileJson In CurseForgeFiles + For Each FileJson In CurseForgeFiles '找出有更新的文件 Dim File As New CompFile(FileJson, CompType.Mod) If Not File.Available Then Continue For For Each Entry As McComp In UpdateFileIds(File.Id) @@ -1090,7 +1077,7 @@ Finished: UpdateFiles(Entry) = File Next Next - For Each Pair In UpdateFiles + For Each Pair In UpdateFiles '设置更新信息 Dim Entry As McComp = Pair.Key Dim UpdateFile As CompFile = Pair.Value If ModeDebug Then Log($"[Mod] 本地文件 {Entry.CompFile.FileName} 在 CurseForge 上的最新版为 {UpdateFile.FileName}") @@ -1126,12 +1113,6 @@ Finished: Cache(Entry.ModrinthHash & McVersion & ModLoaders.Join("")) = Entry.ToJson() Next WriteFile(PathTemp & "Cache\LocalComp.json", Cache.ToString(If(ModeDebug, Newtonsoft.Json.Formatting.Indented, Newtonsoft.Json.Formatting.None))) - '刷新边栏 - If FrmVersionMod?.Filter = PageVersionComp.FilterType.CanUpdate Then - RunInUi(Sub() FrmVersionMod?.RefreshUI()) '同步 “可更新” 列表 (#4677) - Else - RunInUi(Sub() FrmVersionMod?.RefreshBars()) - End If End Sub Public Function GetTargetModLoaders() As List(Of CompModLoaderType) Dim ModLoaders As New List(Of CompModLoaderType) diff --git a/Plain Craft Launcher 2/Modules/ModMain.vb b/Plain Craft Launcher 2/Modules/ModMain.vb index 43028ea4e..384fd9ad3 100644 --- a/Plain Craft Launcher 2/Modules/ModMain.vb +++ b/Plain Craft Launcher 2/Modules/ModMain.vb @@ -434,11 +434,14 @@ EndHint: '版本设置页面声明 Public FrmVersionLeft As PageVersionLeft Public FrmVersionOverall As PageVersionOverall - Public FrmVersionMod As PageVersionComp + Public FrmVersionMod As PageVersionMod Public FrmVersionModDisabled As PageVersionModDisabled Public FrmVersionSetup As PageVersionSetup Public FrmVersionExport As PageVersionExport Public FrmVersionScreenshot As PageVersionScreenshot + Public FrmVersionResourcepack As PageVersionResourcepack + Public FrmVersionShader As PageVersionShader + '资源信息分页声明 Public FrmDownloadCompDetail As PageDownloadCompDetail diff --git a/Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionComp.xaml b/Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionComp.xaml new file mode 100644 index 000000000..8e28b47ca --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionComp.xaml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionComp.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionComp.xaml.vb similarity index 86% rename from Plain Craft Launcher 2/Pages/PageVersion/PageVersionComp.xaml.vb rename to Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionComp.xaml.vb index 0e5a0f2bf..52b1dd155 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionComp.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionComp.xaml.vb @@ -1,24 +1,24 @@ Public Class PageVersionComp Implements IRefreshable -#Region "初始化" - - Public Sub New(ResourceType As CompType) +#Region "属性" + Public Property TargetType As CompType = CompType.Mod - ' 此调用是设计器所必需的。 - InitializeComponent() + Public Property TypeName As String = "模组" - ' 在 InitializeComponent() 调用之后添加任何初始化。 + Public Property CompFolderName As String = "mods" +#End Region - End Sub +#Region "初始化" Private IsLoad As Boolean = False Public Sub PageOther_Loaded() Handles Me.Loaded + UpdateUIText() If FrmMain.PageLast.Page <> FormMain.PageType.CompDetail Then PanBack.ScrollToHome() AniControlEnabled += 1 SelectedMods.Clear() - ReloadModList() + ReloadList() ChangeAllSelected(False) AniControlEnabled -= 1 @@ -26,6 +26,8 @@ If IsLoad Then Exit Sub IsLoad = True + CType(Parent, MyPageRight).PageLoaderInit(Load, PanLoad, PanAllBack, Nothing, McLocalCompLoader, AddressOf LoadUIFromLoaderOutput, AutoRun:=False) + '调整按钮边距(这玩意儿没法从 XAML 改) For Each Btn As MyRadioButton In PanFilter.Children Btn.LabText.Margin = New Thickness(-2, 0, 8, 0) @@ -39,7 +41,7 @@ ''' ''' 刷新 Mod 列表。 ''' - Public Sub ReloadModList(Optional ForceReload As Boolean = False) + Public Sub ReloadList(Optional ForceReload As Boolean = False) If LoaderRun(If(ForceReload, LoaderFolderRunType.ForceRun, LoaderFolderRunType.RunOnUpdated)) Then Log("[System] 已刷新 Mod 列表") Filter = FilterType.All @@ -61,21 +63,20 @@ Catch ex As Exception Log(ex, "强制刷新时清理本地 Mod 信息缓存失败") End Try - If FrmVersionMod IsNot Nothing Then FrmVersionMod.ReloadModList(True) '无需 Else,还没加载刷个鬼的新 + If FrmVersionMod IsNot Nothing Then FrmVersionMod.Content.ReloadList(True) '无需 Else,还没加载刷个鬼的新 FrmVersionLeft.ItemMod.Checked = True Hint("正在刷新……", Log:=False) End Sub - Private Sub LoaderInit() Handles Me.Initialized - PageLoaderInit(Load, PanLoad, PanAllBack, Nothing, McModLoader, AddressOf LoadUIFromLoaderOutput, AutoRun:=False) - End Sub Private Sub Load_Click(sender As Object, e As MouseButtonEventArgs) Handles Load.Click - If McModLoader.State = LoadState.Failed Then + If McLocalCompLoader.State = LoadState.Failed Then LoaderRun(LoaderFolderRunType.ForceRun) End If End Sub Public Function LoaderRun(Type As LoaderFolderRunType) As Boolean - Return LoaderFolderRun(McModLoader, PageVersionLeft.Version.PathIndie & "mods\", Type) + Dim Path = $"{PageVersionLeft.Version.PathIndie}{CompFolderName}\" + Dim Data As New Tuple(Of CompType, String)(TargetType, Path) + Return LoaderFolderRun(McLocalCompLoader, Path, Type, DataInput:=Data) End Function #End Region @@ -92,7 +93,7 @@ Private Sub LoadUIFromLoaderOutput() Try '判断应该显示哪一个页面 - If McModLoader.Output.Any() Then + If McLocalCompLoader.Output.Any() Then PanBack.Visibility = Visibility.Visible PanEmpty.Visibility = Visibility.Collapsed Else @@ -102,7 +103,7 @@ End If '修改缓存 ModItems.Clear() - For Each ModEntity As McComp In McModLoader.Output + For Each ModEntity As McComp In McLocalCompLoader.Output ModItems(ModEntity.RawFileName) = McModListItem(ModEntity) Next '显示结果 @@ -110,9 +111,17 @@ SearchBox.Text = "" '这会触发结果刷新,所以需要在 ModItems 更新之后,详见 #3124 的视频 RefreshUI() Catch ex As Exception - Log(ex, "加载 Mod 列表 UI 失败", LogLevel.Feedback) + Log(ex, "加载资源列表 UI 失败", LogLevel.Feedback) End Try End Sub + Private Sub UpdateUIText() + SearchBox.HintText = $"搜索{TypeName}的 名称 / 描述 / 标签" + BtnManageDownload.Text = $"下载新{TypeName}" + Load.Text = $"正在加载{TypeName}列表" + BtnHintDownload.Text = $"下载{TypeName}" + BtnHintInstall.Text = $"从文件安装{TypeName}" + BtnHintOpen.Text = $"打开{TypeName}文件夹" + End Sub Private Function McModListItem(Entry As McComp) As MyLocalModItem AniControlEnabled += 1 Dim NewItem As New MyLocalModItem With {.SnapsToDevicePixels = True, .Entry = Entry, @@ -152,7 +161,8 @@ ToolTipService.SetVerticalOffset(BtnED, 30) ToolTipService.SetHorizontalOffset(BtnED, 2) AddHandler BtnED.Click, AddressOf ED_Click - If sender.Entry.State = McComp.McModState.Unavailable Then + Dim IsEDFetureEnabled = TargetType = CompType.Mod + If sender.Entry.State = McComp.McModState.Unavailable AndAlso IsEDFetureEnabled Then sender.Buttons = {BtnCont, BtnOpen, BtnDelete} Else sender.Buttons = {BtnCont, BtnOpen, BtnED, BtnDelete} @@ -164,7 +174,7 @@ ''' Public Sub RefreshUI() If PanList Is Nothing Then Exit Sub - Dim ShowingMods = If(IsSearching, SearchResult, If(McModLoader.Output, New List(Of McComp))).Where(Function(m) CanPassFilter(m)).ToList + Dim ShowingMods = If(IsSearching, SearchResult, If(McLocalCompLoader.Output, New List(Of McComp))).Where(Function(m) CanPassFilter(m)).ToList '重新列出列表 AniControlEnabled += 1 If ShowingMods.Any() Then @@ -197,7 +207,7 @@ Dim DisabledCount As Integer = 0 Dim UpdateCount As Integer = 0 Dim UnavalialeCount As Integer = 0 - For Each ModItem In If(IsSearching, SearchResult, If(McModLoader.Output, New List(Of McComp))) + For Each ModItem In If(IsSearching, SearchResult, If(McLocalCompLoader.Output, New List(Of McComp))) AnyCount += 1 If ModItem.CanUpdate Then UpdateCount += 1 If ModItem.State.Equals(McComp.McModState.Fine) Then EnabledCount += 1 @@ -214,7 +224,9 @@ BtnFilterDisabled.Visibility = If(Filter = FilterType.Disabled OrElse DisabledCount > 0, Visibility.Visible, Visibility.Collapsed) BtnFilterError.Text = $"错误 ({UnavalialeCount})" BtnFilterError.Visibility = If(Filter = FilterType.Unavailable OrElse UnavalialeCount > 0, Visibility.Visible, Visibility.Collapsed) - + Dim IsEDFetureEnabled = TargetType = CompType.Mod + BtnSelectEnable.Visibility = If(IsEDFetureEnabled, Visibility.Visible, Visibility.Collapsed) + BtnSelectDisable.Visibility = If(IsEDFetureEnabled, Visibility.Visible, Visibility.Collapsed) '----------------- ' 底部栏 '----------------- @@ -228,7 +240,7 @@ Dim HasUpdate As Boolean = False Dim HasEnabled As Boolean = False Dim HasDisabled As Boolean = False - For Each ModEntity In McModLoader.Output + For Each ModEntity In McLocalCompLoader.Output If SelectedMods.Contains(ModEntity.RawFileName) Then If ModEntity.CanUpdate Then HasUpdate = True If ModEntity.State = McComp.McModState.Fine Then @@ -297,10 +309,11 @@ ''' Private Sub BtnManageOpen_Click(sender As Object, e As EventArgs) Handles BtnManageOpen.Click, BtnHintOpen.Click Try - Directory.CreateDirectory(PageVersionLeft.Version.PathIndie & "mods\") - OpenExplorer(PageVersionLeft.Version.PathIndie & "mods\") + Dim path = $"{PageVersionLeft.Version.PathIndie}{CompFolderName}\" + Directory.CreateDirectory(path) + OpenExplorer(path) Catch ex As Exception - Log(ex, "打开 Mods 文件夹失败", LogLevel.Msgbox) + Log(ex, "打开资源文件夹失败", LogLevel.Msgbox) End Try End Sub @@ -376,7 +389,7 @@ Install: End If '刷新列表 If FrmMain.PageCurrent = FormMain.PageType.VersionSetup AndAlso FrmMain.PageCurrentSub = FormMain.PageSubType.VersionMod Then - LoaderFolderRun(McModLoader, TargetVersion.PathIndie & "mods\", LoaderFolderRunType.ForceRun) + LoaderFolderRun(McLocalCompLoader, TargetVersion.PathIndie & "mods\", LoaderFolderRunType.ForceRun) End If Catch ex As Exception Log(ex, "复制 Mod 文件失败", LogLevel.Msgbox) @@ -390,7 +403,16 @@ Install: ''' Private Sub BtnManageDownload_Click(sender As Object, e As MouseButtonEventArgs) Handles BtnManageDownload.Click, BtnHintDownload.Click PageComp.TargetVersion = PageVersionLeft.Version '将当前版本设置为筛选器 - FrmMain.PageChange(FormMain.PageType.Download, FormMain.PageSubType.DownloadMod) + Dim DesirePageId As FormMain.PageSubType = FormMain.PageSubType.DownloadMod + Select Case TargetType + Case CompType.Mod + DesirePageId = FormMain.PageSubType.DownloadMod + Case CompType.ResourcePack + DesirePageId = FormMain.PageSubType.DownloadResourcePack + Case CompType.Shader + DesirePageId = FormMain.PageSubType.DownloadShader + End Select + FrmMain.PageChange(FormMain.PageType.Download, DesirePageId) End Sub #End Region @@ -426,7 +448,7 @@ Install: AniControlEnabled -= 1 RefreshBars() End Sub - Private Sub UnselectedAllWithAnimation() Handles Load.StateChanged, Me.PageExit + Private Sub UnselectedAllWithAnimation() Handles Load.StateChanged Dim CacheAniControlEnabled = AniControlEnabled AniControlEnabled = 0 ChangeAllSelected(False) @@ -503,7 +525,7 @@ Install: '启用 / 禁用 Private Sub BtnSelectED_Click(sender As MyIconTextButton, e As RouteEventArgs) Handles BtnSelectEnable.Click, BtnSelectDisable.Click - EDMods(McModLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName)), + EDMods(McLocalCompLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName)), Not sender.Equals(BtnSelectDisable)) ChangeAllSelected(False) End Sub @@ -540,7 +562,7 @@ Install: FileSystem.Rename(ModEntity.Path, NewPath) Catch ex As FileNotFoundException Log(ex, $"未找到需要重命名的 Mod({If(ModEntity.Path, "null")})", LogLevel.Feedback) - ReloadModList(True) + ReloadList(True) Return Catch ex As Exception Log(ex, $"重命名 Mod 失败({If(ModEntity.Path, "null")})") @@ -549,10 +571,10 @@ Install: '更改 Loader 中的列表 Dim NewModEntity As New McComp(NewPath) NewModEntity.FromJson(ModEntity.ToJson) - If McModLoader.Output.Contains(ModEntity) Then - Dim IndexOfLoader As Integer = McModLoader.Output.IndexOf(ModEntity) - McModLoader.Output.RemoveAt(IndexOfLoader) - McModLoader.Output.Insert(IndexOfLoader, NewModEntity) + If McLocalCompLoader.Output.Contains(ModEntity) Then + Dim IndexOfLoader As Integer = McLocalCompLoader.Output.IndexOf(ModEntity) + McLocalCompLoader.Output.RemoveAt(IndexOfLoader) + McLocalCompLoader.Output.Insert(IndexOfLoader, NewModEntity) End If If SearchResult IsNot Nothing AndAlso SearchResult.Contains(ModEntity) Then '#4862 Dim IndexOfResult As Integer = SearchResult.IndexOf(ModEntity) @@ -571,14 +593,14 @@ Install: RefreshBars() Else Hint("由于文件被占用,Mod 的状态切换失败,请尝试关闭正在运行的游戏后再试!", HintType.Critical) - ReloadModList(True) + ReloadList(True) End If LoaderRun(LoaderFolderRunType.UpdateOnly) End Sub '更新 Private Sub BtnSelectUpdate_Click() Handles BtnSelectUpdate.Click - Dim UpdateList As List(Of McComp) = McModLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName) AndAlso m.CanUpdate).ToList() + Dim UpdateList As List(Of McComp) = McLocalCompLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName) AndAlso m.CanUpdate).ToList() If Not UpdateList.Any() Then Return UpdateMods(UpdateList) ChangeAllSelected(False) @@ -637,21 +659,21 @@ Install: '构造加载器 Dim InstallLoaders As New List(Of LoaderBase) Dim FinishedFileNames As New List(Of String) - InstallLoaders.Add(New LoaderDownload("下载新版 Mod 文件", FileList) With {.ProgressWeight = ModList.Count * 1.5}) '每个 Mod 需要 1.5s - InstallLoaders.Add(New LoaderTask(Of Integer, Integer)("替换旧版 Mod 文件", + InstallLoaders.Add(New LoaderDownload($"下载新版{TypeName}文件", FileList) With {.ProgressWeight = ModList.Count * 1.5}) '每个 Mod 需要 1.5s + InstallLoaders.Add(New LoaderTask(Of Integer, Integer)($"替换旧版{TypeName}文件", Sub() Try For Each Entry As McComp In ModList If File.Exists(Entry.Path) Then My.Computer.FileSystem.DeleteFile(Entry.Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) Else - Log($"[Mod] 未找到更新前的 Mod 文件,跳过对它的删除:{Entry.Path}", LogLevel.Debug) + Log($"[Mod] 未找到更新前的资源文件,跳过对它的删除:{Entry.Path}", LogLevel.Debug) End If Next For Each Entry As KeyValuePair(Of String, String) In FileCopyList If File.Exists(Entry.Value) Then My.Computer.FileSystem.DeleteFile(Entry.Value, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) - Log($"[Mod] 更新后的 Mod 文件已存在,将会把它放入回收站:{Entry.Value}", LogLevel.Debug) + Log($"[Mod] 更新后的资源文件已存在,将会把它放入回收站:{Entry.Value}", LogLevel.Debug) End If If Directory.Exists(GetPathFromFullPath(Entry.Value)) Then File.Move(Entry.Key, Entry.Value) @@ -661,11 +683,11 @@ Install: End If Next Catch ex As OperationCanceledException - Log(ex, "替换旧版 Mod 文件时被主动取消") + Log(ex, "替换旧版资源文件时被主动取消") End Try End Sub)) '结束处理 - Dim Loader As New LoaderCombo(Of IEnumerable(Of McComp))("Mod 更新:" & PageVersionLeft.Version.Name, InstallLoaders) + Dim Loader As New LoaderCombo(Of IEnumerable(Of McComp))($"{TypeName}更新:" & PageVersionLeft.Version.Name, InstallLoaders) Dim PathMods As String = PageVersionLeft.Version.PathIndie & "mods\" Loader.OnStateChanged = Sub() @@ -673,21 +695,21 @@ Install: Select Case Loader.State Case LoadState.Finished Select Case FinishedFileNames.Count - Case 0 '一般是由于 Mod 文件被占用,然后玩家主动取消 - Log($"[Mod] 没有 Mod 被成功更新") + Case 0 '一般是由于资源文件被占用,然后玩家主动取消 + Log($"[Mod] 没有资源被成功更新") Case 1 Hint($"已成功更新 {FinishedFileNames.Single}!", HintType.Finish) Case Else - Hint($"已成功更新 {FinishedFileNames.Count} 个 Mod!", HintType.Finish) + Hint($"已成功更新 {FinishedFileNames.Count} 个资源!", HintType.Finish) End Select Case LoadState.Failed - Hint("Mod 更新失败:" & GetExceptionSummary(Loader.Error), HintType.Critical) + Hint("资源更新失败:" & GetExceptionSummary(Loader.Error), HintType.Critical) Case LoadState.Aborted - Hint("Mod 更新已中止!", HintType.Info) + Hint("资源更新已中止!", HintType.Info) Case Else Exit Sub End Select - Log($"[Mod] 已从正在进行 Mod 更新的文件夹列表移除:{PathMods}") + Log($"[Mod] 已从正在进行资源更新的文件夹列表移除:{PathMods}") UpdatingVersions.Remove(PathMods) '清理缓存 RunInNewThread( @@ -697,26 +719,26 @@ Install: If File.Exists(TempFile) Then File.Delete(TempFile) Next Catch ex As Exception - Log(ex, "清理 Mod 更新缓存失败") + Log(ex, "清理资源更新缓存失败") End Try - End Sub, "Clean Mod Update Cache", ThreadPriority.BelowNormal) + End Sub, "Clean Comp Update Cache", ThreadPriority.BelowNormal) End Sub '启动加载器 - Log($"[Mod] 开始更新 {ModList.Count} 个 Mod:{PathMods}") + Log($"[Mod] 开始更新 {ModList.Count} 个资源:{PathMods}") UpdatingVersions.Add(PathMods) Loader.Start() LoaderTaskbarAdd(Loader) FrmMain.BtnExtraDownload.ShowRefresh() FrmMain.BtnExtraDownload.Ribble() - ReloadModList(True) + ReloadList(True) Catch ex As Exception - Log(ex, "初始化 Mod 更新失败") + Log(ex, "初始化资源更新失败") End Try End Sub '删除 Private Sub BtnSelectDelete_Click() Handles BtnSelectDelete.Click - DeleteMods(McModLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName))) + DeleteMods(McLocalCompLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName))) ChangeAllSelected(False) End Sub Private Sub DeleteMods(ModList As IEnumerable(Of McComp)) @@ -742,17 +764,17 @@ Install: My.Computer.FileSystem.DeleteFile(ModEntity.Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) End If Catch ex As OperationCanceledException - Log(ex, "删除 Mod 被主动取消") - ReloadModList(True) + Log(ex, "删除资源被主动取消") + ReloadList(True) Return Catch ex As Exception - Log(ex, $"删除 Mod 失败({ModEntity.Path})", LogLevel.Msgbox) + Log(ex, $"删除资源失败({ModEntity.Path})", LogLevel.Msgbox) IsSuccessful = False End Try '取消选中 SelectedMods.Remove(ModEntity.RawFileName) '更改 Loader 和 UI 中的列表 - McModLoader.Output.Remove(ModEntity) + McLocalCompLoader.Output.Remove(ModEntity) SearchResult?.Remove(ModEntity) ModItems.Remove(ModEntity.RawFileName) Dim IndexOfUi As Integer = PanList.Children.IndexOf(PanList.Children.OfType(Of MyLocalModItem).FirstOrDefault(Function(i) i.Entry.Equals(ModEntity))) @@ -760,10 +782,10 @@ Install: Next RefreshBars() If Not IsSuccessful Then - Hint("由于文件被占用,Mod 删除失败,请尝试关闭正在运行的游戏后再试!", HintType.Critical) - ReloadModList(True) + Hint("由于文件被占用,资源删除失败,请尝试关闭正在运行的游戏后再试!", HintType.Critical) + ReloadList(True) ElseIf PanList.Children.Count = 0 Then - ReloadModList(True) '删除了全部文件 + ReloadList(True) '删除了全部文件 Else RefreshBars() End If @@ -783,11 +805,11 @@ Install: End If End If Catch ex As OperationCanceledException - Log(ex, "删除 Mod 被主动取消") - ReloadModList(True) + Log(ex, "删除资源被主动取消") + ReloadList(True) Catch ex As Exception - Log(ex, "删除 Mod 出现未知错误", LogLevel.Feedback) - ReloadModList(True) + Log(ex, "删除资源出现未知错误", LogLevel.Feedback) + ReloadList(True) End Try LoaderRun(LoaderFolderRunType.UpdateOnly) End Sub @@ -808,17 +830,17 @@ Install: Dim ModEntry As McComp = CType(If(TypeOf sender Is MyIconButton, sender.Tag, sender), MyLocalModItem).Entry '加载失败信息 If ModEntry.State = McComp.McModState.Unavailable Then - MyMsgBox("无法读取此 Mod 的信息。" & vbCrLf & vbCrLf & "详细的错误信息:" & GetExceptionDetail(ModEntry.FileUnavailableReason), "Mod 读取失败") + MyMsgBox($"无法读取此{TypeName}的信息。" & vbCrLf & vbCrLf & "详细的错误信息:" & GetExceptionDetail(ModEntry.FileUnavailableReason), "Mod 读取失败") Return End If If ModEntry.Comp IsNot Nothing Then - '跳转到 Mod 下载页面 + '跳转到下载页面 FrmMain.PageChange(New FormMain.PageStackData With {.Page = FormMain.PageType.CompDetail, .Additional = {ModEntry.Comp, New List(Of String), PageVersionLeft.Version.Version.McName, If(PageVersionLeft.Version.Version.HasForge, CompModLoaderType.Forge, If(PageVersionLeft.Version.Version.HasNeoForge, CompModLoaderType.NeoForge, If(PageVersionLeft.Version.Version.HasFabric, CompModLoaderType.Fabric, CompModLoaderType.Any))), - CompType.Mod}}) + TargetType}}) Else '获取信息 Dim ContentLines As New List(Of String) @@ -868,7 +890,7 @@ Install: End If End If Catch ex As Exception - Log(ex, "获取 Mod 详情失败", LogLevel.Feedback) + Log(ex, "获取资源详情失败", LogLevel.Feedback) End Try End Sub '打开文件所在的位置 @@ -877,7 +899,7 @@ Install: Dim ListItem As MyLocalModItem = sender.Tag OpenExplorer(ListItem.Entry.Path) Catch ex As Exception - Log(ex, "打开 Mod 文件位置失败", LogLevel.Feedback) + Log(ex, "打开资源文件位置失败", LogLevel.Feedback) End Try End Sub '删除 @@ -905,7 +927,7 @@ Install: If IsSearching Then '构造请求 Dim QueryList As New List(Of SearchEntry(Of McComp)) - For Each Entry As McComp In McModLoader.Output + For Each Entry As McComp In McLocalCompLoader.Output Dim SearchSource As New List(Of KeyValuePair(Of String, Double)) SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.Name, 1)) SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.FileName, 1)) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionMod.xaml b/Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionMod.xaml new file mode 100644 index 000000000..06294866e --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionMod.xaml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionMod.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionMod.xaml.vb new file mode 100644 index 000000000..889fa651a --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionMod.xaml.vb @@ -0,0 +1,3 @@ +Class PageVersionMod + +End Class diff --git a/Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionResourcepack.xaml b/Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionResourcepack.xaml new file mode 100644 index 000000000..954bd05bc --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionResourcepack.xaml @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionResourcepack.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionResourcepack.xaml.vb new file mode 100644 index 000000000..28ccdf915 --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionResourcepack.xaml.vb @@ -0,0 +1,3 @@ +Class PageVersionResourcepack + +End Class \ No newline at end of file diff --git a/Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionShader.xaml b/Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionShader.xaml new file mode 100644 index 000000000..0a4d22f6f --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionShader.xaml @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionShader.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionShader.xaml.vb new file mode 100644 index 000000000..2884e58e6 --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageVersion/Comp/PageVersionShader.xaml.vb @@ -0,0 +1,3 @@ +Class PageVersionShader + +End Class \ No newline at end of file diff --git a/Plain Craft Launcher 2/Pages/PageVersion/MyLocalModItem.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/MyLocalModItem.xaml.vb index 139881b55..2b0fe29b3 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/MyLocalModItem.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/MyLocalModItem.xaml.vb @@ -126,14 +126,14 @@ Public Class MyLocalModItem SwipeEnd = Index Swiping = True SwipToState = Not Checked - FrmVersionMod.CardSelect.IsHitTestVisible = False '暂时禁用下边栏 + 'FrmVersionMod.Content.CardSelect.IsHitTestVisible = False '暂时禁用下边栏 End Sub Private Sub Button_MouseSwipe(sender As Object, e As Object) Handles Me.MouseEnter, Me.MouseLeave, Me.MouseLeftButtonUp If Parent Is Nothing Then Exit Sub 'Mod 可能已被删除(#3824) '结束滑动 If Mouse.LeftButton <> MouseButtonState.Pressed OrElse Not Swiping Then Swiping = False - FrmVersionMod.CardSelect.IsHitTestVisible = True + 'FrmVersionMod.Content.CardSelect.IsHitTestVisible = True Exit Sub End If '计算滑动范围 @@ -485,7 +485,7 @@ Public Class MyLocalModItem Private Sub BtnUpdate_Click(sender As Object, e As EventArgs) Handles BtnUpdate.Click Select Case MyMsgBox($"是否要更新 {Entry.Name}?{vbCrLf}{vbCrLf}{GetUpdateCompareDescription()}", "Mod 更新确认", "更新", "查看更新日志", "取消") Case 1 '更新 - FrmVersionMod.UpdateMods({Entry}) + FrmVersionMod.Content.UpdateMods({Entry}) Case 2 '查看更新日志 ShowUpdateLog() Case 3 '取消 diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionComp.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionComp.xaml deleted file mode 100644 index 4aae3e1e8..000000000 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionComp.xaml +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml index f0283b880..5bfa9e7a2 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml @@ -24,7 +24,7 @@ + Logo="M835.3 250.9v522.3H188.7V250.9h646.6m49.8-49.8H138.9v621.8H885V201.1h0.1z M138.9 101.6v99.5H64.3v49.8H188.7V101.6zM885.1 922.4v-99.5h74.6v-49.8H835.3v149.3zM511 705.4H297.5c-7.8 0-20.4-2.9-23.3-7.8-2.9-4.9 1.9-16.5 5.8-23.3 26.2-39.8 53.4-79.6 79.6-119.4 8.7-12.6 17.5-13.6 31.1-7.8 44.6 21.4 90.3 42.7 135.9 64.1 12.6 5.8 28.1 1.9 35.9-9.7 24.3-37.9 49.5-74.7 75.7-111.6 4.9-6.8 13.6-17.5 20.4-17.5 7.8 0 13.6 12.6 16.5 20.4 24.3 60.2 47.6 121.3 70.9 181.5 9.7 25.2 5.8 31.1-23.3 31.1H511z m-78.6-298c0 29.1-25.2 52.4-54.4 51.4-29.1-1-51.4-23.3-51.4-51.4 0-29.1 24.3-52.4 54.4-51.4 27.1 0.9 51.4 24.2 51.4 51.4z" > @@ -41,5 +41,21 @@ + + + + + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb index db244f1df..32f70a829 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb @@ -26,7 +26,7 @@ ''' ''' 勾选事件改变页面。 ''' - Private Sub PageCheck(sender As MyListItem, e As RouteEventArgs) Handles ItemOverall.Check, ItemMod.Check, ItemModDisabled.Check, ItemSetup.Check, ItemExport.Check, ItemScreenshot.Check + Private Sub PageCheck(sender As MyListItem, e As RouteEventArgs) Handles ItemOverall.Check, ItemMod.Check, ItemModDisabled.Check, ItemSetup.Check, ItemExport.Check, ItemScreenshot.Check, ItemResourcepack.Check, ItemShader.Check '尚未初始化控件属性时,sender.Tag 为 Nothing,会导致切换到页面 0 '若使用 IsLoaded,则会导致模拟点击不被执行(模拟点击切换页面时,控件的 IsLoaded 为 False) If sender.Tag IsNot Nothing Then PageChange(Val(sender.Tag)) @@ -39,7 +39,7 @@ If FrmVersionOverall Is Nothing Then FrmVersionOverall = New PageVersionOverall Return FrmVersionOverall Case FormMain.PageSubType.VersionMod - If FrmVersionMod Is Nothing Then FrmVersionMod = New PageVersionComp(CompType.Mod) + If FrmVersionMod Is Nothing Then FrmVersionMod = New PageVersionMod() Return FrmVersionMod Case FormMain.PageSubType.VersionModDisabled If FrmVersionModDisabled Is Nothing Then FrmVersionModDisabled = New PageVersionModDisabled @@ -53,6 +53,12 @@ Case FormMain.PageSubType.VersionScreenshot If FrmVersionScreenshot Is Nothing Then FrmVersionScreenshot = New PageVersionScreenshot Return FrmVersionScreenshot + Case FormMain.PageSubType.VersionResourcepack + If FrmVersionResourcepack Is Nothing Then FrmVersionResourcepack = New PageVersionResourcepack + Return FrmVersionResourcepack + Case FormMain.PageSubType.VersionShader + If FrmVersionShader Is Nothing Then FrmVersionShader = New PageVersionShader + Return FrmVersionShader Case Else Throw New Exception("未知的版本设置子页面种类:" & ID) End Select @@ -103,11 +109,17 @@ Public Sub Refresh(SubType As FormMain.PageSubType) Select Case SubType Case FormMain.PageSubType.VersionMod - PageVersionComp.Refresh() + FrmVersionMod?.Content.RefreshUI() ItemMod.Checked = True Case FormMain.PageSubType.VersionExport - If FrmVersionExport IsNot Nothing Then FrmVersionExport.RefreshAll() + FrmVersionExport?.RefreshAll() ItemExport.Checked = True + Case FormMain.PageSubType.VersionResourcepack + FrmVersionResourcepack?.Content.RefreshUI() + ItemResourcepack.Checked = True + Case FormMain.PageSubType.VersionShader + FrmVersionShader?.Content.RefreshUI() + ItemShader.Checked = True End Select End Sub diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index 1b6c3224c..6dc01bb9f 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj @@ -199,6 +199,15 @@ + + PageVersionMod.xaml + + + PageVersionResourcepack.xaml + + + PageVersionShader.xaml + MyLocalModItem.xaml @@ -308,7 +317,7 @@ PageVersionLeft.xaml - + PageVersionComp.xaml @@ -501,6 +510,18 @@ FormMain.xaml Code + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + MSBuild:Compile Designer @@ -710,7 +731,7 @@ Designer MSBuild:Compile - + Designer MSBuild:Compile