Skip to content

Commit 7e8250b

Browse files
authored
Fix: Fixed crash that sometimes occurred when opening pinned items (#17611)
1 parent 2a154dc commit 7e8250b

File tree

1 file changed

+45
-20
lines changed

1 file changed

+45
-20
lines changed

src/Files.App/ViewModels/HomeViewModel.cs

Lines changed: 45 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ private void ReloadWidgets()
105105

106106
public void RefreshWidgetList()
107107
{
108-
for (int i = 0; i < WidgetItems.Count; i++)
108+
for (int i = WidgetItems.Count - 1; i >= 0; i--)
109109
{
110110
if (!WidgetItems[i].WidgetItemModel.IsWidgetSettingEnabled)
111111
RemoveWidgetAt(i);
@@ -116,8 +116,11 @@ public void RefreshWidgetList()
116116

117117
public async Task RefreshWidgetProperties()
118118
{
119-
foreach (var viewModel in WidgetItems.Select(x => x.WidgetItemModel))
120-
await viewModel.RefreshWidgetAsync();
119+
await MainWindow.Instance.DispatcherQueue.EnqueueOrInvokeAsync(async () =>
120+
{
121+
foreach (var viewModel in WidgetItems.Select(x => x.WidgetItemModel).ToList())
122+
await viewModel.RefreshWidgetAsync();
123+
});
121124
}
122125

123126
private bool InsertWidget(WidgetContainerItem widgetModel, int atIndex)
@@ -136,19 +139,28 @@ private bool InsertWidget(WidgetContainerItem widgetModel, int atIndex)
136139

137140
if (atIndex > WidgetItems.Count)
138141
{
139-
WidgetItems.Add(widgetModel);
142+
MainWindow.Instance.DispatcherQueue.EnqueueOrInvokeAsync(() =>
143+
{
144+
WidgetItems.Add(widgetModel);
145+
});
140146
}
141147
else
142148
{
143-
WidgetItems.Insert(atIndex, widgetModel);
149+
MainWindow.Instance.DispatcherQueue.EnqueueOrInvokeAsync(() =>
150+
{
151+
WidgetItems.Insert(atIndex, widgetModel);
152+
});
144153
}
145154

146155
return true;
147156
}
148157

149158
public bool CanAddWidget(string widgetName)
150159
{
151-
return !(WidgetItems.Any((item) => item.WidgetItemModel.WidgetName == widgetName));
160+
return MainWindow.Instance.DispatcherQueue.EnqueueOrInvokeAsync(() =>
161+
{
162+
return !(WidgetItems.Any((item) => item.WidgetItemModel.WidgetName == widgetName));
163+
}).GetAwaiter().GetResult();
152164
}
153165

154166
private void RemoveWidgetAt(int index)
@@ -158,25 +170,35 @@ private void RemoveWidgetAt(int index)
158170
return;
159171
}
160172

161-
WidgetItems[index].Dispose();
162-
WidgetItems.RemoveAt(index);
173+
MainWindow.Instance.DispatcherQueue.EnqueueOrInvokeAsync(() =>
174+
{
175+
WidgetItems[index].Dispose();
176+
WidgetItems.RemoveAt(index);
177+
});
163178
}
164179

165180
public void RemoveWidget<TWidget>() where TWidget : IWidgetViewModel
166181
{
167-
int indexToRemove = -1;
168-
169-
for (int i = 0; i < WidgetItems.Count; i++)
182+
MainWindow.Instance.DispatcherQueue.EnqueueOrInvokeAsync(() =>
170183
{
171-
if (typeof(TWidget).IsAssignableFrom(WidgetItems[i].WidgetControl.GetType()))
184+
int indexToRemove = -1;
185+
186+
for (int i = 0; i < WidgetItems.Count; i++)
172187
{
173-
// Found matching types
174-
indexToRemove = i;
175-
break;
188+
if (typeof(TWidget).IsAssignableFrom(WidgetItems[i].WidgetControl.GetType()))
189+
{
190+
// Found matching types
191+
indexToRemove = i;
192+
break;
193+
}
176194
}
177-
}
178195

179-
RemoveWidgetAt(indexToRemove);
196+
if (indexToRemove >= 0)
197+
{
198+
WidgetItems[indexToRemove].Dispose();
199+
WidgetItems.RemoveAt(indexToRemove);
200+
}
201+
});
180202
}
181203

182204
// Command methods
@@ -191,10 +213,13 @@ private async Task ExecuteReloadWidgetsCommand()
191213

192214
public void Dispose()
193215
{
194-
for (int i = 0; i < WidgetItems.Count; i++)
195-
WidgetItems[i].Dispose();
216+
MainWindow.Instance.DispatcherQueue.EnqueueOrInvokeAsync(() =>
217+
{
218+
for (int i = 0; i < WidgetItems.Count; i++)
219+
WidgetItems[i].Dispose();
196220

197-
WidgetItems.Clear();
221+
WidgetItems.Clear();
222+
});
198223
}
199224
}
200225
}

0 commit comments

Comments
 (0)