Skip to content

Commit 7cde881

Browse files
Fix: Fixed issue with editing properties of multiple items at the same time (#15071)
1 parent 322513e commit 7cde881

File tree

6 files changed

+83
-75
lines changed

6 files changed

+83
-75
lines changed

src/Files.App/Data/Models/SelectedItemsPropertiesViewModel.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -663,8 +663,8 @@ public ObservableCollection<FileProperty> FileProperties
663663
set => SetProperty(ref fileProperties, value);
664664
}
665665

666-
private bool isReadOnly;
667-
public bool IsReadOnly
666+
private bool? isReadOnly;
667+
public bool? IsReadOnly
668668
{
669669
get => isReadOnly;
670670
set
@@ -675,8 +675,8 @@ public bool IsReadOnly
675675
}
676676
}
677677

678-
private bool isReadOnlyEditedValue;
679-
public bool IsReadOnlyEditedValue
678+
private bool? isReadOnlyEditedValue;
679+
public bool? IsReadOnlyEditedValue
680680
{
681681
get => isReadOnlyEditedValue;
682682
set
@@ -693,8 +693,8 @@ public bool IsReadOnlyEnabled
693693
set => SetProperty(ref isReadOnlyEnabled, value);
694694
}
695695

696-
private bool isHidden;
697-
public bool IsHidden
696+
private bool? isHidden;
697+
public bool? IsHidden
698698
{
699699
get => isHidden;
700700
set
@@ -704,8 +704,8 @@ public bool IsHidden
704704
}
705705
}
706706

