PageSelectRight.xaml.vb 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. Public Class PageSelectRight
  2. '窗口基础
  3. Private Sub PageSelectRight_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
  4. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.RunOnUpdated, MaxDepth:=1, ExtraPath:="versions\")
  5. PanBack.ScrollToHome()
  6. End Sub
  7. Private Sub LoaderInit() Handles Me.Initialized
  8. PageLoaderInit(Load, PanLoad, PanAllBack, Nothing, McVersionListLoader, AddressOf McVersionListUI, AutoRun:=False)
  9. End Sub
  10. Private Sub Load_Click(sender As Object, e As MouseButtonEventArgs) Handles Load.Click
  11. If McVersionListLoader.State = LoadState.Failed Then
  12. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  13. End If
  14. End Sub
  15. '窗口属性
  16. ''' <summary>
  17. ''' 是否显示隐藏的 Minecraft 版本。
  18. ''' </summary>
  19. Public ShowHidden As Boolean = False
  20. #Region "结果 UI 化"
  21. Private Sub McVersionListUI(Loader As LoaderTask(Of String, Integer))
  22. Try
  23. Dim Path As String = Loader.Input
  24. '加载 UI
  25. PanMain.Children.Clear()
  26. For Each Card As KeyValuePair(Of McVersionCardType, List(Of McVersion)) In McVersionList.ToArray
  27. '确认是否为隐藏版本显示状态
  28. If Card.Key = McVersionCardType.Hidden Xor ShowHidden Then Continue For
  29. #Region "确认卡片名称"
  30. Dim CardName As String = ""
  31. Select Case Card.Key
  32. Case McVersionCardType.OriginalLike
  33. CardName = "常规版本"
  34. Case McVersionCardType.API
  35. Dim IsForgeExists As Boolean = False
  36. Dim IsFabricExists As Boolean = False
  37. Dim IsLiteExists As Boolean = False
  38. For Each Version As McVersion In Card.Value
  39. If Version.Version.HasFabric Then IsFabricExists = True
  40. If Version.Version.HasLiteLoader Then IsLiteExists = True
  41. If Version.Version.HasForge Then IsForgeExists = True
  42. Next
  43. If If(IsLiteExists, 1, 0) + If(IsForgeExists, 1, 0) + If(IsFabricExists, 1, 0) > 1 Then
  44. CardName = "可安装 Mod"
  45. ElseIf IsForgeExists Then
  46. CardName = "Forge 版本"
  47. ElseIf IsLiteExists Then
  48. CardName = "LiteLoader 版本"
  49. Else
  50. CardName = "Fabric 版本"
  51. End If
  52. Case McVersionCardType.Error
  53. CardName = "错误的版本"
  54. Case McVersionCardType.Hidden
  55. CardName = "隐藏的版本"
  56. Case McVersionCardType.Rubbish
  57. CardName = "不常用版本"
  58. Case McVersionCardType.Star
  59. CardName = "收藏夹"
  60. Case McVersionCardType.Fool
  61. CardName = "愚人节版本"
  62. Case Else
  63. Throw New ArgumentException("未知的卡片种类(" & Card.Key & ")")
  64. End Select
  65. #End Region
  66. '建立控件
  67. Dim CardTitle As String = CardName & If(CardName = "收藏夹", "", " (" & Card.Value.Count & ")")
  68. Dim NewCard As New MyCard With {.Title = CardTitle, .Margin = New Thickness(0, 0, 0, 15), .SwapType = 0}
  69. Dim NewStack As New StackPanel With {.Margin = New Thickness(20, MyCard.SwapedHeight, 18, 0), .VerticalAlignment = VerticalAlignment.Top, .RenderTransform = New TranslateTransform(0, 0), .Tag = Card.Value}
  70. NewCard.Children.Add(NewStack)
  71. NewCard.SwapControl = NewStack
  72. PanMain.Children.Add(NewCard)
  73. '确定卡片是否展开
  74. If Card.Key = McVersionCardType.Rubbish OrElse Card.Key = McVersionCardType.Error OrElse Card.Key = McVersionCardType.Fool Then
  75. NewCard.IsSwaped = True
  76. Else
  77. MyCard.StackInstall(NewStack, 0, CardTitle)
  78. End If
  79. Next
  80. '若只有一个卡片,则强制展开
  81. If PanMain.Children.Count = 1 AndAlso CType(PanMain.Children(0), MyCard).IsSwaped Then
  82. CType(PanMain.Children(0), MyCard).IsSwaped = False
  83. End If
  84. '判断应该显示哪一个页面
  85. If PanMain.Children.Count = 0 Then
  86. PanEmpty.Visibility = Visibility.Visible
  87. PanBack.Visibility = Visibility.Collapsed
  88. If ShowHidden Then
  89. LabEmptyTitle.Text = "无隐藏版本"
  90. LabEmptyContent.Text = "没有版本被隐藏,你可以在版本设置的版本分类选项中隐藏版本。" & vbCrLf & "再次按下 F11 即可退出隐藏版本查看模式。"
  91. BtnEmptyDownload.Visibility = Visibility.Collapsed
  92. Else
  93. LabEmptyTitle.Text = "无可用版本"
  94. LabEmptyContent.Text = "未找到任何版本的游戏,请先下载任意版本的游戏。" & vbCrLf & "若有已存在的游戏,请在左边的列表中选择添加文件夹,选择 .minecraft 文件夹将其导入。"
  95. BtnEmptyDownload.Visibility = If(Setup.Get("UiHiddenPageDownload") AndAlso Not PageSetupUI.HiddenForceShow, Visibility.Collapsed, Visibility.Visible)
  96. End If
  97. Else
  98. PanBack.Visibility = Visibility.Visible
  99. PanEmpty.Visibility = Visibility.Collapsed
  100. End If
  101. Catch ex As Exception
  102. Log(ex, "将版本列表转换显示时失败", LogLevel.Feedback)
  103. End Try
  104. End Sub
  105. Public Shared Function McVersionListItem(Version As McVersion) As MyListItem
  106. Dim NewItem As New MyListItem With {.Title = Version.Name, .Info = Version.Info, .Height = 42, .Tag = Version, .SnapsToDevicePixels = True, .Type = MyListItem.CheckType.Clickable}
  107. Try
  108. If Version.Logo.EndsWith("PCL\Logo.png") Then
  109. NewItem.Logo = Version.Path & "PCL\Logo.png" '修复老版本中,存储的自定义 Logo 使用完整路径,导致移动后无法加载的 Bug
  110. Else
  111. NewItem.Logo = Version.Logo
  112. End If
  113. Catch ex As Exception
  114. Log(ex, "加载版本图标失败", LogLevel.Hint)
  115. NewItem.Logo = "pack://application:,,,/images/Blocks/RedstoneBlock.png"
  116. End Try
  117. NewItem.ContentHandler = AddressOf McVersionListContent
  118. Return NewItem
  119. End Function
  120. Private Shared Sub McVersionListContent(sender As MyListItem, e As EventArgs)
  121. Dim Version As McVersion = sender.Tag
  122. '注册点击事件
  123. AddHandler sender.Click, AddressOf Item_Click
  124. '图标按钮
  125. Dim BtnStar As New MyIconButton
  126. If Version.IsStar Then
  127. BtnStar.ToolTip = "取消收藏"
  128. ToolTipService.SetPlacement(BtnStar, Primitives.PlacementMode.Center)
  129. ToolTipService.SetVerticalOffset(BtnStar, 30)
  130. ToolTipService.SetHorizontalOffset(BtnStar, 2)
  131. BtnStar.LogoScale = 1.1
  132. BtnStar.Logo = Logo.IconButtonLikeFill
  133. Else
  134. BtnStar.ToolTip = "收藏"
  135. ToolTipService.SetPlacement(BtnStar, Primitives.PlacementMode.Center)
  136. ToolTipService.SetVerticalOffset(BtnStar, 30)
  137. ToolTipService.SetHorizontalOffset(BtnStar, 2)
  138. BtnStar.LogoScale = 1.1
  139. BtnStar.Logo = Logo.IconButtonLikeLine
  140. End If
  141. AddHandler BtnStar.Click, Sub()
  142. WriteIni(Version.Path & "PCL\Setup.ini", "IsStar", Not Version.IsStar)
  143. McVersionListForceRefresh = True
  144. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  145. End Sub
  146. Dim BtnDel As New MyIconButton With {.LogoScale = 1.1, .Logo = Logo.IconButtonDelete}
  147. BtnDel.ToolTip = "删除"
  148. ToolTipService.SetPlacement(BtnDel, Primitives.PlacementMode.Center)
  149. ToolTipService.SetVerticalOffset(BtnDel, 30)
  150. ToolTipService.SetHorizontalOffset(BtnDel, 2)
  151. AddHandler BtnDel.Click, Sub() DeleteVersion(sender, Version)
  152. If Version.State <> McVersionState.Error Then
  153. Dim BtnCont As New MyIconButton With {.LogoScale = 1.1, .Logo = Logo.IconButtonSetup}
  154. BtnCont.ToolTip = "设置"
  155. ToolTipService.SetPlacement(BtnCont, Primitives.PlacementMode.Center)
  156. ToolTipService.SetVerticalOffset(BtnCont, 30)
  157. ToolTipService.SetHorizontalOffset(BtnCont, 2)
  158. AddHandler BtnCont.Click, Sub()
  159. PageVersionLeft.Version = Version
  160. FrmMain.PageChange(FormMain.PageType.VersionSetup, 0)
  161. End Sub
  162. AddHandler sender.MouseRightButtonUp, Sub()
  163. PageVersionLeft.Version = Version
  164. FrmMain.PageChange(FormMain.PageType.VersionSetup, 0)
  165. End Sub
  166. sender.Buttons = {BtnStar, BtnDel, BtnCont}
  167. Else
  168. Dim BtnCont As New MyIconButton With {.LogoScale = 1.15, .Logo = Logo.IconButtonOpen}
  169. BtnCont.ToolTip = "打开文件夹"
  170. ToolTipService.SetPlacement(BtnCont, Primitives.PlacementMode.Center)
  171. ToolTipService.SetVerticalOffset(BtnCont, 30)
  172. ToolTipService.SetHorizontalOffset(BtnCont, 2)
  173. AddHandler BtnCont.Click, Sub()
  174. PageVersionOverall.OpenVersionFolder(Version)
  175. End Sub
  176. AddHandler sender.MouseRightButtonUp, Sub()
  177. PageVersionOverall.OpenVersionFolder(Version)
  178. End Sub
  179. sender.Buttons = {BtnStar, BtnDel, BtnCont}
  180. End If
  181. End Sub
  182. #End Region
  183. #Region "页面事件"
  184. '点击选项
  185. Public Shared Sub Item_Click(sender As MyListItem, e As EventArgs)
  186. Dim Version As McVersion = sender.Tag
  187. If New McVersion(Version.Path).Check Then
  188. '正常版本
  189. McVersionCurrent = Version
  190. Setup.Set("LaunchVersionSelect", McVersionCurrent.Name)
  191. FrmMain.PageBack()
  192. Else
  193. '错误版本
  194. PageVersionOverall.OpenVersionFolder(Version)
  195. End If
  196. End Sub
  197. Private Sub BtnDownload_Click(sender As Object, e As EventArgs) Handles BtnEmptyDownload.Click
  198. FrmMain.PageChange(FormMain.PageType.Download, FormMain.PageSubType.DownloadInstall)
  199. End Sub
  200. Public Shared Sub DeleteVersion(Item As MyListItem, Version As McVersion)
  201. '修改此代码时,同时修改 PageVersionOverall 中的代码
  202. Try
  203. Dim IsShiftPressed As Boolean = My.Computer.Keyboard.ShiftKeyDown
  204. Dim IsHintIndie As Boolean = Version.State <> McVersionState.Error AndAlso Version.PathIndie <> PathMcFolder
  205. Select Case MyMsgBox($"你确定要{If(IsShiftPressed, "永久", "")}删除版本 {Version.Name} 吗?" &
  206. If(IsHintIndie, vbCrLf & "由于该版本开启了版本隔离,删除版本时该版本对应的存档、资源包、Mod 等文件也将被一并删除!", ""),
  207. "版本删除确认", , "取消",, True)
  208. Case 1
  209. IniClearCache(Version.Path & "PCL\Setup.ini")
  210. If IsShiftPressed Then
  211. DeleteDirectory(Version.Path)
  212. Hint("版本 " & Version.Name & " 已永久删除!", HintType.Finish)
  213. Else
  214. FileIO.FileSystem.DeleteDirectory(Version.Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin)
  215. Hint("版本 " & Version.Name & " 已删除到回收站!", HintType.Finish)
  216. End If
  217. Case 2
  218. Exit Sub
  219. End Select
  220. '从 UI 中移除
  221. If Version.DisplayType = McVersionCardType.Hidden OrElse Not Version.IsStar Then
  222. '仅出现在当前卡片
  223. Dim Parent As StackPanel = Item.Parent
  224. If Parent.Children.Count > 2 Then '当前的项目与一个占位符
  225. '删除后还有剩
  226. Dim Card As MyCard = Parent.Parent
  227. Card.Title = Card.Title.Replace(Parent.Children.Count - 1, Parent.Children.Count - 2) '有一个占位符
  228. Parent.Children.Remove(Item)
  229. If McVersionCurrent IsNot Nothing AndAlso Version.Path = McVersionCurrent.Path Then
  230. '删除当前版本就更改选择
  231. McVersionCurrent = CType(Parent.Children(0), MyListItem).Tag
  232. End If
  233. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.UpdateOnly, MaxDepth:=1, ExtraPath:="versions\")
  234. Else
  235. '删除后没剩了
  236. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  237. End If
  238. Else
  239. '同时出现在当前卡片与收藏夹
  240. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  241. End If
  242. Catch ex As OperationCanceledException
  243. Log(ex, "删除版本 " & Version.Name & " 被主动取消")
  244. Catch ex As Exception
  245. Log(ex, "删除版本 " & Version.Name & " 失败", LogLevel.Msgbox)
  246. End Try
  247. End Sub
  248. Public Sub BtnEmptyDownload_Loaded() Handles BtnEmptyDownload.Loaded
  249. Dim NewVisibility = If((Setup.Get("UiHiddenPageDownload") AndAlso Not PageSetupUI.HiddenForceShow) OrElse ShowHidden, Visibility.Collapsed, Visibility.Visible)
  250. If BtnEmptyDownload.Visibility <> NewVisibility Then
  251. BtnEmptyDownload.Visibility = NewVisibility
  252. PanLoad.TriggerForceResize()
  253. End If
  254. End Sub
  255. #End Region
  256. End Class