PageSelectRight.xaml.vb 14 KB

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