707-
private bool isHiddenEditedValue;
708-
public bool IsHiddenEditedValue
707+
private bool? isHiddenEditedValue;
708+
public bool? IsHiddenEditedValue
709709
{
710710
get => isHiddenEditedValue;
711711
set => SetProperty(ref isHiddenEditedValue, value);

src/Files.App/ViewModels/Properties/Items/CombinedProperties.cs

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,23 @@ public sealed override void GetBaseProperties()
5959
public override async Task GetSpecialPropertiesAsync()
6060
{
6161
if (List.All(x => x.PrimaryItemAttribute == StorageItemTypes.File))
62-
ViewModel.IsReadOnly = List.All(x => NativeFileOperationsHelper.HasFileAttribute(x.ItemPath, System.IO.FileAttributes.ReadOnly));
62+
{
63+
var fileAttributesReadOnly = List.Select(x => NativeFileOperationsHelper.HasFileAttribute(x.ItemPath, System.IO.FileAttributes.ReadOnly));
64+
if (fileAttributesReadOnly.All(x => x))
65+
ViewModel.IsReadOnly = true;
66+
else if (!fileAttributesReadOnly.Any(x => x))
67+
ViewModel.IsReadOnly = false;
68+
else
69+
ViewModel.IsReadOnly = null;
70+
}
6371

64-
ViewModel.IsHidden = List.All(x => NativeFileOperationsHelper.HasFileAttribute(x.ItemPath, System.IO.FileAttributes.Hidden));
72+
var fileAttributesHidden = List.Select(x => NativeFileOperationsHelper.HasFileAttribute(x.ItemPath, System.IO.FileAttributes.Hidden));
73+
if (fileAttributesHidden.All(x => x))
74+
ViewModel.IsHidden = true;
75+
else if (!fileAttributesHidden.Any(x => x))
76+
ViewModel.IsHidden = false;
77+
else
78+
ViewModel.IsHidden = null;
6579

6680
ViewModel.LastSeparatorVisibility = false;
6781
ViewModel.ItemSizeVisibility = true;
@@ -122,30 +136,36 @@ private void ViewModel_PropertyChanged(object sender, System.ComponentModel.Prop
122136
{
123137
case "IsReadOnly":
124138
{
125-
if (ViewModel.IsReadOnly)
139+
if (ViewModel.IsReadOnly is not null)
126140
{
127-
List.ForEach(x => NativeFileOperationsHelper.SetFileAttribute(
128-
x.ItemPath, System.IO.FileAttributes.ReadOnly));
129-
}
130-
else
131-
{
132-
List.ForEach(x => NativeFileOperationsHelper.UnsetFileAttribute(
133-
x.ItemPath, System.IO.FileAttributes.ReadOnly));
141+
if ((bool)ViewModel.IsReadOnly)
142+
{
143+
List.ForEach(x => NativeFileOperationsHelper.SetFileAttribute(
144+
x.ItemPath, System.IO.FileAttributes.ReadOnly));
145+
}
146+
else
147+
{
148+
List.ForEach(x => NativeFileOperationsHelper.UnsetFileAttribute(
149+
x.ItemPath, System.IO.FileAttributes.ReadOnly));
150+
}
134151
}
135152
}
136153
break;
137154

138155
case "IsHidden":
139156
{
140-
if (ViewModel.IsHidden)
141-
{
142-
List.ForEach(x => NativeFileOperationsHelper.SetFileAttribute(
143-
x.ItemPath, System.IO.FileAttributes.Hidden));
144-
}
145-
else
157+
if (ViewModel.IsHidden is not null)
146158
{
147-
List.ForEach(x => NativeFileOperationsHelper.UnsetFileAttribute(
148-
x.ItemPath, System.IO.FileAttributes.Hidden));
159+
if ((bool)ViewModel.IsHidden)
160+
{
161+
List.ForEach(x => NativeFileOperationsHelper.SetFileAttribute(
162+
x.ItemPath, System.IO.FileAttributes.Hidden));
163+
}
164+
else
165+
{
166+
List.ForEach(x => NativeFileOperationsHelper.UnsetFileAttribute(
167+
x.ItemPath, System.IO.FileAttributes.Hidden));
168+
}
149169
}
150170

151171
}

src/Files.App/ViewModels/Properties/Items/FileProperties.cs

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -275,37 +275,23 @@ private async void ViewModel_PropertyChanged(object sender, System.ComponentMode
275275
switch (e.PropertyName)
276276
{
277277
case nameof(ViewModel.IsReadOnly):
278-
if (ViewModel.IsReadOnly)
278+
if (ViewModel.IsReadOnly is not null)
279279
{
280-
NativeFileOperationsHelper.SetFileAttribute(
281-
Item.ItemPath,
282-
System.IO.FileAttributes.ReadOnly
283-
);
284-
}
285-
else
286-
{
287-
NativeFileOperationsHelper.UnsetFileAttribute(
288-
Item.ItemPath,
289-
System.IO.FileAttributes.ReadOnly
290-
);
280+
if ((bool)ViewModel.IsReadOnly)
281+
NativeFileOperationsHelper.SetFileAttribute(Item.ItemPath, System.IO.FileAttributes.ReadOnly);
282+
else
283+
NativeFileOperationsHelper.UnsetFileAttribute(Item.ItemPath, System.IO.FileAttributes.ReadOnly);
291284
}
292285

293286
break;
294287

295288
case nameof(ViewModel.IsHidden):
296-
if (ViewModel.IsHidden)
297-
{
298-
NativeFileOperationsHelper.SetFileAttribute(
299-
Item.ItemPath,
300-
System.IO.FileAttributes.Hidden
301-
);
302-
}
303-
else
289+
if (ViewModel.IsHidden is not null)
304290
{
305-
NativeFileOperationsHelper.UnsetFileAttribute(
306-
Item.ItemPath,
307-
System.IO.FileAttributes.Hidden
308-
);
291+
if ((bool)ViewModel.IsHidden)
292+
NativeFileOperationsHelper.SetFileAttribute(Item.ItemPath, System.IO.FileAttributes.Hidden);
293+
else
294+
NativeFileOperationsHelper.UnsetFileAttribute(Item.ItemPath, System.IO.FileAttributes.Hidden);
309295
}
310296

311297
break;

src/Files.App/ViewModels/Properties/Items/FolderProperties.cs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -200,15 +200,12 @@ private async void ViewModel_PropertyChanged(object sender, System.ComponentMode
200200
switch (e.PropertyName)
201201
{
202202
case "IsHidden":
203-
if (ViewModel.IsHidden)
203+
if (ViewModel.IsHidden is not null)
204204
{
205-
NativeFileOperationsHelper.SetFileAttribute(
206-
Item.ItemPath, System.IO.FileAttributes.Hidden);
207-
}
208-
else
209-
{
210-
NativeFileOperationsHelper.UnsetFileAttribute(
211-
Item.ItemPath, System.IO.FileAttributes.Hidden);
205+
if ((bool)ViewModel.IsHidden)
206+
NativeFileOperationsHelper.SetFileAttribute(Item.ItemPath, System.IO.FileAttributes.Hidden);
207+
else
208+
NativeFileOperationsHelper.UnsetFileAttribute(Item.ItemPath, System.IO.FileAttributes.Hidden);
212209
}
213210
break;
214211

src/Files.App/ViewModels/Properties/Items/LibraryProperties.cs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -141,25 +141,23 @@ private void ViewModel_PropertyChanged(object sender, System.ComponentModel.Prop
141141
switch (e.PropertyName)
142142
{
143143
case "IsReadOnly":
144-
if (ViewModel.IsReadOnly)
144+
if (ViewModel.IsReadOnly is not null)
145145
{
146-
NativeFileOperationsHelper.SetFileAttribute(Library.ItemPath, System.IO.FileAttributes.ReadOnly);
147-
}
148-
else
149-
{
150-
NativeFileOperationsHelper.UnsetFileAttribute(Library.ItemPath, System.IO.FileAttributes.ReadOnly);
146+
if ((bool)ViewModel.IsReadOnly)
147+
NativeFileOperationsHelper.SetFileAttribute(Library.ItemPath, System.IO.FileAttributes.ReadOnly);
148+
else
149+
NativeFileOperationsHelper.UnsetFileAttribute(Library.ItemPath, System.IO.FileAttributes.ReadOnly);
151150
}
152151

153152
break;
154153

155154
case "IsHidden":
156-
if (ViewModel.IsHidden)
157-
{
158-
NativeFileOperationsHelper.SetFileAttribute(Library.ItemPath, System.IO.FileAttributes.Hidden);
159-
}
160-
else
155+
if (ViewModel.IsHidden is not null)
161156
{
162-
NativeFileOperationsHelper.UnsetFileAttribute(Library.ItemPath, System.IO.FileAttributes.Hidden);
157+
if ((bool)ViewModel.IsHidden)
158+
NativeFileOperationsHelper.SetFileAttribute(Library.ItemPath, System.IO.FileAttributes.Hidden);
159+
else
160+
NativeFileOperationsHelper.UnsetFileAttribute(Library.ItemPath, System.IO.FileAttributes.Hidden);
163161
}
164162

165163
break;

src/Files.App/Views/Properties/GeneralPage.xaml.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,16 @@ async Task<bool> SaveCombinedAsync(IList<ListedItem> fileOrFolders)
131131
{
132132
foreach (var fileOrFolder in fileOrFolders)
133133
{
134-
await MainWindow.Instance.DispatcherQueue.EnqueueOrInvokeAsync(() =>
135-
UIFilesystemHelpers.SetHiddenAttributeItem(fileOrFolder, ViewModel.IsHidden, itemMM)
136-
);
134+
if (ViewModel.IsHiddenEditedValue is not null)
135+
{
136+
var isHiddenEditedValue = (bool)ViewModel.IsHiddenEditedValue;
137+
await MainWindow.Instance.DispatcherQueue.EnqueueOrInvokeAsync(() =>
138+
UIFilesystemHelpers.SetHiddenAttributeItem(fileOrFolder, isHiddenEditedValue, itemMM)
139+
);
140+
ViewModel.IsHidden = isHiddenEditedValue;
141+
}
142+
143+
ViewModel.IsReadOnly = ViewModel.IsReadOnlyEditedValue;
137144

138145
if (ViewModel.IsAblumCoverModified)
139146
{
@@ -153,10 +160,10 @@ async Task<bool> SaveBaseAsync(ListedItem item)
153160
{
154161
// Handle the visibility attribute for a single file
155162
var itemMM = AppInstance?.SlimContentPage?.ItemManipulationModel;
156-
if (itemMM is not null) // null on homepage
163+
if (itemMM is not null && ViewModel.IsHiddenEditedValue is not null) // null on homepage
157164
{
158165
await MainWindow.Instance.DispatcherQueue.EnqueueOrInvokeAsync(() =>
159-
UIFilesystemHelpers.SetHiddenAttributeItem(item, ViewModel.IsHidden, itemMM)
166+
UIFilesystemHelpers.SetHiddenAttributeItem(item, (bool)ViewModel.IsHiddenEditedValue, itemMM)
160167
);
161168
}
162169

0 commit comments

Comments
 (0)