PageSpeedLeft.xaml.vb 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. Public Class PageSpeedLeft
  2. Private Const WatcherInterval As Integer = 300
  3. '初始化
  4. Private IsLoad As Boolean = False
  5. Private Sub Page_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
  6. '进入时就刷新一次显示
  7. Watcher()
  8. '如果在页面切换动画的 “上一页消失” 部分已经完成了下载,就直接尝试返回
  9. TryReturnToHome()
  10. If IsLoad Then Exit Sub
  11. IsLoad = True
  12. '监控定时器
  13. Dim timer As New Threading.DispatcherTimer With {.Interval = New TimeSpan(0, 0, 0, 0, WatcherInterval)}
  14. AddHandler timer.Tick, AddressOf Watcher
  15. timer.Start()
  16. '非调试模式隐藏线程数
  17. If Not ModeDebug Then
  18. RowDefinitions(12).Height = New GridLength(0)
  19. RowDefinitions(13).Height = New GridLength(0)
  20. RowDefinitions(14).Height = New GridLength(0)
  21. RowDefinitions(15).Height = New GridLength(0)
  22. End If
  23. End Sub
  24. '定时器任务
  25. Private ReadOnly RightCards As New Dictionary(Of String, MyCard)
  26. Private Sub Watcher()
  27. If Not FrmMain.PageCurrent = FormMain.PageType.DownloadManager Then Exit Sub
  28. Try
  29. #Region "更新左边栏"
  30. If LoaderTaskbar.Count = 0 Then
  31. '无任务
  32. LabProgress.Text = "100 %"
  33. LabSpeed.Text = "0 B/s"
  34. LabFile.Text = "0"
  35. LabThread.Text = "0 / " & NetTaskThreadLimit
  36. Else
  37. '有任务,输出基本信息
  38. Dim RawPercent As Double = LoaderTaskbarProgress
  39. Dim PredictText As String = Math.Floor(RawPercent * 100) & "." & StrFill(Math.Floor((RawPercent * 100 - Math.Floor(RawPercent * 100)) * 100), "0", 2) & " %"
  40. LabProgress.Text = If(RawPercent > 0.999999, "100 %", PredictText)
  41. LabSpeed.Text = GetString(NetManager.Speed) & "/s"
  42. LabFile.Text = If(NetManager.FileRemain < 0, "0*", NetManager.FileRemain)
  43. LabThread.Text = NetTaskThreadCount & " / " & NetTaskThreadLimit
  44. End If
  45. #End Region
  46. Catch ex As Exception
  47. Log(ex, "下载管理左栏监视出错", LogLevel.Feedback)
  48. End Try
  49. If FrmSpeedRight Is Nothing OrElse FrmSpeedRight.PanMain Is Nothing Then Exit Sub
  50. Try
  51. SyncLock LoaderTaskbarLock
  52. For i = 0 To LoaderTaskbar.Count - 1
  53. TaskRefresh(LoaderTaskbar(i))
  54. Next
  55. End SyncLock
  56. Catch ex As Exception
  57. Log(ex, "下载管理右栏监视出错", LogLevel.Feedback)
  58. End Try
  59. End Sub
  60. Public Sub TaskRefresh(Loader As LoaderBase)
  61. If Loader Is Nothing OrElse Not Loader.Show Then Exit Sub
  62. Try
  63. '获取实际加载器列表
  64. Dim LoaderList As List(Of LoaderBase) = CType(Loader, Object).GetLoaderList()
  65. If RightCards.ContainsKey(Loader.Name) Then
  66. '已有此卡片
  67. Dim Card As Grid = RightCards(Loader.Name)
  68. Dim NewValue As Double = Loader.Progress + Loader.State
  69. If Val(Card.Tag) = NewValue Then Exit Sub
  70. Card.Tag = NewValue
  71. If Card.Children.Count <= 3 Then
  72. Log("[Watcher] 元素不足的卡片:" & Loader.Name, LogLevel.Debug)
  73. Exit Sub
  74. End If
  75. Card = Card.Children(3)
  76. Try
  77. Select Case Loader.State
  78. Case LoadState.Failed
  79. #Region "失败,更新卡片"
  80. Card.RowDefinitions.Clear()
  81. Card.Children.Clear()
  82. Card.Children.Add(GetObjectFromXML("<Path xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" Stretch=""Uniform"" Tag=""Failed"" Data=""F1 M2.5,0 L0,2.5 7.5,10 0,17.5 2.5,20 10,12.5 17.5,20 20,17.5 12.5,10 20,2.5 17.5,0 10,7.5 2.5,0Z"" Height=""15"" Width=""15"" HorizontalAlignment=""Center"" Grid.Column=""0"" Grid.Row=""0"" Fill=""{DynamicResource ColorBrush3}"" Margin=""0,1,0,0"" VerticalAlignment=""Top""/>"))
  83. Dim Tb As TextBlock = GetObjectFromXML("<TextBlock xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" TextWrapping=""Wrap"" HorizontalAlignment=""Left"" ToolTip=""单击复制错误详情"" Grid.Column=""1"" Grid.Row=""0"" Margin=""0,0,0,5"" />")
  84. Tb.Text = GetExceptionDetail(Loader.Error)
  85. AddHandler Tb.MouseLeftButtonDown, Sub(sender As TextBlock, e As EventArgs)
  86. ClipboardSet(sender.Text, False)
  87. Hint("已复制错误详情!", HintType.Finish)
  88. End Sub
  89. Card.Children.Add(Tb)
  90. ''删除取消按钮
  91. 'For Each Element As FrameworkElement In CType(Card.Parent, Panel).Children
  92. ' If Element.Name = "BtnCancel" Then AniDispose(CType(Element, MyIconButton), True)
  93. 'Next
  94. #End Region
  95. Case LoadState.Finished
  96. #Region "完成,销毁卡片并返回"
  97. AniDispose(CType(Card.Parent, MyCard), True, AddressOf TryReturnToHome)
  98. #End Region
  99. Case LoadState.Loading, LoadState.Waiting
  100. #Region "进度不同,更新卡片"
  101. Try
  102. If Card.Children.Count < LoaderList.Count * 2 Then
  103. Log("刷新下载管理卡片失败:卡片中仅有 " & Card.Children.Count & " 个子项", LogLevel.Debug)
  104. Exit Try
  105. End If
  106. Dim Row As Integer = 0
  107. For Each SubTask In LoaderList
  108. Select Case SubTask.State
  109. Case LoadState.Waiting
  110. If CType(Card.Children(Row * 2), FrameworkElement).Tag <> "Waiting" Then
  111. Card.Children.RemoveAt(Row * 2)
  112. Card.Children.Insert(Row * 2, GetObjectFromXML("<Path xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" xmlns:local=""clr-namespace:PCL;assembly=Plain Craft Launcher 2"" Stretch=""Uniform"" Tag=""Waiting"" Data=""F1 M5,0 a5,5 360 1 0 0,0.0001 m15,0 a5,5 360 1 0 0,0.0001 m15,0 a5,5 360 1 0 0,0.0001 Z"" Width=""18"" HorizontalAlignment=""Center"" Grid.Column=""0"" Grid.Row=""" & Row & """ Fill=""{DynamicResource ColorBrush3}"" Margin=""0,7,0,0"" VerticalAlignment=""Top"" Height=""6""/>"))
  113. End If
  114. Case LoadState.Loading
  115. If CType(Card.Children(Row * 2), FrameworkElement).Tag <> "Loading" Then
  116. Card.Children.RemoveAt(Row * 2)
  117. Card.Children.Insert(Row * 2, GetObjectFromXML("<TextBlock xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" xmlns:local=""clr-namespace:PCL;assembly=Plain Craft Launcher 2"" Text=""" & Math.Floor(SubTask.Progress * 100) & "%"" Tag=""Loading"" HorizontalAlignment=""Center"" Grid.Column=""0"" Grid.Row=""" & Row & """ Foreground=""{DynamicResource ColorBrush3}""/>"))
  118. Else
  119. CType(Card.Children(Row * 2), TextBlock).Text = Math.Floor(SubTask.Progress * 100) & "%"
  120. End If
  121. Case LoadState.Finished
  122. If CType(Card.Children(Row * 2), FrameworkElement).Tag <> "Finished" Then
  123. Card.Children.RemoveAt(Row * 2)
  124. Card.Children.Insert(Row * 2, GetObjectFromXML("<Path xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" xmlns:local=""clr-namespace:PCL;assembly=Plain Craft Launcher 2"" Stretch=""Uniform"" Tag=""Finished"" Data=""F1 M 23.7501,33.25L 34.8334,44.3333L 52.2499,22.1668L 56.9999,26.9168L 34.8334,53.8333L 19.0001,38L 23.7501,33.25 Z"" Height=""16"" Width=""15"" HorizontalAlignment=""Center"" Grid.Column=""0"" Grid.Row=""" & Row & """ Fill=""{DynamicResource ColorBrush3}"" Margin=""0,3,0,0"" VerticalAlignment=""Top""/>"))
  125. End If
  126. End Select
  127. Row += 1
  128. Next
  129. Catch ex As Exception
  130. Log(ex, "刷新下载管理卡片失败", LogLevel.Feedback)
  131. End Try
  132. #End Region
  133. End Select
  134. Catch ex As Exception
  135. Log(ex, "更新下载管理显示失败(" & Loader.State.ToString & ")", LogLevel.Feedback)
  136. End Try
  137. ElseIf Not (Loader.State = LoadState.Aborted OrElse Loader.State = LoadState.Finished) Then
  138. Try
  139. #Region "没有卡片且未中断或完成,添加新的卡片"
  140. Dim CardXAML As String = "
  141. <local:MyCard xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" xmlns:local=""clr-namespace:PCL;assembly=Plain Craft Launcher 2""
  142. Tag=""" & (Loader.Progress + Loader.State) & """ Title=""" & EscapeXML(Loader.Name) & """ Margin=""0,0,0,15"">
  143. <Grid Margin=""14,40,15,10"">
  144. <Grid.ColumnDefinitions>
  145. <ColumnDefinition Width=""50""/>
  146. <ColumnDefinition/>
  147. </Grid.ColumnDefinitions>
  148. <Grid.RowDefinitions>"
  149. For Each SubTask In LoaderList
  150. CardXAML += "<RowDefinition Height=""26""/>"
  151. Next
  152. CardXAML += "</Grid.RowDefinitions>"
  153. Dim Row As Integer = 0
  154. For Each SubTask In LoaderList
  155. Select Case SubTask.State
  156. Case LoadState.Waiting
  157. CardXAML += "<Path Stretch=""Uniform"" Tag=""Waiting"" Data=""F1 M5,0 a5,5 360 1 0 0,0.0001 m15,0 a5,5 360 1 0 0,0.0001 m15,0 a5,5 360 1 0 0,0.0001 Z"" Width=""18"" HorizontalAlignment=""Center"" Grid.Column=""0"" Grid.Row=""" & Row & """ Fill=""{DynamicResource ColorBrush3}"" Margin=""0,7,0,0"" VerticalAlignment=""Top"" Height=""6""/>"
  158. Case LoadState.Loading
  159. CardXAML += "<TextBlock Text=""" & Math.Floor(SubTask.Progress * 100) & "%"" Tag=""Loading"" HorizontalAlignment=""Center"" Grid.Column=""0"" Grid.Row=""" & Row & """ Foreground=""{DynamicResource ColorBrush3}"" />"
  160. Case LoadState.Finished
  161. CardXAML += "<Path Stretch=""Uniform"" Tag=""Finished"" Data=""F1 M 23.7501,33.25L 34.8334,44.3333L 52.2499,22.1668L 56.9999,26.9168L 34.8334,53.8333L 19.0001,38L 23.7501,33.25 Z"" Height=""16"" Width=""15"" HorizontalAlignment=""Center"" Grid.Column=""0"" Grid.Row=""" & Row & """ Fill=""{DynamicResource ColorBrush3}"" Margin=""0,3,0,0"" VerticalAlignment=""Top""/>"
  162. Case Else
  163. CardXAML += "<Path Stretch=""Uniform"" Tag=""Failed"" Data=""F1 M2.5,0 L0,2.5 7.5,10 0,17.5 2.5,20 10,12.5 17.5,20 20,17.5 12.5,10 20,2.5 17.5,0 10,7.5 2.5,0Z"" Height=""15"" Width=""15"" HorizontalAlignment=""Center"" Grid.Column=""0"" Grid.Row=""" & Row & """ Fill=""{DynamicResource ColorBrush3}"" Margin=""0,1,0,0"" VerticalAlignment=""Top""/>"
  164. End Select
  165. CardXAML += "<TextBlock Text=""" & EscapeXML(SubTask.Name) & """ HorizontalAlignment=""Left"" Grid.Column=""1"" Grid.Row=""" & Row & """/>"
  166. Row += 1
  167. Next
  168. CardXAML += "</Grid></local:MyCard>"
  169. '实例化控件
  170. Dim Card As MyCard
  171. Try
  172. Card = GetObjectFromXML(CardXAML)
  173. Catch ex As Exception
  174. Log(ex, "新建下载管理卡片失败")
  175. Log("出错的卡片内容:" & vbCrLf & CardXAML)
  176. Throw
  177. End Try
  178. FrmSpeedRight.PanMain.Children.Insert(0, Card)
  179. RightCards.Add(Loader.Name, Card)
  180. Log($"[Watcher] 新建下载管理卡片:{Loader.Name}")
  181. '添加取消按钮
  182. Dim Cancel As New MyIconButton With {.Name = "BtnCancel", .Logo = "F1 M2,0 L0,2 8,10 0,18 2,20 10,12 18,20 20,18 12,10 20,2 18,0 10,8 2,0Z", .Height = 20, .Margin = New Thickness(0, 10, 10, 0), .LogoScale = 1.1, .HorizontalAlignment = HorizontalAlignment.Right, .VerticalAlignment = VerticalAlignment.Top}
  183. Card.Children.Add(Cancel)
  184. AddHandler Cancel.Click, Sub(sender As MyIconButton, e As EventArgs)
  185. AniDispose(sender, False)
  186. AniDispose(Card, True, Sub() If FrmSpeedRight.PanMain.Children.Count = 0 AndAlso FrmMain.PageCurrent = FormMain.PageType.DownloadManager Then FrmMain.PageBack())
  187. RightCards.Remove(Loader.Name)
  188. Log($"[Watcher] 关闭下载管理卡片:{Loader.Name}")
  189. RunInThread(Sub() Loader.Abort())
  190. End Sub
  191. '如果已经失败,再刷新一次,修改成失败的控件
  192. If Loader.State = LoadState.Failed Then
  193. Card.Tag = Nothing '避免重复导致刷新无效
  194. TaskRefresh(Loader)
  195. End If
  196. #End Region
  197. Catch ex As Exception
  198. Log(ex, "添加下载管理卡片失败", LogLevel.Feedback)
  199. End Try
  200. End If
  201. Catch ex As Exception
  202. Log(ex, "刷新下载管理显示失败", LogLevel.Feedback)
  203. End Try
  204. End Sub
  205. Public Sub TaskRemove(Loader As Object)
  206. If RightCards.ContainsKey(Loader.Name) Then
  207. RunInUiWait(Sub()
  208. '移除已有的卡片
  209. Dim Card As Grid = RightCards(Loader.Name)
  210. FrmSpeedRight.PanMain.Children.Remove(Card)
  211. RightCards.Remove(Loader.Name)
  212. Log($"[Watcher] 移除下载管理卡片:{Loader.Name}")
  213. End Sub)
  214. End If
  215. End Sub
  216. ''' <summary>
  217. ''' 若没有任务,尝试返回主页。
  218. ''' </summary>
  219. Private Sub TryReturnToHome()
  220. If FrmSpeedRight.PanMain.Children.Count = 0 AndAlso FrmMain.PageCurrent = FormMain.PageType.DownloadManager Then
  221. FrmMain.PageBack()
  222. End If
  223. End Sub
  224. End Class