diff --git a/src/DynamoCoreWpf/PublicAPI.Unshipped.txt b/src/DynamoCoreWpf/PublicAPI.Unshipped.txt index 9b55e04bb31..6fd915b1aa7 100644 --- a/src/DynamoCoreWpf/PublicAPI.Unshipped.txt +++ b/src/DynamoCoreWpf/PublicAPI.Unshipped.txt @@ -874,6 +874,8 @@ Dynamo.PackageManager.PackageManagerSearchViewModel.FilterEntry.FilterName.get - Dynamo.PackageManager.PackageManagerSearchViewModel.FilterEntry.FilterName.set -> void Dynamo.PackageManager.PackageManagerSearchViewModel.FilterEntry.GroupName.get -> string Dynamo.PackageManager.PackageManagerSearchViewModel.FilterEntry.GroupName.set -> void +Dynamo.PackageManager.PackageManagerSearchViewModel.FilterEntry.IsEnabled.get -> bool +Dynamo.PackageManager.PackageManagerSearchViewModel.FilterEntry.IsEnabled.set -> void Dynamo.PackageManager.PackageManagerSearchViewModel.FilterEntry.OnChecked.get -> bool Dynamo.PackageManager.PackageManagerSearchViewModel.FilterEntry.OnChecked.set -> void Dynamo.PackageManager.PackageManagerSearchViewModel.FilterEntry.Tooltip.get -> string diff --git a/src/DynamoCoreWpf/ViewModels/PackageManager/PackageManagerSearchViewModel.cs b/src/DynamoCoreWpf/ViewModels/PackageManager/PackageManagerSearchViewModel.cs index 9fad081fbd7..abbaa99e46f 100644 --- a/src/DynamoCoreWpf/ViewModels/PackageManager/PackageManagerSearchViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/PackageManager/PackageManagerSearchViewModel.cs @@ -86,6 +86,22 @@ public class FilterEntry : NotificationObject /// public string Tooltip { get; set; } + /// + /// Controls the IsEnabled status of the filter + /// + private bool isEnabled = true; + + public bool IsEnabled + { + get { return isEnabled; } + set + { + isEnabled = value; + RaisePropertyChanged(nameof(IsEnabled)); + } + } + + /// /// Filter entry click command, notice this is a dynamic command /// with command param set to FilterName so that the code is robust @@ -410,6 +426,33 @@ public bool IsAnyFilterOn private void SetFilterChange() { IsAnyFilterOn = HostFilter.Any(f => f.OnChecked) || NonHostFilter.Any(f => f.OnChecked) || CompatibilityFilter.Any(f => f.OnChecked); + ApplyFilterRules(); + } + + /// + /// Executes any additional logic on the filters + /// + internal void ApplyFilterRules() + { + // Enable/disable Compatibility filters if any HostFilter is on + if (CompatibilityFilter.Any(f => f.OnChecked)) + { + HostFilter.ForEach(x => x.IsEnabled = false); + } + else + { + HostFilter.ForEach(x => x.IsEnabled = true); + } + + // Enable/disable Host filters if any CompatibilityFilter is on + if (HostFilter.Any(f => f.OnChecked)) + { + CompatibilityFilter.ForEach(x => x.IsEnabled = false); + } + else + { + CompatibilityFilter.ForEach(x => x.IsEnabled = true); + } } /// diff --git a/src/DynamoCoreWpf/Views/PackageManager/Controls/PackageManagerSearchControl.xaml b/src/DynamoCoreWpf/Views/PackageManager/Controls/PackageManagerSearchControl.xaml index de24db4ee82..27fc671b8e6 100644 --- a/src/DynamoCoreWpf/Views/PackageManager/Controls/PackageManagerSearchControl.xaml +++ b/src/DynamoCoreWpf/Views/PackageManager/Controls/PackageManagerSearchControl.xaml @@ -262,6 +262,7 @@ + diff --git a/src/DynamoUtilities/PublicAPI.Unshipped.txt b/src/DynamoUtilities/PublicAPI.Unshipped.txt index 405d94fed95..f63b93a55d0 100644 --- a/src/DynamoUtilities/PublicAPI.Unshipped.txt +++ b/src/DynamoUtilities/PublicAPI.Unshipped.txt @@ -234,7 +234,6 @@ static DynamoUtilities.PathHelper.IsValidPath(string filePath) -> bool static DynamoUtilities.PathHelper.isValidXML(string path, out System.Xml.XmlDocument xmlDoc, out System.Exception ex) -> bool static DynamoUtilities.PathHelper.LoadEmbeddedResourceAsString(string resourcePath, System.Reflection.Assembly assembly) -> string static DynamoUtilities.StringUtilities.CapitalizeFirstLetter(string word) -> string -static DynamoUtilities.StringUtilities.SimplifyFileSizeUnit(string size) -> string static DynamoUtilities.TypeSwitch.Case(System.Action action) -> DynamoUtilities.TypeSwitch.CaseInfo static DynamoUtilities.TypeSwitch.Case(System.Action action) -> DynamoUtilities.TypeSwitch.CaseInfo static DynamoUtilities.TypeSwitch.Default(System.Action action) -> DynamoUtilities.TypeSwitch.CaseInfo diff --git a/src/DynamoUtilities/StringUtilities.cs b/src/DynamoUtilities/StringUtilities.cs index 0fe079cee20..be74b03ee45 100644 --- a/src/DynamoUtilities/StringUtilities.cs +++ b/src/DynamoUtilities/StringUtilities.cs @@ -1,3 +1,9 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + namespace DynamoUtilities { /// @@ -17,20 +23,5 @@ public static string CapitalizeFirstLetter(string word) return char.ToUpper(word[0]) + word.Substring(1); } - - /// - /// Replaces 'i' in a file size string - /// - /// The file size string - /// - public static string SimplifyFileSizeUnit(string size) - { - if (string.IsNullOrEmpty(size)) - { - return size; - } - - return size.Replace("i", ""); - } } } diff --git a/src/PackageDetailsViewExtension/PackageDetailItem.cs b/src/PackageDetailsViewExtension/PackageDetailItem.cs index c1173fcf2f0..b61984dab60 100644 --- a/src/PackageDetailsViewExtension/PackageDetailItem.cs +++ b/src/PackageDetailsViewExtension/PackageDetailItem.cs @@ -5,7 +5,6 @@ using Dynamo.Core; using Dynamo.PackageManager; using Dynamo.PythonServices; -using DynamoUtilities; using Greg.Responses; namespace Dynamo.PackageDetails @@ -284,7 +283,7 @@ public PackageDetailItem(string packageName, PackageVersion packageVersion, bool this.CopyRightYear = PackageVersion.copyright_year; this.CanInstall = canInstall; this.IsEnabledForInstall = isEnabledForInstall && canInstall; - this.PackageSize = string.IsNullOrEmpty(PackageVersion.size) ? "--" : StringUtilities.SimplifyFileSizeUnit (PackageVersion.size); + this.PackageSize = string.IsNullOrEmpty(PackageVersion.size) ? "--" : PackageVersion.size; this.Created = GetFormattedDate(PackageVersion.created); this.VersionInformation = GetFlattenedCompatibilityInformation(packageVersion.compatibility_matrix); this.ReleaseNotes = PackageVersion.release_notes_url; @@ -316,7 +315,7 @@ public PackageDetailItem(List versionDetails, string package this.CopyRightYear = PackageVersion.copyright_year; this.CanInstall = canInstall; this.IsEnabledForInstall = isEnabledForInstall && canInstall; - this.PackageSize = string.IsNullOrEmpty(PackageVersion.size) ? "--" : StringUtilities.SimplifyFileSizeUnit (PackageVersion.size); + this.PackageSize = string.IsNullOrEmpty(PackageVersion.size) ? "--" : PackageVersion.size; this.Created = GetFormattedDate(PackageVersion.created); this.VersionInformation = GetFlattenedCompatibilityInformation(packageVersion.compatibility_matrix); this.IsCompatible = PackageManager.VersionInformation.GetVersionCompatibility(versionDetails, PackageVersionNumber); diff --git a/src/PackageDetailsViewExtension/PackageDetailsView.xaml b/src/PackageDetailsViewExtension/PackageDetailsView.xaml index 6deba4a0d0b..a1bd4e2f8ee 100644 --- a/src/PackageDetailsViewExtension/PackageDetailsView.xaml +++ b/src/PackageDetailsViewExtension/PackageDetailsView.xaml @@ -468,6 +468,16 @@ Margin="10,0" VerticalAlignment="Center"> + + + + + + + + + + (); + + var clientMock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty); + var pmCVM = new Mock(ViewModel, clientMock.Object) { CallBase = true }; + var pmSVM = new PackageManagerSearchViewModel(pmCVM.Object); + pmSVM.RegisterTransientHandlers(); + + pmSVM.HostFilter = new List + { + new FilterEntry("host", "group", "tooltip", pmSVM) { OnChecked = false }, + }; + + pmSVM.CompatibilityFilter = new List + { + new FilterEntry("compatibility", "group", "tooltip", pmSVM) { OnChecked = false }, + }; + + pmSVM.HostFilter.ForEach(f => f.PropertyChanged += pmSVM.filter_PropertyChanged); + pmSVM.CompatibilityFilter.ForEach(f => f.PropertyChanged += pmSVM.filter_PropertyChanged); + + Assert.IsTrue(pmSVM.HostFilter.All(x => x.IsEnabled), "Expect starting filter state to be enabled"); + Assert.IsTrue(pmSVM.CompatibilityFilter.All(x => x.IsEnabled), "Expect starting filter state to be enabled"); + + // Act/Assert Host -> Compatibility + pmSVM.HostFilter.First().OnChecked = true; + pmSVM.ApplyFilterRules(); + + Assert.IsFalse(pmSVM.CompatibilityFilter.All(x => x.IsEnabled), "Filter groups should be mutually exclusive"); + + pmSVM.HostFilter.First().OnChecked = false; + pmSVM.ApplyFilterRules(); + + Assert.IsTrue(pmSVM.CompatibilityFilter.All(x => x.IsEnabled), "Filter groups should be mutually exclusive"); + + // Act/Assert Compatibility -> Host + pmSVM.CompatibilityFilter.First().OnChecked = true; + pmSVM.ApplyFilterRules(); + + Assert.IsFalse(pmSVM.HostFilter.All(x => x.IsEnabled), "Filter groups should be mutually exclusive"); + + pmSVM.CompatibilityFilter.First().OnChecked = false; + pmSVM.ApplyFilterRules(); + + Assert.IsTrue(pmSVM.HostFilter.All(x => x.IsEnabled), "Filter groups should be mutually exclusive"); + } + + #region Compatibility Tests + [Test] public void TestReverseDynamoCompatibilityFromHost() { @@ -1329,5 +1380,7 @@ public void IsVersionCompatible_InValidMaxRange_ReturnsTrueForVersionInsideOfMaj "Expected compatibility to be true when major version is greater than Max major version and there is an invalid max range."); } + #endregion + } }