PageVersionExport.xaml.vb 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. Public Class PageVersionExport
  2. Private CurrentVer As String = ""
  3. Private Sub PageVersionExport_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
  4. Reload()
  5. End Sub
  6. Public ItemVersion As MyListItem
  7. Public Sub Reload()
  8. AniControlEnabled += 1
  9. If CurrentVer <> PageVersionLeft.Version.Path Then
  10. '说明切换到另一个版本了,所有的绝对路径都要重置,否则爆炸
  11. CurrentPath = ""
  12. Selected = New List(Of String)
  13. CurrentVer = PageVersionLeft.Version.Path
  14. End If
  15. TbExportName.HintText = PageVersionLeft.Version.Name
  16. TbExportDesc.HintText = PageVersionLeft.Version.Info
  17. PanDisplayItem.Children.Clear()
  18. ItemVersion = PageSelectRight.McVersionListItem(PageVersionLeft.Version.Load())
  19. ItemVersion.IsHitTestVisible = False
  20. If Not String.IsNullOrEmpty(CustomLogo) Then ItemVersion.Logo = CustomLogo
  21. PanDisplayItem.Children.Add(ItemVersion)
  22. ItemVersion.Title = If(String.IsNullOrWhiteSpace(TbExportName.Text), PageVersionLeft.Version.Name, TbExportName.Text)
  23. ItemVersion.Info = If(String.IsNullOrWhiteSpace(TbExportDesc.Text), PageVersionLeft.Version.Info, TbExportDesc.Text)
  24. #If BETA Then
  25. CheckIncludePCL.IsEnabled = True
  26. #Else
  27. CheckIncludePCL.IsEnabled = False
  28. TbHint.Text = "你可以在此勾选需要包含进整合包的文件或文件夹,其他文件或文件夹在高级选项添加。" & vbCrLf & "你当前的 PCL 不是正式版,有二次分发的限制,因此整合包不能包含 PCL 程序。"
  29. #End If
  30. CheckIncludeSetup.IsEnabled = CheckIncludePCL.IsEnabled
  31. ReloadFileList(CurrentPath)
  32. AniControlEnabled -= 1
  33. End Sub
  34. #Region "文件列表"
  35. ''' <summary>
  36. ''' 当前所在的文件夹。注意是绝对路径!以 \ 结尾。
  37. ''' </summary>
  38. Private CurrentPath As String = ""
  39. Private Sub ReloadFileList(Optional NewPath As String = "")
  40. If String.IsNullOrWhiteSpace(NewPath) Then NewPath = PageVersionLeft.Version.Path
  41. Dim tb As TextBlock = PanFileList.Children(0)
  42. PanFileList.Children.Clear()
  43. PanFileList.Children.Add(tb)
  44. If NewPath <> PageVersionLeft.Version.Path Then
  45. Dim listItem As New MyListItem With {.Title = "返回上一级目录", .Tag = "..", .Height = 35, .Type = MyListItem.CheckType.Clickable}
  46. AddHandler listItem.Click, AddressOf ListItem_Click
  47. PanFileList.Children.Add(listItem)
  48. End If
  49. Dim fileCount As Integer = 0
  50. For Each d In Directory.EnumerateDirectories(NewPath)
  51. If Directory.EnumerateFileSystemEntries(d).Count = 0 Then Continue For
  52. d = GetFolderNameFromPath(d)
  53. If IsVerRedundant(NewPath & d) OrElse IsMustExport(d) Then Continue For
  54. Dim title As String = ""
  55. Dim listItem As New MyListItem
  56. If Titles.TryGetValue(d, title) Then 'title 作为引用类型传入
  57. listItem.Title = title
  58. listItem.Info = d
  59. Else
  60. listItem.Title = d
  61. End If
  62. '图标按钮
  63. Dim btnSwap As New MyIconButton
  64. btnSwap.Logo = Logo.IconButtonRight
  65. btnSwap.LogoScale = 1.0
  66. btnSwap.Tag = d
  67. AddHandler btnSwap.Click, AddressOf BtnSwap_Click
  68. listItem.Buttons = {btnSwap}
  69. listItem.Type = MyListItem.CheckType.CheckBox
  70. listItem.Height = 35
  71. listItem.Logo = Logo.IconButtonOpen
  72. listItem.Tag = d & "\"
  73. If IsSelected(NewPath & d & "\") Then listItem.Checked = True
  74. AddHandler listItem.Click, AddressOf ListItem_Click
  75. PanFileList.Children.Add(listItem)
  76. fileCount += 1
  77. Next
  78. For Each f In Directory.EnumerateFiles(NewPath)
  79. f = GetFileNameFromPath(f)
  80. If IsVerRedundant(NewPath & f) OrElse IsMustExport(f) Then Continue For
  81. Dim title As String = ""
  82. Dim listItem As New MyListItem
  83. If Titles.TryGetValue(f, title) Then 'title 作为引用类型传入
  84. listItem.Title = title
  85. listItem.Info = f
  86. Else
  87. listItem.Title = f
  88. End If
  89. listItem.Type = MyListItem.CheckType.CheckBox
  90. listItem.Height = 35
  91. listItem.Tag = f
  92. If IsSelected(NewPath & f) Then listItem.Checked = True
  93. AddHandler listItem.Click, AddressOf ListItem_Click
  94. PanFileList.Children.Add(listItem)
  95. fileCount += 1
  96. Next
  97. CurrentPath = NewPath
  98. CardMore.Title = If(NewPath = PageVersionLeft.Version.Path, "高级选项", $"高级选项 ({NewPath.Replace(PageVersionLeft.Version.Path, "").TrimEnd("\")})")
  99. End Sub
  100. Private Titles As New Dictionary(Of String, String) From {
  101. {"saves", "存档"},
  102. {"resourcepacks", "资源包"},
  103. {"config", "Mod 配置"},
  104. {"shaderpacks", "光影包"},
  105. {"options.txt", "游戏配置"},
  106. {"servers.dat", "服务器列表"}
  107. }
  108. Private Sub BtnSwap_Click(sender As MyIconButton, e As Object)
  109. Dim actualPath As String = CurrentPath & sender.Tag & "\"
  110. 'Dim relative As String = actualPath.Replace(PageVersionLeft.Version.Path, "")
  111. If Not Directory.Exists(actualPath) Then
  112. Hint($"找不到目录:{actualPath}", HintType.Critical)
  113. Exit Sub
  114. End If
  115. ReloadFileList(actualPath)
  116. End Sub
  117. ''' <summary>
  118. ''' 选中的文件列表,绝对路径。
  119. ''' </summary>
  120. Private Selected As New List(Of String)
  121. Private Sub SelectedChange(IsAdd As Boolean, TargetPath As String)
  122. If File.Exists(TargetPath) Then
  123. If IsAdd Then Selected.Add(TargetPath) Else Selected.Remove(TargetPath)
  124. Exit Sub
  125. End If
  126. If Directory.Exists(TargetPath) Then
  127. For Each d In Directory.EnumerateDirectories(TargetPath)
  128. SelectedChange(IsAdd, d)
  129. Next
  130. For Each f In Directory.EnumerateFiles(TargetPath)
  131. If IsAdd Then Selected.Add(f) Else Selected.Remove(f)
  132. Next
  133. End If
  134. End Sub
  135. Private Function IsSelected(TargetPath As String, Optional AllowEmpty As Boolean = False) As Boolean
  136. If File.Exists(TargetPath) Then
  137. Return Selected.Contains(TargetPath)
  138. End If
  139. If Directory.Exists(TargetPath) Then
  140. Dim di As New DirectoryInfo(TargetPath)
  141. If (Not AllowEmpty) AndAlso di.GetDirectories.Length + di.GetFiles.Length = 0 Then Return False
  142. Return Directory.EnumerateDirectories(TargetPath).All(Function(s) IsSelected(s, True)) AndAlso
  143. Directory.EnumerateFiles(TargetPath).All(Function(s) Selected.Contains(s))
  144. End If
  145. Return False
  146. End Function
  147. Private Sub ListItem_Click(sender As MyListItem, e As Object)
  148. If sender.Tag = ".." Then '回到上一级目录
  149. ReloadFileList(GetPathFromFullPath(CurrentPath))
  150. Exit Sub
  151. End If
  152. SelectedChange(Not sender.Checked, '非常难绷的逻辑,很难描述清楚,自己打断点看 Checked 属性值吧……
  153. CurrentPath & sender.Tag)
  154. End Sub
  155. 'Private ReadOnly Property Saves As List(Of String)
  156. ' Get
  157. ' If Directory.Exists(PageVersionLeft.Version.Path & "saves\") Then
  158. ' Return Directory.EnumerateDirectories(PageVersionLeft.Version.Path & "saves\").ToList
  159. ' End If
  160. ' Return New List(Of String)
  161. ' End Get
  162. 'End Property
  163. '复选框与高级选项同步
  164. Private Sub PanCommonFiles_MouseLeftButtonUp(sender As Object, e As MouseButtonEventArgs) Handles PanCommonFiles.MouseLeftButtonUp
  165. For Each c In PanCommonFiles.Children
  166. If TypeOf c IsNot MyCheckBox Then Continue For
  167. If String.IsNullOrEmpty(c.Tag) Then Continue For
  168. For Each l In PanFileList.Children
  169. If TypeOf l Is MyListItem Then
  170. If l.Tag.Replace("\", "") = c.Tag Then
  171. l.Checked = c.Checked
  172. SelectedChange(c.Checked, PageVersionLeft.Version.Path & c.Tag)
  173. End If
  174. End If
  175. Next
  176. Next
  177. End Sub
  178. '高级选项与复选框同步
  179. Private Sub PanFileList_MouseLeftButtonUp(sender As Object, e As MouseButtonEventArgs) Handles PanFileList.MouseLeftButtonUp
  180. For Each c In PanCommonFiles.Children
  181. If TypeOf c Is MyCheckBox Then
  182. c.Checked = IsSelected(PageVersionLeft.Version.Path & c.Tag)
  183. End If
  184. Next
  185. End Sub
  186. #End Region
  187. #Region "整合包信息 & 预览栏"
  188. Private Sub TbExportName_TextChanged(sender As MyTextBox, e As TextChangedEventArgs) Handles TbExportName.TextChanged
  189. ItemVersion.Title = If(String.IsNullOrWhiteSpace(sender.Text), PageVersionLeft.Version.Name, sender.Text)
  190. End Sub
  191. Private Sub TbExportDesc_TextChanged(sender As MyTextBox, e As TextChangedEventArgs) Handles TbExportDesc.TextChanged
  192. ItemVersion.Info = If(String.IsNullOrWhiteSpace(sender.Text), PageVersionLeft.Version.Info, sender.Text)
  193. End Sub
  194. Private CustomLogoVal As String
  195. ''' <summary>
  196. ''' 自定义 Logo 的路径。
  197. ''' </summary>
  198. Public Property CustomLogo() As String
  199. Get
  200. Return CustomLogoVal
  201. End Get
  202. Set(value As String)
  203. If AniControlEnabled <> 0 Then Exit Property
  204. CustomLogoVal = value
  205. ItemVersion.Logo = value
  206. Reload()
  207. End Set
  208. End Property
  209. Private Sub ComboDisplayLogo_SelectionChanged(sender As MyComboBox, e As SelectionChangedEventArgs) Handles ComboDisplayLogo.SelectionChanged
  210. If Not AniControlEnabled = 0 Then Exit Sub
  211. '选择 自定义 时修改图片
  212. If ComboDisplayLogo.SelectedItem Is ItemDisplayLogoCustom Then
  213. Dim FileName As String = SelectFile("常用图片文件(*.png;*.jpg;*.gif)|*.png;*.jpg;*.gif", "选择图片")
  214. If String.IsNullOrWhiteSpace(FileName) Then Exit Sub
  215. CustomLogo = FileName
  216. Else
  217. CustomLogo = sender.SelectedItem.Tag
  218. End If
  219. End Sub
  220. #End Region
  221. #Region "基本信息"
  222. Private Sub CheckIncludePCL_Change(sender As Object, user As Boolean) Handles CheckIncludePCL.Change
  223. CheckIncludeSetup.IsEnabled = CheckIncludePCL.IsEnabled
  224. End Sub
  225. #End Region
  226. #Region "导出"
  227. 'Private Sub ComboExportType_Change(sender As ComboBox, e As SelectionChangedEventArgs) Handles ComboExportType.SelectionChanged
  228. ' If AniControlEnabled <> 0 Then Exit Sub
  229. ' Type = sender.SelectedIndex
  230. ' Select Case Type
  231. ' Case ModpackType.Modrinth
  232. ' If IncludePCL() Then 'TODO:修改这里的条件
  233. ' If GridCompressed IsNot Nothing Then GridCompressed.Visibility = Visibility.Visible
  234. ' If GridModrinth IsNot Nothing Then GridModrinth.Visibility = Visibility.Collapsed
  235. ' Else
  236. ' If GridCompressed IsNot Nothing Then GridCompressed.Visibility = Visibility.Collapsed
  237. ' If GridModrinth IsNot Nothing Then GridModrinth.Visibility = Visibility.Visible
  238. ' End If
  239. ' End Select
  240. ' CardExport.TriggerForceResize()
  241. 'End Sub
  242. Private Sub BtnExportExport_Click() Handles BtnExportExport.Click
  243. Dim savePath As String = SelectAs(
  244. "选择导出位置", $"整合包 - {If(String.IsNullOrWhiteSpace(TbExportName.Text), PageVersionLeft.Version.Name, TbExportName.Text)}" & If(CheckIncludePCL.Checked, ".zip", ".mrpack"),
  245. If(CheckIncludePCL.Checked, "整合包文件(*.zip)|*.zip", "Modrinth 整合包(*.mrpack)|*.mrpack"))
  246. If String.IsNullOrEmpty(savePath) Then Exit Sub
  247. '获取需要包含的文件夹
  248. Dim contains As New List(Of String)
  249. For Each c In PanCommonFiles.Children
  250. If TypeOf c IsNot MyCheckBox Then Continue For
  251. If String.IsNullOrEmpty(c.Tag) Then Continue For
  252. contains.Add(c.Tag)
  253. Next
  254. ModpackExport(New ExportOptions(PageVersionLeft.Version, savePath, CheckIncludePCL.Checked, Selected.ToArray,
  255. PCLSetupGlobal:=CheckIncludeSetup.Checked, Name:=TbExportName.Text, VerID:=TbExportVersion.Text))
  256. End Sub
  257. #End Region
  258. End Class