PageSelectRight.xaml.vb 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  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 Sub McVersionListContent(sender As MyListItem, e As EventArgs)
  110. Dim Version As McVersion = sender.Tag
  111. '注册点击事件
  112. AddHandler sender.Click, AddressOf Item_Click
  113. '图标按钮
  114. Dim BtnStar As New MyIconButton
  115. If Version.IsStar Then
  116. BtnStar.ToolTip = "取消收藏"
  117. ToolTipService.SetPlacement(BtnStar, Primitives.PlacementMode.Center)
  118. ToolTipService.SetVerticalOffset(BtnStar, 30)
  119. ToolTipService.SetHorizontalOffset(BtnStar, 2)
  120. BtnStar.LogoScale = 1.1
  121. BtnStar.Logo = Logo.IconButtonLikeFill
  122. Else
  123. BtnStar.ToolTip = "收藏"
  124. ToolTipService.SetPlacement(BtnStar, Primitives.PlacementMode.Center)
  125. ToolTipService.SetVerticalOffset(BtnStar, 30)
  126. ToolTipService.SetHorizontalOffset(BtnStar, 2)
  127. BtnStar.LogoScale = 1.1
  128. BtnStar.Logo = Logo.IconButtonLikeLine
  129. End If
  130. AddHandler BtnStar.Click, Sub()
  131. WriteIni(Version.Path & "PCL\Setup.ini", "IsStar", Not Version.IsStar)
  132. McVersionListForceRefresh = True
  133. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  134. End Sub
  135. Dim BtnDel As New MyIconButton With {.LogoScale = 1.1, .Logo = Logo.IconButtonDelete}
  136. BtnDel.ToolTip = "删除"
  137. ToolTipService.SetPlacement(BtnDel, Primitives.PlacementMode.Center)
  138. ToolTipService.SetVerticalOffset(BtnDel, 30)
  139. ToolTipService.SetHorizontalOffset(BtnDel, 2)
  140. AddHandler BtnDel.Click, Sub() DeleteVersion(sender, Version)
  141. If Version.State <> McVersionState.Error Then
  142. Dim BtnCont As New MyIconButton With {.LogoScale = 1.1, .Logo = Logo.IconButtonSetup}
  143. BtnCont.ToolTip = "设置"
  144. ToolTipService.SetPlacement(BtnCont, Primitives.PlacementMode.Center)
  145. ToolTipService.SetVerticalOffset(BtnCont, 30)
  146. ToolTipService.SetHorizontalOffset(BtnCont, 2)
  147. AddHandler BtnCont.Click,
  148. Sub()
  149. PageVersionLeft.Version = Version
  150. FrmMain.PageChange(FormMain.PageType.VersionSetup, 0)
  151. End Sub
  152. AddHandler sender.MouseRightButtonUp,
  153. Sub()
  154. PageVersionLeft.Version = Version
  155. FrmMain.PageChange(FormMain.PageType.VersionSetup, 0)
  156. End Sub
  157. sender.Buttons = {BtnStar, BtnDel, BtnCont}
  158. Else
  159. Dim BtnCont As New MyIconButton With {.LogoScale = 1.15, .Logo = Logo.IconButtonOpen}
  160. BtnCont.ToolTip = "打开文件夹"
  161. ToolTipService.SetPlacement(BtnCont, Primitives.PlacementMode.Center)
  162. ToolTipService.SetVerticalOffset(BtnCont, 30)
  163. ToolTipService.SetHorizontalOffset(BtnCont, 2)
  164. AddHandler BtnCont.Click, Sub() PageVersionOverall.OpenVersionFolder(Version)
  165. AddHandler sender.MouseRightButtonUp, Sub() PageVersionOverall.OpenVersionFolder(Version)
  166. sender.Buttons = {BtnStar, BtnDel, BtnCont}
  167. End If
  168. End Sub
  169. #End Region
  170. #Region "页面事件"
  171. '点击选项
  172. Public Shared Sub Item_Click(sender As MyListItem, e As EventArgs)
  173. Dim Version As McVersion = sender.Tag
  174. If New McVersion(Version.Path).Check Then
  175. '正常版本
  176. McVersionCurrent = Version
  177. Setup.Set("LaunchVersionSelect", McVersionCurrent.Name)
  178. FrmMain.PageBack()
  179. Else
  180. '错误版本
  181. PageVersionOverall.OpenVersionFolder(Version)
  182. End If
  183. End Sub
  184. Private Sub BtnDownload_Click(sender As Object, e As EventArgs) Handles BtnEmptyDownload.Click
  185. FrmMain.PageChange(FormMain.PageType.Download, FormMain.PageSubType.DownloadInstall)
  186. End Sub
  187. '修改此代码时,同时修改 PageVersionOverall 中的代码
  188. Public Shared Sub DeleteVersion(Item As MyListItem, Version As McVersion)
  189. Try
  190. Dim IsShiftPressed As Boolean = My.Computer.Keyboard.ShiftKeyDown
  191. Dim IsHintIndie As Boolean = Version.State <> McVersionState.Error AndAlso Version.PathIndie <> PathMcFolder
  192. Select Case MyMsgBox($"你确定要{If(IsShiftPressed, "永久", "")}删除版本 {Version.Name} 吗?" &
  193. If(IsHintIndie, vbCrLf & "由于该版本开启了版本隔离,删除版本时该版本对应的存档、资源包、Mod 等文件也将被一并删除!", ""),
  194. "版本删除确认", , "取消",, True)
  195. Case 1
  196. IniClearCache(Version.PathIndie & "options.txt")
  197. IniClearCache(Version.Path & "PCL\Setup.ini")
  198. If IsShiftPressed Then
  199. DeleteDirectory(Version.Path)
  200. Hint("版本 " & Version.Name & " 已永久删除!", HintType.Green)
  201. Else
  202. FileIO.FileSystem.DeleteDirectory(Version.Path, FileIO.UIOption.AllDialogs, FileIO.RecycleOption.SendToRecycleBin)
  203. Hint("版本 " & Version.Name & " 已删除!", HintType.Green)
  204. End If
  205. Case 2
  206. Return
  207. End Select
  208. '从 UI 中移除
  209. If Version.DisplayType = McVersionCardType.Hidden OrElse Not Version.IsStar Then
  210. '仅出现在当前卡片
  211. Dim Parent As StackPanel = Item.Parent
  212. If Parent.Children.Count > 2 Then '当前的项目与一个占位符
  213. '删除后还有剩
  214. Dim Card As MyCard = Parent.Parent
  215. Card.Title = Card.Title.Replace(Parent.Children.Count - 1, Parent.Children.Count - 2) '有一个占位符
  216. Parent.Children.Remove(Item)
  217. If McVersionCurrent IsNot Nothing AndAlso Version.Path = McVersionCurrent.Path Then
  218. '删除当前版本就更改选择
  219. McVersionCurrent = CType(Parent.Children(0), MyListItem).Tag
  220. End If
  221. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.UpdateOnly, MaxDepth:=1, ExtraPath:="versions\")
  222. Else
  223. '删除后没剩了
  224. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  225. End If
  226. Else
  227. '同时出现在当前卡片与收藏夹
  228. LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  229. End If
  230. Catch ex As OperationCanceledException
  231. Log(ex, "删除版本 " & Version.Name & " 被主动取消")
  232. Catch ex As Exception
  233. Log(ex, "删除版本 " & Version.Name & " 失败", LogLevel.Msgbox)
  234. End Try
  235. End Sub
  236. Public Sub BtnEmptyDownload_Loaded() Handles BtnEmptyDownload.Loaded
  237. Dim NewVisibility = If((Setup.Get("UiHiddenPageDownload") AndAlso Not PageSetupUI.HiddenForceShow) OrElse ShowHidden, Visibility.Collapsed, Visibility.Visible)
  238. If BtnEmptyDownload.Visibility <> NewVisibility Then
  239. BtnEmptyDownload.Visibility = NewVisibility
  240. PanLoad.TriggerForceResize()
  241. End If
  242. End Sub
  243. #End Region
  244. End Class