PageVersionExport.xaml.vb 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  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 di.GetDirectories.Length + di.GetFiles.Length = 0 Then Return If(AllowEmpty, 2, 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. If Directory.EnumerateFileSystemEntries(d).Count = 0 Then Continue For
  158. Select Case IsSelected(d, True)
  159. Case 0
  160. hasFalse = True
  161. Case 1
  162. Return 1
  163. Case 2
  164. hasTrue = True
  165. End Select
  166. If hasTrue AndAlso hasFalse Then Return 1 '如果有文件在、有文件不在列表中,可以断定部分选中
  167. Next
  168. For Each f In Directory.EnumerateFiles(TargetPath)
  169. If Selected.Contains(f) Then hasTrue = True Else hasFalse = True
  170. If hasTrue AndAlso hasFalse Then Return 1 '如果有文件在、有文件不在列表中,可以断定部分选中
  171. Next
  172. If hasFalse AndAlso Not hasTrue Then Return 0
  173. If hasTrue AndAlso Not hasFalse Then Return 2
  174. End If
  175. Return 0
  176. End Function
  177. Private Sub ListItem_Click(sender As MyListItem, e As Object)
  178. If sender.Tag = ".." Then '回到上一级目录
  179. ReloadFileList(GetPathFromFullPath(CurrentPath))
  180. Exit Sub
  181. End If
  182. SelectedChange(Not sender.Checked, '非常难绷的逻辑,很难描述清楚,自己打断点看 Checked 属性值吧……
  183. CurrentPath & sender.Tag)
  184. End Sub
  185. 'Private ReadOnly Property Saves As List(Of String)
  186. ' Get
  187. ' If Directory.Exists(PageVersionLeft.Version.Path & "saves\") Then
  188. ' Return Directory.EnumerateDirectories(PageVersionLeft.Version.Path & "saves\").ToList
  189. ' End If
  190. ' Return New List(Of String)
  191. ' End Get
  192. 'End Property
  193. '复选框与高级选项同步
  194. Private Sub PanCommonFiles_MouseLeftButtonUp(sender As Object, e As MouseButtonEventArgs) Handles PanCommonFiles.MouseLeftButtonUp
  195. For Each c In PanCommonFiles.Children
  196. If TypeOf c IsNot MyCheckBox Then Continue For
  197. If String.IsNullOrEmpty(c.Tag) Then Continue For
  198. For Each l In PanFileList.Children
  199. If TypeOf l Is MyListItem Then
  200. If l.Tag.Replace("\", "") = c.Tag Then
  201. l.Checked = c.Checked
  202. SelectedChange(c.Checked, PageVersionLeft.Version.Path & c.Tag)
  203. End If
  204. End If
  205. Next
  206. Next
  207. End Sub
  208. '高级选项与复选框同步
  209. Private Sub PanFileList_MouseLeftButtonUp(sender As Object, e As MouseButtonEventArgs) Handles PanFileList.MouseLeftButtonUp
  210. For Each c In PanCommonFiles.Children
  211. If TypeOf c Is MyCheckBox Then
  212. c.Checked = (IsSelected(PageVersionLeft.Version.Path & c.Tag) = 2)
  213. End If
  214. Next
  215. End Sub
  216. #End Region
  217. #Region "整合包信息 & 预览栏"
  218. Private Sub TbExportName_TextChanged(sender As MyTextBox, e As TextChangedEventArgs) Handles TbExportName.TextChanged
  219. ItemVersion.Title = If(String.IsNullOrWhiteSpace(sender.Text), PageVersionLeft.Version.Name, sender.Text)
  220. End Sub
  221. Private Sub TbExportDesc_TextChanged(sender As MyTextBox, e As TextChangedEventArgs) Handles TbExportDesc.TextChanged
  222. ItemVersion.Info = If(String.IsNullOrWhiteSpace(sender.Text), PageVersionLeft.Version.Info, sender.Text)
  223. End Sub
  224. Private CustomLogoVal As String
  225. ''' <summary>
  226. ''' 自定义 Logo 的路径。
  227. ''' </summary>
  228. Public Property CustomLogo() As String
  229. Get
  230. Return CustomLogoVal
  231. End Get
  232. Set(value As String)
  233. If AniControlEnabled <> 0 Then Exit Property
  234. CustomLogoVal = value
  235. ItemVersion.Logo = value
  236. Reload()
  237. End Set
  238. End Property
  239. Private Sub ComboDisplayLogo_SelectionChanged(sender As MyComboBox, e As SelectionChangedEventArgs) Handles ComboDisplayLogo.SelectionChanged
  240. If Not AniControlEnabled = 0 Then Exit Sub
  241. '选择 自定义 时修改图片
  242. If ComboDisplayLogo.SelectedItem Is ItemDisplayLogoCustom Then
  243. Dim FileName As String = SelectFile("常用图片文件(*.png;*.jpg;*.gif)|*.png;*.jpg;*.gif", "选择图片")
  244. If String.IsNullOrWhiteSpace(FileName) Then Exit Sub
  245. CustomLogo = FileName
  246. Else
  247. CustomLogo = sender.SelectedItem.Tag
  248. End If
  249. End Sub
  250. #End Region
  251. #Region "基本信息"
  252. Private Sub CheckIncludePCL_Change(sender As Object, user As Boolean) Handles CheckIncludePCL.Change
  253. CheckIncludeSetup.IsEnabled = CheckIncludePCL.IsEnabled
  254. End Sub
  255. #End Region
  256. #Region "导出"
  257. 'Private Sub ComboExportType_Change(sender As ComboBox, e As SelectionChangedEventArgs) Handles ComboExportType.SelectionChanged
  258. ' If AniControlEnabled <> 0 Then Exit Sub
  259. ' Type = sender.SelectedIndex
  260. ' Select Case Type
  261. ' Case ModpackType.Modrinth
  262. ' If IncludePCL() Then 'TODO:修改这里的条件
  263. ' If GridCompressed IsNot Nothing Then GridCompressed.Visibility = Visibility.Visible
  264. ' If GridModrinth IsNot Nothing Then GridModrinth.Visibility = Visibility.Collapsed
  265. ' Else
  266. ' If GridCompressed IsNot Nothing Then GridCompressed.Visibility = Visibility.Collapsed
  267. ' If GridModrinth IsNot Nothing Then GridModrinth.Visibility = Visibility.Visible
  268. ' End If
  269. ' End Select
  270. ' CardExport.TriggerForceResize()
  271. 'End Sub
  272. Private Sub BtnExportExport_Click() Handles BtnExportExport.Click
  273. Dim savePath As String = SelectAs(
  274. "选择导出位置", $"整合包 - {If(String.IsNullOrWhiteSpace(TbExportName.Text), PageVersionLeft.Version.Name, TbExportName.Text)}" & If(CheckIncludePCL.Checked, ".zip", ".mrpack"),
  275. If(CheckIncludePCL.Checked, "整合包文件(*.zip)|*.zip", "Modrinth 整合包(*.mrpack)|*.mrpack"))
  276. If String.IsNullOrEmpty(savePath) Then Exit Sub
  277. '获取需要包含的文件
  278. Dim contains As List(Of String) = Selected
  279. For Each c In PanCommonFiles.Children
  280. If TypeOf c IsNot MyCheckBox Then Continue For
  281. If String.IsNullOrEmpty(c.Tag) Then Continue For
  282. contains.Add(PageVersionLeft.Version.Path & c.Tag)
  283. Next
  284. ModpackExport(New ExportOptions(PageVersionLeft.Version, savePath, CheckIncludePCL.Checked, contains.Distinct.ToArray,
  285. PCLSetupGlobal:=CheckIncludeSetup.Checked, Name:=TbExportName.Text, VerID:=TbExportVersion.Text))
  286. End Sub
  287. #End Region
  288. End Class