feat: 改成龙猫想要的样子

This commit is contained in:
tangge233
2024-08-05 13:32:36 +08:00
parent c0a966f212
commit cfe925c667
2 changed files with 87 additions and 89 deletions
@@ -7,7 +7,8 @@
<Grid> <Grid>
<Grid x:Name="PanAllBack"> <Grid x:Name="PanAllBack">
<local:MyScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" x:Name="PanBack"> <local:MyScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" x:Name="PanBack">
<StackPanel x:Name="PanMain" Margin="25,10,25,10" Grid.IsSharedSizeScope="True"> <!-- 若显示多选模块则为 92 --> <StackPanel x:Name="PanMain" Margin="25,10,25,10" Grid.IsSharedSizeScope="True">
<!-- 若显示多选模块则为 92 -->
<local:MySearchBox Margin="0,15" HintText="搜索 Mod 名称 / 描述 / 标签" x:Name="SearchBox" /> <local:MySearchBox Margin="0,15" HintText="搜索 Mod 名称 / 描述 / 标签" x:Name="SearchBox" />
<local:MyCard Grid.Row="0" Margin="0,0,0,15" x:Name="PanManage"> <local:MyCard Grid.Row="0" Margin="0,0,0,15" x:Name="PanManage">
<Grid Margin="15,15,0,15" Height="35"> <Grid Margin="15,15,0,15" Height="35">
@@ -23,17 +24,15 @@
<local:MyButton x:Name="BtnManageCheck" Grid.Column="3" MinWidth="140" Text="检查 Mod" Padding="13,0" Margin="0,0,20,0" HorizontalAlignment="Left" ToolTip="快速检查 Mod 的版本要求、重复、前置缺失等问题。&#xa;结果仅供参考,由于部分 Mod 标注的信息有误,可能并不准确。" Visibility="Collapsed" /> <local:MyButton x:Name="BtnManageCheck" Grid.Column="3" MinWidth="140" Text="检查 Mod" Padding="13,0" Margin="0,0,20,0" HorizontalAlignment="Left" ToolTip="快速检查 Mod 的版本要求、重复、前置缺失等问题。&#xa;结果仅供参考,由于部分 Mod 标注的信息有误,可能并不准确。" Visibility="Collapsed" />
</Grid> </Grid>
</local:MyCard> </local:MyCard>
<local:MyCard x:Name="PanUpdateListBack" VerticalAlignment="Top" Opacity="0" Margin="0,0,0,15" Title=" " MinHeight="40" CanSwap="True"> <local:MyCard x:Name="PanListBack" VerticalAlignment="Top" Opacity="0" Margin="0,0,0,15" Title=" " MinHeight="40">
<StackPanel Margin="20,38,18,18" Name="PanUpdateList" VerticalAlignment="Top" /> <StackPanel Margin="13" Orientation="Horizontal" VerticalAlignment="Top" HorizontalAlignment="Right" Height="20">
</local:MyCard> <local:MyTextButton Height="20" Margin="4,0" Tag="All" Text="全部" x:Name="BtnTypeAll"/>
<local:MyCard x:Name="PanDefaultListBack" VerticalAlignment="Top" Opacity="0" Margin="0,0,0,15" Title=" " MinHeight="40" CanSwap="True"> <local:MyTextButton Height="20" Margin="4,0" Tag="Enabled" Text="已启用" x:Name="BtnTypeEnabled"/>
<StackPanel Margin="20,38,18,18" Name="PanDefaultList" VerticalAlignment="Top" /> <local:MyTextButton Height="20" Margin="4,0" Tag="Disabled" Text="已禁用" x:Name="BtnTypeDisabled"/>
</local:MyCard> <local:MyTextButton Height="20" Margin="4,0" Tag="CanUpdate" Text="可更新" x:Name="BtnTypeCanUpdate"/>
<local:MyCard x:Name="PanDisabledListBack" VerticalAlignment="Top" Opacity="0" Margin="0,0,0,15" Title=" " MinHeight="40" CanSwap="True"> <local:MyTextButton Height="20" Margin="4,0" Tag="Error" Text="错误" x:Name="BtnTypeError"/>
<StackPanel Margin="20,38,18,18" Name="PanDisabledList" VerticalAlignment="Top" /> </StackPanel>
</local:MyCard> <StackPanel Margin="20,38,18,18" Name="PanList" VerticalAlignment="Top" />
<local:MyCard x:Name="PanUnavaliableListBack" VerticalAlignment="Top" Opacity="0" Margin="0,0,0,15" Title=" " MinHeight="40" CanSwap="True">
<StackPanel Margin="20,38,18,18" Name="PanUnavaliableList" VerticalAlignment="Top" />
</local:MyCard> </local:MyCard>
</StackPanel> </StackPanel>
</local:MyScrollViewer> </local:MyScrollViewer>
@@ -25,6 +25,7 @@
''' 刷新 Mod 列表。 ''' 刷新 Mod 列表。
''' </summary> ''' </summary>
Public Sub RefreshList(Optional ForceReload As Boolean = False) Public Sub RefreshList(Optional ForceReload As Boolean = False)
ViewModType = "All"
If LoaderFolderRun(McModLoader, PageVersionLeft.Version.PathIndie & "mods\", If(ForceReload, LoaderFolderRunType.ForceRun, LoaderFolderRunType.RunOnUpdated)) Then If LoaderFolderRun(McModLoader, PageVersionLeft.Version.PathIndie & "mods\", If(ForceReload, LoaderFolderRunType.ForceRun, LoaderFolderRunType.RunOnUpdated)) Then
Log("[System] 已刷新 Mod 列表") Log("[System] 已刷新 Mod 列表")
PanBack.ScrollToHome() PanBack.ScrollToHome()
@@ -125,49 +126,68 @@
''' 刷新结果显示。 ''' 刷新结果显示。
''' </summary> ''' </summary>
Private Sub RefreshResult(Mods As List(Of McMod)) Private Sub RefreshResult(Mods As List(Of McMod))
PanDefaultList.Children.Clear() Dim ShowMods As List(Of McMod) = New List(Of McMod)
PanDisabledList.Children.Clear() Select Case ViewModType
PanUpdateList.Children.Clear() Case "All"
PanUnavaliableList.Children.Clear() ShowMods = Mods
For Each TargetMod In Mods Case "Enabled"
If TargetMod.CanUpdate Then For Each Item In Mods
PanUpdateList.Children.Add(ModItems(TargetMod.RawFileName)) If Item.State.Equals(McMod.McModState.Fine) Then ShowMods.Add(Item)
ElseIf TargetMod.State.Equals(McMod.McModState.Fine) Then Next
PanDefaultList.Children.Add(ModItems(TargetMod.RawFileName)) Case "Disabled"
ElseIf TargetMod.State.Equals(McMod.McModState.Disabled) Then For Each Item In Mods
PanDisabledList.Children.Add(ModItems(TargetMod.RawFileName)) If Item.State.Equals(McMod.McModState.Disabled) Then ShowMods.Add(Item)
Else Next
PanUnavaliableList.Children.Add(ModItems(TargetMod.RawFileName)) Case "CanUpdate"
For Each Item In Mods
If Item.CanUpdate Then ShowMods.Add(Item)
Next
Case "Error"
For Each Item In Mods
If Item.State.Equals(McMod.McModState.Unavaliable) Then ShowMods.Add(Item)
Next
End Select
PanList.Children.Clear()
For Each TargetMod In ShowMods
PanList.Children.Add(ModItems(TargetMod.RawFileName))
Next
Dim ModEnabled As Integer = 0
Dim ModDisabled As Integer = 0
Dim ModCanUpdate As Integer = 0
Dim ModError As Integer = 0
For Each ModItem In ModItems
If ModItem.Value.Entry.CanUpdate Then
ModCanUpdate += 1
End If
If ModItem.Value.Entry.State.Equals(McMod.McModState.Fine) Then
ModEnabled += 1
End If
If ModItem.Value.Entry.State.Equals(McMod.McModState.Disabled) Then
ModDisabled += 1
End If
If ModItem.Value.Entry.State.Equals(McMod.McModState.Unavaliable) Then
ModError += 1
End If End If
Next Next
BtnTypeAll.Text = $"全部({ModEnabled + ModDisabled + ModCanUpdate + ModError})"
BtnTypeCanUpdate.Text = $"可更新({ModCanUpdate})"
BtnTypeEnabled.Text = $"已启用({ModEnabled})"
BtnTypeDisabled.Text = $"已禁用({ModDisabled})"
BtnTypeError.Text = $"错误({ModError})"
RefreshTitle() RefreshTitle()
End Sub End Sub
''' <summary> ''' <summary>
''' 刷新卡片标题。 ''' 刷新卡片标题。
''' </summary> ''' </summary>
Private Sub RefreshTitle() Private Sub RefreshTitle()
RefreshTargetTitle(PanDefaultListBack, PanDefaultList, "已启用 Mod")
RefreshTargetTitle(PanUpdateListBack, PanUpdateList, "可更新 Mod")
'没有可以更新的 Mod 就暂时隐藏卡片
PanUpdateListBack.Visibility = If(PanUpdateList.Children.Count.Equals(0), Visibility.Collapsed, Visibility.Visible)
RefreshTargetTitle(PanDisabledListBack, PanDisabledList, "已禁用的 Mod")
RefreshTargetTitle(PanUnavaliableListBack, PanUnavaliableList, "暂不可用 Mod")
End Sub
Private Sub RefreshTargetTitle(Card As MyCard, List As StackPanel, Name As String)
Dim Mods = List.Children.Cast(Of MyLocalModItem).ToList
If Not IsSearching Then If Not IsSearching Then
Card.Title = Name & " 列表 (" & Mods.Count & ")" PanListBack.Title = "Mod 列表 (" & PanList.Children.Count & ")"
ElseIf Mods.Any() Then ElseIf PanList.Children.Count > 0 Then
Card.Title = Name & " 列表搜索结果 (" & Mods.Count & ")" PanListBack.Title = "搜索结果 (" & PanList.Children.Count & ")"
Else Else
Card.Title = Name & " 列表无搜索结果" PanListBack.Title = "无搜索结果"
End If End If
Dim IsContainItem As Boolean = Mods.Any() PanList.Visibility = If(PanList.Children.Count > 0, Visibility.Visible, Visibility.Collapsed)
List.Visibility = If(IsContainItem, Visibility.Visible, Visibility.Collapsed)
'CanSwap 设置无效果,不知道为什么
Card.CanSwap = IsContainItem
Card.IsSwaped = Not IsContainItem
End Sub End Sub
#End Region #End Region
@@ -208,7 +228,7 @@
''' 全选。 ''' 全选。
''' </summary> ''' </summary>
Private Sub BtnManageSelectAll_Click(sender As Object, e As MouseButtonEventArgs) Handles BtnManageSelectAll.Click Private Sub BtnManageSelectAll_Click(sender As Object, e As MouseButtonEventArgs) Handles BtnManageSelectAll.Click
If SelectedMods.Count < PanDefaultList.Children.Count + PanUnavaliableList.Children.Count + PanUpdateList.Children.Count + PanDisabledList.Children.Count Then If SelectedMods.Count < PanList.Children.Count Then
ChangeAllSelected(True) ChangeAllSelected(True)
Else Else
ChangeAllSelected(False) ChangeAllSelected(False)
@@ -317,23 +337,14 @@
Private Sub ChangeAllSelected(Value As Boolean) Private Sub ChangeAllSelected(Value As Boolean)
AniControlEnabled += 1 AniControlEnabled += 1
SelectedMods.Clear() SelectedMods.Clear()
ChangeTargetListSeleted(PanUpdateListBack, PanUpdateList, Value) For Each Item As MyLocalModItem In PanList.Children
ChangeTargetListSeleted(PanDisabledListBack, PanDisabledList, Value) Item.Checked = Value
ChangeTargetListSeleted(PanUnavaliableListBack, PanUnavaliableList, Value) If Value Then SelectedMods.Add(Item.Entry.RawFileName)
ChangeTargetListSeleted(PanDefaultListBack, PanDefaultList, Value) Next
AniControlEnabled -= 1 AniControlEnabled -= 1
'更新下边栏 UI '更新下边栏 UI
RefreshBottomBar() RefreshBottomBar()
End Sub End Sub
Private Sub ChangeTargetListSeleted(Card As MyCard, List As StackPanel, Value As Boolean)
If Value.Equals(True) Then Card.IsSwaped = False
For Each Item As MyLocalModItem In List.Children
Item.Checked = Value
If Value Then SelectedMods.Add(Item.Entry.RawFileName)
Next
End Sub
Private Sub UnselectedAllWithAnimation() Handles Load.StateChanged, Me.PageExit Private Sub UnselectedAllWithAnimation() Handles Load.StateChanged, Me.PageExit
Dim CacheAniControlEnabled = AniControlEnabled Dim CacheAniControlEnabled = AniControlEnabled
AniControlEnabled = 0 AniControlEnabled = 0
@@ -344,6 +355,17 @@
If My.Computer.Keyboard.CtrlKeyDown AndAlso e.Key = Key.A Then ChangeAllSelected(True) If My.Computer.Keyboard.CtrlKeyDown AndAlso e.Key = Key.A Then ChangeAllSelected(True)
End Sub End Sub
Private ViewModType As String = "All"
Private Sub ChangeViewType(sender As MyTextButton, e As EventArgs) Handles BtnTypeAll.Click, BtnTypeCanUpdate.Click, BtnTypeDisabled.Click, BtnTypeEnabled.Click, BtnTypeError.Click
ViewModType = sender.Tag
If IsSearching Then
SearchRun()
Else
RefreshResult(McModLoader.Output)
End If
End Sub
#End Region #End Region
#Region "下边栏" #Region "下边栏"
@@ -353,6 +375,7 @@
EDMods(McModLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName)), EDMods(McModLoader.Output.Where(Function(m) SelectedMods.Contains(m.RawFileName)),
Not sender.Equals(BtnSelectDisable)) Not sender.Equals(BtnSelectDisable))
ChangeAllSelected(False) ChangeAllSelected(False)
RefreshResult(McModLoader.Output)
End Sub End Sub
Private Sub EDMods(ModList As IEnumerable(Of McMod), IsEnable As Boolean) Private Sub EDMods(ModList As IEnumerable(Of McMod), IsEnable As Boolean)
Dim IsSuccessful As Boolean = True Dim IsSuccessful As Boolean = True
@@ -402,27 +425,10 @@
'更改 UI 中的列表 '更改 UI 中的列表
Dim NewItem As MyLocalModItem = McModListItem(NewModEntity) Dim NewItem As MyLocalModItem = McModListItem(NewModEntity)
ModItems(ModEntity.RawFileName) = NewItem ModItems(ModEntity.RawFileName) = NewItem
If ModEntity.CanUpdate Then Dim IndexOfUi As Integer = PanList.Children.IndexOf(PanList.Children.OfType(Of MyLocalModItem).FirstOrDefault(Function(i) i.Entry Is ModEntity))
Dim IndexOfUi As Integer = PanUpdateList.Children.IndexOf(PanUpdateList.Children.OfType(Of MyLocalModItem).FirstOrDefault(Function(i) i.Entry Is ModEntity)) If IndexOfUi = -1 Then Continue For '因为未知原因 Mod 的状态已经切换完了
If IndexOfUi = -1 Then Continue For '因为未知原因 Mod 的状态已经切换完了 PanList.Children.RemoveAt(IndexOfUi)
PanUpdateList.Children.RemoveAt(IndexOfUi) PanList.Children.Insert(IndexOfUi, NewItem)
PanUpdateList.Children.Insert(IndexOfUi, NewItem)
ElseIf ModEntity.State.Equals(McMod.McModState.Fine) Then '启用 → 禁用
Dim IndexOfUi As Integer = PanDefaultList.Children.IndexOf(PanDefaultList.Children.OfType(Of MyLocalModItem).FirstOrDefault(Function(i) i.Entry Is ModEntity))
If IndexOfUi = -1 Then Continue For '因为未知原因 Mod 的状态已经切换完了
PanDefaultList.Children.RemoveAt(IndexOfUi)
PanDisabledList.Children.Add(NewItem)
ElseIf ModEntity.State.Equals(McMod.McModState.Disabled) Then '禁用 → 启用
Dim IndexOfUi As Integer = PanDisabledList.Children.IndexOf(PanDisabledList.Children.OfType(Of MyLocalModItem).FirstOrDefault(Function(i) i.Entry Is ModEntity))
If IndexOfUi = -1 Then Continue For '因为未知原因 Mod 的状态已经切换完了
PanDisabledList.Children.RemoveAt(IndexOfUi)
PanDefaultList.Children.Add(NewItem)
Else
Dim IndexOfUi As Integer = PanUnavaliableList.Children.IndexOf(PanUnavaliableList.Children.OfType(Of MyLocalModItem).FirstOrDefault(Function(i) i.Entry Is ModEntity))
If IndexOfUi = -1 Then Continue For '因为未知原因 Mod 的状态已经切换完了
PanUnavaliableList.Children.RemoveAt(IndexOfUi)
PanUnavaliableList.Children.Insert(IndexOfUi, NewItem)
End If
Next Next
RefreshTitle() '改变数量显示 RefreshTitle() '改变数量显示
If Not IsSuccessful Then If Not IsSuccessful Then
@@ -441,7 +447,6 @@
''' 记录正在进行 Mod 更新的 mods 文件夹路径。 ''' 记录正在进行 Mod 更新的 mods 文件夹路径。
''' </summary> ''' </summary>
Public Shared UpdatingVersions As New List(Of String) Public Shared UpdatingVersions As New List(Of String)
Public Sub UpdateMods(ModList As IEnumerable(Of McMod)) Public Sub UpdateMods(ModList As IEnumerable(Of McMod))
'更新前警告 '更新前警告
If Not Setup.Get("HintUpdateMod") Then If Not Setup.Get("HintUpdateMod") Then
@@ -592,20 +597,14 @@
'更改 Loader 和 UI 中的列表 '更改 Loader 和 UI 中的列表
McModLoader.Output.Remove(ModEntity) McModLoader.Output.Remove(ModEntity)
ModItems.Remove(ModEntity.RawFileName) ModItems.Remove(ModEntity.RawFileName)
Dim IndexOfUi As Integer = PanDefaultList.Children.IndexOf(PanDefaultList.Children.OfType(Of MyLocalModItem).FirstOrDefault(Function(i) i.Entry.Equals(ModEntity))) Dim IndexOfUi As Integer = PanList.Children.IndexOf(PanList.Children.OfType(Of MyLocalModItem).FirstOrDefault(Function(i) i.Entry.Equals(ModEntity)))
If IndexOfUi >= 0 Then PanDefaultList.Children.RemoveAt(IndexOfUi) If IndexOfUi >= 0 Then PanList.Children.RemoveAt(IndexOfUi)
IndexOfUi = PanUpdateList.Children.IndexOf(PanUpdateList.Children.OfType(Of MyLocalModItem).FirstOrDefault(Function(i) i.Entry.Equals(ModEntity)))
If IndexOfUi >= 0 Then PanUpdateList.Children.RemoveAt(IndexOfUi)
IndexOfUi = PanDisabledList.Children.IndexOf(PanDisabledList.Children.OfType(Of MyLocalModItem).FirstOrDefault(Function(i) i.Entry.Equals(ModEntity)))
If IndexOfUi >= 0 Then PanDisabledList.Children.RemoveAt(IndexOfUi)
IndexOfUi = PanUnavaliableList.Children.IndexOf(PanUnavaliableList.Children.OfType(Of MyLocalModItem).FirstOrDefault(Function(i) i.Entry.Equals(ModEntity)))
If IndexOfUi >= 0 Then PanUnavaliableList.Children.RemoveAt(IndexOfUi)
Next Next
RefreshTitle() RefreshTitle()
If Not IsSuccessful Then If Not IsSuccessful Then
Hint("由于文件被占用,Mod 删除失败,请尝试关闭正在运行的游戏后再试!", HintType.Critical) Hint("由于文件被占用,Mod 删除失败,请尝试关闭正在运行的游戏后再试!", HintType.Critical)
RefreshList(True) RefreshList(True)
ElseIf PanDefaultList.Children.Count + PanUpdateList.Children.Count + PanDisabledList.Children.Count + PanUnavaliableList.Children.Count = 0 Then ElseIf PanList.Children.Count = 0 Then
RefreshList(True) '删除了全部文件 RefreshList(True) '删除了全部文件
Else Else
RefreshBottomBar() RefreshBottomBar()