PageDownloadMod.xaml.vb 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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(Storage.Results(i).ToCompItem(Loader.Input.GameVersion Is Nothing, Loader.Input.ModLoader = CompModLoaderType.Any))
  33. Next
  34. '页码
  35. CardPages.Visibility = If(Storage.Results.Count > 40 OrElse
  36. Storage.CurseForgeOffset < Storage.CurseForgeTotal OrElse Storage.ModrinthOffset < Storage.ModrinthTotal,
  37. Visibility.Visible, Visibility.Collapsed)
  38. LabPage.Text = Page + 1
  39. BtnPageFirst.IsEnabled = Page > 1
  40. BtnPageFirst.Opacity = If(Page > 1, 1, 0.2)
  41. BtnPageLeft.IsEnabled = Page > 0
  42. BtnPageLeft.Opacity = If(Page > 0, 1, 0.2)
  43. Dim IsRightEnabled As Boolean = '由于 WPF 的未知 bug,读取到的 IsEnabled 可能是错误的值(#3319)
  44. Storage.Results.Count > PageSize * (Page + 1) OrElse
  45. Storage.CurseForgeOffset < Storage.CurseForgeTotal OrElse Storage.ModrinthOffset < Storage.ModrinthTotal
  46. BtnPageRight.IsEnabled = IsRightEnabled
  47. BtnPageRight.Opacity = If(IsRightEnabled, 1, 0.2)
  48. '错误信息
  49. If Storage.ErrorMessage Is Nothing Then
  50. HintError.Visibility = Visibility.Collapsed
  51. Else
  52. HintError.Visibility = Visibility.Visible
  53. HintError.Text = Storage.ErrorMessage
  54. End If
  55. '强制返回顶部
  56. PanBack.ScrollToTop()
  57. Catch ex As Exception
  58. Log(ex, "可视化 Mod 列表出错", LogLevel.Feedback)
  59. End Try
  60. End Sub
  61. '自动重试
  62. Private Sub Load_State(sender As Object, state As MyLoading.MyLoadingState, oldState As MyLoading.MyLoadingState) Handles Load.StateChanged
  63. Select Case Loader.State
  64. Case LoadState.Failed
  65. Dim ErrorMessage As String = ""
  66. If Loader.Error IsNot Nothing Then ErrorMessage = Loader.Error.Message
  67. If ErrorMessage.Contains("不是有效的 json 文件") Then
  68. Log("[Download] 下载的 Mod 列表 json 文件损坏,已自动重试", LogLevel.Debug)
  69. PageLoaderRestart()
  70. End If
  71. End Select
  72. End Sub
  73. '切换页码
  74. Private Sub BtnPageFirst_Click(sender As Object, e As RoutedEventArgs) Handles BtnPageFirst.Click
  75. ChangePage(0)
  76. End Sub
  77. Private Sub BtnPageLeft_Click(sender As Object, e As RoutedEventArgs) Handles BtnPageLeft.Click
  78. ChangePage(Page - 1)
  79. End Sub
  80. Private Sub BtnPageRight_Click(sender As Object, e As RoutedEventArgs) Handles BtnPageRight.Click
  81. ChangePage(Page + 1)
  82. End Sub
  83. Private Sub ChangePage(NewPage As Integer)
  84. CardPages.IsEnabled = False
  85. Page = NewPage
  86. FrmMain.BackToTop()
  87. Log($"[Download] Mod 切换到第 {Page + 1} 页")
  88. RunInThread(
  89. Sub()
  90. Thread.Sleep(100) '等待向上滚的动画结束
  91. RunInUi(Sub() CardPages.IsEnabled = True)
  92. Loader.Start()
  93. End Sub)
  94. End Sub
  95. #Region "搜索"
  96. '搜索按钮
  97. Private Sub StartNewSearch() Handles BtnSearchRun.Click
  98. Page = 0
  99. If Loader.ShouldStart(LoaderInput()) Then Storage = New CompProjectStorage '避免连续搜索两次使得 CompProjectStorage 引用丢失(#1311)
  100. Loader.Start()
  101. End Sub
  102. Private Sub EnterTrigger(sender As Object, e As KeyEventArgs) Handles TextSearchName.KeyDown, TextSearchVersion.KeyDown
  103. If e.Key = Key.Enter Then StartNewSearch()
  104. End Sub
  105. '重置按钮
  106. Private Sub BtnSearchReset_Click(sender As Object, e As EventArgs) Handles BtnSearchReset.Click
  107. TextSearchName.Text = ""
  108. TextSearchVersion.Text = "全部 (也可自行输入)"
  109. TextSearchVersion.SelectedIndex = 0
  110. ComboSearchSource.SelectedIndex = 0
  111. ComboSearchTag.SelectedIndex = 0
  112. ComboSearchLoader.SelectedIndex = 0
  113. Loader.LastFinishedTime = 0 '要求强制重新开始
  114. End Sub
  115. '版本选择
  116. '#3067:当下拉菜单展开时,程序会被 WPF 挂起,因而无法更新 Grid 布局,所以必须延迟到下拉菜单收起后才能更新
  117. Private Sub TextSearchVersion_TextChanged() Handles TextSearchVersion.TextChanged
  118. If Not TextSearchVersion.IsDropDownOpen Then UpdateSearchLoaderVisibility()
  119. End Sub
  120. Private Sub UpdateSearchLoaderVisibility() Handles TextSearchVersion.DropDownClosed
  121. If TextSearchVersion.Text.Contains(".") OrElse TextSearchVersion.Text.Contains("w") Then
  122. ComboSearchLoader.Visibility = Visibility.Visible
  123. Grid.SetColumnSpan(TextSearchVersion, 1)
  124. Else
  125. ComboSearchLoader.Visibility = Visibility.Collapsed
  126. Grid.SetColumnSpan(TextSearchVersion, 2)
  127. ComboSearchLoader.SelectedIndex = 0
  128. End If
  129. End Sub
  130. #End Region
  131. End Class