فهرست منبع

:boom: :children_crossing: 显示部分选中的文件夹

youzi-2333 2 سال پیش
والد
کامیت
1095a33a44

+ 23 - 7
Plain Craft Launcher 2/Controls/MyListItem.xaml.vb

@@ -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 * 0.6, 300,, New AniEaseOutBack(AniEasePower.Weak)))
-                        Anim.Add(AaOpacity(RectCheck, 1 - RectCheck.Opacity, 30))
+                        Anim.Add(AaHeight(RectCheck, Delta * If(half, 0.2, 0.4), 200,, New AniEaseOutFluent(AniEasePower.Weak)))
+                        Anim.Add(AaHeight(RectCheck, Delta * If(half, 0.3, 0.6), 300,, New AniEaseOutBack(AniEasePower.Weak)))
+                        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

+ 1 - 1
Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml

@@ -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" />

+ 42 - 13
Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb

@@ -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
-            Return Directory.EnumerateDirectories(TargetPath).All(Function(s) IsSelected(s, True)) AndAlso
-                    Directory.EnumerateFiles(TargetPath).All(Function(s) Selected.Contains(s))
+            If (Not AllowEmpty) AndAlso di.GetDirectories.Length + di.GetFiles.Length = 0 Then Return 0
+            '如果有一个文件不在列表,则 hasFalse = True
+            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