💥 🚸 显示部分选中的文件夹

This commit is contained in:
youzi-2333
2024-07-23 08:49:19 +08:00
parent 43511b0a49
commit 1095a33a44
3 changed files with 66 additions and 21 deletions
@@ -344,7 +344,16 @@
Return _Checked Return _Checked
End Get End Get
Set(value As Boolean) Set(value As Boolean)
SetChecked(value, False, True) SetChecked(value, False, True, _Half)
End Set
End Property
Private _Half As Boolean = False
Public Property Half As Boolean
Get
Return _Half
End Get
Set(value As Boolean)
SetChecked(_Checked, False, True, value)
End Set End Set
End Property End Property
''' <summary> ''' <summary>
@@ -353,7 +362,8 @@
''' <param name="value">新的 Checked 属性。</param> ''' <param name="value">新的 Checked 属性。</param>
''' <param name="user">是否由用户引发。</param> ''' <param name="user">是否由用户引发。</param>
''' <param name="anime">是否执行动画。</param> ''' <param name="anime">是否执行动画。</param>
Public Sub SetChecked(value As Boolean, user As Boolean, anime As Boolean) ''' <param name="half">是否为部分选中。</param>
Public Sub SetChecked(value As Boolean, user As Boolean, anime As Boolean, Optional half As Boolean = False)
Try Try
'自定义属性基础 '自定义属性基础
@@ -371,8 +381,9 @@
End If End If
_Checked = value _Checked = value
Else Else
If value = _Checked Then Exit Sub If value = _Checked AndAlso half = _Half Then Exit Sub
_Checked = value _Checked = value
_Half = half
If IsInitialized Then If IsInitialized Then
RaiseEvent Changed(Me, ChangedEventArgs) RaiseEvent Changed(Me, ChangedEventArgs)
If ChangedEventArgs.Handled Then If ChangedEventArgs.Handled Then
@@ -436,9 +447,9 @@
'由无变有 '由无变有
If Not IsNothing(RectCheck) Then If Not IsNothing(RectCheck) Then
Dim Delta = ActualHeight - RectCheck.ActualHeight - 12 Dim Delta = ActualHeight - RectCheck.ActualHeight - 12
Anim.Add(AaHeight(RectCheck, Delta * 0.4, 200,, New AniEaseOutFluent(AniEasePower.Weak))) Anim.Add(AaHeight(RectCheck, Delta * If(half, 0.2, 0.4), 200,, New AniEaseOutFluent(AniEasePower.Weak)))
Anim.Add(AaHeight(RectCheck, Delta * 0.6, 300,, New AniEaseOutBack(AniEasePower.Weak))) Anim.Add(AaHeight(RectCheck, Delta * If(half, 0.3, 0.6), 300,, New AniEaseOutBack(AniEasePower.Weak)))
Anim.Add(AaOpacity(RectCheck, 1 - RectCheck.Opacity, 30)) Anim.Add(AaOpacity(RectCheck, If(half, 0.5, 1) - RectCheck.Opacity, 30))
RectCheck.VerticalAlignment = VerticalAlignment.Center RectCheck.VerticalAlignment = VerticalAlignment.Center
RectCheck.Margin = New Thickness(-1, 0, 0, 0) RectCheck.Margin = New Thickness(-1, 0, 0, 0)
End If End If
@@ -457,12 +468,17 @@
Else Else
'不使用动画 '不使用动画
AniStop("MyListItem Checked " & Uuid) AniStop("MyListItem Checked " & Uuid)
If Checked Then
If Checked OrElse half Then
If Not IsNothing(RectCheck) Then If Not IsNothing(RectCheck) Then
RectCheck.Height = Double.NaN RectCheck.Height = Double.NaN
RectCheck.Margin = New Thickness(-1, 6, 0, 6) RectCheck.Margin = New Thickness(-1, 6, 0, 6)
RectCheck.Opacity = 1 RectCheck.Opacity = 1
RectCheck.VerticalAlignment = VerticalAlignment.Stretch RectCheck.VerticalAlignment = VerticalAlignment.Stretch
If half Then
RectCheck.Height = Height * 0.4
RectCheck.Opacity = 0.5
End If
End If End If
SetResourceReference(ForegroundProperty, If(Height < 40, "ColorBrush3", "ColorBrush2")) SetResourceReference(ForegroundProperty, If(Height < 40, "ColorBrush3", "ColorBrush2"))
Else Else
@@ -115,7 +115,7 @@
</local:MyCard> </local:MyCard>
<local:MyCard x:Name="CardMore" Title="高级选项" Margin="0,0,0,15" CanSwap="True" IsSwaped="True"> <local:MyCard x:Name="CardMore" Title="高级选项" Margin="0,0,0,15" CanSwap="True" IsSwaped="True">
<StackPanel x:Name="PanFileList" Margin="25,40,23,15"> <StackPanel x:Name="PanFileList" Margin="25,40,23,15">
<TextBlock Margin="0,1,0,10" Text="你可以在此勾选需要包含进整合包的文件或文件夹。" TextWrapping="Wrap" /> <TextBlock Margin="0,1,0,10" Text="你可以在此勾选其他需要包含进整合包的文件或文件夹。&#xa;请注意:部分冗余的文件或文件夹、必须包含在整合包的文件或文件夹不被展示在列表中。" TextWrapping="Wrap" />
<local:MyListItem Type="CheckBox" Title="游戏存档" Height="35" Logo="M889.018182 418.909091H884.363636V316.509091a93.090909 93.090909 0 0 0-99.607272-89.832727h-302.545455l-93.090909-76.334546A46.545455 46.545455 0 0 0 358.865455 139.636364H146.152727A93.090909 93.090909 0 0 0 46.545455 229.469091V837.818182a46.545455 46.545455 0 0 0 46.545454 46.545454 46.545455 46.545455 0 0 0 16.756364-3.258181 109.381818 109.381818 0 0 0 25.134545 3.258181h586.472727a85.178182 85.178182 0 0 0 87.04-63.301818l163.374546-302.545454a46.545455 46.545455 0 0 0 5.585454-21.876364A82.385455 82.385455 0 0 0 889.018182 418.909091z m-744.727273-186.181818h198.283636l93.09091 76.334545a46.545455 46.545455 0 0 0 29.323636 10.705455h319.301818a12.101818 12.101818 0 0 1 6.516364 0V418.909091H302.545455a85.178182 85.178182 0 0 0-87.04 63.301818L139.636364 622.778182V232.727273a19.549091 19.549091 0 0 1 6.516363 0z m578.094546 552.029091a27.461818 27.461818 0 0 0-2.792728 6.516363H154.530909l147.083636-272.290909a27.461818 27.461818 0 0 0 2.792728-6.981818h565.061818z" /> <local:MyListItem Type="CheckBox" Title="游戏存档" Height="35" Logo="M889.018182 418.909091H884.363636V316.509091a93.090909 93.090909 0 0 0-99.607272-89.832727h-302.545455l-93.090909-76.334546A46.545455 46.545455 0 0 0 358.865455 139.636364H146.152727A93.090909 93.090909 0 0 0 46.545455 229.469091V837.818182a46.545455 46.545455 0 0 0 46.545454 46.545454 46.545455 46.545455 0 0 0 16.756364-3.258181 109.381818 109.381818 0 0 0 25.134545 3.258181h586.472727a85.178182 85.178182 0 0 0 87.04-63.301818l163.374546-302.545454a46.545455 46.545455 0 0 0 5.585454-21.876364A82.385455 82.385455 0 0 0 889.018182 418.909091z m-744.727273-186.181818h198.283636l93.09091 76.334545a46.545455 46.545455 0 0 0 29.323636 10.705455h319.301818a12.101818 12.101818 0 0 1 6.516364 0V418.909091H302.545455a85.178182 85.178182 0 0 0-87.04 63.301818L139.636364 622.778182V232.727273a19.549091 19.549091 0 0 1 6.516363 0z m578.094546 552.029091a27.461818 27.461818 0 0 0-2.792728 6.516363H154.530909l147.083636-272.290909a27.461818 27.461818 0 0 0 2.792728-6.981818h565.061818z" />
<local:MyListItem Type="CheckBox" Title="游戏存档" Height="35" Logo="M586.9 436h-74.7V62.4H177.1c-20.6 0-37.4 16.7-37.4 37.4v821.9c0 20.6 16.7 37.4 37.4 37.4h672.5c20.6 0 37.4-16.7 37.4-37.4V436H586.9z m0-74.7h297.8c-7.3-57.4-31.2-70.9-58.4-98.1l-66.5-66.5-0.1-0.1 0.1 0.1-0.9-0.9-22.8-22.8-0.9-0.9 0.1 0.1-0.1-0.1-66.5-66.5c-21.8-21.8-38.8-36.5-81.7-41.4l-0.1 297.1z" /> <local:MyListItem Type="CheckBox" Title="游戏存档" Height="35" Logo="M586.9 436h-74.7V62.4H177.1c-20.6 0-37.4 16.7-37.4 37.4v821.9c0 20.6 16.7 37.4 37.4 37.4h672.5c20.6 0 37.4-16.7 37.4-37.4V436H586.9z m0-74.7h297.8c-7.3-57.4-31.2-70.9-58.4-98.1l-66.5-66.5-0.1-0.1 0.1 0.1-0.9-0.9-22.8-22.8-0.9-0.9 0.1 0.1-0.1-0.1-66.5-66.5c-21.8-21.8-38.8-36.5-81.7-41.4l-0.1 297.1z" />
<local:MyListItem Type="CheckBox" Title="游戏存档" Height="35" Logo="M757.792745 435.407215L419.597482 96.904967c-40.010393-40.010393-104.886579-40.010393-144.896972 0-40.010393 40.010393-40.010393 104.988908 0 144.9993L540.344959 507.855701 274.70051 773.807135c-40.010393 40.112721-40.010393 104.988908 0 144.9993 40.010393 40.010393 104.886579 40.010393 144.896972 0l338.092935-338.39992c40.112721-40.010393 40.112721-104.988908 0.102328-144.9993z" /> <local:MyListItem Type="CheckBox" Title="游戏存档" Height="35" Logo="M757.792745 435.407215L419.597482 96.904967c-40.010393-40.010393-104.886579-40.010393-144.896972 0-40.010393 40.010393-40.010393 104.988908 0 144.9993L540.344959 507.855701 274.70051 773.807135c-40.010393 40.112721-40.010393 104.988908 0 144.9993 40.010393 40.010393 104.886579 40.010393 144.896972 0l338.092935-338.39992c40.112721-40.010393 40.112721-104.988908 0.102328-144.9993z" />
@@ -77,7 +77,12 @@
listItem.Height = 35 listItem.Height = 35
listItem.Logo = Logo.IconButtonOpen listItem.Logo = Logo.IconButtonOpen
listItem.Tag = d & "\" listItem.Tag = d & "\"
If IsSelected(NewPath & d & "\") Then listItem.Checked = True Select Case IsSelected(NewPath & d & "\")
Case 1
listItem.Half = True
Case 2
listItem.Checked = True
End Select
AddHandler listItem.Click, AddressOf ListItem_Click AddHandler listItem.Click, AddressOf ListItem_Click
PanFileList.Children.Add(listItem) PanFileList.Children.Add(listItem)
fileCount += 1 fileCount += 1
@@ -97,7 +102,7 @@
listItem.Type = MyListItem.CheckType.CheckBox listItem.Type = MyListItem.CheckType.CheckBox
listItem.Height = 35 listItem.Height = 35
listItem.Tag = f listItem.Tag = f
If IsSelected(NewPath & f) Then listItem.Checked = True listItem.Checked = (IsSelected(NewPath & f) = 2)
AddHandler listItem.Click, AddressOf ListItem_Click AddHandler listItem.Click, AddressOf ListItem_Click
PanFileList.Children.Add(listItem) PanFileList.Children.Add(listItem)
fileCount += 1 fileCount += 1
@@ -141,18 +146,42 @@
If IsAdd Then Selected.Add(f) Else Selected.Remove(f) If IsAdd Then Selected.Add(f) Else Selected.Remove(f)
Next Next
End If End If
Selected = Selected.Distinct().ToList()
End Sub End Sub
Private Function IsSelected(TargetPath As String, Optional AllowEmpty As Boolean = False) As Boolean ''' <summary>
''' 获取 TargetPath 是否选中。
''' </summary>
''' <returns>全部未选中为 0,部分选中为 1,全部选中为 2。</returns>
Private Function IsSelected(TargetPath As String, Optional AllowEmpty As Boolean = False) As Integer
If File.Exists(TargetPath) Then If File.Exists(TargetPath) Then
Return Selected.Contains(TargetPath) Return If(Selected.Contains(TargetPath), 2, 0)
End If End If
If Directory.Exists(TargetPath) Then If Directory.Exists(TargetPath) Then
Dim di As New DirectoryInfo(TargetPath) Dim di As New DirectoryInfo(TargetPath)
If (Not AllowEmpty) AndAlso di.GetDirectories.Length + di.GetFiles.Length = 0 Then Return False If (Not AllowEmpty) AndAlso di.GetDirectories.Length + di.GetFiles.Length = 0 Then Return 0
Return Directory.EnumerateDirectories(TargetPath).All(Function(s) IsSelected(s, True)) AndAlso '如果有一个文件不在列表,则 hasFalse = True
Directory.EnumerateFiles(TargetPath).All(Function(s) Selected.Contains(s)) Dim hasFalse As Boolean = False
'如果有一个文件在列表,则 hasTrue = True
Dim hasTrue As Boolean = False
For Each d In Directory.EnumerateDirectories(TargetPath)
Select Case IsSelected(d, True)
Case 0
hasFalse = True
Case 1
Return 1
Case 2
hasTrue = True
End Select
If hasTrue AndAlso hasFalse Then Return 1 '如果有文件在、有文件不在列表中,可以断定部分选中
Next
For Each f In Directory.EnumerateFiles(TargetPath)
If Selected.Contains(f) Then hasTrue = True Else hasFalse = True
If hasTrue AndAlso hasFalse Then Return 1 '如果有文件在、有文件不在列表中,可以断定部分选中
Next
If hasFalse AndAlso Not hasTrue Then Return 0
If hasTrue AndAlso Not hasFalse Then Return 2
End If End If
Return False Return 0
End Function End Function
Private Sub ListItem_Click(sender As MyListItem, e As Object) Private Sub ListItem_Click(sender As MyListItem, e As Object)
If sender.Tag = ".." Then '回到上一级目录 If sender.Tag = ".." Then '回到上一级目录
@@ -191,7 +220,7 @@
Private Sub PanFileList_MouseLeftButtonUp(sender As Object, e As MouseButtonEventArgs) Handles PanFileList.MouseLeftButtonUp Private Sub PanFileList_MouseLeftButtonUp(sender As Object, e As MouseButtonEventArgs) Handles PanFileList.MouseLeftButtonUp
For Each c In PanCommonFiles.Children For Each c In PanCommonFiles.Children
If TypeOf c Is MyCheckBox Then If TypeOf c Is MyCheckBox Then
c.Checked = IsSelected(PageVersionLeft.Version.Path & c.Tag) c.Checked = (IsSelected(PageVersionLeft.Version.Path & c.Tag) = 2)
End If End If
Next Next
End Sub End Sub
@@ -263,14 +292,14 @@
If(CheckIncludePCL.Checked, "整合包文件(*.zip)|*.zip", "Modrinth 整合包(*.mrpack)|*.mrpack")) If(CheckIncludePCL.Checked, "整合包文件(*.zip)|*.zip", "Modrinth 整合包(*.mrpack)|*.mrpack"))
If String.IsNullOrEmpty(savePath) Then Exit Sub If String.IsNullOrEmpty(savePath) Then Exit Sub
'获取需要包含的文件夹 '获取需要包含的文件
Dim contains As New List(Of String) Dim contains As List(Of String) = Selected
For Each c In PanCommonFiles.Children For Each c In PanCommonFiles.Children
If TypeOf c IsNot MyCheckBox Then Continue For If TypeOf c IsNot MyCheckBox Then Continue For
If String.IsNullOrEmpty(c.Tag) Then Continue For If String.IsNullOrEmpty(c.Tag) Then Continue For
contains.Add(c.Tag) contains.Add(PageVersionLeft.Version.Path & c.Tag)
Next Next
ModpackExport(New ExportOptions(PageVersionLeft.Version, savePath, CheckIncludePCL.Checked, Selected.ToArray, ModpackExport(New ExportOptions(PageVersionLeft.Version, savePath, CheckIncludePCL.Checked, contains.Distinct.ToArray,
PCLSetupGlobal:=CheckIncludeSetup.Checked, Name:=TbExportName.Text, VerID:=TbExportVersion.Text)) PCLSetupGlobal:=CheckIncludeSetup.Checked, Name:=TbExportName.Text, VerID:=TbExportVersion.Text))
End Sub End Sub