PageSelectRight.xaml.vb 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  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(Of Boolean)("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. Logger.Error(ex, "将版本列表转换显示时失败")
  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. BtnStar.LogoScale = 1.1
  117. BtnStar.Logo = Logo.IconButtonLikeFill
  118. Else
  119. BtnStar.ToolTip = "收藏"
  120. BtnStar.LogoScale = 1.1
  121. BtnStar.Logo = Logo.IconButtonLikeLine
  122. End If
  123. AddHandler BtnStar.Click, Sub()
  124. WriteIni(Instance.PathVersion & "PCL\Setup.ini", "IsStar", Not Instance.IsStar)
  125. McInstanceListForceRefresh = True
  126. LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  127. End Sub
  128. Dim BtnDel As New MyIconButton With {.LogoScale = 1.1, .Logo = Logo.IconButtonDelete}
  129. BtnDel.ToolTip = "删除"
  130. AddHandler BtnDel.Click, Sub() DeleteInstance(sender, Instance)
  131. If Instance.State <> McInstanceState.Error Then
  132. Dim BtnCont As New MyIconButton With {.LogoScale = 1.1, .Logo = Logo.IconButtonSetup}
  133. BtnCont.ToolTip = "设置"
  134. AddHandler BtnCont.Click,
  135. Sub()
  136. PageInstanceLeft.Instance = Instance
  137. FrmMain.PageChange(FormMain.PageType.InstanceSetup, 0)
  138. End Sub
  139. AddHandler sender.MouseRightButtonUp,
  140. Sub()
  141. PageInstanceLeft.Instance = Instance
  142. FrmMain.PageChange(FormMain.PageType.InstanceSetup, 0)
  143. End Sub
  144. sender.Buttons = {BtnStar, BtnDel, BtnCont}
  145. Else
  146. Dim BtnCont As New MyIconButton With {.LogoScale = 1.15, .Logo = Logo.IconButtonOpen}
  147. BtnCont.ToolTip = "打开文件夹"
  148. AddHandler BtnCont.Click, Sub() PageInstanceOverall.OpenInstanceFolder(Instance)
  149. AddHandler sender.MouseRightButtonUp, Sub() PageInstanceOverall.OpenInstanceFolder(Instance)
  150. sender.Buttons = {BtnStar, BtnDel, BtnCont}
  151. End If
  152. End Sub
  153. #End Region
  154. #Region "页面事件"
  155. '点击选项
  156. Public Shared Sub Item_Click(sender As MyListItem, e As EventArgs)
  157. Dim Instance As McInstance = sender.Tag
  158. If New McInstance(Instance.PathVersion).Check Then
  159. '正常版本
  160. McInstanceSelected = Instance
  161. FrmMain.PageBack()
  162. Else
  163. '错误版本
  164. PageInstanceOverall.OpenInstanceFolder(Instance)
  165. End If
  166. End Sub
  167. Private Sub BtnDownload_Click(sender As Object, e As EventArgs) Handles BtnEmptyDownload.Click
  168. FrmMain.PageChange(FormMain.PageType.Download, FormMain.PageSubType.DownloadInstall)
  169. End Sub
  170. '修改此代码时,同时修改 PageInstanceOverall 中的代码
  171. Public Shared Sub DeleteInstance(Item As MyListItem, Instance As McInstance)
  172. Try
  173. Dim IsShiftPressed As Boolean = My.Computer.Keyboard.ShiftKeyDown
  174. Dim IsHintIndie As Boolean = Instance.State <> McInstanceState.Error AndAlso Instance.PathIndie <> McFolderSelected
  175. Dim SavesFolder = DirectoryUtils.GetInfo(Instance.PathIndie & "saves\")
  176. 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))
  177. Select Case MyMsgBox($"你确定要{If(IsShiftPressed, "永久", "")}删除版本 {Instance.Name} 吗?" &
  178. If(IsHintIndie, vbCrLf & "该版本对应的存档、资源包、Mod 等文件也将被一并删除!", "") &
  179. If(SaveEntries.Any, vbCrLf & vbCrLf & "这会删除以下存档:" & vbCrLf & "· " & SaveEntries.Join(vbCrLf & "· "), ""),
  180. "版本删除确认", , "取消",, True)
  181. Case 1
  182. Instance.ResetSettingsCache()
  183. DirectoryUtils.Delete(Instance.PathVersion, Not IsShiftPressed)
  184. Hint("版本 " & Instance.Name & " 已删除!", HintType.Green)
  185. Case 2
  186. Return
  187. End Select
  188. '从 UI 中移除
  189. If Instance.DisplayType = McInstanceCardType.Hidden OrElse Not Instance.IsStar Then
  190. '仅出现在当前卡片
  191. Dim Parent As StackPanel = Item.Parent
  192. If Parent.Children.Count > 2 Then '当前的项目与一个占位符
  193. '删除后还有剩
  194. Dim Card As MyCard = Parent.Parent
  195. Card.Title = Card.Title.Replace(Parent.Children.Count - 1, Parent.Children.Count - 2) '有一个占位符
  196. Parent.Children.Remove(Item)
  197. If McInstanceSelected IsNot Nothing AndAlso Instance.PathVersion = McInstanceSelected.PathVersion Then
  198. '删除当前版本就更改选择
  199. McInstanceSelected = MyVirtualizingElement.TryInit(Parent.Children(0)).Tag
  200. End If
  201. LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.UpdateOnly, MaxDepth:=1, ExtraPath:="versions\")
  202. Else
  203. '删除后没剩了
  204. LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  205. End If
  206. Else
  207. '同时出现在当前卡片与收藏夹
  208. LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  209. End If
  210. Catch ex As OperationCanceledException
  211. Logger.Warn(ex, $"删除版本 {Instance.Name} 被主动取消")
  212. Catch ex As Exception
  213. Logger.Error(ex, $"删除版本 {Instance.Name} 失败", LogBehavior.Alert)
  214. End Try
  215. End Sub
  216. Public Sub BtnEmptyDownload_Loaded() Handles BtnEmptyDownload.Loaded
  217. Dim NewVisibility = If((Settings.Get(Of Boolean)("UiHiddenPageDownload") AndAlso Not PageSetupUI.HiddenForceShow) OrElse ShowHidden, Visibility.Collapsed, Visibility.Visible)
  218. If BtnEmptyDownload.Visibility <> NewVisibility Then
  219. BtnEmptyDownload.Visibility = NewVisibility
  220. PanLoad.TriggerForceResize()
  221. End If
  222. End Sub
  223. #End Region
  224. End Class