MyLocalModItem.xaml.vb 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  1. Imports System.Windows.Forms
  2. Public Class MyLocalModItem
  3. #Region "基础属性"
  4. Public Uuid As Integer = GetUuid()
  5. 'Logo
  6. Public Property Logo As String
  7. Get
  8. Return PathLogo.Source
  9. End Get
  10. Set(value As String)
  11. PathLogo.Source = value
  12. End Set
  13. End Property
  14. '标题
  15. Private _Title As String
  16. Public Property Title As String
  17. Get
  18. Return _Title
  19. End Get
  20. Set(value As String)
  21. Dim RawValue = value
  22. Select Case Entry.State
  23. Case McMod.McModState.Fine
  24. LabTitle.TextDecorations = Nothing
  25. Case McMod.McModState.Disabled
  26. LabTitle.TextDecorations = TextDecorations.Strikethrough
  27. Case McMod.McModState.Unavailable
  28. LabTitle.TextDecorations = TextDecorations.Strikethrough
  29. value &= " [错误]"
  30. End Select
  31. If LabTitle.Text = value Then Exit Property
  32. LabTitle.Text = value
  33. _Title = RawValue
  34. End Set
  35. End Property
  36. '副标题
  37. Public Property SubTitle As String
  38. Get
  39. Return If(LabSubtitle?.Text, "")
  40. End Get
  41. Set(value As String)
  42. If LabSubtitle.Text = value Then Exit Property
  43. LabSubtitle.Text = value
  44. LabSubtitle.Visibility = If(value = "", Visibility.Collapsed, Visibility.Visible)
  45. End Set
  46. End Property
  47. '描述
  48. Public Property Description As String
  49. Get
  50. Return LabInfo.Text
  51. End Get
  52. Set(value As String)
  53. If LabInfo.Text = value Then Exit Property
  54. LabInfo.Text = value
  55. End Set
  56. End Property
  57. 'Tag
  58. Public WriteOnly Property Tags As List(Of String)
  59. Set(value As List(Of String))
  60. PanTags.Children.Clear()
  61. PanTags.Visibility = If(value.Any(), Visibility.Visible, Visibility.Collapsed)
  62. For Each TagText In value
  63. Dim NewTag = GetObjectFromXML(
  64. "<Border xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
  65. Background=""#0C000000"" Padding=""3,1"" CornerRadius=""3"" Margin=""0,0,3,0""
  66. SnapsToDevicePixels=""True"" UseLayoutRounding=""False"">
  67. <TextBlock Text=""" & TagText & """ Foreground=""#88000000"" FontSize=""11"" />
  68. </Border>")
  69. PanTags.Children.Add(NewTag)
  70. Next
  71. End Set
  72. End Property
  73. '相关联的 Mod
  74. Public Property Entry As McMod
  75. Get
  76. Return Tag
  77. End Get
  78. Set(value As McMod)
  79. Tag = value
  80. End Set
  81. End Property
  82. #End Region
  83. #Region "点击与勾选"
  84. '触发点击事件
  85. Public Event Click(sender As Object, e As MouseButtonEventArgs)
  86. Private Sub Button_MouseUp(sender As Object, e As MouseButtonEventArgs) Handles Me.PreviewMouseLeftButtonUp
  87. If IsMouseDown Then
  88. RaiseEvent Click(sender, e)
  89. If e.Handled Then Exit Sub
  90. Log("[Control] 按下本地 Mod 列表项:" & LabTitle.Text)
  91. End If
  92. End Sub
  93. '鼠标点击判定
  94. Private IsMouseDown As Boolean = False
  95. Private Sub Button_MouseDown(sender As Object, e As MouseButtonEventArgs) Handles Me.PreviewMouseLeftButtonDown
  96. If Not IsMouseDirectlyOver Then Exit Sub
  97. IsMouseDown = True
  98. If ButtonStack IsNot Nothing Then ButtonStack.IsHitTestVisible = False
  99. End Sub
  100. Private Sub Button_MouseLeave(sender As Object, e As Object) Handles Me.MouseLeave, Me.PreviewMouseLeftButtonUp
  101. IsMouseDown = False
  102. If ButtonStack IsNot Nothing Then ButtonStack.IsHitTestVisible = True
  103. End Sub
  104. '滑动选中
  105. Private Shared SwipeStart As Integer, SwipeEnd As Integer
  106. Private Shared Swiping As Boolean = False
  107. Private Shared SwipToState As Boolean '被滑动到的目标应将 Checked 改为此值
  108. Private Sub Button_MouseSwipeStart(sender As Object, e As Object) Handles Me.MouseLeftButtonDown
  109. If Parent Is Nothing Then Exit Sub 'Mod 可能已被删除(#3824)
  110. '开始滑动
  111. Dim Index = CType(Parent, StackPanel).Children.IndexOf(Me)
  112. SwipeStart = Index
  113. SwipeEnd = Index
  114. Swiping = True
  115. SwipToState = Not Checked
  116. FrmVersionMod.CardSelect.IsHitTestVisible = False '暂时禁用下边栏
  117. End Sub
  118. Private Sub Button_MouseSwipe(sender As Object, e As Object) Handles Me.MouseEnter, Me.MouseLeave, Me.MouseLeftButtonUp
  119. If Parent Is Nothing Then Exit Sub 'Mod 可能已被删除(#3824)
  120. '结束滑动
  121. If Mouse.LeftButton <> MouseButtonState.Pressed OrElse Not Swiping Then
  122. Swiping = False
  123. FrmVersionMod.CardSelect.IsHitTestVisible = True
  124. Exit Sub
  125. End If
  126. '计算滑动范围
  127. Dim Index = CType(Parent, StackPanel).Children.IndexOf(Me)
  128. If Index < 0 OrElse Index >= CType(Parent, StackPanel).Children.Count Then Exit Sub
  129. SwipeStart = Math.Min(SwipeStart, Index)
  130. SwipeEnd = Math.Max(SwipeEnd, Index)
  131. If SwipeStart < 0 Then SwipeStart = 0
  132. If SwipeEnd < 0 Then SwipeEnd = 0
  133. If SwipeStart >= CType(Parent, StackPanel).Children.Count Then SwipeStart = CType(Parent, StackPanel).Children.Count - 1
  134. If SwipeEnd >= CType(Parent, StackPanel).Children.Count Then SwipeEnd = CType(Parent, StackPanel).Children.Count - 1
  135. '勾选所有范围中的项
  136. If SwipeStart = SwipeEnd Then Exit Sub
  137. For i = SwipeStart To SwipeEnd
  138. Dim Item As MyLocalModItem = CType(Parent, StackPanel).Children(i)
  139. Item.InitLate(Item, e)
  140. Item.Checked = SwipToState
  141. Next
  142. End Sub
  143. '勾选状态
  144. Public Event Check(sender As Object, e As RouteEventArgs)
  145. Public Event Changed(sender As Object, e As RouteEventArgs)
  146. Private _Checked As Boolean = False
  147. Public Property Checked As Boolean
  148. Get
  149. Return _Checked
  150. End Get
  151. Set(value As Boolean)
  152. Try
  153. '触发属性值修改
  154. Dim RawValue = _Checked
  155. If value = _Checked Then Exit Property
  156. _Checked = value
  157. Dim ChangedEventArgs As New RouteEventArgs(False)
  158. If IsInitialized Then
  159. RaiseEvent Changed(Me, ChangedEventArgs)
  160. If ChangedEventArgs.Handled Then
  161. _Checked = RawValue
  162. Exit Property
  163. End If
  164. End If
  165. If value Then
  166. Dim CheckEventArgs As New RouteEventArgs(False)
  167. RaiseEvent Check(Me, CheckEventArgs)
  168. If CheckEventArgs.Handled Then Exit Property
  169. End If
  170. '更改动画
  171. If IsVisibleInForm() Then
  172. Dim Anim As New List(Of AniData)
  173. If Checked Then
  174. '由无变有
  175. Dim Delta = 32 - RectCheck.ActualHeight
  176. Anim.Add(AaHeight(RectCheck, Delta * 0.4, 200,, New AniEaseOutFluent(AniEasePower.Weak)))
  177. Anim.Add(AaHeight(RectCheck, Delta * 0.6, 300,, New AniEaseOutBack(AniEasePower.Weak)))
  178. Anim.Add(AaOpacity(RectCheck, 1 - RectCheck.Opacity, 30))
  179. RectCheck.VerticalAlignment = VerticalAlignment.Center
  180. RectCheck.Margin = New Thickness(-3, 0, 0, 0)
  181. Anim.Add(AaColor(LabTitle, TextBlock.ForegroundProperty, If(Entry.State = McMod.McModState.Fine, "ColorBrush2", "ColorBrush5"), 200))
  182. Else
  183. '由有变无
  184. Anim.Add(AaHeight(RectCheck, -RectCheck.ActualHeight, 120,, New AniEaseInFluent(AniEasePower.Weak)))
  185. Anim.Add(AaOpacity(RectCheck, -RectCheck.Opacity, 70, 40))
  186. RectCheck.VerticalAlignment = VerticalAlignment.Center
  187. Anim.Add(AaColor(LabTitle, TextBlock.ForegroundProperty, If(LabTitle.TextDecorations Is Nothing, "ColorBrush1", "ColorBrushGray4"), 120))
  188. End If
  189. AniStart(Anim, "MyLocalModItem Checked " & Uuid)
  190. Else
  191. '不在窗口上时直接设置
  192. RectCheck.VerticalAlignment = VerticalAlignment.Center
  193. RectCheck.Margin = New Thickness(-3, 0, 0, 0)
  194. If Checked Then
  195. RectCheck.Height = 32
  196. RectCheck.Opacity = 1
  197. LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = McMod.McModState.Fine, "ColorBrush2", "ColorBrush5"))
  198. Else
  199. RectCheck.Height = 0
  200. RectCheck.Opacity = 0
  201. LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = McMod.McModState.Fine, "ColorBrush1", "ColorBrushGray4"))
  202. End If
  203. AniStop("MyLocalModItem Checked " & Uuid)
  204. End If
  205. Catch ex As Exception
  206. Log(ex, "设置 Checked 失败")
  207. End Try
  208. End Set
  209. End Property
  210. #End Region
  211. #Region "后加载内容"
  212. '右下角状态指示图标
  213. Private ImgState As Image
  214. '指向背景
  215. Private _RectBack As Border = Nothing
  216. Public ReadOnly Property RectBack As Border
  217. Get
  218. If _RectBack Is Nothing Then
  219. Dim Rect As New Border With {
  220. .Name = "RectBack",
  221. .CornerRadius = New CornerRadius(3),
  222. .RenderTransform = New ScaleTransform(0.8, 0.8),
  223. .RenderTransformOrigin = New Point(0.5, 0.5),
  224. .BorderThickness = New Thickness(GetWPFSize(1)),
  225. .SnapsToDevicePixels = True,
  226. .IsHitTestVisible = False,
  227. .Opacity = 0
  228. }
  229. Rect.SetResourceReference(Border.BackgroundProperty, "ColorBrush7")
  230. Rect.SetResourceReference(Border.BorderBrushProperty, "ColorBrush6")
  231. SetColumnSpan(Rect, 999)
  232. SetRowSpan(Rect, 999)
  233. Children.Insert(0, Rect)
  234. _RectBack = Rect
  235. '<!--<Border x:Name = "RectBack" CornerRadius="3" RenderTransformOrigin="0.5,0.5" SnapsToDevicePixels="True"
  236. 'IsHitTestVisible = "False" Opacity="0" BorderThickness="1"
  237. 'Grid.ColumnSpan = "4" Background="{DynamicResource ColorBrush7}" BorderBrush="{DynamicResource ColorBrush6}"/>-->
  238. End If
  239. Return _RectBack
  240. End Get
  241. End Property
  242. '按钮
  243. Public ButtonHandler As Action(Of MyLocalModItem, EventArgs)
  244. Public ButtonStack As FrameworkElement
  245. Private _Buttons As IEnumerable(Of MyIconButton)
  246. Public Property Buttons As IEnumerable(Of MyIconButton)
  247. Get
  248. Return _Buttons
  249. End Get
  250. Set(value As IEnumerable(Of MyIconButton))
  251. _Buttons = value
  252. '移除原 Stack
  253. If ButtonStack IsNot Nothing Then
  254. Children.Remove(ButtonStack)
  255. ButtonStack = Nothing
  256. End If
  257. If Not value.Any() Then Exit Property
  258. '添加新 Stack
  259. ButtonStack = New StackPanel With {.Opacity = 0, .Margin = New Thickness(0, 0, 5, 0), .SnapsToDevicePixels = False, .Orientation = Orientation.Horizontal,
  260. .HorizontalAlignment = HorizontalAlignment.Right, .VerticalAlignment = VerticalAlignment.Center, .UseLayoutRounding = False}
  261. SetColumnSpan(ButtonStack, 10) : SetRowSpan(ButtonStack, 10)
  262. '构造按钮
  263. For Each Btn As MyIconButton In value
  264. If Btn.Height.Equals(Double.NaN) Then Btn.Height = 25
  265. If Btn.Width.Equals(Double.NaN) Then Btn.Width = 25
  266. CType(ButtonStack, StackPanel).Children.Add(Btn)
  267. Next
  268. Children.Add(ButtonStack)
  269. End Set
  270. End Property
  271. '勾选条
  272. Private _RectCheck As Border
  273. Public ReadOnly Property RectCheck As Border
  274. Get
  275. If _RectCheck Is Nothing Then
  276. _RectCheck = New Border With {.Width = 5, .Height = If(Checked, Double.NaN, 0), .CornerRadius = New CornerRadius(2, 2, 2, 2),
  277. .VerticalAlignment = If(Checked, VerticalAlignment.Stretch, VerticalAlignment.Center),
  278. .HorizontalAlignment = HorizontalAlignment.Left, .UseLayoutRounding = False, .SnapsToDevicePixels = False,
  279. .Margin = If(Checked, New Thickness(-3, 6, 0, 6), New Thickness(-3, 0, 0, 0))}
  280. _RectCheck.SetResourceReference(Border.BackgroundProperty, "ColorBrush3")
  281. SetRowSpan(_RectCheck, 10)
  282. Children.Add(_RectCheck)
  283. End If
  284. Return _RectCheck
  285. End Get
  286. End Property
  287. #End Region
  288. Private Function GetUpdateCompareDescription() As String
  289. Dim CurrentName = Entry.CompFile.FileName.Replace(".jar", "")
  290. Dim NewestName = Entry.UpdateFile.FileName.Replace(".jar", "")
  291. '简化名称对比
  292. Dim CurrentSegs = CurrentName.Split("-"c).ToList()
  293. Dim NewestSegs = NewestName.Split("-"c).ToList()
  294. Dim Shortened As Boolean = False
  295. For Each Seg In CurrentSegs.ToList()
  296. If Not NewestSegs.Contains(Seg) Then Continue For
  297. CurrentSegs.Remove(Seg)
  298. NewestSegs.Remove(Seg)
  299. Shortened = True
  300. Next
  301. If Shortened AndAlso CurrentSegs.Any() AndAlso NewestSegs.Any() Then
  302. CurrentName = Join(CurrentSegs, "-")
  303. NewestName = Join(NewestSegs, "-")
  304. Entry._Version = CurrentName '使用网络信息作为显示的版本号
  305. End If
  306. Return $"当前版本:{CurrentName}({GetTimeSpanString(Entry.CompFile.ReleaseDate - Date.Now, False)}){vbCrLf}最新版本:{NewestName}({GetTimeSpanString(Entry.UpdateFile.ReleaseDate - Date.Now, False)})"
  307. End Function
  308. Public Sub Refresh() Handles Me.Loaded
  309. RunInUi(
  310. Sub()
  311. '更新
  312. If Entry.CanUpdate Then
  313. BtnUpdate.Visibility = Visibility.Visible
  314. BtnUpdate.ToolTip = $"{GetUpdateCompareDescription()}{vbCrLf}点击以更新,右键查看更新日志。"
  315. Else
  316. BtnUpdate.Visibility = Visibility.Collapsed
  317. End If
  318. '标题与描述
  319. Dim DescFileName As String
  320. Select Case Entry.State
  321. Case McMod.McModState.Fine
  322. DescFileName = GetFileNameWithoutExtentionFromPath(Entry.Path)
  323. Case McMod.McModState.Disabled
  324. DescFileName = GetFileNameWithoutExtentionFromPath(Entry.Path.Replace(".disabled", "").Replace(".old", ""))
  325. Case Else 'McMod.McModState.Unavailable
  326. DescFileName = GetFileNameFromPath(Entry.Path)
  327. End Select
  328. Dim NewDescription As String
  329. If Setup.Get("ToolModLocalNameStyle") = 1 Then
  330. '标题显示文件名,详情显示译名
  331. '标题
  332. Title = DescFileName
  333. SubTitle = ""
  334. '描述
  335. If Entry.Comp Is Nothing Then
  336. NewDescription = Entry.Name
  337. Else
  338. Dim Titles = Entry.Comp.GetControlTitle(False)
  339. NewDescription = Titles.Key & Titles.Value
  340. End If
  341. NewDescription = NewDescription.Replace(" | ", " / ")
  342. If Entry.Version IsNot Nothing Then NewDescription &= $" ({Entry.Version})"
  343. Else
  344. '标题显示译名,详情显示文件名
  345. '标题
  346. If Entry.Comp Is Nothing Then
  347. Title = Entry.Name
  348. SubTitle = If(Entry.Version Is Nothing, "", " | " & Entry.Version)
  349. Else
  350. Dim Titles = Entry.Comp.GetControlTitle(False)
  351. Title = Titles.Key
  352. SubTitle = Titles.Value & If(Entry.Version Is Nothing, "", " | " & Entry.Version)
  353. End If
  354. '描述
  355. NewDescription = DescFileName
  356. End If
  357. If Entry.Comp IsNot Nothing Then
  358. NewDescription += ": " & Entry.Comp.Description.Replace(vbCr, "").Replace(vbLf, "")
  359. ElseIf Entry.Description IsNot Nothing Then
  360. NewDescription += ": " & Entry.Description.Replace(vbCr, "").Replace(vbLf, "")
  361. ElseIf Not Entry.IsFileAvailable Then
  362. NewDescription += ": " & "存在错误,无法获取信息"
  363. End If
  364. Description = NewDescription
  365. If Checked Then
  366. LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = McMod.McModState.Fine, "ColorBrush2", "ColorBrush5"))
  367. Else
  368. LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = McMod.McModState.Fine, "ColorBrush1", "ColorBrushGray4"))
  369. End If
  370. '主 Logo
  371. Logo = If(Entry.Comp Is Nothing, PathImage & "Icons/NoIcon.png", Entry.Comp.GetControlLogo())
  372. '图标右下角的 Logo
  373. If Entry.State = McMod.McModState.Fine Then
  374. If ImgState IsNot Nothing Then
  375. Children.Remove(ImgState)
  376. ImgState = Nothing
  377. End If
  378. Else
  379. If ImgState Is Nothing Then
  380. ImgState = New Image With {
  381. .Width = 20, .Height = 20, .Margin = New Thickness(0, 0, -5, -3), .IsHitTestVisible = False,
  382. .HorizontalAlignment = HorizontalAlignment.Right, .VerticalAlignment = VerticalAlignment.Bottom
  383. }
  384. RenderOptions.SetBitmapScalingMode(ImgState, BitmapScalingMode.HighQuality)
  385. SetColumn(ImgState, 1) : SetRow(ImgState, 1) : SetRowSpan(ImgState, 2)
  386. Children.Add(ImgState)
  387. '<Image x:Name="ImgState" RenderOptions.BitmapScalingMode="HighQuality" Width="16" Height="16" Margin="0,0,-3,-1"
  388. ' Grid.Column="1" Grid.Row="1" Grid.RowSpan="2" IsHitTestVisible="False"
  389. ' HorizontalAlignment="Right" VerticalAlignment="Bottom"
  390. ' Source="/Images/Icons/Unavailable.png" />
  391. End If
  392. ImgState.Source = New MyBitmap(PathImage & $"Icons/{Entry.State}.png")
  393. End If
  394. '标签
  395. If Entry.Comp IsNot Nothing Then Tags = Entry.Comp.Tags
  396. End Sub)
  397. End Sub
  398. Public Sub RefreshColor(sender As Object, e As EventArgs) Handles Me.MouseEnter, Me.MouseLeave, Me.MouseLeftButtonDown, Me.MouseLeftButtonUp, Me.Changed
  399. InitLate(sender, e)
  400. '触发颜色动画
  401. Dim Time As Integer = If(IsMouseOver, 120, 180)
  402. Dim Ani As New List(Of AniData)
  403. 'ButtonStack
  404. If ButtonStack IsNot Nothing Then
  405. If IsMouseOver Then
  406. Ani.Add(AaOpacity(ButtonStack, 1 - ButtonStack.Opacity, Time * 0.7, Time * 0.3))
  407. Ani.Add(AaDouble(Sub(i) ColumnPaddingRight.Width = New GridLength(Math.Max(0, ColumnPaddingRight.Width.Value + i)),
  408. 5 + Buttons.Count * 25 - ColumnPaddingRight.Width.Value, Time * 0.3, Time * 0.7))
  409. Else
  410. Ani.Add(AaOpacity(ButtonStack, -ButtonStack.Opacity, Time * 0.4))
  411. Ani.Add(AaDouble(Sub(i) ColumnPaddingRight.Width = New GridLength(Math.Max(0, ColumnPaddingRight.Width.Value + i)),
  412. 4 - ColumnPaddingRight.Width.Value, Time * 0.4))
  413. End If
  414. End If
  415. 'RectBack
  416. If IsMouseOver OrElse Checked Then
  417. Ani.AddRange({
  418. AaColor(RectBack, Border.BackgroundProperty, If(IsMouseDown, "ColorBrush6", "ColorBrushBg1"), Time),
  419. AaOpacity(RectBack, 1 - RectBack.Opacity, Time,, New AniEaseOutFluent)
  420. })
  421. If IsMouseDown Then
  422. Ani.Add(AaScaleTransform(RectBack, 0.996 - CType(RectBack.RenderTransform, ScaleTransform).ScaleX, Time * 1.2,, New AniEaseOutFluent))
  423. Else
  424. Ani.Add(AaScaleTransform(RectBack, 1 - CType(RectBack.RenderTransform, ScaleTransform).ScaleX, Time * 1.2,, New AniEaseOutFluent))
  425. End If
  426. Else
  427. Ani.AddRange({
  428. AaOpacity(RectBack, -RectBack.Opacity, Time),
  429. AaScaleTransform(RectBack, 0.996 - CType(RectBack.RenderTransform, ScaleTransform).ScaleX, Time,, New AniEaseOutFluent),
  430. AaScaleTransform(RectBack, -0.196, 1,,, True)
  431. })
  432. End If
  433. AniStart(Ani, "LocalModItem Color " & Uuid)
  434. End Sub
  435. '触发虚拟化内容
  436. Private Sub InitLate(sender As Object, e As EventArgs)
  437. If ButtonHandler IsNot Nothing Then
  438. ButtonHandler(sender, e)
  439. ButtonHandler = Nothing
  440. End If
  441. End Sub
  442. '显示更新日志
  443. Private Sub ShowUpdateLog(sender As Object, e As MouseButtonEventArgs) Handles BtnUpdate.PreviewMouseRightButtonUp
  444. e.Handled = True
  445. Dim CurseForgeUrl As String = Entry.ChangelogUrls.FirstOrDefault(Function(x) x.Contains("curseforge.com"))
  446. Dim ModrinthUrl As String = Entry.ChangelogUrls.FirstOrDefault(Function(x) x.Contains("modrinth.com"))
  447. If CurseForgeUrl Is Nothing OrElse ModrinthUrl Is Nothing Then
  448. OpenWebsite(Entry.ChangelogUrls.First)
  449. Else
  450. Select Case MyMsgBox("要在哪个网站上查看更新日志?", "查看更新日志", "Modrinth", "CurseForge", "取消")
  451. Case 1
  452. OpenWebsite(ModrinthUrl)
  453. Case 2
  454. OpenWebsite(CurseForgeUrl)
  455. End Select
  456. End If
  457. End Sub
  458. '触发更新
  459. Private Sub BtnUpdate_Click(sender As Object, e As EventArgs) Handles BtnUpdate.Click
  460. If MyMsgBox($"是否要更新 {Entry.Name}?{vbCrLf}{vbCrLf}{GetUpdateCompareDescription()}", "Mod 更新确认", "更新", "取消") = 2 Then Return
  461. FrmVersionMod.UpdateMods({Entry})
  462. End Sub
  463. '自适应(#4465)
  464. Private Sub PanTitle_SizeChanged() Handles PanTitle.SizeChanged
  465. '0:全部舒展:Auto - Auto - (Auto) - 1*
  466. '1:压缩 Subtitle:Auto - 1* - (Auto) - 0
  467. '2:继续压缩 Title:1* - 0 - (Auto) - 0
  468. Dim CurrentCompressLevel As Integer =
  469. If(ColumnExtend.Width.IsStar, 0, If(ColumnTitle.Width.IsStar, 2, 1)) 'Subtitle 可能是 Collapsed
  470. Dim NewCompressLevel As Integer
  471. Select Case CurrentCompressLevel
  472. Case 0
  473. If ColumnExtend.ActualWidth < 0.5 Then
  474. NewCompressLevel = If(LabSubtitle.Visibility = Visibility.Collapsed, 2, 1)
  475. Else
  476. Return
  477. End If
  478. Case 1
  479. If ColumnSubtitle.ActualWidth < 0.5 Then
  480. NewCompressLevel = 2
  481. ElseIf Not LabSubtitle.IsTextTrimmed Then
  482. NewCompressLevel = 0
  483. Else
  484. Return
  485. End If
  486. Case 2
  487. If Not LabTitle.IsTextTrimmed Then
  488. NewCompressLevel = If(LabSubtitle.Visibility = Visibility.Collapsed, 0, 1)
  489. Else
  490. Return
  491. End If
  492. End Select
  493. Select Case NewCompressLevel
  494. Case 0
  495. '全部舒展:Auto - Auto - (Auto) - 1*
  496. ColumnTitle.Width = GridLength.Auto
  497. ColumnSubtitle.Width = GridLength.Auto
  498. ColumnExtend.Width = New GridLength(1, GridUnitType.Star)
  499. Case 1
  500. '压缩 Subtitle:Auto - 1* - (Auto) - 0
  501. ColumnTitle.Width = GridLength.Auto
  502. ColumnSubtitle.Width = New GridLength(1, GridUnitType.Star)
  503. ColumnExtend.Width = New GridLength(0, GridUnitType.Pixel)
  504. Case 2
  505. '继续压缩 Title:1* - 0 - (Auto) - 0
  506. ColumnTitle.Width = New GridLength(1, GridUnitType.Star)
  507. ColumnSubtitle.Width = New GridLength(0, GridUnitType.Pixel)
  508. ColumnExtend.Width = New GridLength(0, GridUnitType.Pixel)
  509. End Select
  510. End Sub
  511. End Class