PageVersionOverall.xaml.vb 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  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. '刷新版本显示
  24. PanDisplayItem.Children.Clear()
  25. ItemVersion = PageSelectRight.McVersionListItem(PageVersionLeft.Version)
  26. ItemVersion.IsHitTestVisible = False
  27. PanDisplayItem.Children.Add(ItemVersion)
  28. FrmMain.PageNameRefresh()
  29. '刷新版本图标
  30. ComboDisplayLogo.SelectedIndex = 0
  31. Dim Logo As String = ReadIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "Logo", "")
  32. Dim LogoCustom As Boolean = ReadIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "LogoCustom", "False")
  33. If LogoCustom Then
  34. For Each Selection As MyComboBoxItem In ComboDisplayLogo.Items
  35. If Selection.Tag = Logo OrElse (Selection.Tag = "PCL\Logo.png" AndAlso Logo.EndsWith("PCL\Logo.png")) Then
  36. ComboDisplayLogo.SelectedItem = Selection
  37. Exit For
  38. End If
  39. Next
  40. End If
  41. AniControlEnabled -= 1
  42. End Sub
  43. #Region "设置临时接口"
  44. '版本分类
  45. Private Sub ComboDisplayType_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboDisplayType.SelectionChanged
  46. If Not (IsLoad AndAlso AniControlEnabled = 0) Then Exit Sub
  47. If ComboDisplayType.SelectedIndex <> 1 Then
  48. '改为不隐藏
  49. Try
  50. WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "DisplayType", ComboDisplayType.SelectedIndex)
  51. WriteIni(PathMcFolder & "PCL.ini", "VersionCache", "") '要求刷新缓存
  52. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  53. Catch ex As Exception
  54. Log(ex, "修改版本分类失败(" & PageVersionLeft.Version.Name & ")", LogLevel.Feedback)
  55. End Try
  56. Else
  57. '改为隐藏
  58. Try
  59. If Not Setup.Get("HintHide") Then
  60. If MyMsgBox("确认要从版本列表中隐藏该版本吗?隐藏该版本后,它将不再出现于 PCL 显示的版本列表中。" & vbCrLf & "此后,在版本列表页面按下 F11 才可以查看被隐藏的版本。", "隐藏版本提示",, "取消") <> 1 Then
  61. ComboDisplayType.SelectedIndex = 0
  62. Exit Sub
  63. End If
  64. Setup.Set("HintHide", True)
  65. End If
  66. WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "DisplayType", McVersionCardType.Hidden)
  67. WriteIni(PathMcFolder & "PCL.ini", "VersionCache", "") '要求刷新缓存
  68. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  69. Catch ex As Exception
  70. Log(ex, "隐藏版本 " & PageVersionLeft.Version.Name & " 失败", LogLevel.Feedback)
  71. End Try
  72. End If
  73. End Sub
  74. '更改描述
  75. Private Sub BtnDisplayDesc_Click(sender As Object, e As EventArgs) Handles BtnDisplayDesc.Click
  76. Try
  77. Dim OldInfo As String = ReadIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "CustomInfo")
  78. Dim NewInfo As String = MyMsgBoxInput(OldInfo, New ObjectModel.Collection(Of Validate), "留空即为使用默认描述", "更改描述",, "取消")
  79. If NewInfo IsNot Nothing AndAlso OldInfo <> NewInfo Then WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "CustomInfo", NewInfo)
  80. PageVersionLeft.Version = New McVersion(PageVersionLeft.Version.Name).Load()
  81. Reload()
  82. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  83. Catch ex As Exception
  84. Log(ex, "版本 " & PageVersionLeft.Version.Name & " 描述更改失败", LogLevel.Msgbox)
  85. End Try
  86. End Sub
  87. '重命名版本
  88. Private Sub BtnDisplayRename_Click(sender As Object, e As EventArgs) Handles BtnDisplayRename.Click
  89. Try
  90. '确认输入的新名称
  91. Dim OldName As String = PageVersionLeft.Version.Name
  92. Dim OldPath As String = PageVersionLeft.Version.Path
  93. '修改此部分的同时修改快速安装的版本名检测*
  94. Dim NewName As String = MyMsgBoxInput(OldName, New ObjectModel.Collection(Of Validate) From {New ValidateFolderName(PathMcFolder & "versions", IgnoreCase:=False)},, "重命名版本",, "取消")
  95. If String.IsNullOrWhiteSpace(NewName) Then Exit Sub
  96. Dim NewPath As String = PathMcFolder & "versions\" & NewName & "\"
  97. '获取临时中间名,以防止仅修改大小写的重命名失败
  98. Dim TempName As String = NewName & "_temp"
  99. Dim TempPath As String = PathMcFolder & "versions\" & TempName & "\"
  100. Dim IsCaseChangedOnly As Boolean = NewName.ToLower = OldName.ToLower
  101. '重新加载版本 Json 信息,避免 HMCL 项被合并
  102. Dim JsonObject As JObject
  103. Try
  104. JsonObject = GetJson(ReadFile(PageVersionLeft.Version.Path & PageVersionLeft.Version.Name & ".json"))
  105. Catch ex As Exception
  106. Log(ex, "重命名读取 Json 时失败")
  107. JsonObject = PageVersionLeft.Version.JsonObject
  108. End Try
  109. '重命名主文件夹
  110. My.Computer.FileSystem.RenameDirectory(OldPath, TempName)
  111. My.Computer.FileSystem.RenameDirectory(TempPath, NewName)
  112. '遍历重命名所有文件与文件夹
  113. For Each Entry As DirectoryInfo In New DirectoryInfo(NewPath).EnumerateDirectories
  114. If Not Entry.Name.Contains(OldName) Then Continue For
  115. If IsCaseChangedOnly Then
  116. My.Computer.FileSystem.RenameDirectory(Entry.FullName, Entry.Name & "_temp")
  117. My.Computer.FileSystem.RenameDirectory(Entry.FullName & "_temp", Entry.Name.Replace(OldName, NewName))
  118. Else
  119. DeleteDirectory(NewPath & Entry.Name.Replace(OldName, NewName))
  120. My.Computer.FileSystem.RenameDirectory(Entry.FullName, Entry.Name.Replace(OldName, NewName))
  121. End If
  122. Next
  123. For Each Entry As FileInfo In New DirectoryInfo(NewPath).EnumerateFiles
  124. If Not Entry.Name.Contains(OldName) Then Continue For
  125. If IsCaseChangedOnly Then
  126. My.Computer.FileSystem.RenameFile(Entry.FullName, Entry.Name & "_temp")
  127. My.Computer.FileSystem.RenameFile(Entry.FullName & "_temp", Entry.Name.Replace(OldName, NewName))
  128. Else
  129. If File.Exists(NewPath & Entry.Name.Replace(OldName, NewName)) Then File.Delete(NewPath & Entry.Name.Replace(OldName, NewName))
  130. My.Computer.FileSystem.RenameFile(Entry.FullName, Entry.Name.Replace(OldName, NewName))
  131. End If
  132. Next
  133. '替换版本设置文件中的路径
  134. If File.Exists(NewPath & "PCL\Setup.ini") Then
  135. WriteFile(NewPath & "PCL\Setup.ini", ReadFile(NewPath & "PCL\Setup.ini").Replace(OldPath, NewPath))
  136. End If
  137. '更改已选中的版本
  138. If ReadIni(PathMcFolder & "PCL.ini", "Version") = OldName Then
  139. WriteIni(PathMcFolder & "PCL.ini", "Version", NewName)
  140. End If
  141. '更改版本 Json
  142. If File.Exists(NewPath & NewName & ".json") Then
  143. Try
  144. JsonObject("id") = NewName
  145. WriteFile(NewPath & NewName & ".json", JsonObject.ToString)
  146. Catch ex As Exception
  147. Log(ex, "重命名 Json 时失败")
  148. End Try
  149. End If
  150. '刷新与提示
  151. Hint("重命名成功!", HintType.Finish)
  152. PageVersionLeft.Version = New McVersion(NewName).Load()
  153. If Not IsNothing(McVersionCurrent) AndAlso McVersionCurrent.Equals(PageVersionLeft.Version) Then WriteIni(PathMcFolder & "PCL.ini", "Version", NewName)
  154. Reload()
  155. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  156. Catch ex As Exception
  157. Log(ex, "重命名版本失败", LogLevel.Msgbox)
  158. End Try
  159. End Sub
  160. '收藏夹
  161. Private Sub BtnDisplayStar_Click(sender As Object, e As EventArgs) Handles BtnDisplayStar.Click
  162. Try
  163. WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "IsStar", Not PageVersionLeft.Version.IsStar)
  164. PageVersionLeft.Version = New McVersion(PageVersionLeft.Version.Name).Load()
  165. Reload()
  166. McVersionListForceRefresh = True
  167. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  168. Catch ex As Exception
  169. Log(ex, "版本 " & PageVersionLeft.Version.Name & " 收藏状态更改失败", LogLevel.Msgbox)
  170. End Try
  171. End Sub
  172. '补全文件
  173. Private Sub BtnManageCheck_Click(sender As Object, e As EventArgs) Handles BtnManageCheck.Click
  174. Try
  175. '重复任务检查
  176. SyncLock LoaderTaskbarLock
  177. For i = 0 To LoaderTaskbar.Count - 1
  178. If LoaderTaskbar(i).Name = PageVersionLeft.Version.Name & " 文件补全" Then
  179. Hint("正在处理中,请稍候!", HintType.Critical)
  180. Exit Sub
  181. End If
  182. Next
  183. End SyncLock
  184. '启动
  185. Dim Loader As New LoaderCombo(Of String)(PageVersionLeft.Version.Name & " 文件补全", DlClientFix(PageVersionLeft.Version, True, AssetsIndexExistsBehaviour.AlwaysDownload, False))
  186. Loader.OnStateChanged = Sub()
  187. Select Case Loader.State
  188. Case LoadState.Finished
  189. Hint(Loader.Name & "成功!", HintType.Finish)
  190. Case LoadState.Failed
  191. Hint(Loader.Name & "失败:" & GetString(Loader.Error), HintType.Critical)
  192. Case LoadState.Aborted
  193. Hint(Loader.Name & "已取消!", HintType.Info)
  194. End Select
  195. End Sub
  196. Loader.Start(PageVersionLeft.Version.Name)
  197. LoaderTaskbarAdd(Loader)
  198. FrmMain.BtnExtraDownload.ShowRefresh()
  199. FrmMain.BtnExtraDownload.Ribble()
  200. Catch ex As Exception
  201. Log(ex, "尝试补全文件失败(" & PageVersionLeft.Version.Name & ")", LogLevel.Msgbox)
  202. End Try
  203. End Sub
  204. '删除版本
  205. Private Sub BtnManageDelete_Click(sender As Object, e As EventArgs) Handles BtnManageDelete.Click
  206. '修改此代码时,同时修改 PageSelectRight 中的代码
  207. Try
  208. Dim IsHintIndie As Boolean = PageVersionLeft.Version.State <> McVersionState.Error AndAlso PageVersionLeft.Version.PathIndie <> PathMcFolder
  209. Select Case MyMsgBox("你确定要删除版本 " & PageVersionLeft.Version.Name & " 吗?" &
  210. If(IsHintIndie, vbCrLf & "由于该版本开启了版本隔离,删除版本时该版本对应的存档、资源包、Mod 等文件也将被一并删除!", ""),
  211. "版本删除确认", , "取消",, True)
  212. Case 1
  213. FileIO.FileSystem.DeleteDirectory(PageVersionLeft.Version.Path, FileIO.UIOption.AllDialogs, FileIO.RecycleOption.SendToRecycleBin)
  214. Hint("版本 " & PageVersionLeft.Version.Name & " 已删除到回收站!", HintType.Finish)
  215. Case 2
  216. ' DeleteDirectory(PageVersionLeft.Version.Path)
  217. ' Hint("版本 " & PageVersionLeft.Version.Name & " 已永久删除!", HintType.Finish)
  218. 'Case 3
  219. Exit Sub
  220. End Select
  221. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  222. FrmMain.PageBack()
  223. Catch ex As Exception
  224. Log(ex, "删除版本 " & PageVersionLeft.Version.Name & " 失败", LogLevel.Msgbox)
  225. End Try
  226. End Sub
  227. '打开版本文件夹
  228. Private Sub BtnManageFolder_Click() Handles BtnManageFolder.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 ComboDisplayLogo_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboDisplayLogo.SelectionChanged
  236. If Not (IsLoad AndAlso AniControlEnabled = 0) Then Exit Sub
  237. '选择 自定义 时修改图片
  238. Try
  239. If ComboDisplayLogo.SelectedItem Is ItemDisplayLogoCustom Then
  240. Dim FileName As String = SelectFile("常用图片文件(*.png;*.jpg;*.gif)|*.png;*.jpg;*.gif", "选择图片")
  241. If FileName = "" Then
  242. Reload() '还原选项
  243. Exit Sub
  244. End If
  245. File.Delete(PageVersionLeft.Version.Path & "PCL\Logo.png")
  246. Directory.CreateDirectory(PageVersionLeft.Version.Path & "PCL") '虽然不知道为啥,有时候真没这文件夹
  247. File.Copy(FileName, PageVersionLeft.Version.Path & "PCL\Logo.png")
  248. Else
  249. File.Delete(PageVersionLeft.Version.Path & "PCL\Logo.png")
  250. End If
  251. Catch ex As Exception
  252. Log(ex, "更改自定义版本图标失败(" & PageVersionLeft.Version.Name & ")", LogLevel.Feedback)
  253. End Try
  254. '进行更改
  255. Try
  256. Dim NewLogo As String = ComboDisplayLogo.SelectedItem.Tag
  257. WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "Logo", NewLogo)
  258. WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "LogoCustom", Not NewLogo = "")
  259. '刷新显示
  260. WriteIni(PathMcFolder & "PCL.ini", "VersionCache", "") '要求刷新缓存
  261. PageVersionLeft.Version = New McVersion(PageVersionLeft.Version.Name).Load()
  262. Reload()
  263. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  264. Catch ex As Exception
  265. Log(ex, "更改版本图标失败(" & PageVersionLeft.Version.Name & ")", LogLevel.Feedback)
  266. End Try
  267. End Sub
  268. #End Region
  269. End Class