Skip to content

Commit af5dbc3

Browse files
author
David Khristepher Santos
committed
Rebuild thumbnails
1 parent 29effd6 commit af5dbc3

6 files changed

Lines changed: 55 additions & 1 deletion

File tree

Diffusion.Toolkit/Controls/ThumbnailView.xaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -601,6 +601,7 @@
601601
<MenuItem Style="{StaticResource FolderMenuItem}" Header="{lex:Loc Thumbnail.ContextMenu.ScanNew}" Command="{Binding ScanFolderCommand}" />
602602
<Separator Style="{StaticResource FolderSeparator}"/>
603603
<MenuItem Style="{StaticResource FileMenuItem}" Header="{lex:Loc Thumbnail.ContextMenu.Rescan}" Command="{Binding RescanCommand}" />
604+
<MenuItem Style="{StaticResource FileMenuItem}" Header="{lex:Loc Thumbnail.ContextMenu.RebuildThumbnail}" Command="{Binding RebuildThumbnailCommand}" />
604605
</ContextMenu>
605606
</ListView.ContextMenu>
606607
<ListView.Template>

Diffusion.Toolkit/Controls/ThumbnailView.xaml.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ public ThumbnailView()
7676
Model.CopyCommand = new RelayCommand<object>(o => CopySelected());
7777
Model.MoveCommand = new RelayCommand<object>(o => MoveSelected());
7878
Model.RescanCommand = new AsyncCommand<object>(o => RescanSelected());
79+
Model.RebuildThumbnailCommand = new RelayCommand<object>(o => RebuildThumbnails());
80+
7981
Model.RescanFolderCommand = new AsyncCommand<object>(o => RescanFolder(true));
8082
Model.ScanFolderCommand = new AsyncCommand<object>(o => RescanFolder(false));
8183

@@ -149,6 +151,16 @@ await ServiceLocator.MetadataScannerService.QueueBatchAsync(
149151
}
150152

151153

154+
private void RebuildThumbnails()
155+
{
156+
var imageEntries = ThumbnailListView.SelectedItems.Cast<ImageEntry>().ToList();
157+
158+
foreach (var imageEntry in imageEntries)
159+
{
160+
ServiceLocator.ThumbnailService.RebuildThumbnail(imageEntry);
161+
}
162+
}
163+
152164
private void CopySelected()
153165
{
154166
var imageEntries = ThumbnailListView.SelectedItems.Cast<ImageEntry>().ToList();

Diffusion.Toolkit/Controls/ThumbnailViewModel.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,7 @@ public int PageSize
361361
}
362362

363363
public ICommand RescanCommand { get; set; }
364+
public ICommand RebuildThumbnailCommand { get; set; }
364365
public ICommand PermanentlyDeleteCommand { get; set; }
365366

366367
public int ThumbnailSpacing

Diffusion.Toolkit/Localization/default.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,7 @@
283283
"Thumbnail.ContextMenu.ForDeletion": "For _Deletion",
284284
"Thumbnail.ContextMenu.OpenWith": "Open with...",
285285
"Thumbnail.ContextMenu.Restore": "_Restore",
286+
"Thumbnail.ContextMenu.RebuildThumbnail": "Rebuild Thumbnail",
286287
"Thumbnail.ContextMenu.Rescan": "Rescan",
287288
"Thumbnail.ContextMenu.Remove": "Remove",
288289
"Thumbnail.ContextMenu.PermanentlyDelete": "Permanently Delete",

Diffusion.Toolkit/Thumbnails/ThumbnailJob.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ public class ThumbnailJob
1111
public ImageType Type { get; set; }
1212
public int Width { get; set; }
1313
public int Height { get; set; }
14+
public bool Rebuild { get; set; }
1415
}

Diffusion.Toolkit/Thumbnails/ThumbnailService.cs

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,44 @@ public ThumbnailService()
7070
private Dispatcher _dispatcher => ServiceLocator.Dispatcher;
7171

7272

73+
public void RebuildThumbnail(ImageEntry image)
74+
{
75+
image.LoadState = LoadState.Loading;
76+
77+
var job = new ThumbnailJob()
78+
{
79+
BatchId = image.BatchId,
80+
EntryType = image.EntryType,
81+
Path = image.Path,
82+
Type = image.Type,
83+
Height = image.Height,
84+
Width = image.Width,
85+
Rebuild = true
86+
};
87+
88+
_ = QueueAsync(job, (d) =>
89+
{
90+
image.LoadState = LoadState.Loaded;
91+
92+
if (d.Success)
93+
{
94+
_dispatcher.Invoke(() =>
95+
{
96+
image.Thumbnail = d.Image;
97+
image.ThumbnailHeight = d.Image.Height;
98+
image.ThumbnailWidth = d.Image.Width;
99+
});
100+
}
101+
else
102+
{
103+
_dispatcher.Invoke(() => { image.Unavailable = true; });
104+
}
105+
106+
//Debug.WriteLine($"Finished job {job.RequestId}");
107+
//OnPropertyChanged(nameof(Thumbnail));
108+
});
109+
}
110+
73111
public void QueueImage(ImageEntry image)
74112
{
75113
image.LoadState = LoadState.Loading;
@@ -201,7 +239,7 @@ private async Task ProcessTaskAsync(CancellationToken token)
201239

202240
if (_enableCache)
203241
{
204-
if (!ThumbnailCache.Instance.TryGetThumbnail(job.Data.Path, Size,
242+
if (job.Data.Rebuild || !ThumbnailCache.Instance.TryGetThumbnail(job.Data.Path, Size,
205243
out BitmapSource? thumbnail))
206244
{
207245
// Debug.WriteLine($"Loading from disk");

0 commit comments

Comments
 (0)