Skip to content

Commit

Permalink
Fix gallery loading when changing directory
Browse files Browse the repository at this point in the history
  • Loading branch information
Ruben2776 committed May 22, 2023
1 parent 37d5ed6 commit ea5aa96
Show file tree
Hide file tree
Showing 6 changed files with 87 additions and 48 deletions.
14 changes: 7 additions & 7 deletions PicView/ChangeImage/Error_Handling.cs
Expand Up @@ -139,9 +139,7 @@ internal static void ChangeFolder(bool backup = false)
/// </summary>
internal static async Task ReloadAsync(bool fromBackup = false)
{
string? path = fromBackup
? BackupPath ?? null
: GetReloadPath();
var path = fromBackup ? BackupPath ?? null : GetReloadPath();
if (path == null)
{
UnexpectedError();
Expand Down Expand Up @@ -178,20 +176,22 @@ internal static async Task ReloadAsync(bool fromBackup = false)
string? GetReloadPath()
{
if (CheckOutOfRange())
{
return ConfigureWindows.GetMainWindow?.Dispatcher.Invoke(() =>
{
var path = Path.GetFileName(ConfigureWindows.GetMainWindow.TitleText.Text);
return path == (string)Application.Current.Resources["Loading"] ? InitialPath : path;
var fileName = Path.GetFileName(ConfigureWindows.GetMainWindow.TitleText.Text);
return fileName == (string) Application.Current.Resources["Loading"] ? InitialPath : fileName;
});
if (string.IsNullOrWhiteSpace(InitialPath) == false
}

if (string.IsNullOrWhiteSpace(InitialPath) == false
&& Settings.Default.IncludeSubDirectories
&& Path.GetDirectoryName(InitialPath) != Path.GetDirectoryName(Pics[FolderIndex]))
{
return InitialPath;
}

return Pics[FolderIndex];

}
}

Expand Down
14 changes: 7 additions & 7 deletions PicView/ChangeImage/LoadPic.cs
@@ -1,6 +1,7 @@
using PicView.FileHandling;
using PicView.ImageHandling;
using PicView.PicGallery;
using PicView.Properties;
using PicView.UILogic;
using System.Diagnostics;
using System.IO;
Expand Down Expand Up @@ -133,18 +134,17 @@ private static async Task LoadPiFromFileAsync(FileInfo fileInfo)

Pics = FileList(fileInfo);

if (Properties.Settings.Default.FullscreenGallery)
{
await GalleryLoad.LoadAsync().ConfigureAwait(false);
}

if (string.IsNullOrWhiteSpace(InitialPath) || folderChanged)
InitialPath = fileInfo.FullName;
}
else if (Pics.Count > PreLoader.MaxCount) PreLoader.Clear();

FolderIndex = Pics.IndexOf(fileInfo.FullName);
await LoadPicAtIndexAsync(FolderIndex, fileInfo).ConfigureAwait(false);
if ( folderChanged && Settings.Default.FullscreenGallery)
{
await GalleryLoad.ReloadGallery().ConfigureAwait(false);
}
}

#endregion
Expand Down Expand Up @@ -243,9 +243,9 @@ internal static async Task LoadPicFromFolderAsync(FileInfo fileInfo, int index =
await LoadPicAtIndexAsync(0, fileInfo).ConfigureAwait(false);
}

if (Properties.Settings.Default.FullscreenGallery)
if (Settings.Default.FullscreenGallery)
{
await GalleryLoad.LoadAsync().ConfigureAwait(false);
await GalleryLoad.ReloadGallery().ConfigureAwait(false);
}

if (folderChanged || string.IsNullOrWhiteSpace(InitialPath))
Expand Down
5 changes: 4 additions & 1 deletion PicView/ChangeImage/Navigation.cs
Expand Up @@ -3,6 +3,9 @@
using PicView.PicGallery;
using PicView.Properties;
using PicView.UILogic;
using PicView.Views.UserControls.Gallery;
using System.Windows.Threading;
using System;

namespace PicView.ChangeImage;

Expand Down Expand Up @@ -135,7 +138,7 @@ internal static async Task GoToNextFolder(bool next)
await LoadPic.LoadPicAtIndexAsync(0).ConfigureAwait(false);
if (Settings.Default.FullscreenGallery)
{
await GalleryLoad.LoadAsync().ConfigureAwait(false);
await GalleryLoad.ReloadGallery().ConfigureAwait(false);
}
}

