PageDownloadMod.xaml.vb 6.8 KB

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