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; }