Expand Down
2 changes: 1 addition & 1 deletion PicView/FileHandling/ArchiveExtraction.cs
Expand Up @@ -147,7 +147,7 @@ private static bool Extract(string path, string exe, bool isWinrar)
if (Settings.Default.FullscreenGallery)
{
await GalleryLoad.LoadAsync().ConfigureAwait(false);
await GalleryLoad.ReloadGallery().ConfigureAwait(false);
}
}
else
Expand Down
95 changes: 65 additions & 30 deletions PicView/PicGallery/GalleryLoad.cs
Expand Up @@ -115,54 +115,89 @@ internal static void LoadLayout()

internal static async Task LoadAsync()
{
if (UC.GetPicGallery is null || IsLoading) { return; }

IsLoading = true;
var source = new CancellationTokenSource();
try
{
await LoopAsync(source.Token).ConfigureAwait(false);
await Task.Run(async () =>
{
var count = Navigation.Pics.Count;
var index = Navigation.FolderIndex;
for (var i = 0; i < count; i++)
{
try
{
if (count != Navigation.Pics.Count)
{
throw new TaskCanceledException();
}
Add(i, index);
}
catch (Exception)
{
//GalleryFunctions.Clear();
//IsLoading = false;
}
}
await Task.Run(() =>
{
Parallel.For(0, count, i =>
{
try
{
if (count != Navigation.Pics.Count || Navigation.Pics?.Count < Navigation.FolderIndex || Navigation.Pics?.Count < 1)
{
throw new TaskCanceledException();
}
var bitmapSource = Thumbnails.GetBitmapSourceThumb(new FileInfo(Navigation.Pics[i]), (int)GalleryNavigation.PicGalleryItemSize);
UpdatePic(i, bitmapSource);
}
catch (Exception exception)
{
//GalleryFunctions.Clear();
//IsLoading = false;
}
});
}, source.Token);
}, source.Token).ConfigureAwait(false);
}
catch (TaskCanceledException)
catch (Exception)
{
ConfigureWindows.GetMainWindow.Dispatcher.Invoke(DispatcherPriority.Background,
new Action(() => { UC.GetPicGallery.Container.Children.Clear(); }));
await LoadAsync().ConfigureAwait(false);
GalleryFunctions.Clear();
IsLoading = false;
}
finally
{
IsLoading = false;
source.Dispose();
}
IsLoading = false;
}

private static async Task LoopAsync(CancellationToken cancellationToken)
{
if (UC.GetPicGallery is null) { return; }

var count = Navigation.Pics.Count;
var index = Navigation.FolderIndex;

for (int i = 0; i < count; i++)
internal static async Task ReloadGallery()
{
if (Settings.Default.FullscreenGallery)
{
if (count != Navigation.Pics.Count)
while (IsLoading)
{
throw new TaskCanceledException();
await Task.Delay(200).ConfigureAwait(false);
ConfigureWindows.GetMainWindow.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() =>
{
if (UC.GetPicGallery.Container.Children.Count is 0)
{
IsLoading = false;
}
}));
}

Add(i, index);
await LoadAsync().ConfigureAwait(false);
}

await Parallel.ForEachAsync(Navigation.Pics, cancellationToken, async (item, token) =>
{
if (count != Navigation.Pics.Count)
{
throw new TaskCanceledException();
}
if (cancellationToken.IsCancellationRequested)
{
cancellationToken.ThrowIfCancellationRequested();
}
await UpdatePic(item).ConfigureAwait(false);
});
}

internal static void Add(int i, int index)
Expand Down Expand Up @@ -206,7 +241,7 @@ internal static void UpdatePic(int i, BitmapSource? pic)
if (Navigation.Pics?.Count < Navigation.FolderIndex || Navigation.Pics?.Count < 1 || i >= UC.GetPicGallery.Container.Children.Count)
{
GalleryFunctions.Clear();
LoadAsync().ConfigureAwait(false); // restart when changing directory
//LoadAsync().ConfigureAwait(false); // restart when changing directory
return;
}
Expand Down
5 changes: 3 additions & 2 deletions PicView/Shortcuts/MainKeyboardShortcuts.cs
Expand Up @@ -412,9 +412,10 @@ internal static async Task MainWindow_KeysDownAsync(object sender, KeyEventArgs

// R
case Key.R:
if (ctrlDown && !GalleryFunctions.IsGalleryOpen)
if (ctrlDown && !GalleryFunctions.IsGalleryOpen || ctrlDown && Settings.Default.FullscreenGallery)
{
await ReloadAsync().ConfigureAwait(false);
BackupPath = Pics[FolderIndex];
await ReloadAsync(true).ConfigureAwait(false);
}
else
{
Expand Down

0 comments on commit ea5aa96

Please sign in to comment.