diff --git a/.gitignore b/.gitignore
index 9491a2f..eaa9902 100644
--- a/.gitignore
+++ b/.gitignore
@@ -360,4 +360,4 @@ MigrationBackup/
.ionide/
# Fody - auto-generated XML schema
-FodyWeavers.xsd
\ No newline at end of file
+FodyWeavers.xsd
diff --git a/DeskFrame/DeskFrameWindow.xaml b/DeskFrame/DeskFrameWindow.xaml
index 56da1b4..8d17191 100644
--- a/DeskFrame/DeskFrameWindow.xaml
+++ b/DeskFrame/DeskFrameWindow.xaml
@@ -66,9 +66,9 @@
+ MouseLeftButtonDown="FileItem_LeftMouseButtonDown"
+ MouseEnter="FileItem_MouseEnter" MouseLeave="FileItem_MouseLeave"
+ BorderThickness="1" MouseRightButtonDown="FileItem_RightClick">
+ SnapsToDevicePixels="True"
+ RenderOptions.BitmapScalingMode="NearestNeighbor"
+ UseLayoutRounding="True"
+ Width="{Binding DataContext.Instance.IconSize, RelativeSource={RelativeSource AncestorType=Window}, Converter={StaticResource IconSizeToHeightWidthConverter}}"
+ Height="{Binding DataContext.Instance.IconSize, RelativeSource={RelativeSource AncestorType=Window}, Converter={StaticResource IconSizeToHeightWidthConverter}}"
+ VerticalAlignment="Center" HorizontalAlignment="Center"/>
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TextWrapping="Wrap" TextAlignment="Center"
+ FontFamily="{DynamicResource ItemFont}"
+ TextTrimming="{Binding TextTrimming}"
+ HorizontalAlignment="Center" MaxHeight="{Binding MaxHeight}"
+ Foreground="{Binding DataContext.Instance.ListViewFontColor, RelativeSource={RelativeSource AncestorType=Window}}"
+ />
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
-
-
-
-
+
diff --git a/DeskFrame/DeskFrameWindow.xaml.cs b/DeskFrame/DeskFrameWindow.xaml.cs
index 53b7519..60f4ecb 100644
--- a/DeskFrame/DeskFrameWindow.xaml.cs
+++ b/DeskFrame/DeskFrameWindow.xaml.cs
@@ -104,6 +104,7 @@ public int ItemPerRow
private bool _fixIsOnBottomInit = true;
private bool _didFixIsOnBottom = false;
private bool _isMinimized = false;
+ private bool _animLock = false;
private bool _isIngrid = true;
private bool _grabbedOnLeft;
private int _snapDistance = 8;
@@ -1757,37 +1758,60 @@ private void AnimateChevron(bool flip, bool onLoad, double animationSpeed)
rotateTransform.BeginAnimation(RotateTransform.AngleProperty, rotateAnimation);
}
- private void Minimize_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
+ private async void Minimize_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
-
- AnimateChevron(_isMinimized, false, Instance.AnimationSpeed);
+ if (_animLock) return;
+
+ // Check if we even can minimize before locking
if (showFolder.Visibility == Visibility.Hidden && showFolderInGrid.Visibility == Visibility.Hidden)
{
return;
}
- if (!_isMinimized)
+
+ _animLock = true;
+
+ try
{
- _originalHeight = this.ActualHeight;
- _isMinimized = true;
- Instance.Minimized = true;
- // Debug.WriteLine("minimize: " + Instance.Height);
- AnimateWindowHeight(titleBar.Height, Instance.AnimationSpeed);
+ _isMinimized = !_isMinimized;
+ Instance.Minimized = _isMinimized;
+
+ AnimateChevron(_isMinimized, false, Instance.AnimationSpeed);
+
+ if (_isMinimized)
+ {
+ _originalHeight = this.ActualHeight;
+ AnimateWindowHeight(titleBar.Height, Instance.AnimationSpeed);
+ }
+ else
+ {
+ WindowBackground.CornerRadius = new CornerRadius(
+ topLeft: WindowBackground.CornerRadius.TopLeft,
+ topRight: WindowBackground.CornerRadius.TopRight,
+ bottomRight: 5.0,
+ bottomLeft: 5.0
+ );
+ AnimateWindowHeight(Instance.Height, Instance.AnimationSpeed);
+ }
+
+ HandleWindowMove(false);
+
+
+
+ var waitTime = 50;
+
+ if (Instance.AnimationSpeed > 0)
+ {
+ waitTime += (int)((0.2 / Instance.AnimationSpeed) * 1000);
+ }
+
+ await Task.Delay(waitTime);
+
}
- else
+ finally
{
- WindowBackground.CornerRadius = new CornerRadius(
- topLeft: WindowBackground.CornerRadius.TopLeft,
- topRight: WindowBackground.CornerRadius.TopRight,
- bottomRight: 5.0,
- bottomLeft: 5.0
- );
- _isMinimized = false;
- Instance.Minimized = false;
-
- // Debug.WriteLine("unminimize: " + Instance.Height);
- AnimateWindowHeight(Instance.Height, Instance.AnimationSpeed);
+ // Always unlock, even if an error occurred
+ _animLock = false;
}
- HandleWindowMove(false);
}
private void ToggleFileExtension_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
@@ -2233,6 +2257,9 @@ public async void LoadFiles(string path)
loadFilesCancellationToken.Dispose();
loadFilesCancellationToken = new CancellationTokenSource();
CancellationToken loadFiles_cts = loadFilesCancellationToken.Token;
+ var fileFilterHideRegex = string.IsNullOrEmpty(Instance.FileFilterHideRegex)
+ ? null
+ : new Regex(Instance.FileFilterHideRegex);
try
{
if (!Directory.Exists(path))
@@ -2252,7 +2279,7 @@ public async void LoadFiles(string path)
var files = dirInfo.GetFiles();
var directories = dirInfo.GetDirectories();
_folderCount = directories.Count();
- _fileCount = dirInfo.GetFiles().Count().ToString();
+ _fileCount = files.Count().ToString();
_folderSize = !Instance.CheckFolderSize ? "" : Task.Run(() => BytesToStringAsync(dirInfo.EnumerateFiles("*", SearchOption.AllDirectories).Sum(file => file.Length))).Result; var filteredFiles = files.Cast()
.Concat(directories)
.OrderBy(entry => entry.Name, StringComparer.OrdinalIgnoreCase)
@@ -2314,7 +2341,7 @@ await Dispatcher.InvokeAsync(async () =>
FileItems.RemoveAt(i);
}
}
-
+ var existingLookup = FileItems.ToDictionary(f => f.FullPath, f => f);
foreach (var entry in fileEntries)
{
if (loadFiles_cts.IsCancellationRequested)
@@ -2323,7 +2350,6 @@ await Dispatcher.InvokeAsync(async () =>
return;
}
- var existingItem = FileItems.FirstOrDefault(item => item.FullPath == entry.FullName);
long size = 0;
if (entry is FileInfo fileInfo)
@@ -2338,10 +2364,10 @@ await Dispatcher.InvokeAsync(async () =>
var thumbnail = await GetThumbnailAsync(entry.FullName);
bool isFile = entry is FileInfo;
string actualExt = isFile ? Path.GetExtension(entry.Name) : string.Empty;
- if (existingItem == null)
+
+ if (!existingLookup.TryGetValue(entry.FullName, out var existingItem))
{
- if (!string.IsNullOrEmpty(Instance.FileFilterHideRegex) &&
- new Regex(Instance.FileFilterHideRegex).IsMatch(entry.Name))
+ if (fileFilterHideRegex?.IsMatch(entry.Name) == true)
{
continue;
}
@@ -2381,8 +2407,7 @@ await Dispatcher.InvokeAsync(async () =>
FileItems.Clear();
foreach (var fileItem in sortedList)
{
- if (Instance.FileFilterHideRegex != null && Instance.FileFilterHideRegex != ""
- && new Regex(Instance.FileFilterHideRegex).IsMatch(fileItem.Name))
+ if (fileFilterHideRegex?.IsMatch(fileItem.Name) == true)
{
continue;
}