| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349 |
- Public Class PageVersionOverall
- Private IsLoad As Boolean = False
- Private Sub PageSetupLaunch_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
- '重复加载部分
- PanBack.ScrollToHome()
- '更新设置
- ItemDisplayLogoCustom.Tag = "PCL\Logo.png"
- Reload()
- '非重复加载部分
- If IsLoad Then Exit Sub
- IsLoad = True
- PanDisplay.TriggerForceResize()
- End Sub
- Public ItemVersion As MyListItem
- ''' <summary>
- ''' 确保当前页面上的信息已正确显示。
- ''' </summary>
- Private Sub Reload()
- AniControlEnabled += 1
- '刷新设置项目
- ComboDisplayType.SelectedIndex = ReadIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "DisplayType", McVersionCardType.Auto)
- BtnDisplayStar.Text = If(PageVersionLeft.Version.IsStar, "从收藏夹中移除", "加入收藏夹")
- BtnFolderMods.Visibility = If(PageVersionLeft.Version.Modable, Visibility.Visible, Visibility.Collapsed)
- '刷新版本显示
- PanDisplayItem.Children.Clear()
- ItemVersion = PageSelectRight.McVersionListItem(PageVersionLeft.Version)
- ItemVersion.IsHitTestVisible = False
- PanDisplayItem.Children.Add(ItemVersion)
- FrmMain.PageNameRefresh()
- '刷新版本图标
- ComboDisplayLogo.SelectedIndex = 0
- Dim Logo As String = ReadIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "Logo", "")
- Dim LogoCustom As Boolean = ReadIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "LogoCustom", "False")
- If LogoCustom Then
- For Each Selection As MyComboBoxItem In ComboDisplayLogo.Items
- If Selection.Tag = Logo OrElse (Selection.Tag = "PCL\Logo.png" AndAlso Logo.EndsWith("PCL\Logo.png")) Then
- ComboDisplayLogo.SelectedItem = Selection
- Exit For
- End If
- Next
- End If
- AniControlEnabled -= 1
- End Sub
- #Region "卡片:个性化"
- '版本分类
- Private Sub ComboDisplayType_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboDisplayType.SelectionChanged
- If Not (IsLoad AndAlso AniControlEnabled = 0) Then Exit Sub
- If ComboDisplayType.SelectedIndex <> 1 Then
- '改为不隐藏
- Try
- '若设置分类为可安装 Mod,则显示正常的 Mod 管理页面
- WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "DisplayType", ComboDisplayType.SelectedIndex)
- PageVersionLeft.Version.DisplayType = ReadIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "DisplayType", McVersionCardType.Auto)
- FrmVersionLeft.RefreshModDisabled()
- WriteIni(PathMcFolder & "PCL.ini", "VersionCache", "") '要求刷新缓存
- LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
- Catch ex As Exception
- Log(ex, "修改版本分类失败(" & PageVersionLeft.Version.Name & ")", LogLevel.Feedback)
- End Try
- Reload() '更新 “打开 Mod 文件夹” 按钮
- Else
- '改为隐藏
- Try
- If Not Setup.Get("HintHide") Then
- If MyMsgBox("确认要从版本列表中隐藏该版本吗?隐藏该版本后,它将不再出现于 PCL 显示的版本列表中。" & vbCrLf & "此后,在版本列表页面按下 F11 才可以查看被隐藏的版本。", "隐藏版本提示",, "取消") <> 1 Then
- ComboDisplayType.SelectedIndex = 0
- Exit Sub
- End If
- Setup.Set("HintHide", True)
- End If
- WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "DisplayType", McVersionCardType.Hidden)
- WriteIni(PathMcFolder & "PCL.ini", "VersionCache", "") '要求刷新缓存
- LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
- Catch ex As Exception
- Log(ex, "隐藏版本 " & PageVersionLeft.Version.Name & " 失败", LogLevel.Feedback)
- End Try
- End If
- End Sub
- '更改描述
- Private Sub BtnDisplayDesc_Click(sender As Object, e As EventArgs) Handles BtnDisplayDesc.Click
- Try
- Dim OldInfo As String = ReadIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "CustomInfo")
- Dim NewInfo As String = MyMsgBoxInput("更改描述", "修改版本的描述文本,留空则使用 PCL 的默认描述。", OldInfo, New ObjectModel.Collection(Of Validate), "默认描述")
- If NewInfo IsNot Nothing AndAlso OldInfo <> NewInfo Then WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "CustomInfo", NewInfo)
- PageVersionLeft.Version = New McVersion(PageVersionLeft.Version.Name).Load()
- Reload()
- LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
- Catch ex As Exception
- Log(ex, "版本 " & PageVersionLeft.Version.Name & " 描述更改失败", LogLevel.Msgbox)
- End Try
- End Sub
- '重命名版本
- Private Sub BtnDisplayRename_Click(sender As Object, e As EventArgs) Handles BtnDisplayRename.Click
- Try
- '确认输入的新名称
- Dim OldName As String = PageVersionLeft.Version.Name
- Dim OldPath As String = PageVersionLeft.Version.Path
- '修改此部分的同时修改快速安装的版本名检测*
- Dim NewName As String = MyMsgBoxInput("重命名版本", "", OldName, New ObjectModel.Collection(Of Validate) From {New ValidateFolderName(PathMcFolder & "versions", IgnoreCase:=False)})
- If String.IsNullOrWhiteSpace(NewName) Then Exit Sub
- Dim NewPath As String = PathMcFolder & "versions\" & NewName & "\"
- '获取临时中间名,以防止仅修改大小写的重命名失败
- Dim TempName As String = NewName & "_temp"
- Dim TempPath As String = PathMcFolder & "versions\" & TempName & "\"
- Dim IsCaseChangedOnly As Boolean = NewName.ToLower = OldName.ToLower
- '重新加载版本 Json 信息,避免 HMCL 项被合并
- Dim JsonObject As JObject
- Try
- JsonObject = GetJson(ReadFile(PageVersionLeft.Version.Path & PageVersionLeft.Version.Name & ".json"))
- Catch ex As Exception
- Log(ex, "重命名读取 json 时失败")
- JsonObject = PageVersionLeft.Version.JsonObject
- End Try
- '重命名主文件夹
- My.Computer.FileSystem.RenameDirectory(OldPath, TempName)
- My.Computer.FileSystem.RenameDirectory(TempPath, NewName)
- '清理 ini 缓存
- IniClearCache(PageVersionLeft.Version.Path & "PCL\Setup.ini")
- '遍历重命名所有文件与文件夹
- For Each Entry As DirectoryInfo In New DirectoryInfo(NewPath).EnumerateDirectories
- If Not Entry.Name.Contains(OldName) Then Continue For
- If IsCaseChangedOnly Then
- My.Computer.FileSystem.RenameDirectory(Entry.FullName, Entry.Name & "_temp")
- My.Computer.FileSystem.RenameDirectory(Entry.FullName & "_temp", Entry.Name.Replace(OldName, NewName))
- Else
- DeleteDirectory(NewPath & Entry.Name.Replace(OldName, NewName))
- My.Computer.FileSystem.RenameDirectory(Entry.FullName, Entry.Name.Replace(OldName, NewName))
- End If
- Next
- For Each Entry As FileInfo In New DirectoryInfo(NewPath).EnumerateFiles
- If Not Entry.Name.Contains(OldName) Then Continue For
- If IsCaseChangedOnly Then
- My.Computer.FileSystem.RenameFile(Entry.FullName, Entry.Name & "_temp")
- My.Computer.FileSystem.RenameFile(Entry.FullName & "_temp", Entry.Name.Replace(OldName, NewName))
- Else
- If File.Exists(NewPath & Entry.Name.Replace(OldName, NewName)) Then File.Delete(NewPath & Entry.Name.Replace(OldName, NewName))
- My.Computer.FileSystem.RenameFile(Entry.FullName, Entry.Name.Replace(OldName, NewName))
- End If
- Next
- '替换版本设置文件中的路径
- If File.Exists(NewPath & "PCL\Setup.ini") Then
- WriteFile(NewPath & "PCL\Setup.ini", ReadFile(NewPath & "PCL\Setup.ini").Replace(OldPath, NewPath))
- End If
- '更改已选中的版本
- If ReadIni(PathMcFolder & "PCL.ini", "Version") = OldName Then
- WriteIni(PathMcFolder & "PCL.ini", "Version", NewName)
- End If
- '更改版本 Json
- If File.Exists(NewPath & NewName & ".json") Then
- Try
- JsonObject("id") = NewName
- WriteFile(NewPath & NewName & ".json", JsonObject.ToString)
- Catch ex As Exception
- Log(ex, "重命名版本 json 失败")
- End Try
- End If
- '刷新与提示
- Hint("重命名成功!", HintType.Finish)
- PageVersionLeft.Version = New McVersion(NewName).Load()
- If Not IsNothing(McVersionCurrent) AndAlso McVersionCurrent.Equals(PageVersionLeft.Version) Then WriteIni(PathMcFolder & "PCL.ini", "Version", NewName)
- Reload()
- LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
- Catch ex As Exception
- Log(ex, "重命名版本失败", LogLevel.Msgbox)
- End Try
- End Sub
- '版本图标
- Private Sub ComboDisplayLogo_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboDisplayLogo.SelectionChanged
- If Not (IsLoad AndAlso AniControlEnabled = 0) Then Exit Sub
- '选择 自定义 时修改图片
- Try
- If ComboDisplayLogo.SelectedItem Is ItemDisplayLogoCustom Then
- Dim FileName As String = SelectFile("常用图片文件(*.png;*.jpg;*.gif)|*.png;*.jpg;*.gif", "选择图片")
- If FileName = "" Then
- Reload() '还原选项
- Exit Sub
- End If
- File.Delete(PageVersionLeft.Version.Path & "PCL\Logo.png")
- Directory.CreateDirectory(PageVersionLeft.Version.Path & "PCL") '虽然不知道为啥,有时候真没这文件夹
- CopyFile(FileName, PageVersionLeft.Version.Path & "PCL\Logo.png")
- Else
- File.Delete(PageVersionLeft.Version.Path & "PCL\Logo.png")
- End If
- Catch ex As Exception
- Log(ex, "更改自定义版本图标失败(" & PageVersionLeft.Version.Name & ")", LogLevel.Feedback)
- End Try
- '进行更改
- Try
- Dim NewLogo As String = ComboDisplayLogo.SelectedItem.Tag
- WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "Logo", NewLogo)
- WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "LogoCustom", Not NewLogo = "")
- '刷新显示
- WriteIni(PathMcFolder & "PCL.ini", "VersionCache", "") '要求刷新缓存
- PageVersionLeft.Version = New McVersion(PageVersionLeft.Version.Name).Load()
- Reload()
- LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
- Catch ex As Exception
- Log(ex, "更改版本图标失败(" & PageVersionLeft.Version.Name & ")", LogLevel.Feedback)
- End Try
- End Sub
- '收藏夹
- Private Sub BtnDisplayStar_Click(sender As Object, e As EventArgs) Handles BtnDisplayStar.Click
- Try
- WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "IsStar", Not PageVersionLeft.Version.IsStar)
- PageVersionLeft.Version = New McVersion(PageVersionLeft.Version.Name).Load()
- Reload()
- McVersionListForceRefresh = True
- LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
- Catch ex As Exception
- Log(ex, "版本 " & PageVersionLeft.Version.Name & " 收藏状态更改失败", LogLevel.Msgbox)
- End Try
- End Sub
- #End Region
- #Region "卡片:快捷方式"
- '版本文件夹
- Private Sub BtnFolderVersion_Click() Handles BtnFolderVersion.Click
- OpenVersionFolder(PageVersionLeft.Version)
- End Sub
- Public Shared Sub OpenVersionFolder(Version As McVersion)
- OpenExplorer("""" & Version.Path & """")
- End Sub
- '存档文件夹
- Private Sub BtnFolderSaves_Click() Handles BtnFolderSaves.Click
- Dim FolderPath As String = PageVersionLeft.Version.PathIndie & "saves\"
- Directory.CreateDirectory(FolderPath)
- OpenExplorer("""" & FolderPath & """")
- End Sub
- 'Mod 文件夹
- Private Sub BtnFolderMods_Click() Handles BtnFolderMods.Click
- Dim FolderPath As String = PageVersionLeft.Version.PathIndie & "mods\"
- Directory.CreateDirectory(FolderPath)
- OpenExplorer("""" & FolderPath & """")
- End Sub
- #End Region
- #Region "卡片:管理"
- '导出启动脚本
- Private Sub BtnManageScript_Click() Handles BtnManageScript.Click
- Try
- '弹窗要求指定脚本的保存位置
- Dim SavePath As String = SelectAs("选择脚本保存位置", "启动 " & PageVersionLeft.Version.Name & ".bat", "批处理文件(*.bat)|*.bat")
- If SavePath = "" Then Exit Sub
- '检查中断(等玩家选完弹窗指不定任务就结束了呢……)
- If McLaunchLoader.State = LoadState.Loading Then
- Hint("请在当前启动任务结束后再试!", HintType.Critical)
- Exit Sub
- End If
- '生成脚本
- If McLaunchStart(New McLaunchOptions With {.SaveBatch = SavePath, .Version = PageVersionLeft.Version}) Then
- If Setup.Get("LoginType") = McLoginType.Legacy Then
- Hint("正在导出启动脚本……")
- Else
- Hint("正在导出启动脚本……(注意,使用脚本启动可能会导致登录失效!)")
- End If
- End If
- Catch ex As Exception
- Log(ex, "导出启动脚本失败(" & PageVersionLeft.Version.Name & ")", LogLevel.Msgbox)
- End Try
- End Sub
- '补全文件
- Private Sub BtnManageCheck_Click(sender As Object, e As EventArgs) Handles BtnManageCheck.Click
- Try
- '重复任务检查
- SyncLock LoaderTaskbarLock
- For i = 0 To LoaderTaskbar.Count - 1
- If LoaderTaskbar(i).Name = PageVersionLeft.Version.Name & " 文件补全" Then
- Hint("正在处理中,请稍候!", HintType.Critical)
- Exit Sub
- End If
- Next
- End SyncLock
- '启动
- Dim Loader As New LoaderCombo(Of String)(PageVersionLeft.Version.Name & " 文件补全", DlClientFix(PageVersionLeft.Version, True, AssetsIndexExistsBehaviour.AlwaysDownload, False))
- Loader.OnStateChanged =
- Sub()
- Select Case Loader.State
- Case LoadState.Finished
- Hint(Loader.Name & "成功!", HintType.Finish)
- Case LoadState.Failed
- Hint(Loader.Name & "失败:" & GetExceptionSummary(Loader.Error), HintType.Critical)
- Case LoadState.Aborted
- Hint(Loader.Name & "已取消!", HintType.Info)
- End Select
- End Sub
- Loader.Start(PageVersionLeft.Version.Name)
- LoaderTaskbarAdd(Loader)
- FrmMain.BtnExtraDownload.ShowRefresh()
- FrmMain.BtnExtraDownload.Ribble()
- Catch ex As Exception
- Log(ex, "尝试补全文件失败(" & PageVersionLeft.Version.Name & ")", LogLevel.Msgbox)
- End Try
- End Sub
- '删除版本
- '修改此代码时,同时修改 PageSelectRight 中的代码
- Private Sub BtnManageDelete_Click(sender As Object, e As EventArgs) Handles BtnManageDelete.Click
- Try
- Dim IsShiftPressed As Boolean = My.Computer.Keyboard.ShiftKeyDown
- Dim IsHintIndie As Boolean = PageVersionLeft.Version.State <> McVersionState.Error AndAlso PageVersionLeft.Version.PathIndie <> PathMcFolder
- Select Case MyMsgBox($"你确定要{If(IsShiftPressed, "永久", "")}删除版本 {PageVersionLeft.Version.Name} 吗?" &
- If(IsHintIndie, vbCrLf & "由于该版本开启了版本隔离,删除版本时该版本对应的存档、资源包、Mod 等文件也将被一并删除!", ""),
- "版本删除确认", , "取消",, IsHintIndie OrElse IsShiftPressed)
- Case 1
- IniClearCache(PageVersionLeft.Version.Path & "PCL\Setup.ini")
- If IsShiftPressed Then
- DeleteDirectory(PageVersionLeft.Version.Path)
- Hint("版本 " & PageVersionLeft.Version.Name & " 已永久删除!", HintType.Finish)
- Else
- FileIO.FileSystem.DeleteDirectory(PageVersionLeft.Version.Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin)
- Hint("版本 " & PageVersionLeft.Version.Name & " 已删除到回收站!", HintType.Finish)
- End If
- Case 2
- Exit Sub
- End Select
- LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
- FrmMain.PageBack()
- Catch ex As OperationCanceledException
- Log(ex, "删除版本 " & PageVersionLeft.Version.Name & " 被主动取消")
- Catch ex As Exception
- Log(ex, "删除版本 " & PageVersionLeft.Version.Name & " 失败", LogLevel.Msgbox)
- End Try
- End Sub
- #End Region
- End Class
|