diff --git a/src/Files.App/Data/Models/SelectedItemsPropertiesViewModel.cs b/src/Files.App/Data/Models/SelectedItemsPropertiesViewModel.cs index 97a7a62b80ef..7ae6ba094138 100644 --- a/src/Files.App/Data/Models/SelectedItemsPropertiesViewModel.cs +++ b/src/Files.App/Data/Models/SelectedItemsPropertiesViewModel.cs @@ -663,8 +663,8 @@ public ObservableCollection FileProperties set => SetProperty(ref fileProperties, value); } - private bool isReadOnly; - public bool IsReadOnly + private bool? isReadOnly; + public bool? IsReadOnly { get => isReadOnly; set @@ -675,8 +675,8 @@ public bool IsReadOnly } } - private bool isReadOnlyEditedValue; - public bool IsReadOnlyEditedValue + private bool? isReadOnlyEditedValue; + public bool? IsReadOnlyEditedValue { get => isReadOnlyEditedValue; set @@ -693,8 +693,8 @@ public bool IsReadOnlyEnabled set => SetProperty(ref isReadOnlyEnabled, value); } - private bool isHidden; - public bool IsHidden + private bool? isHidden; + public bool? IsHidden { get => isHidden; set @@ -704,8 +704,8 @@ public bool IsHidden } } - private bool isHiddenEditedValue; - public bool IsHiddenEditedValue + private bool? isHiddenEditedValue; + public bool? IsHiddenEditedValue { get => isHiddenEditedValue; set => SetProperty(ref isHiddenEditedValue, value); diff --git a/src/Files.App/ViewModels/Properties/Items/CombinedProperties.cs b/src/Files.App/ViewModels/Properties/Items/CombinedProperties.cs index a13e30134b30..ef9849f1b915 100644 --- a/src/Files.App/ViewModels/Properties/Items/CombinedProperties.cs +++ b/src/Files.App/ViewModels/Properties/Items/CombinedProperties.cs @@ -59,9 +59,23 @@ public sealed override void GetBaseProperties() public override async Task GetSpecialPropertiesAsync() { if (List.All(x => x.PrimaryItemAttribute == StorageItemTypes.File)) - ViewModel.IsReadOnly = List.All(x => NativeFileOperationsHelper.HasFileAttribute(x.ItemPath, System.IO.FileAttributes.ReadOnly)); + { + var fileAttributesReadOnly = List.Select(x => NativeFileOperationsHelper.HasFileAttribute(x.ItemPath, System.IO.FileAttributes.ReadOnly)); + if (fileAttributesReadOnly.All(x => x)) + ViewModel.IsReadOnly = true; + else if (!fileAttributesReadOnly.Any(x => x)) + ViewModel.IsReadOnly = false; + else + ViewModel.IsReadOnly = null; + } - ViewModel.IsHidden = List.All(x => NativeFileOperationsHelper.HasFileAttribute(x.ItemPath, System.IO.FileAttributes.Hidden)); + var fileAttributesHidden = List.Select(x => NativeFileOperationsHelper.HasFileAttribute(x.ItemPath, System.IO.FileAttributes.Hidden)); + if (fileAttributesHidden.All(x => x)) + ViewModel.IsHidden = true; + else if (!fileAttributesHidden.Any(x => x)) + ViewModel.IsHidden = false; + else + ViewModel.IsHidden = null; ViewModel.LastSeparatorVisibility = false; ViewModel.ItemSizeVisibility = true; @@ -122,30 +136,36 @@ private void ViewModel_PropertyChanged(object sender, System.ComponentModel.Prop { case "IsReadOnly": { - if (ViewModel.IsReadOnly) + if (ViewModel.IsReadOnly is not null) { - List.ForEach(x => NativeFileOperationsHelper.SetFileAttribute( - x.ItemPath, System.IO.FileAttributes.ReadOnly)); - } - else - { - List.ForEach(x => NativeFileOperationsHelper.UnsetFileAttribute( - x.ItemPath, System.IO.FileAttributes.ReadOnly)); + if ((bool)ViewModel.IsReadOnly) + { + List.ForEach(x => NativeFileOperationsHelper.SetFileAttribute( + x.ItemPath, System.IO.FileAttributes.ReadOnly)); + } + else + { + List.ForEach(x => NativeFileOperationsHelper.UnsetFileAttribute( + x.ItemPath, System.IO.FileAttributes.ReadOnly)); + } } } break; case "IsHidden": { - if (ViewModel.IsHidden) - { - List.ForEach(x => NativeFileOperationsHelper.SetFileAttribute( - x.ItemPath, System.IO.FileAttributes.Hidden)); - } - else + if (ViewModel.IsHidden is not null) { - List.ForEach(x => NativeFileOperationsHelper.UnsetFileAttribute( - x.ItemPath, System.IO.FileAttributes.Hidden)); + if ((bool)ViewModel.IsHidden) + { + List.ForEach(x => NativeFileOperationsHelper.SetFileAttribute( + x.ItemPath, System.IO.FileAttributes.Hidden)); + } + else + { + List.ForEach(x => NativeFileOperationsHelper.UnsetFileAttribute( + x.ItemPath, System.IO.FileAttributes.Hidden)); + } } } diff --git a/src/Files.App/ViewModels/Properties/Items/FileProperties.cs b/src/Files.App/ViewModels/Properties/Items/FileProperties.cs index d6dd2d85921a..cc0cd707f791 100644 --- a/src/Files.App/ViewModels/Properties/Items/FileProperties.cs +++ b/src/Files.App/ViewModels/Properties/Items/FileProperties.cs @@ -275,37 +275,23 @@ private async void ViewModel_PropertyChanged(object sender, System.ComponentMode switch (e.PropertyName) { case nameof(ViewModel.IsReadOnly): - if (ViewModel.IsReadOnly) + if (ViewModel.IsReadOnly is not null) { - NativeFileOperationsHelper.SetFileAttribute( - Item.ItemPath, - System.IO.FileAttributes.ReadOnly - ); - } - else - { - NativeFileOperationsHelper.UnsetFileAttribute( - Item.ItemPath, - System.IO.FileAttributes.ReadOnly - ); + if ((bool)ViewModel.IsReadOnly) + NativeFileOperationsHelper.SetFileAttribute(Item.ItemPath, System.IO.FileAttributes.ReadOnly); + else + NativeFileOperationsHelper.UnsetFileAttribute(Item.ItemPath, System.IO.FileAttributes.ReadOnly); } break; case nameof(ViewModel.IsHidden): - if (ViewModel.IsHidden) - { - NativeFileOperationsHelper.SetFileAttribute( - Item.ItemPath, - System.IO.FileAttributes.Hidden - ); - } - else + if (ViewModel.IsHidden is not null) { - NativeFileOperationsHelper.UnsetFileAttribute( - Item.ItemPath, - System.IO.FileAttributes.Hidden - ); + if ((bool)ViewModel.IsHidden) + NativeFileOperationsHelper.SetFileAttribute(Item.ItemPath, System.IO.FileAttributes.Hidden); + else + NativeFileOperationsHelper.UnsetFileAttribute(Item.ItemPath, System.IO.FileAttributes.Hidden); } break; diff --git a/src/Files.App/ViewModels/Properties/Items/FolderProperties.cs b/src/Files.App/ViewModels/Properties/Items/FolderProperties.cs index 84149c699dea..52f616258502 100644 --- a/src/Files.App/ViewModels/Properties/Items/FolderProperties.cs +++ b/src/Files.App/ViewModels/Properties/Items/FolderProperties.cs @@ -200,15 +200,12 @@ private async void ViewModel_PropertyChanged(object sender, System.ComponentMode switch (e.PropertyName) { case "IsHidden": - if (ViewModel.IsHidden) + if (ViewModel.IsHidden is not null) { - NativeFileOperationsHelper.SetFileAttribute( - Item.ItemPath, System.IO.FileAttributes.Hidden); - } - else - { - NativeFileOperationsHelper.UnsetFileAttribute( - Item.ItemPath, System.IO.FileAttributes.Hidden); + if ((bool)ViewModel.IsHidden) + NativeFileOperationsHelper.SetFileAttribute(Item.ItemPath, System.IO.FileAttributes.Hidden); + else + NativeFileOperationsHelper.UnsetFileAttribute(Item.ItemPath, System.IO.FileAttributes.Hidden); } break; diff --git a/src/Files.App/ViewModels/Properties/Items/LibraryProperties.cs b/src/Files.App/ViewModels/Properties/Items/LibraryProperties.cs index b89862acf7fe..7871789bb773 100644 --- a/src/Files.App/ViewModels/Properties/Items/LibraryProperties.cs +++ b/src/Files.App/ViewModels/Properties/Items/LibraryProperties.cs @@ -141,25 +141,23 @@ private void ViewModel_PropertyChanged(object sender, System.ComponentModel.Prop switch (e.PropertyName) { case "IsReadOnly": - if (ViewModel.IsReadOnly) + if (ViewModel.IsReadOnly is not null) { - NativeFileOperationsHelper.SetFileAttribute(Library.ItemPath, System.IO.FileAttributes.ReadOnly); - } - else - { - NativeFileOperationsHelper.UnsetFileAttribute(Library.ItemPath, System.IO.FileAttributes.ReadOnly); + if ((bool)ViewModel.IsReadOnly) + NativeFileOperationsHelper.SetFileAttribute(Library.ItemPath, System.IO.FileAttributes.ReadOnly); + else + NativeFileOperationsHelper.UnsetFileAttribute(Library.ItemPath, System.IO.FileAttributes.ReadOnly); } break; case "IsHidden": - if (ViewModel.IsHidden) - { - NativeFileOperationsHelper.SetFileAttribute(Library.ItemPath, System.IO.FileAttributes.Hidden); - } - else + if (ViewModel.IsHidden is not null) { - NativeFileOperationsHelper.UnsetFileAttribute(Library.ItemPath, System.IO.FileAttributes.Hidden); + if ((bool)ViewModel.IsHidden) + NativeFileOperationsHelper.SetFileAttribute(Library.ItemPath, System.IO.FileAttributes.Hidden); + else + NativeFileOperationsHelper.UnsetFileAttribute(Library.ItemPath, System.IO.FileAttributes.Hidden); } break; diff --git a/src/Files.App/Views/Properties/GeneralPage.xaml.cs b/src/Files.App/Views/Properties/GeneralPage.xaml.cs index f9b1ad91c7ec..2ec15dd24a61 100644 --- a/src/Files.App/Views/Properties/GeneralPage.xaml.cs +++ b/src/Files.App/Views/Properties/GeneralPage.xaml.cs @@ -131,9 +131,16 @@ async Task SaveCombinedAsync(IList fileOrFolders) { foreach (var fileOrFolder in fileOrFolders) { - await MainWindow.Instance.DispatcherQueue.EnqueueOrInvokeAsync(() => - UIFilesystemHelpers.SetHiddenAttributeItem(fileOrFolder, ViewModel.IsHidden, itemMM) - ); + if (ViewModel.IsHiddenEditedValue is not null) + { + var isHiddenEditedValue = (bool)ViewModel.IsHiddenEditedValue; + await MainWindow.Instance.DispatcherQueue.EnqueueOrInvokeAsync(() => + UIFilesystemHelpers.SetHiddenAttributeItem(fileOrFolder, isHiddenEditedValue, itemMM) + ); + ViewModel.IsHidden = isHiddenEditedValue; + } + + ViewModel.IsReadOnly = ViewModel.IsReadOnlyEditedValue; if (ViewModel.IsAblumCoverModified) { @@ -153,10 +160,10 @@ async Task SaveBaseAsync(ListedItem item) { // Handle the visibility attribute for a single file var itemMM = AppInstance?.SlimContentPage?.ItemManipulationModel; - if (itemMM is not null) // null on homepage + if (itemMM is not null && ViewModel.IsHiddenEditedValue is not null) // null on homepage { await MainWindow.Instance.DispatcherQueue.EnqueueOrInvokeAsync(() => - UIFilesystemHelpers.SetHiddenAttributeItem(item, ViewModel.IsHidden, itemMM) + UIFilesystemHelpers.SetHiddenAttributeItem(item, (bool)ViewModel.IsHiddenEditedValue, itemMM) ); }