2
0

formDownloadRight.xaml.vb 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. Public Class formDownloadRight
  2. '初始化滚动条
  3. Private Sub panShow_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles panShow.Loaded
  4. If scroll.SetControl(panShow, True) Then AddHandler panBack.MouseWheel, AddressOf scroll.RunMouseWheel
  5. RefreshPage()
  6. End Sub
  7. Private ControlDict As New Dictionary(Of String, Object)
  8. ''' <summary>
  9. ''' 添加一个文件组到 UI。
  10. ''' </summary>
  11. ''' <param name="Group"></param>
  12. Public Sub AddGroup(Group As WebGroup)
  13. frmMain.Dispatcher.Invoke(Sub()
  14. panShow.UpdateLayout()
  15. Dim NewGrid As New Grid With {.Width = 203, .Margin = New Thickness(0, 5, 0, 9)}
  16. ControlDict.Add("MainGrid" & Group.UUID, NewGrid)
  17. Dim NewPath As New Shapes.Path With {.Data = New GeometryConverter().ConvertFromString("F1 M 38,19C 47.3888,19 55,21.0147 55,23.5038L 55,25.5C 55,27.9853 47.3888,30 38,30C 28.6112,30 21,27.9853 21,25.5L 21,23.5C 21,21.0147 28.6112,19 38,19 Z M 55,52.5C 55,54.9853 47.3888,57 38,57C 28.6112,57 21,54.9853 21,52.5L 21,46.5C 21,48.9853 28.6112,51 38,51C 47.384,51 54.9921,48.9874 55,46.5039L 55,52.5 Z M 55,43.5C 55,45.9853 47.3888,48 38,48C 28.6112,48 21,45.9853 21,43.5L 21,37.5C 21,39.9853 28.6112,42 38,42C 47.384,42 54.9921,39.9874 55,37.5038L 55,43.5 Z M 55,34.5C 55,36.9853 47.3888,39 38,39C 28.6112,39 21,36.9853 21,34.5L 21,28.5C 21,30.9853 28.6112,33 38,33C 47.384,33 54.9921,30.9874 55,28.5038L 55,34.5 Z"), .Height = 19, .Stretch = Stretch.Fill, .Width = 17, .HorizontalAlignment = HorizontalAlignment.Left, .VerticalAlignment = VerticalAlignment.Top, .UseLayoutRounding = False, .Margin = New Thickness(9, 9, 0, 0)}
  18. NewPath.SetResourceReference(Shape.FillProperty, "Color4")
  19. NewGrid.Children.Add(NewPath)
  20. Dim NewTitle As New Label With {.Content = Group.Name, .FontSize = 16, .VerticalContentAlignment = VerticalAlignment.Center, .Margin = New Thickness(35, 0, 0, 0), .Height = 36, .VerticalAlignment = VerticalAlignment.Top, .Padding = New Thickness(0), .UseLayoutRounding = False, .MaxWidth = 160, .HorizontalAlignment = HorizontalAlignment.Left}
  21. NewTitle.SetResourceReference(ForegroundProperty, "Color4")
  22. AddHandler NewTitle.MouseEnter, Sub()
  23. NewTitle.ToolTip = If(NewTitle.ActualWidth > 159, Group.Name, Nothing)
  24. End Sub
  25. NewGrid.Children.Add(NewTitle)
  26. Dim NewProgress1 As New TextBlock With {.Height = 2, .VerticalAlignment = VerticalAlignment.Top, .Margin = New Thickness(5, 37, 0, 0), .HorizontalAlignment = HorizontalAlignment.Left, .Width = 193, .UseLayoutRounding = True}
  27. NewProgress1.SetResourceReference(TextBlock.BackgroundProperty, "Color2")
  28. NewGrid.Children.Add(NewProgress1)
  29. Dim NewProgress2 As New TextBlock With {.Height = 2, .VerticalAlignment = VerticalAlignment.Top, .Margin = New Thickness(5, 37, 0, 0), .HorizontalAlignment = HorizontalAlignment.Left, .Width = 0, .UseLayoutRounding = True, .MaxWidth = 193}
  30. NewProgress2.SetResourceReference(TextBlock.BackgroundProperty, "Color4")
  31. NewGrid.Children.Add(NewProgress2)
  32. ControlDict.Add("Progress" & Group.UUID, NewProgress2)
  33. Dim NewHost As New StackPanel With {.HorizontalAlignment = HorizontalAlignment.Left, .Margin = New Thickness(5, 45, 0, 0), .VerticalAlignment = VerticalAlignment.Top, .Width = 193}
  34. ControlDict.Add("Host" & Group.UUID, NewHost)
  35. NewGrid.Children.Add(NewHost)
  36. panShow.Children.Add(NewGrid)
  37. AddFileList(Group.Files, NewHost)
  38. RefreshGroup(Group)
  39. RefreshPage()
  40. End Sub)
  41. End Sub
  42. ''' <summary>
  43. ''' 刷新一个 WebGroup 在 UI 中的显示。
  44. ''' </summary>
  45. ''' <param name="Group"></param>
  46. Public Sub RefreshGroup(Group As WebGroup)
  47. frmMain.Dispatcher.Invoke(Sub()
  48. '刷新进度条
  49. AniStart({
  50. AaWidth(ControlDict("Progress" & Group.UUID), 193 * Group.Percent - ControlDict("Progress" & Group.UUID).Width, 250, , New AniEaseJumpEnd(0.6))
  51. }, "Progress" & Group.UUID)
  52. End Sub)
  53. End Sub
  54. ''' <summary>
  55. ''' 添加一堆文件到 UI 中的 StackPanel。
  56. ''' </summary>
  57. Private Sub AddFileList(Files As ArrayList, Host As StackPanel)
  58. For Each File As WebFile In Files
  59. Dim f As WebFile = File
  60. Dim NewFileGrid As New Grid With {.Height = 22, .UseLayoutRounding = True, .Background = New MyColor(1, 255, 255, 255), .Width = 193, .HorizontalAlignment = HorizontalAlignment.Left}
  61. NewFileGrid.ColumnDefinitions.Add(New ColumnDefinition With {.Width = (New GridLengthConverter).ConvertFromString("1*")})
  62. NewFileGrid.ColumnDefinitions.Add(New ColumnDefinition With {.Width = GridLength.Auto})
  63. AddHandler NewFileGrid.MouseEnter, Sub()
  64. NewFileGrid.ToolTip = "下载地址:" & f.WebAddress &
  65. If(f.WebAddress.Contains("minecraft.net/") Or f.WebAddress.Contains("mojang.com/"), vbCrLf & "下载来源:Mojang 官方", "") &
  66. If(f.WebAddress.Contains("optifine.net/"), vbCrLf & "下载来源:OptiFine 官方", "") &
  67. If(f.WebAddress.Contains("minecraftforge.net/"), vbCrLf & "下载来源:Forge 官方", "") &
  68. If(f.WebAddress.Contains("bangbang93.com/"), vbCrLf & "下载来源:BMCLAPI by bangbang93", "") &
  69. If(f.WebAddress.Contains(TX_SREVER_1) Or f.WebAddress.Contains(TX_SREVER_2) Or f.WebAddress.Contains("bkt.clouddn.com/"), vbCrLf & "下载来源:PCL 服务器", "") &
  70. If(f.State = WebDownloadStats.Download And Not f.GetServerFileSize = WebRequireSize.DontNeed,
  71. vbCrLf & "文件大小:" & f.GetSize.ToString & " / " & f.TotalSize.ToString &
  72. vbCrLf & "下载速度:" & f.Speed.ToString & "/s",
  73. "")
  74. End Sub
  75. ControlDict.Add("FileGrid" & File.UUID, NewFileGrid)
  76. Dim FileImage As New Image With {.Height = 14, .HorizontalAlignment = HorizontalAlignment.Left, .Margin = New Thickness(4, 4, 0, 0), .VerticalAlignment = VerticalAlignment.Top, .Width = 14, .UseLayoutRounding = True, .Tag = "", .Opacity = 0.8}
  77. NewFileGrid.Children.Add(FileImage)
  78. ControlDict.Add("Image" & File.UUID, FileImage)
  79. Dim LeftLabel As New Label With {.Margin = New Thickness(23, 0, 0, 0), .Padding = New Thickness(0, 0, 4, 0), .VerticalContentAlignment = VerticalAlignment.Center, .Foreground = New MyColor(255, 75, 75, 75), .FontSize = 12}
  80. NewFileGrid.Children.Add(LeftLabel)
  81. ControlDict.Add("FileName" & File.UUID, LeftLabel)
  82. Dim RightLabel As New Label With {.Name = "Label" & File.UUID, .FontSize = 12, .Foreground = New MyColor(255, 75, 75, 75), .HorizontalAlignment = HorizontalAlignment.Right, .Padding = New Thickness(0), .VerticalContentAlignment = VerticalAlignment.Center, .Margin = New Thickness(0, 0, 3, 0), .Opacity = 0.6}
  83. NewFileGrid.Children.Add(RightLabel)
  84. ControlDict.Add("Label" & File.UUID, RightLabel)
  85. Grid.SetColumn(RightLabel, 1)
  86. Host.Children.Add(NewFileGrid)
  87. RefreshFile(File)
  88. Next
  89. End Sub
  90. ''' <summary>
  91. ''' 刷新一个 WebFile 在 UI 中的显示。
  92. ''' </summary>
  93. Public Sub RefreshFile(File As WebFile)
  94. frmMain.Dispatcher.Invoke(Sub()
  95. Try
  96. '查找控件
  97. Dim FileGrid As Grid = ControlDict("FileGrid" & File.UUID)
  98. Dim FileImage As Image = ControlDict("Image" & File.UUID)
  99. Dim FileName As Label = ControlDict("FileName" & File.UUID)
  100. Dim FileLabel As Label = ControlDict("Label" & File.UUID)
  101. '刷新 Grid 的指向信息
  102. If FileGrid.IsMouseOver Then
  103. FileGrid.ToolTip = "下载地址:" & File.WebAddress &
  104. If(File.WebAddress.Contains("minecraft.net/") Or File.WebAddress.Contains("mojang.com/"), vbCrLf & "下载来源:Mojang 官方", "") &
  105. If(File.WebAddress.Contains("optifine.net/"), vbCrLf & "下载来源:OptiFine 官方", "") &
  106. If(File.WebAddress.Contains("minecraftforge.net/"), vbCrLf & "下载来源:Forge 官方", "") &
  107. If(File.WebAddress.Contains("bangbang93.com/"), vbCrLf & "下载来源:BMCLAPI by bangbang93", "") &
  108. If(File.WebAddress.Contains(TX_SREVER_1) Or File.WebAddress.Contains(TX_SREVER_2) Or File.WebAddress.Contains("bkt.clouddn.com/"), vbCrLf & "下载来源:PCL 服务器", "") &
  109. If(File.State = WebDownloadStats.Download And Not File.GetServerFileSize = WebRequireSize.DontNeed,
  110. vbCrLf & "文件大小:" & File.GetSize.ToString & " / " & File.TotalSize.ToString &
  111. vbCrLf & "下载速度:" & File.Speed.ToString & "/s",
  112. "")
  113. End If
  114. '刷新图标
  115. Dim PictureSource As String = ""
  116. Select Case File.State
  117. Case WebDownloadStats.Success
  118. PictureSource = PATH_IMAGE & "Stats-Finish.png"
  119. Case WebDownloadStats.Download, WebDownloadStats.GetSize
  120. PictureSource = PATH_IMAGE & "Stats-Running.png"
  121. Case WebDownloadStats.Fail
  122. PictureSource = PATH_IMAGE & "Stats-Fail.png"
  123. Case WebDownloadStats.Wait, WebDownloadStats.FirstLoad
  124. PictureSource = PATH_IMAGE & "Stats-Wait.png"
  125. Case Else
  126. PictureSource = PATH_IMAGE & "Stats-Retry.png"
  127. End Select
  128. If Not FileImage.Tag = PictureSource Then
  129. FileImage.Tag = PictureSource
  130. FileImage.Source = New BitmapImage(New Uri(PictureSource, UriKind.Absolute))
  131. End If
  132. '刷新右边的文本
  133. Dim ShouldText As String
  134. Select Case File.State
  135. Case WebDownloadStats.Download
  136. ShouldText = If(File.TotalSize > 0, File.Percent * 100 & "%", "")
  137. Case WebDownloadStats.Fail
  138. ShouldText = "下载失败"
  139. Case WebDownloadStats.Wait, WebDownloadStats.FirstLoad
  140. ShouldText = ""
  141. Case WebDownloadStats.GetSize
  142. ShouldText = "准备中"
  143. Case WebDownloadStats.Success
  144. ShouldText = "下载成功"
  145. Case Else
  146. ShouldText = "等待重试"
  147. End Select
  148. If Not ShouldText = FileLabel.Content Then
  149. FileLabel.Content = ShouldText
  150. '移除下载成功的文件
  151. If ShouldText = "下载成功" Then
  152. RemoveFile(File)
  153. End If
  154. End If
  155. '刷新文件名
  156. If Not FileName.Content = File.LocalName Then FileName.Content = File.LocalName
  157. Catch
  158. End Try
  159. End Sub)
  160. End Sub
  161. ''' <summary>
  162. ''' 从 UI 中删除一个文件组。
  163. ''' </summary>
  164. Public Sub RemoveGroup(Group As WebGroup)
  165. frmMain.Dispatcher.Invoke(Sub()
  166. Dim Target As Grid = ControlDict("MainGrid" & Group.UUID)
  167. AniStart({
  168. AaOpacity(Target, -1, 250),
  169. AaHeight(Target, -Target.ActualHeight, 250, , New AniEaseEnd),
  170. AaCode({"Remove", panShow.Children, Target}, , True)
  171. }, "Remove" & GetUUID())
  172. Target.Height = Target.ActualHeight
  173. RefreshPage()
  174. End Sub)
  175. End Sub
  176. ''' <summary>
  177. ''' 从 UI 中删除一个文件。
  178. ''' </summary>
  179. Public Sub RemoveFile(File As WebFile)
  180. frmMain.Dispatcher.Invoke(Sub()
  181. Try
  182. If Not WebGroups.Keys.Contains(File.GroupName) Then Exit Sub
  183. Dim FileGrid As Grid = ControlDict("FileGrid" & File.UUID)
  184. Dim Stack As StackPanel = ControlDict("Host" & WebGroups(File.GroupName).UUID)
  185. If Stack.Children.Count > 30 Then
  186. AniStart({
  187. AaCode({"Remove", Stack.Children, FileGrid}, 700)
  188. }, "File" & File.UUID, False)
  189. Else
  190. AniStart({
  191. AaX(FileGrid, -191, 200, 600, New AniEaseJumpStart(0.25)),
  192. AaOpacity(FileGrid, -FileGrid.Opacity, 150, 700),
  193. AaHeight(FileGrid, -22, 100, 750),
  194. AaCode({"Remove", Stack.Children, FileGrid}, 850)
  195. }, "File" & File.UUID, False)
  196. End If
  197. Catch
  198. End Try
  199. End Sub)
  200. End Sub
  201. Private LastPageVisible As Boolean = True
  202. ''' <summary>
  203. ''' 刷新下载进度页可见性。
  204. ''' </summary>
  205. Private Sub RefreshPage()
  206. If WebGroups.Count = 0 Then
  207. '没有下载任务
  208. If scroll.IsHitTestVisible = True Or (LastPageVisible Xor frmDownloadLeft.panMain.Visibility = Visibility.Visible) Then
  209. LastPageVisible = frmDownloadLeft.panMain.Visibility = Visibility.Visible
  210. scroll.IsHitTestVisible = False
  211. If frmDownloadLeft.panMain.Visibility = Visibility.Collapsed Then
  212. '下载页被隐藏
  213. panMain.Width = 230
  214. panMain.Opacity = 1
  215. AniStart({
  216. AaOpacity(panBack, -panBack.Opacity, 200),
  217. AaOpacity(scroll, -scroll.Opacity, 200),
  218. AaOpacity(labNull, 0.9 - labNull.Opacity, 200),
  219. AaY(labNull, 146 - labNull.Margin.Top, 200, , New AniEaseEnd)
  220. }, "DownloadNothing")
  221. Else
  222. '下载页未被隐藏
  223. AniStart({
  224. AaWidth(panMain, -panMain.Width, 200, , New AniEaseEnd),
  225. AaOpacity(panMain, -panMain.Opacity, 150),
  226. AaWidth(frmDownloadLeft.panMain, 227 + 504 - frmDownloadLeft.panMain.Width, 250, , New AniEaseEnd)
  227. }, "DownloadNothing")
  228. End If
  229. End If
  230. Else
  231. '有下载任务
  232. If scroll.IsHitTestVisible = False Or (LastPageVisible Xor frmDownloadLeft.panMain.Visibility = Visibility.Visible) Then
  233. LastPageVisible = frmDownloadLeft.panMain.Visibility = Visibility.Visible
  234. scroll.IsHitTestVisible = True
  235. If frmDownloadLeft.panMain.Visibility = Visibility.Collapsed Then
  236. '下载页被隐藏
  237. panMain.Width = 230
  238. panMain.Opacity = 1
  239. AniStart({
  240. AaOpacity(panBack, 1 - panBack.Opacity, 200),
  241. AaOpacity(labNull, -labNull.Opacity, 200),
  242. AaY(labNull, 152 - labNull.Margin.Top, 200, , New AniEaseStart)
  243. }, "DownloadNothing")
  244. Else
  245. '下载页未被隐藏
  246. AniStart({
  247. AaWidth(panMain, 230 - panMain.Width, 200, , New AniEaseEnd),
  248. AaOpacity(panMain, 1 - panMain.Opacity, 150, 50),
  249. AaWidth(frmDownloadLeft.panMain, 504 - frmDownloadLeft.panMain.Width, 250, , New AniEaseEnd)
  250. }, "DownloadNothing")
  251. End If
  252. End If
  253. End If
  254. End Sub
  255. End Class