| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- Public Class PageSpeedLeft
- Private Const WatcherInterval As Integer = 300
- '初始化
- Private IsLoad As Boolean = False
- Private Sub Page_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
- '进入时就刷新一次显示
- Watcher()
- '如果在页面切换动画的 “上一页消失” 部分已经完成了下载,就直接尝试返回
- TryReturnToHome()
- If IsLoad Then Return
- IsLoad = True
- '监控定时器
- Dim timer As New Threading.DispatcherTimer With {.Interval = New TimeSpan(0, 0, 0, 0, WatcherInterval)}
- AddHandler timer.Tick, AddressOf Watcher
- timer.Start()
- '非调试模式隐藏线程数
- If Not ModeDebug Then
- RowDefinitions(12).Height = New GridLength(0)
- RowDefinitions(13).Height = New GridLength(0)
- RowDefinitions(14).Height = New GridLength(0)
- RowDefinitions(15).Height = New GridLength(0)
- End If
- End Sub
- '定时器任务
- Private ReadOnly RightCards As New Dictionary(Of String, MyCard)
- Private Sub Watcher()
- If Not FrmMain.PageCurrent = FormMain.PageType.TaskManager Then Return
- Try
- #Region "更新左边栏"
- If Not LoaderTaskbar.Any() Then
- '无任务
- LabProgress.Text = "100 %"
- LabSpeed.Text = "0 B/s"
- LabFile.Text = "0"
- LabThread.Text = "0 / " & NetTaskThreadLimit
- Else
- '有任务,输出基本信息
- Dim Tasks = LoaderTaskbar.Where(Function(l) l.Show).ToList() '筛选掉启动 MC 的任务(#6270)
- Dim RawPercent As Double = If(Tasks.Any, Tasks.Select(Function(l) l.Progress).Average().Clamp(0, 1), 1)
- Dim PredictText As String = Math.Floor(RawPercent * 100) & "." & Math.Floor((RawPercent * 100 - Math.Floor(RawPercent * 100)) * 100).ToString.EnsureLength("0", 2) & " %"
- LabProgress.Text = If(RawPercent > 0.999999, "100 %", PredictText)
- LabSpeed.Text = StringUtils.FormatByteSize(NetManager.Speed) & "/s"
- LabFile.Text = If(NetManager.FileRemain < 0, "0*", NetManager.FileRemain)
- LabThread.Text = NetTaskThreadCount & " / " & NetTaskThreadLimit
- End If
- #End Region
- Catch ex As Exception
- Logger.Error(ex, "任务管理左栏监视出错")
- End Try
- If FrmSpeedRight Is Nothing OrElse FrmSpeedRight.PanMain Is Nothing Then Return
- Try
- For Each Loader In LoaderTaskbar.ToList
- TaskRefresh(Loader)
- Next
- Catch ex As Exception
- Logger.Error(ex, "任务管理右栏监视出错")
- End Try
- End Sub
- Public Sub TaskRefresh(Loader As LoaderBase)
- If Loader Is Nothing OrElse Not Loader.Show Then Return
- Try
- '获取实际加载器列表
- Dim LoaderList As List(Of LoaderBase) = CType(Loader, Object).GetLoaderList()
- If RightCards.ContainsKey(Loader.Name) Then
- '已有此卡片
- Dim Card As Grid = RightCards(Loader.Name)
- Dim NewValue As Double = Loader.Progress + Loader.State
- If Val(Card.Tag) = NewValue Then Return
- Card.Tag = NewValue
- If Card.Children.Count <= 3 Then
- Logger.Warn($"元素不足的卡片:{Loader.Name}")
- Return
- End If
- Card = Card.Children(3)
- Try
- Select Case Loader.State
- Case LoadState.Failed
- #Region "失败,更新卡片"
- Card.RowDefinitions.Clear()
- Card.Children.Clear()
- 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""/>"))
- 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"" />")
- Tb.Text = Loader.Error.GetDisplay(True)
- AddHandler Tb.MouseLeftButtonDown,
- Sub(sender As TextBlock, e As EventArgs)
- ClipboardSet(sender.Text, False)
- Hint("已复制错误详情!", HintType.Green)
- End Sub
- Card.Children.Add(Tb)
- #End Region
- Case LoadState.Finished, LoadState.Canceled
- #Region "完成或中断,销毁卡片并返回"
- AniDispose(CType(Card.Parent, MyCard), True, AddressOf TryReturnToHome)
- #End Region
- Case LoadState.Loading, LoadState.Waiting
- #Region "进度不同,更新卡片"
- Try
- If Card.Children.Count < LoaderList.Count * 2 Then
- Logger.Warn($"刷新任务管理卡片 {Loader.Name} 失败:卡片中仅有 {Card.Children.Count} 个子项,要求至少有 {LoaderList.Count * 2} 个子项")
- Exit Try
- End If
- Dim Row As Integer = 0
- For Each SubTask In LoaderList
- Select Case SubTask.State
- Case LoadState.Waiting
- If CType(Card.Children(Row * 2), FrameworkElement).Tag <> "Waiting" Then
- Card.Children.RemoveAt(Row * 2)
- 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""/>"))
- End If
- Case LoadState.Loading
- If CType(Card.Children(Row * 2), FrameworkElement).Tag <> "Loading" Then
- Card.Children.RemoveAt(Row * 2)
- 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}""/>"))
- Else
- CType(Card.Children(Row * 2), TextBlock).Text = Math.Floor(SubTask.Progress * 100) & "%"
- End If
- Case LoadState.Finished
- If CType(Card.Children(Row * 2), FrameworkElement).Tag <> "Finished" Then
- Card.Children.RemoveAt(Row * 2)
- 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""/>"))
- End If
- End Select
- Row += 1
- Next
- Catch ex As Exception
- Logger.Error(ex, $"刷新任务管理卡片 {Loader.Name} 失败")
- End Try
- #End Region
- End Select
- Catch ex As Exception
- Logger.Error(ex, $"更新任务管理显示失败({Loader.State})")
- End Try
- ElseIf Not (Loader.State = LoadState.Canceled OrElse Loader.State = LoadState.Finished) Then
- Try
- #Region "没有卡片且未中断或完成,添加新的卡片"
- Dim CardXAML As String = "
- <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""
- Tag=""" & (Loader.Progress + Loader.State) & """ Title=""" & StringUtils.XmlEscape(Loader.Name) & """ Margin=""0,0,0,15"">
- <Grid Margin=""14,40,15,10"">
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width=""50""/>
- <ColumnDefinition/>
- </Grid.ColumnDefinitions>
- <Grid.RowDefinitions>"
- For Each SubTask In LoaderList
- CardXAML += "<RowDefinition Height=""26""/>"
- Next
- CardXAML += "</Grid.RowDefinitions>"
- Dim Row As Integer = 0
- For Each SubTask In LoaderList
- Select Case SubTask.State
- Case LoadState.Waiting
- 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""/>"
- Case LoadState.Loading
- CardXAML += "<TextBlock Text=""" & Math.Floor(SubTask.Progress * 100) & "%"" Tag=""Loading"" HorizontalAlignment=""Center"" Grid.Column=""0"" Grid.Row=""" & Row & """ Foreground=""{DynamicResource ColorBrush3}"" />"
- Case LoadState.Finished
- 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""/>"
- Case Else
- 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""/>"
- End Select
- CardXAML += "<TextBlock Text=""" & StringUtils.XmlEscape(SubTask.Name) & """ HorizontalAlignment=""Left"" Grid.Column=""1"" Grid.Row=""" & Row & """/>"
- Row += 1
- Next
- CardXAML += "</Grid></local:MyCard>"
- '实例化控件
- Dim Card As MyCard
- Try
- Card = GetObjectFromXML(CardXAML)
- Catch ex As Exception
- Logger.Warn(ex, "新建任务管理卡片失败")
- Logger.Info($"出错的卡片内容:{vbCrLf}{CardXAML}")
- Throw
- End Try
- FrmSpeedRight.PanMain.Children.Insert(0, Card)
- RightCards.Add(Loader.Name, Card)
- Logger.Info($"新建任务管理卡片:{Loader.Name}")
- '添加取消按钮
- 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}
- Card.Children.Add(Cancel)
- AddHandler Cancel.Click,
- Sub(sender As MyIconButton, e As EventArgs)
- AniDispose(sender, False)
- AniDispose(Card, True, Sub() If FrmSpeedRight.PanMain.Children.Count = 0 AndAlso FrmMain.PageCurrent = FormMain.PageType.TaskManager Then FrmMain.PageBack())
- RightCards.Remove(Loader.Name)
- LoaderTaskbar.Remove(Loader)
- Logger.Info($"关闭任务管理卡片:{Loader.Name},且移出任务列表")
- RunInThread(Sub() Loader.Cancel())
- End Sub
- '如果已经失败,再刷新一次,修改成失败的控件
- If Loader.State = LoadState.Failed Then
- Card.Tag = Nothing '避免重复导致刷新无效
- TaskRefresh(Loader)
- End If
- #End Region
- Catch ex As Exception
- Logger.Error(ex, "添加任务管理卡片失败")
- End Try
- End If
- Catch ex As Exception
- Logger.Error(ex, "刷新任务管理显示失败")
- End Try
- End Sub
- Public Sub TaskRemove(Loader As Object)
- If RightCards.ContainsKey(Loader.Name) Then
- RunInUiWait(
- Sub()
- '移除已有的卡片
- Dim Card As Grid = RightCards(Loader.Name)
- FrmSpeedRight.PanMain.Children.Remove(Card)
- RightCards.Remove(Loader.Name)
- Logger.Info($"移除任务管理卡片:{Loader.Name}")
- End Sub)
- End If
- End Sub
- ''' <summary>
- ''' 若没有任务,尝试返回主页。
- ''' </summary>
- Private Sub TryReturnToHome()
- If FrmSpeedRight.PanMain.Children.Count = 0 AndAlso FrmMain.PageCurrent = FormMain.PageType.TaskManager Then
- FrmMain.PageBack()
- End If
- End Sub
- End Class
|