formHomeLeft.xaml.vb 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. Public Class formHomeLeft
  2. Public LoadingItem As New ArrayList '正在加载的首页项目
  3. Public LoadedItem As New ArrayList '加载结束但没有编入随机位的首页项目
  4. Public RandomedItem As New ArrayList '已随机处理的首页项目
  5. Private ShowingCount As Integer = 0 '正在显示的首页项目计数,用于排布位置
  6. Private ShowingPage As Integer = 0 '正在显示的页码
  7. Private LoadedRefreshCount As Integer = 0 '刷新计数
  8. Public HideNotfull As Boolean = True
  9. Private Sub timerLoad_Tick() Handles timerLoad.Tick
  10. If MODE_OFFLINE Then Exit Sub
  11. '检查是否存在加载结束的项目(成功或是失败)
  12. If LoadingItem.Count > 0 Then
  13. For i = 0 To LoadingItem.Count - 1
  14. Dim item As InfoBoxSource = LoadingItem(i) '当前的InfoBox
  15. If IsNothing(item) Then Exit Sub
  16. frmStart.IsPushLoading = False
  17. Select Case item.State
  18. Case LoadState.Loaded
  19. '移动到加载结束的数组
  20. LoadingItem.Remove(item)
  21. LoadedItem.Add(item)
  22. i = i - 1
  23. Case LoadState.Failed
  24. '输出信息并移除
  25. log("[HomeLeft] 信息框加载失败:" & item.Source & " - " & item.Title, True)
  26. LoadingItem.Remove(item)
  27. i = i - 1
  28. End Select
  29. If i >= LoadingItem.Count - 1 Then Exit For
  30. Next i
  31. End If
  32. '检查是否存在可显示的项目
  33. Dim Count As Integer = 0
  34. Do While LoadedItem.Count > 0 And Count < 4
  35. Count = Count + 1
  36. '处理源
  37. Dim itemSource As InfoBoxSource = LoadedItem(RandomInteger(0, LoadedItem.Count - 1))
  38. LoadedItem.Remove(itemSource)
  39. RandomedItem.Add(itemSource)
  40. '处理新的控件
  41. Dim item As New InfoBox With {.Margin = New Thickness(0, 0, 15, 0), .UseLayoutRounding = False}
  42. item.Show(itemSource)
  43. '添加到 UI
  44. If ReadIni("setup", "HomeEnabled", "True") = "True" Then
  45. Select Case ShowingCount
  46. Case 0, 1
  47. If panTop.Children.Count < 2 Then SendStat("推荐源", "显示", item.Source & "(" & item.Title & ")") : item.IsSendStat = True
  48. panTop.Children.Add(item)
  49. ShowingCount = ShowingCount + 1
  50. Case 2
  51. If panBottom.Children.Count < 2 Then SendStat("推荐源", "显示", item.Source & "(" & item.Title & ")") : item.IsSendStat = True
  52. panBottom.Children.Add(item)
  53. ShowingCount = ShowingCount + 1
  54. Case 3
  55. If panBottom.Children.Count < 2 Then SendStat("推荐源", "显示", item.Source & "(" & item.Title & ")") : item.IsSendStat = True
  56. panBottom.Children.Add(item)
  57. ShowingCount = 0
  58. End Select
  59. End If
  60. Loop
  61. '检查是否需要刷新计数
  62. If Not RandomedItem.Count = LoadedRefreshCount Then
  63. LoadedRefreshCount = RandomedItem.Count
  64. '刷新页面计数器
  65. Dim NewPageAnimation As New ArrayList
  66. Do While panPage.Children.Count < If(HideNotfull, Math.Floor(LoadedRefreshCount / 4), Math.Floor((LoadedRefreshCount - 1) / 4) + 1)
  67. '添加新页面按钮
  68. Dim NewPage As Integer = panPage.Children.Count + 1 '新添加的页面编号
  69. 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}
  70. NewBorder.SetResourceReference(BorderBrushProperty, "Color4")
  71. panPage.Children.Add(NewBorder)
  72. '按钮动画(每一页都按次序执行动画)
  73. NewPageAnimation.AddRange({
  74. AaWidth(panPage, 20, 300, , , True),
  75. AaWidth(NewBorder, 8, 250, 50),
  76. AaHeight(NewBorder, 8, 250, 50)
  77. })
  78. Loop
  79. If NewPageAnimation.Count > 0 Then AniStart(NewPageAnimation, "HomeLeftNewPage" & GetUUID()) '点点的动画
  80. ChangeWidth()
  81. End If
  82. End Sub
  83. Public Sub ChangeWidth() Handles panMain.Loaded
  84. '如果是离线模式或者没有推荐则直接隐藏,并且还顺便改变登录页大小
  85. Dim TotalCount As Integer = LoadingItem.Count + LoadedItem.Count + RandomedItem.Count
  86. If MODE_OFFLINE Or TotalCount = 0 Or ReadIni("setup", "HomeEnabled", "True") = "False" Then
  87. panMain.Visibility = Visibility.Collapsed
  88. Else
  89. panMain.Visibility = Visibility.Visible
  90. End If
  91. End Sub
  92. Private Sub StatShow() Handles panMain.Loaded
  93. Dim IsSendStat As Boolean = RandomInteger(1, 100) = 66 '1%的情况下反馈显示推荐源信息
  94. Dim Info As InfoBox
  95. If ShowingPage * 2 < panTop.Children.Count Then
  96. Info = CType(panTop.Children(ShowingPage * 2), InfoBox)
  97. If Info.IsSendStat = False Then
  98. Info.IsSendStat = True
  99. If IsSendStat Then SendStat("推荐源", "显示", Info.Source & "(" & Info.Title & ")")
  100. End If
  101. End If
  102. If ShowingPage * 2 + 1 < panTop.Children.Count Then
  103. Info = CType(panTop.Children(ShowingPage * 2 + 1), InfoBox)
  104. If Info.IsSendStat = False Then
  105. Info.IsSendStat = True
  106. If IsSendStat Then SendStat("推荐源", "显示", Info.Source & "(" & Info.Title & ")")
  107. End If
  108. End If
  109. If ShowingPage * 2 < panBottom.Children.Count Then
  110. Info = CType(panBottom.Children(ShowingPage * 2), InfoBox)
  111. If Info.IsSendStat = False Then
  112. Info.IsSendStat = True
  113. If IsSendStat Then SendStat("推荐源", "显示", Info.Source & "(" & Info.Title & ")")
  114. End If
  115. End If
  116. If ShowingPage * 2 + 1 < panBottom.Children.Count Then
  117. Info = CType(panBottom.Children(ShowingPage * 2 + 1), InfoBox)
  118. If Info.IsSendStat = False Then
  119. Info.IsSendStat = True
  120. If IsSendStat Then SendStat("推荐源", "显示", Info.Source & "(" & Info.Title & ")")
  121. End If
  122. End If
  123. End Sub
  124. ''' <summary>
  125. ''' 切换页面的点击事件。
  126. ''' </summary>
  127. ''' <param name="sender"></param>
  128. ''' <param name="e"></param>
  129. ''' <remarks></remarks>
  130. Private Sub panPage_MouseLeftButtonDown(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles panPage.MouseLeftButtonDown
  131. '初始化
  132. Dim ClickedPage As Integer = Math.Floor(e.GetPosition(panPage).X / 20)
  133. If ClickedPage = ShowingPage Then Exit Sub
  134. ChangePage(ClickedPage)
  135. End Sub
  136. Private Sub ChangePage(ByVal ClickedPage As Integer)
  137. If Not frmMain.PageSelect = "首页" Then Exit Sub
  138. '小点的动画
  139. Dim OldDot As Border = panPage.Children(ShowingPage)
  140. Dim NewDot As Border = panPage.Children(ClickedPage)
  141. AniStart({
  142. AaWidth(OldDot, 8 - OldDot.Width, 100),
  143. AaHeight(OldDot, 8 - OldDot.Height, 100),
  144. AaX(OldDot, 20 * ShowingPage + 6 - OldDot.Margin.Left, 100),
  145. AaBorderThickness(OldDot, 2 - OldDot.BorderThickness.Bottom, 60),
  146. AaRotateTransform(OldDot, -CType(OldDot.RenderTransform, RotateTransform).Angle, 100,, New AniEaseEnd),
  147. AaWidth(NewDot, 12 - NewDot.Width, 100),
  148. AaHeight(NewDot, 12 - NewDot.Height, 100),
  149. AaX(NewDot, 20 * ClickedPage + 4 - NewDot.Margin.Left, 100),
  150. AaBorderThickness(NewDot, 6 - NewDot.BorderThickness.Bottom, 60),
  151. AaRotateTransform(NewDot, 45 - CType(NewDot.RenderTransform, RotateTransform).Angle, 100,, New AniEaseEnd),
  152. AaX(panTop, -ClickedPage * 2 * (230 + 15) - panTop.Margin.Left, 250,, New AniEaseEnd()),
  153. AaX(panBottom, -ClickedPage * 2 * (230 + 15) - panBottom.Margin.Left, 250,, New AniEaseEnd())
  154. }, "HomeLeftPushChange")
  155. '结束
  156. ShowingPage = ClickedPage
  157. timerPage.Reset()
  158. StatShow()
  159. End Sub
  160. Public Sub ChangeSetup() Handles panMain.Loaded
  161. timerPage.IsEnabled = ReadIni("setup", "HomeAutoplay", "True") = "True"
  162. HideNotfull = ReadIni("setup", "HomeFull", "True")
  163. If timerPage.IsEnabled Then
  164. Select Case ReadIni("setup", "raHomeAutoplaySpeed", "1")
  165. Case "0"
  166. timerPage.Interval = 5000
  167. Case "1"
  168. timerPage.Interval = 10000
  169. Case "2"
  170. timerPage.Interval = 20000
  171. End Select
  172. End If
  173. End Sub
  174. Private Sub timerPage_Tick() Handles timerPage.Tick
  175. If panBottom.Children.Count >= 4 Then
  176. Dim NewPageId As Integer = ShowingPage + 1
  177. If NewPageId >= panPage.Children.Count Then NewPageId = 0
  178. ChangePage(NewPageId)
  179. End If
  180. End Sub
  181. End Class