PageVersionOverall.xaml.vb 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. Public Class PageVersionOverall
  2. Private IsLoad As Boolean = False
  3. Private Sub PageSetupLaunch_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
  4. '重复加载部分
  5. PanBack.ScrollToHome()
  6. '更新设置
  7. ItemDisplayLogoCustom.Tag = "PCL\Logo.png"
  8. Reload()
  9. '非重复加载部分
  10. If IsLoad Then Exit Sub
  11. IsLoad = True
  12. PanDisplay.TriggerForceResize()
  13. End Sub
  14. Public ItemVersion As MyListItem
  15. ''' <summary>
  16. ''' 确保当前页面上的信息已正确显示。
  17. ''' </summary>
  18. Private Sub Reload()
  19. AniControlEnabled += 1
  20. '刷新设置项目
  21. ComboDisplayType.SelectedIndex = ReadIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "DisplayType", McVersionCardType.Auto)
  22. BtnDisplayStar.Text = If(PageVersionLeft.Version.IsStar, "从收藏夹中移除", "加入收藏夹")
  23. BtnFolderMods.Visibility = If(PageVersionLeft.Version.Modable, Visibility.Visible, Visibility.Collapsed)
  24. '刷新版本显示
  25. PanDisplayItem.Children.Clear()
  26. ItemVersion = PageSelectRight.McVersionListItem(PageVersionLeft.Version)
  27. ItemVersion.IsHitTestVisible = False
  28. PanDisplayItem.Children.Add(ItemVersion)
  29. FrmMain.PageNameRefresh()
  30. '刷新版本图标
  31. ComboDisplayLogo.SelectedIndex = 0
  32. Dim Logo As String = ReadIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "Logo", "")
  33. Dim LogoCustom As Boolean = ReadIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "LogoCustom", "False")
  34. If LogoCustom Then
  35. For Each Selection As MyComboBoxItem In ComboDisplayLogo.Items
  36. If Selection.Tag = Logo OrElse (Selection.Tag = "PCL\Logo.png" AndAlso Logo.EndsWith("PCL\Logo.png")) Then
  37. ComboDisplayLogo.SelectedItem = Selection
  38. Exit For
  39. End If
  40. Next
  41. End If
  42. AniControlEnabled -= 1
  43. End Sub
  44. #Region "卡片:个性化"
  45. '版本分类
  46. Private Sub ComboDisplayType_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboDisplayType.SelectionChanged
  47. If Not (IsLoad AndAlso AniControlEnabled = 0) Then Exit Sub
  48. If ComboDisplayType.SelectedIndex <> 1 Then
  49. '改为不隐藏
  50. Try
  51. '若设置分类为可安装 Mod,则显示正常的 Mod 管理页面
  52. WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "DisplayType", ComboDisplayType.SelectedIndex)
  53. PageVersionLeft.Version.DisplayType = ReadIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "DisplayType", McVersionCardType.Auto)
  54. FrmVersionLeft.RefreshModDisabled()
  55. WriteIni(PathMcFolder & "PCL.ini", "VersionCache", "") '要求刷新缓存
  56. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  57. Catch ex As Exception
  58. Log(ex, "修改版本分类失败(" & PageVersionLeft.Version.Name & ")", LogLevel.Feedback)
  59. End Try
  60. Reload() '更新 “打开 Mod 文件夹” 按钮
  61. Else
  62. '改为隐藏
  63. Try
  64. If Not Setup.Get("HintHide") Then
  65. If MyMsgBox("确认要从版本列表中隐藏该版本吗?隐藏该版本后,它将不再出现于 PCL 显示的版本列表中。" & vbCrLf & "此后,在版本列表页面按下 F11 才可以查看被隐藏的版本。", "隐藏版本提示",, "取消") <> 1 Then
  66. ComboDisplayType.SelectedIndex = 0
  67. Exit Sub
  68. End If
  69. Setup.Set("HintHide", True)
  70. End If
  71. WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "DisplayType", McVersionCardType.Hidden)
  72. WriteIni(PathMcFolder & "PCL.ini", "VersionCache", "") '要求刷新缓存
  73. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  74. Catch ex As Exception
  75. Log(ex, "隐藏版本 " & PageVersionLeft.Version.Name & " 失败", LogLevel.Feedback)
  76. End Try
  77. End If
  78. End Sub
  79. '更改描述
  80. Private Sub BtnDisplayDesc_Click(sender As Object, e As EventArgs) Handles BtnDisplayDesc.Click
  81. Try
  82. Dim OldInfo As String = ReadIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "CustomInfo")
  83. Dim NewInfo As String = MyMsgBoxInput("更改描述", "修改版本的描述文本,留空则使用 PCL 的默认描述。", OldInfo, New ObjectModel.Collection(Of Validate), "默认描述")
  84. If NewInfo IsNot Nothing AndAlso OldInfo <> NewInfo Then WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "CustomInfo", NewInfo)
  85. PageVersionLeft.Version = New McVersion(PageVersionLeft.Version.Name).Load()
  86. Reload()
  87. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  88. Catch ex As Exception
  89. Log(ex, "版本 " & PageVersionLeft.Version.Name & " 描述更改失败", LogLevel.Msgbox)
  90. End Try
  91. End Sub
  92. '重命名版本
  93. Private Sub BtnDisplayRename_Click(sender As Object, e As EventArgs) Handles BtnDisplayRename.Click
  94. Try
  95. '确认输入的新名称
  96. Dim OldName As String = PageVersionLeft.Version.Name
  97. Dim OldPath As String = PageVersionLeft.Version.Path
  98. ReType:
  99. '修改此部分的同时修改快速安装的版本名检测*
  100. Dim NewName As String = MyMsgBoxInput("重命名版本", "", OldName, New ObjectModel.Collection(Of Validate) From {New ValidateFolderName(PathMcFolder & "versions", IgnoreCase:=False)})
  101. If String.IsNullOrWhiteSpace(NewName) Then Exit Sub
  102. Dim NewPath As String = PathMcFolder & "versions\" & NewName & "\"
  103. '获取临时中间名,以防止仅修改大小写的重命名失败
  104. Dim TempName As String = NewName & "_temp"
  105. Dim TempPath As String = PathMcFolder & "versions\" & TempName & "\"
  106. Dim IsCaseChangedOnly As Boolean = NewName.ToLower = OldName.ToLower
  107. '重新加载版本 Json 信息,避免 HMCL 项被合并
  108. Dim JsonObject As JObject
  109. Try
  110. JsonObject = GetJson(ReadFile(PageVersionLeft.Version.Path & PageVersionLeft.Version.Name & ".json"))
  111. Catch ex As Exception
  112. Log(ex, "重命名读取 json 时失败")
  113. JsonObject = PageVersionLeft.Version.JsonObject
  114. End Try
  115. If Directory.Exists(NewPath) OrElse Directory.Exists(TempName) Then
  116. Select Case MyMsgBox("当前文件夹已存在此名称,请重新输入一个有效的名称。", "重命名失败", Button1:="确定", Button2:="取消")
  117. Case 1
  118. GoTo ReType
  119. Case 2
  120. Exit Sub
  121. End Select
  122. ElseIf Not Directory.Exists($"{PathMcFolder}\versions") Then
  123. MyMsgBox("当前版本文件夹无效,请检查版本文件夹。", "重命名失败")
  124. Exit Sub
  125. End If
  126. '重命名主文件夹
  127. My.Computer.FileSystem.RenameDirectory(OldPath, TempName)
  128. My.Computer.FileSystem.RenameDirectory(TempPath, NewName)
  129. '清理 ini 缓存
  130. IniClearCache(PageVersionLeft.Version.Path & "PCL\Setup.ini")
  131. '遍历重命名所有文件与文件夹
  132. For Each Entry As DirectoryInfo In New DirectoryInfo(NewPath).EnumerateDirectories
  133. If Not Entry.Name.Contains(OldName) Then Continue For
  134. If IsCaseChangedOnly Then
  135. My.Computer.FileSystem.RenameDirectory(Entry.FullName, Entry.Name & "_temp")
  136. My.Computer.FileSystem.RenameDirectory(Entry.FullName & "_temp", Entry.Name.Replace(OldName, NewName))
  137. Else
  138. DeleteDirectory(NewPath & Entry.Name.Replace(OldName, NewName))
  139. My.Computer.FileSystem.RenameDirectory(Entry.FullName, Entry.Name.Replace(OldName, NewName))
  140. End If
  141. Next
  142. For Each Entry As FileInfo In New DirectoryInfo(NewPath).EnumerateFiles
  143. If Not Entry.Name.Contains(OldName) Then Continue For
  144. If IsCaseChangedOnly Then
  145. My.Computer.FileSystem.RenameFile(Entry.FullName, Entry.Name & "_temp")
  146. My.Computer.FileSystem.RenameFile(Entry.FullName & "_temp", Entry.Name.Replace(OldName, NewName))
  147. Else
  148. If File.Exists(NewPath & Entry.Name.Replace(OldName, NewName)) Then File.Delete(NewPath & Entry.Name.Replace(OldName, NewName))
  149. My.Computer.FileSystem.RenameFile(Entry.FullName, Entry.Name.Replace(OldName, NewName))
  150. End If
  151. Next
  152. '替换版本设置文件中的路径
  153. If File.Exists(NewPath & "PCL\Setup.ini") Then
  154. WriteFile(NewPath & "PCL\Setup.ini", ReadFile(NewPath & "PCL\Setup.ini").Replace(OldPath, NewPath))
  155. End If
  156. '更改已选中的版本
  157. If ReadIni(PathMcFolder & "PCL.ini", "Version") = OldName Then
  158. WriteIni(PathMcFolder & "PCL.ini", "Version", NewName)
  159. End If
  160. '更改版本 Json
  161. If File.Exists(NewPath & NewName & ".json") Then
  162. Try
  163. JsonObject("id") = NewName
  164. WriteFile(NewPath & NewName & ".json", JsonObject.ToString)
  165. Catch ex As Exception
  166. Log(ex, "重命名版本 json 失败")
  167. End Try
  168. End If
  169. '刷新与提示
  170. Hint("重命名成功!", HintType.Finish)
  171. PageVersionLeft.Version = New McVersion(NewName).Load()
  172. If Not IsNothing(McVersionCurrent) AndAlso McVersionCurrent.Equals(PageVersionLeft.Version) Then WriteIni(PathMcFolder & "PCL.ini", "Version", NewName)
  173. Reload()
  174. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  175. Catch ex As Exception
  176. Log(ex, "重命名版本失败", LogLevel.Msgbox)
  177. End Try
  178. End Sub
  179. '版本图标
  180. Private Sub ComboDisplayLogo_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboDisplayLogo.SelectionChanged
  181. If Not (IsLoad AndAlso AniControlEnabled = 0) Then Exit Sub
  182. '选择 自定义 时修改图片
  183. Try
  184. If ComboDisplayLogo.SelectedItem Is ItemDisplayLogoCustom Then
  185. Dim FileName As String = SelectFile("常用图片文件(*.png;*.jpg;*.gif)|*.png;*.jpg;*.gif", "选择图片")
  186. If FileName = "" Then
  187. Reload() '还原选项
  188. Exit Sub
  189. End If
  190. File.Delete(PageVersionLeft.Version.Path & "PCL\Logo.png")
  191. Directory.CreateDirectory(PageVersionLeft.Version.Path & "PCL") '虽然不知道为啥,有时候真没这文件夹
  192. CopyFile(FileName, PageVersionLeft.Version.Path & "PCL\Logo.png")
  193. Else
  194. File.Delete(PageVersionLeft.Version.Path & "PCL\Logo.png")
  195. End If
  196. Catch ex As Exception
  197. Log(ex, "更改自定义版本图标失败(" & PageVersionLeft.Version.Name & ")", LogLevel.Feedback)
  198. End Try
  199. '进行更改
  200. Try
  201. Dim NewLogo As String = ComboDisplayLogo.SelectedItem.Tag
  202. WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "Logo", NewLogo)
  203. WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "LogoCustom", Not NewLogo = "")
  204. '刷新显示
  205. WriteIni(PathMcFolder & "PCL.ini", "VersionCache", "") '要求刷新缓存
  206. PageVersionLeft.Version = New McVersion(PageVersionLeft.Version.Name).Load()
  207. Reload()
  208. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  209. Catch ex As Exception
  210. Log(ex, "更改版本图标失败(" & PageVersionLeft.Version.Name & ")", LogLevel.Feedback)
  211. End Try
  212. End Sub
  213. '收藏夹
  214. Private Sub BtnDisplayStar_Click(sender As Object, e As EventArgs) Handles BtnDisplayStar.Click
  215. Try
  216. WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "IsStar", Not PageVersionLeft.Version.IsStar)
  217. PageVersionLeft.Version = New McVersion(PageVersionLeft.Version.Name).Load()
  218. Reload()
  219. McVersionListForceRefresh = True
  220. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  221. Catch ex As Exception
  222. Log(ex, "版本 " & PageVersionLeft.Version.Name & " 收藏状态更改失败", LogLevel.Msgbox)
  223. End Try
  224. End Sub
  225. #End Region
  226. #Region "卡片:快捷方式"
  227. '版本文件夹
  228. Private Sub BtnFolderVersion_Click() Handles BtnFolderVersion.Click
  229. OpenVersionFolder(PageVersionLeft.Version)
  230. End Sub
  231. Public Shared Sub OpenVersionFolder(Version As McVersion)
  232. OpenExplorer(Version.Path)
  233. End Sub
  234. '存档文件夹
  235. Private Sub BtnFolderSaves_Click() Handles BtnFolderSaves.Click
  236. Dim FolderPath As String = PageVersionLeft.Version.PathIndie & "saves\"
  237. Directory.CreateDirectory(FolderPath)
  238. OpenExplorer(FolderPath)
  239. End Sub
  240. 'Mod 文件夹
  241. Private Sub BtnFolderMods_Click() Handles BtnFolderMods.Click
  242. Dim FolderPath As String = PageVersionLeft.Version.PathIndie & "mods\"
  243. Directory.CreateDirectory(FolderPath)
  244. OpenExplorer(FolderPath)
  245. End Sub
  246. #End Region
  247. #Region "卡片:管理"
  248. '导出启动脚本
  249. Private Sub BtnManageScript_Click() Handles BtnManageScript.Click
  250. Try
  251. '弹窗要求指定脚本的保存位置
  252. Dim SavePath As String = SelectSaveFile("选择脚本保存位置", "启动 " & PageVersionLeft.Version.Name & ".bat", "批处理文件(*.bat)|*.bat")
  253. If SavePath = "" Then Exit Sub
  254. '检查中断(等玩家选完弹窗指不定任务就结束了呢……)
  255. If McLaunchLoader.State = LoadState.Loading Then
  256. Hint("请在当前启动任务结束后再试!", HintType.Critical)
  257. Exit Sub
  258. End If
  259. '生成脚本
  260. If McLaunchStart(New McLaunchOptions With {.SaveBatch = SavePath, .Version = PageVersionLeft.Version}) Then
  261. If Setup.Get("LoginType") = McLoginType.Legacy Then
  262. Hint("正在导出启动脚本……")
  263. Else
  264. Hint("正在导出启动脚本……(注意,使用脚本启动可能会导致登录失效!)")
  265. End If
  266. End If
  267. Catch ex As Exception
  268. Log(ex, "导出启动脚本失败(" & PageVersionLeft.Version.Name & ")", LogLevel.Msgbox)
  269. End Try
  270. End Sub
  271. '补全文件
  272. Private Sub BtnManageCheck_Click(sender As Object, e As EventArgs) Handles BtnManageCheck.Click
  273. Try
  274. '忽略文件检查提示
  275. If ShouldIgnoreFileCheck(PageVersionLeft.Version) Then
  276. If Setup.Get("LaunchAdvanceAssets") Then
  277. Hint("请先关闭 [设置 → 高级启动选项 → 关闭文件校验],然后再尝试补全文件!", HintType.Info)
  278. Else
  279. Hint("请先关闭 [版本设置 → 设置 → 高级启动选项 → 关闭文件校验],然后再尝试补全文件!", HintType.Info)
  280. End If
  281. Exit Sub
  282. End If
  283. '重复任务检查
  284. For Each OngoingLoader In LoaderTaskbar
  285. If OngoingLoader.Name <> PageVersionLeft.Version.Name & " 文件补全" Then Continue For
  286. Hint("正在处理中,请稍候!", HintType.Critical)
  287. Exit Sub
  288. Next
  289. '启动
  290. Dim Loader As New LoaderCombo(Of String)(PageVersionLeft.Version.Name & " 文件补全", DlClientFix(PageVersionLeft.Version, True, AssetsIndexExistsBehaviour.AlwaysDownload))
  291. Loader.OnStateChanged =
  292. Sub()
  293. Select Case Loader.State
  294. Case LoadState.Finished
  295. Hint(Loader.Name & "成功!", HintType.Finish)
  296. Case LoadState.Failed
  297. Hint(Loader.Name & "失败:" & GetExceptionSummary(Loader.Error), HintType.Critical)
  298. Case LoadState.Aborted
  299. Hint(Loader.Name & "已取消!", HintType.Info)
  300. End Select
  301. End Sub
  302. Loader.Start(PageVersionLeft.Version.Name)
  303. LoaderTaskbarAdd(Loader)
  304. FrmMain.BtnExtraDownload.ShowRefresh()
  305. FrmMain.BtnExtraDownload.Ribble()
  306. Catch ex As Exception
  307. Log(ex, "尝试补全文件失败(" & PageVersionLeft.Version.Name & ")", LogLevel.Msgbox)
  308. End Try
  309. End Sub
  310. '删除版本
  311. '修改此代码时,同时修改 PageSelectRight 中的代码
  312. Private Sub BtnManageDelete_Click(sender As Object, e As EventArgs) Handles BtnManageDelete.Click
  313. Try
  314. Dim IsShiftPressed As Boolean = My.Computer.Keyboard.ShiftKeyDown
  315. Dim IsHintIndie As Boolean = PageVersionLeft.Version.State <> McVersionState.Error AndAlso PageVersionLeft.Version.PathIndie <> PathMcFolder
  316. Select Case MyMsgBox($"你确定要{If(IsShiftPressed, "永久", "")}删除版本 {PageVersionLeft.Version.Name} 吗?" &
  317. If(IsHintIndie, vbCrLf & "由于该版本开启了版本隔离,删除版本时该版本对应的存档、资源包、Mod 等文件也将被一并删除!", ""),
  318. "版本删除确认", , "取消",, IsHintIndie OrElse IsShiftPressed)
  319. Case 1
  320. IniClearCache(PageVersionLeft.Version.Path & "PCL\Setup.ini")
  321. If IsShiftPressed Then
  322. DeleteDirectory(PageVersionLeft.Version.Path)
  323. Hint("版本 " & PageVersionLeft.Version.Name & " 已永久删除!", HintType.Finish)
  324. Else
  325. FileIO.FileSystem.DeleteDirectory(PageVersionLeft.Version.Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin)
  326. Hint("版本 " & PageVersionLeft.Version.Name & " 已删除到回收站!", HintType.Finish)
  327. End If
  328. Case 2
  329. Exit Sub
  330. End Select
  331. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  332. FrmMain.PageBack()
  333. Catch ex As OperationCanceledException
  334. Log(ex, "删除版本 " & PageVersionLeft.Version.Name & " 被主动取消")
  335. Catch ex As Exception
  336. Log(ex, "删除版本 " & PageVersionLeft.Version.Name & " 失败", LogLevel.Msgbox)
  337. End Try
  338. End Sub
  339. #End Region
  340. End Class