PageSelectRight.xaml.vb 13 KB

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