Public Class formHomeLeft
Public LoadingItem As New ArrayList '正在加载的首页项目
Public LoadedItem As New ArrayList '加载结束但没有编入随机位的首页项目
Public RandomedItem As New ArrayList '已随机处理的首页项目
Private ShowingCount As Integer = 0 '正在显示的首页项目计数,用于排布位置
Private ShowingPage As Integer = 0 '正在显示的页码
Private LoadedRefreshCount As Integer = 0 '刷新计数
Public HideNotfull As Boolean = True
Private Sub timerLoad_Tick() Handles timerLoad.Tick
If MODE_OFFLINE Then Exit Sub
'检查是否存在加载结束的项目(成功或是失败)
If LoadingItem.Count > 0 Then
For i = 0 To LoadingItem.Count - 1
Dim item As InfoBoxSource = LoadingItem(i) '当前的InfoBox
If IsNothing(item) Then Exit Sub
frmStart.IsPushLoading = False
Select Case item.State
Case LoadState.Loaded
'移动到加载结束的数组
LoadingItem.Remove(item)
LoadedItem.Add(item)
i = i - 1
Case LoadState.Failed
'输出信息并移除
log("[HomeLeft] 信息框加载失败:" & item.Source & " - " & item.Title, True)
LoadingItem.Remove(item)
i = i - 1
End Select
If i >= LoadingItem.Count - 1 Then Exit For
Next i
End If
'检查是否存在可显示的项目
Dim Count As Integer = 0
Do While LoadedItem.Count > 0 And Count < 4
Count = Count + 1
'处理源
Dim itemSource As InfoBoxSource = LoadedItem(RandomInteger(0, LoadedItem.Count - 1))
LoadedItem.Remove(itemSource)
RandomedItem.Add(itemSource)
'处理新的控件
Dim item As New InfoBox With {.Margin = New Thickness(0, 0, 15, 0), .UseLayoutRounding = False}
item.Show(itemSource)
'添加到 UI
If ReadIni("setup", "HomeEnabled", "True") = "True" Then
Select Case ShowingCount
Case 0, 1
If panTop.Children.Count < 2 Then SendStat("推荐源", "显示", item.Source & "(" & item.Title & ")") : item.IsSendStat = True
panTop.Children.Add(item)
ShowingCount = ShowingCount + 1
Case 2
If panBottom.Children.Count < 2 Then SendStat("推荐源", "显示", item.Source & "(" & item.Title & ")") : item.IsSendStat = True
panBottom.Children.Add(item)
ShowingCount = ShowingCount + 1
Case 3
If panBottom.Children.Count < 2 Then SendStat("推荐源", "显示", item.Source & "(" & item.Title & ")") : item.IsSendStat = True
panBottom.Children.Add(item)
ShowingCount = 0
End Select
End If
Loop
'检查是否需要刷新计数
If Not RandomedItem.Count = LoadedRefreshCount Then
LoadedRefreshCount = RandomedItem.Count
'刷新页面计数器
Dim NewPageAnimation As New ArrayList
Do While panPage.Children.Count < If(HideNotfull, Math.Floor(LoadedRefreshCount / 4), Math.Floor((LoadedRefreshCount - 1) / 4) + 1)
'添加新页面按钮
Dim NewPage As Integer = panPage.Children.Count + 1 '新添加的页面编号
Dim NewBorder As New Border With {.Name = "btnPage" & NewPage, .VerticalAlignment = VerticalAlignment.Center, .Height = 0, .Width = 0, .BorderThickness = New Thickness(2), .Margin = New Thickness(20 * (NewPage - 1) + 6, 0, 0, 0), .IsHitTestVisible = False, .HorizontalAlignment = HorizontalAlignment.Left, .RenderTransform = New RotateTransform(0), .RenderTransformOrigin = New Point(0.5, 0.5), .Background = New MyColor(128, 255, 255, 255), .UseLayoutRounding = True}
NewBorder.SetResourceReference(BorderBrushProperty, "Color4")
panPage.Children.Add(NewBorder)
'按钮动画(每一页都按次序执行动画)
NewPageAnimation.AddRange({
AaWidth(panPage, 20, 300, , , True),
AaWidth(NewBorder, 8, 250, 50),
AaHeight(NewBorder, 8, 250, 50)
})
Loop
If NewPageAnimation.Count > 0 Then AniStart(NewPageAnimation, "HomeLeftNewPage" & GetUUID()) '点点的动画
ChangeWidth()
End If
End Sub
Public Sub ChangeWidth() Handles panMain.Loaded
'如果是离线模式或者没有推荐则直接隐藏,并且还顺便改变登录页大小
Dim TotalCount As Integer = LoadingItem.Count + LoadedItem.Count + RandomedItem.Count
If MODE_OFFLINE Or TotalCount = 0 Or ReadIni("setup", "HomeEnabled", "True") = "False" Then
panMain.Visibility = Visibility.Collapsed
Else
panMain.Visibility = Visibility.Visible
End If
End Sub
Private Sub StatShow() Handles panMain.Loaded
Dim IsSendStat As Boolean = RandomInteger(1, 100) = 66 '1%的情况下反馈显示推荐源信息
Dim Info As InfoBox
If ShowingPage * 2 < panTop.Children.Count Then
Info = CType(panTop.Children(ShowingPage * 2), InfoBox)
If Info.IsSendStat = False Then
Info.IsSendStat = True
If IsSendStat Then SendStat("推荐源", "显示", Info.Source & "(" & Info.Title & ")")
End If
End If
If ShowingPage * 2 + 1 < panTop.Children.Count Then
Info = CType(panTop.Children(ShowingPage * 2 + 1), InfoBox)
If Info.IsSendStat = False Then
Info.IsSendStat = True
If IsSendStat Then SendStat("推荐源", "显示", Info.Source & "(" & Info.Title & ")")
End If
End If
If ShowingPage * 2 < panBottom.Children.Count Then
Info = CType(panBottom.Children(ShowingPage * 2), InfoBox)
If Info.IsSendStat = False Then
Info.IsSendStat = True
If IsSendStat Then SendStat("推荐源", "显示", Info.Source & "(" & Info.Title & ")")
End If
End If
If ShowingPage * 2 + 1 < panBottom.Children.Count Then
Info = CType(panBottom.Children(ShowingPage * 2 + 1), InfoBox)
If Info.IsSendStat = False Then
Info.IsSendStat = True
If IsSendStat Then SendStat("推荐源", "显示", Info.Source & "(" & Info.Title & ")")
End If
End If
End Sub
'''
''' 切换页面的点击事件。
'''
'''
'''
'''
Private Sub panPage_MouseLeftButtonDown(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles panPage.MouseLeftButtonDown
'初始化
Dim ClickedPage As Integer = Math.Floor(e.GetPosition(panPage).X / 20)
If ClickedPage = ShowingPage Then Exit Sub
ChangePage(ClickedPage)
End Sub
Private Sub ChangePage(ByVal ClickedPage As Integer)
If Not frmMain.PageSelect = "首页" Then Exit Sub
'小点的动画
Dim OldDot As Border = panPage.Children(ShowingPage)
Dim NewDot As Border = panPage.Children(ClickedPage)
AniStart({
AaWidth(OldDot, 8 - OldDot.Width, 100),
AaHeight(OldDot, 8 - OldDot.Height, 100),
AaX(OldDot, 20 * ShowingPage + 6 - OldDot.Margin.Left, 100),
AaBorderThickness(OldDot, 2 - OldDot.BorderThickness.Bottom, 60),
AaRotateTransform(OldDot, -CType(OldDot.RenderTransform, RotateTransform).Angle, 100,, New AniEaseEnd),
AaWidth(NewDot, 12 - NewDot.Width, 100),
AaHeight(NewDot, 12 - NewDot.Height, 100),
AaX(NewDot, 20 * ClickedPage + 4 - NewDot.Margin.Left, 100),
AaBorderThickness(NewDot, 6 - NewDot.BorderThickness.Bottom, 60),
AaRotateTransform(NewDot, 45 - CType(NewDot.RenderTransform, RotateTransform).Angle, 100,, New AniEaseEnd),
AaX(panTop, -ClickedPage * 2 * (230 + 15) - panTop.Margin.Left, 250,, New AniEaseEnd()),
AaX(panBottom, -ClickedPage * 2 * (230 + 15) - panBottom.Margin.Left, 250,, New AniEaseEnd())
}, "HomeLeftPushChange")
'结束
ShowingPage = ClickedPage
timerPage.Reset()
StatShow()
End Sub
Public Sub ChangeSetup() Handles panMain.Loaded
timerPage.IsEnabled = ReadIni("setup", "HomeAutoplay", "True") = "True"
HideNotfull = ReadIni("setup", "HomeFull", "True")
If timerPage.IsEnabled Then
Select Case ReadIni("setup", "raHomeAutoplaySpeed", "1")
Case "0"
timerPage.Interval = 5000
Case "1"
timerPage.Interval = 10000
Case "2"
timerPage.Interval = 20000
End Select
End If
End Sub
Private Sub timerPage_Tick() Handles timerPage.Tick
If panBottom.Children.Count >= 4 Then
Dim NewPageId As Integer = ShowingPage + 1
If NewPageId >= panPage.Children.Count Then NewPageId = 0
ChangePage(NewPageId)
End If
End Sub
End Class