PageVersionExport.xaml.vb 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  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. Select Case IsSelected(NewPath & d & "\")
  74. Case 1
  75. listItem.Half = True
  76. Case 2
  77. listItem.Checked = True
  78. End Select
  79. AddHandler listItem.Click, AddressOf ListItem_Click
  80. PanFileList.Children.Add(listItem)
  81. fileCount += 1
  82. Next
  83. For Each f In Directory.EnumerateFiles(NewPath)
  84. f = GetFileNameFromPath(f)
  85. If IsVerRedundant(NewPath & f) OrElse IsMustExport(f) Then Continue For
  86. Dim title As String = ""
  87. Dim listItem As New MyListItem
  88. If Titles.TryGetValue(f, title) Then 'title 作为引用类型传入
  89. listItem.Title = title
  90. listItem.Info = f
  91. Else
  92. listItem.Title = f
  93. End If
  94. listItem.Type = MyListItem.CheckType.CheckBox
  95. listItem.Height = 35
  96. listItem.Tag = f
  97. listItem.Checked = (IsSelected(NewPath & f) = 2)
  98. AddHandler listItem.Click, AddressOf ListItem_Click
  99. PanFileList.Children.Add(listItem)
  100. fileCount += 1
  101. Next
  102. CurrentPath = NewPath
  103. CardMore.Title = If(NewPath = PageVersionLeft.Version.Path, "高级选项", $"高级选项 ({NewPath.Replace(PageVersionLeft.Version.Path, "").TrimEnd("\")})")
  104. End Sub
  105. Private Titles As New Dictionary(Of String, String) From {
  106. {"saves", "存档"},
  107. {"resourcepacks", "资源包"},
  108. {"config", "Mod 配置"},
  109. {"shaderpacks", "光影包"},
  110. {"options.txt", "游戏配置"},
  111. {"servers.dat", "服务器列表"}
  112. }
  113. Private Sub BtnSwap_Click(sender As MyIconButton, e As Object)
  114. Dim actualPath As String = CurrentPath & sender.Tag & "\"
  115. 'Dim relative As String = actualPath.Replace(PageVersionLeft.Version.Path, "")
  116. If Not Directory.Exists(actualPath) Then
  117. Hint($"找不到目录:{actualPath}", HintType.Critical)
  118. Exit Sub
  119. End If
  120. ReloadFileList(actualPath)
  121. End Sub
  122. ''' <summary>
  123. ''' 选中的文件列表,绝对路径。
  124. ''' </summary>
  125. Private Selected As New List(Of String)
  126. Private Sub SelectedChange(IsAdd As Boolean, TargetPath As String)
  127. If File.Exists(TargetPath) Then
  128. If IsAdd Then Selected.Add(TargetPath) Else Selected.Remove(TargetPath)
  129. Exit Sub
  130. End If
  131. If Directory.Exists(TargetPath) Then
  132. For Each d In Directory.EnumerateDirectories(TargetPath)
  133. SelectedChange(IsAdd, d)
  134. Next
  135. For Each f In Directory.EnumerateFiles(TargetPath)
  136. If IsAdd Then Selected.Add(f) Else Selected.Remove(f)
  137. Next
  138. End If
  139. Selected = Selected.Distinct().ToList()
  140. End Sub
  141. ''' <summary>
  142. ''' 获取 TargetPath 是否选中。
  143. ''' </summary>
  144. ''' <returns>全部未选中为 0,部分选中为 1,全部选中为 2。</returns>
  145. Private Function IsSelected(TargetPath As String, Optional AllowEmpty As Boolean = False) As Integer
  146. If File.Exists(TargetPath) Then
  147. Return If(Selected.Contains(TargetPath), 2, 0)
  148. End If
  149. If Directory.Exists(TargetPath) Then
  150. Dim di As New DirectoryInfo(TargetPath)
  151. If (Not AllowEmpty) AndAlso di.GetDirectories.Length + di.GetFiles.Length = 0 Then Return 0
  152. '如果有一个文件不在列表,则 hasFalse = True
  153. Dim hasFalse As Boolean = False
  154. '如果有一个文件在列表,则 hasTrue = True
  155. Dim hasTrue As Boolean = False
  156. For Each d In Directory.EnumerateDirectories(TargetPath)
  157. Select Case IsSelected(d, True)
  158. Case 0
  159. hasFalse = True
  160. Case 1
  161. Return 1
  162. Case 2
  163. hasTrue = True
  164. End Select
  165. If hasTrue AndAlso hasFalse Then Return 1 '如果有文件在、有文件不在列表中,可以断定部分选中
  166. Next
  167. For Each f In Directory.EnumerateFiles(TargetPath)
  168. If Selected.Contains(f) Then hasTrue = True Else hasFalse = True
  169. If hasTrue AndAlso hasFalse Then Return 1 '如果有文件在、有文件不在列表中,可以断定部分选中
  170. Next
  171. If hasFalse AndAlso Not hasTrue Then Return 0
  172. If hasTrue AndAlso Not hasFalse Then Return 2
  173. End If
  174. Return 0
  175. End Function
  176. Private Sub ListItem_Click(sender As MyListItem, e As Object)
  177. If sender.Tag = ".." Then '回到上一级目录
  178. ReloadFileList(GetPathFromFullPath(CurrentPath))
  179. Exit Sub
  180. End If
  181. SelectedChange(Not sender.Checked, '非常难绷的逻辑,很难描述清楚,自己打断点看 Checked 属性值吧……
  182. CurrentPath & sender.Tag)
  183. End Sub
  184. 'Private ReadOnly Property Saves As List(Of String)
  185. ' Get
  186. ' If Directory.Exists(PageVersionLeft.Version.Path & "saves\") Then
  187. ' Return Directory.EnumerateDirectories(PageVersionLeft.Version.Path & "saves\").ToList
  188. ' End If
  189. ' Return New List(Of String)
  190. ' End Get
  191. 'End Property
  192. '复选框与高级选项同步
  193. Private Sub PanCommonFiles_MouseLeftButtonUp(sender As Object, e As MouseButtonEventArgs) Handles PanCommonFiles.MouseLeftButtonUp
  194. For Each c In PanCommonFiles.Children
  195. If TypeOf c IsNot MyCheckBox Then Continue For
  196. If String.IsNullOrEmpty(c.Tag) Then Continue For
  197. For Each l In PanFileList.Children
  198. If TypeOf l Is MyListItem Then
  199. If l.Tag.Replace("\", "") = c.Tag Then
  200. l.Checked = c.Checked
  201. SelectedChange(c.Checked, PageVersionLeft.Version.Path & c.Tag)
  202. End If
  203. End If
  204. Next
  205. Next
  206. End Sub
  207. '高级选项与复选框同步
  208. Private Sub PanFileList_MouseLeftButtonUp(sender As Object, e As MouseButtonEventArgs) Handles PanFileList.MouseLeftButtonUp
  209. For Each c In PanCommonFiles.Children
  210. If TypeOf c Is MyCheckBox Then
  211. c.Checked = (IsSelected(PageVersionLeft.Version.Path & c.Tag) = 2)
  212. End If
  213. Next
  214. End Sub
  215. #End Region
  216. #Region "整合包信息 & 预览栏"
  217. Private Sub TbExportName_TextChanged(sender As MyTextBox, e As TextChangedEventArgs) Handles TbExportName.TextChanged
  218. ItemVersion.Title = If(String.IsNullOrWhiteSpace(sender.Text), PageVersionLeft.Version.Name, sender.Text)
  219. End Sub
  220. Private Sub TbExportDesc_TextChanged(sender As MyTextBox, e As TextChangedEventArgs) Handles TbExportDesc.TextChanged
  221. ItemVersion.Info = If(String.IsNullOrWhiteSpace(sender.Text), PageVersionLeft.Version.Info, sender.Text)
  222. End Sub
  223. Private CustomLogoVal As String
  224. ''' <summary>
  225. ''' 自定义 Logo 的路径。
  226. ''' </summary>
  227. Public Property CustomLogo() As String
  228. Get
  229. Return CustomLogoVal
  230. End Get
  231. Set(value As String)
  232. If AniControlEnabled <> 0 Then Exit Property
  233. CustomLogoVal = value
  234. ItemVersion.Logo = value
  235. Reload()
  236. End Set
  237. End Property
  238. Private Sub ComboDisplayLogo_SelectionChanged(sender As MyComboBox, e As SelectionChangedEventArgs) Handles ComboDisplayLogo.SelectionChanged
  239. If Not AniControlEnabled = 0 Then Exit Sub
  240. '选择 自定义 时修改图片
  241. If ComboDisplayLogo.SelectedItem Is ItemDisplayLogoCustom Then
  242. Dim FileName As String = SelectFile("常用图片文件(*.png;*.jpg;*.gif)|*.png;*.jpg;*.gif", "选择图片")
  243. If String.IsNullOrWhiteSpace(FileName) Then Exit Sub
  244. CustomLogo = FileName
  245. Else
  246. CustomLogo = sender.SelectedItem.Tag
  247. End If
  248. End Sub
  249. #End Region
  250. #Region "基本信息"
  251. Private Sub CheckIncludePCL_Change(sender As Object, user As Boolean) Handles CheckIncludePCL.Change
  252. CheckIncludeSetup.IsEnabled = CheckIncludePCL.IsEnabled
  253. End Sub
  254. #End Region
  255. #Region "导出"
  256. 'Private Sub ComboExportType_Change(sender As ComboBox, e As SelectionChangedEventArgs) Handles ComboExportType.SelectionChanged
  257. ' If AniControlEnabled <> 0 Then Exit Sub
  258. ' Type = sender.SelectedIndex
  259. ' Select Case Type
  260. ' Case ModpackType.Modrinth
  261. ' If IncludePCL() Then 'TODO:修改这里的条件
  262. ' If GridCompressed IsNot Nothing Then GridCompressed.Visibility = Visibility.Visible
  263. ' If GridModrinth IsNot Nothing Then GridModrinth.Visibility = Visibility.Collapsed
  264. ' Else
  265. ' If GridCompressed IsNot Nothing Then GridCompressed.Visibility = Visibility.Collapsed
  266. ' If GridModrinth IsNot Nothing Then GridModrinth.Visibility = Visibility.Visible
  267. ' End If
  268. ' End Select
  269. ' CardExport.TriggerForceResize()
  270. 'End Sub
  271. Private Sub BtnExportExport_Click() Handles BtnExportExport.Click
  272. Dim savePath As String = SelectAs(
  273. "选择导出位置", $"整合包 - {If(String.IsNullOrWhiteSpace(TbExportName.Text), PageVersionLeft.Version.Name, TbExportName.Text)}" & If(CheckIncludePCL.Checked, ".zip", ".mrpack"),
  274. If(CheckIncludePCL.Checked, "整合包文件(*.zip)|*.zip", "Modrinth 整合包(*.mrpack)|*.mrpack"))
  275. If String.IsNullOrEmpty(savePath) Then Exit Sub
  276. '获取需要包含的文件
  277. Dim contains As List(Of String) = Selected
  278. For Each c In PanCommonFiles.Children
  279. If TypeOf c IsNot MyCheckBox Then Continue For
  280. If String.IsNullOrEmpty(c.Tag) Then Continue For
  281. contains.Add(PageVersionLeft.Version.Path & c.Tag)
  282. Next
  283. ModpackExport(New ExportOptions(PageVersionLeft.Version, savePath, CheckIncludePCL.Checked, contains.Distinct.ToArray,
  284. PCLSetupGlobal:=CheckIncludeSetup.Checked, Name:=TbExportName.Text, VerID:=TbExportVersion.Text))
  285. End Sub
  286. #End Region
  287. End Class