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.Info = (NewPath & f).Replace(GetPathFromFullPath(PageVersionLeft.Version.Path), "")
  90. listItem.Type = MyListItem.CheckType.CheckBox
  91. listItem.Height = 35
  92. listItem.Tag = f
  93. If IsSelected(NewPath & f) Then listItem.Checked = True
  94. AddHandler listItem.Click, AddressOf ListItem_Click
  95. PanFileList.Children.Add(listItem)
  96. fileCount += 1
  97. Next
  98. CurrentPath = NewPath
  99. CardMore.Title = If(NewPath = PageVersionLeft.Version.Path, "高级选项", $"高级选项 ({NewPath.Replace(PageVersionLeft.Version.Path, "").TrimEnd("\")})")
  100. End Sub
  101. Private Titles As New Dictionary(Of String, String) From {
  102. {"saves", "存档"},
  103. {"resourcepacks", "资源包"},
  104. {"config", "Mod 配置"},
  105. {"shaderpacks", "光影包"},
  106. {"options.txt", "游戏配置"},
  107. {"servers.dat", "服务器列表"}
  108. }
  109. Private Sub BtnSwap_Click(sender As MyIconButton, e As Object)
  110. Dim actualPath As String = CurrentPath & sender.Tag & "\"
  111. 'Dim relative As String = actualPath.Replace(PageVersionLeft.Version.Path, "")
  112. If Not Directory.Exists(actualPath) Then
  113. Hint($"找不到目录:{actualPath}", HintType.Critical)
  114. Exit Sub
  115. End If
  116. ReloadFileList(actualPath)
  117. End Sub
  118. ''' <summary>
  119. ''' 选中的文件列表,绝对路径。
  120. ''' </summary>
  121. Private Selected As New List(Of String)
  122. Private Sub SelectedChange(IsAdd As Boolean, TargetPath As String)
  123. If File.Exists(TargetPath) Then
  124. If IsAdd Then Selected.Add(TargetPath) Else Selected.Remove(TargetPath)
  125. Exit Sub
  126. End If
  127. If Directory.Exists(TargetPath) Then
  128. For Each d In Directory.EnumerateDirectories(TargetPath)
  129. SelectedChange(IsAdd, d)
  130. Next
  131. For Each f In Directory.EnumerateFiles(TargetPath)
  132. If IsAdd Then Selected.Add(f) Else Selected.Remove(f)
  133. Next
  134. End If
  135. End Sub
  136. Private Function IsSelected(TargetPath As String) As Boolean
  137. If File.Exists(TargetPath) Then
  138. Return Selected.Contains(TargetPath)
  139. End If
  140. If Directory.Exists(TargetPath) Then
  141. Return Directory.EnumerateDirectories(TargetPath).All(Function(s) IsSelected(s)) AndAlso
  142. Directory.EnumerateFiles(TargetPath).All(Function(s) Selected.Contains(s))
  143. End If
  144. Return False
  145. End Function
  146. Private Sub ListItem_Click(sender As MyListItem, e As Object)
  147. If sender.Tag = ".." Then '回到上一级目录
  148. ReloadFileList(GetPathFromFullPath(CurrentPath))
  149. Exit Sub
  150. End If
  151. SelectedChange(Not sender.Checked, '非常难绷的逻辑,很难描述清楚,自己打断点看 Checked 属性值吧……
  152. CurrentPath & sender.Tag)
  153. End Sub
  154. 'Private ReadOnly Property Saves As List(Of String)
  155. ' Get
  156. ' If Directory.Exists(PageVersionLeft.Version.Path & "saves\") Then
  157. ' Return Directory.EnumerateDirectories(PageVersionLeft.Version.Path & "saves\").ToList
  158. ' End If
  159. ' Return New List(Of String)
  160. ' End Get
  161. 'End Property
  162. '复选框与高级选项同步
  163. Private Sub PanCommonFiles_MouseLeftButtonUp(sender As Object, e As MouseButtonEventArgs) Handles PanCommonFiles.MouseLeftButtonUp
  164. For Each c In PanCommonFiles.Children
  165. If TypeOf c IsNot MyCheckBox Then Continue For
  166. If String.IsNullOrEmpty(c.Tag) Then Continue For
  167. For Each l In PanFileList.Children
  168. If TypeOf l Is MyListItem Then
  169. If l.Tag.Replace("\", "") = c.Tag Then l.Checked = c.Checked
  170. End If
  171. Next
  172. Next
  173. End Sub
  174. '高级选项与复选框同步
  175. Private Sub PanFileList_MouseLeftButtonUp(sender As Object, e As MouseButtonEventArgs) Handles PanFileList.MouseLeftButtonUp
  176. For Each l In PanFileList.Children
  177. If TypeOf l IsNot MyListItem Then Continue For
  178. If String.IsNullOrEmpty(l.Tag) Then Continue For
  179. For Each c In PanCommonFiles.Children
  180. If TypeOf c Is MyCheckBox Then
  181. If c.Tag = l.Tag.Replace("\", "") Then c.Checked = l.Checked
  182. End If
  183. Next
  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