PageDownloadMod.xaml.vb 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. Public Class PageDownloadMod
  2. Public Const PageSize = 40
  3. '加载器信息
  4. Public Shared Loader As New LoaderTask(Of CompProjectRequest, Integer)("CompProject Mod", AddressOf CompProjectsGet, AddressOf LoaderInput) With {.ReloadTimeout = 60 * 1000}
  5. Public Shared Storage As New CompProjectStorage
  6. Public Shared Page As Integer = 0
  7. Private Sub PageDownloadMod_Inited(sender As Object, e As EventArgs) Handles Me.Initialized
  8. PageLoaderInit(Load, PanLoad, PanContent, PanAlways, Loader, AddressOf Load_OnFinish, AddressOf LoaderInput)
  9. If McVersionHighest = -1 Then McVersionHighest = Math.Max(McVersionHighest, Integer.Parse(CType(TextSearchVersion.Items(1), MyComboBoxItem).Content.ToString.Split(".")(1)))
  10. End Sub
  11. Private Shared Function LoaderInput() As CompProjectRequest
  12. Dim Request As New CompProjectRequest(CompType.Mod, Storage, (Page + 1) * PageSize)
  13. If FrmDownloadMod IsNot Nothing Then
  14. With Request
  15. .SearchText = FrmDownloadMod.TextSearchName.Text
  16. .GameVersion = If(FrmDownloadMod.TextSearchVersion.Text = "全部 (也可自行输入)", Nothing,
  17. If(FrmDownloadMod.TextSearchVersion.Text.Contains(".") OrElse FrmDownloadMod.TextSearchVersion.Text.Contains("w"), FrmDownloadMod.TextSearchVersion.Text, Nothing))
  18. .Tag = FrmDownloadMod.ComboSearchTag.SelectedItem.Tag
  19. .ModLoader = Val(FrmDownloadMod.ComboSearchLoader.SelectedItem.Tag)
  20. .Source = CType(Val(FrmDownloadMod.ComboSearchSource.SelectedItem.Tag), CompSourceType)
  21. End With
  22. End If
  23. Return Request
  24. End Function
  25. '结果 UI 化
  26. Private Sub Load_OnFinish()
  27. Try
  28. Log($"[Comp] 开始可视化 Mod 列表,已储藏 {Storage.Results.Count} 个结果,当前在第 {Page + 1} 页")
  29. '列表项
  30. PanProjects.Children.Clear()
  31. For i = Math.Min(Page * PageSize, Storage.Results.Count - 1) To Math.Min((Page + 1) * PageSize - 1, Storage.Results.Count - 1)
  32. PanProjects.Children.Add(
  33. Storage.Results(i).ToCompItem(Loader.Input.GameVersion Is Nothing,
  34. Loader.Input.ModLoader = CompModLoaderType.Any, AddressOf ProjectClick))
  35. Next
  36. '页码
  37. CardPages.Visibility = If(Storage.Results.Count > 40 OrElse
  38. Storage.CurseForgeOffset < Storage.CurseForgeTotal OrElse Storage.ModrinthOffset < Storage.ModrinthTotal,
  39. Visibility.Visible, Visibility.Collapsed)
  40. LabPage.Text = Page + 1
  41. BtnPageFirst.IsEnabled = Page > 1
  42. BtnPageFirst.Opacity = If(BtnPageFirst.IsEnabled, 1, 0.2)
  43. BtnPageLeft.IsEnabled = Page > 0
  44. BtnPageLeft.Opacity = If(BtnPageLeft.IsEnabled, 1, 0.2)
  45. BtnPageRight.IsEnabled = Storage.Results.Count > PageSize * (Page + 1) OrElse
  46. Storage.CurseForgeOffset < Storage.CurseForgeTotal OrElse Storage.ModrinthOffset < Storage.ModrinthTotal
  47. BtnPageRight.Opacity = If(BtnPageRight.IsEnabled, 1, 0.2)
  48. '强制返回顶部
  49. PanBack.ScrollToTop()
  50. Catch ex As Exception
  51. Log(ex, "可视化 Mod 列表出错", LogLevel.Feedback)
  52. End Try
  53. End Sub
  54. '自动重试
  55. Private Sub Load_State(sender As Object, state As MyLoading.MyLoadingState, oldState As MyLoading.MyLoadingState) Handles Load.StateChanged
  56. Select Case Loader.State
  57. Case LoadState.Failed
  58. Dim ErrorMessage As String = ""
  59. If Loader.Error IsNot Nothing Then ErrorMessage = Loader.Error.Message
  60. If ErrorMessage.Contains("不是有效的 json 文件") Then
  61. Log("[Download] 下载的 Mod 列表 json 文件损坏,已自动重试", LogLevel.Debug)
  62. PageLoaderRestart()
  63. End If
  64. End Select
  65. End Sub
  66. '进入详情页面
  67. Public Sub ProjectClick(sender As MyCompItem, e As EventArgs)
  68. FrmMain.PageChange(New FormMain.PageStackData With {.Page = FormMain.PageType.CompDetail, .Additional = sender.Tag})
  69. End Sub
  70. '切换页码
  71. Private Sub BtnPageFirst_Click(sender As Object, e As RoutedEventArgs) Handles BtnPageFirst.Click
  72. ChangePage(0)
  73. End Sub
  74. Private Sub BtnPageLeft_Click(sender As Object, e As RoutedEventArgs) Handles BtnPageLeft.Click
  75. ChangePage(Page - 1)
  76. End Sub
  77. Private Sub BtnPageRight_Click(sender As Object, e As RoutedEventArgs) Handles BtnPageRight.Click
  78. ChangePage(Page + 1)
  79. End Sub
  80. Private Sub ChangePage(NewPage As Integer)
  81. CardPages.IsEnabled = False
  82. Page = NewPage
  83. FrmMain.BackToTop()
  84. Log($"[Download] Mod 切换到第 {Page + 1} 页")
  85. RunInThread(Sub()
  86. Thread.Sleep(100) '等待向上滚的动画结束
  87. RunInUi(Sub() CardPages.IsEnabled = True)
  88. Loader.Start()
  89. End Sub)
  90. End Sub
  91. #Region "搜索"
  92. '搜索按钮
  93. Private Sub StartNewSearch() Handles BtnSearchRun.Click
  94. Page = 0
  95. If Loader.ShouldStart(LoaderInput()) Then Storage = New CompProjectStorage '避免连续搜索两次使得 CompProjectStorage 引用丢失(#1311)
  96. Loader.Start()
  97. End Sub
  98. Private Sub EnterTrigger(sender As Object, e As KeyEventArgs) Handles TextSearchName.KeyDown, TextSearchVersion.KeyDown
  99. If e.Key = Key.Enter Then StartNewSearch()
  100. End Sub
  101. '重置按钮
  102. Private Sub BtnSearchReset_Click(sender As Object, e As EventArgs) Handles BtnSearchReset.Click
  103. TextSearchName.Text = ""
  104. TextSearchVersion.Text = "全部 (也可自行输入)"
  105. TextSearchVersion.SelectedIndex = 0
  106. ComboSearchSource.SelectedIndex = 0
  107. ComboSearchTag.SelectedIndex = 0
  108. ComboSearchLoader.SelectedIndex = 0
  109. Loader.LastFinishedTime = 0 '要求强制重新开始
  110. End Sub
  111. '版本选择
  112. Private Sub TextSearchVersion_TextChanged(sender As Object, e As TextChangedEventArgs) Handles TextSearchVersion.TextChanged
  113. If TextSearchVersion.Text.Contains(".") OrElse TextSearchVersion.Text.Contains("w") Then
  114. ComboSearchLoader.Visibility = Visibility.Visible
  115. Grid.SetColumnSpan(TextSearchVersion, 1)
  116. Else
  117. ComboSearchLoader.Visibility = Visibility.Collapsed
  118. Grid.SetColumnSpan(TextSearchVersion, 2)
  119. ComboSearchLoader.SelectedIndex = 0
  120. End If
  121. End Sub
  122. #End Region
  123. End Class