PageSelectRight.xaml.vb 14 KB

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