Skip to content

Commit f9a9292

Browse files
authored
Merge pull request #2157 from gave92/fix_iconoverlay
Fix issues with icon overlays
2 parents 480cead + 94b9577 commit f9a9292

File tree

2 files changed

+52
-51
lines changed

2 files changed

+52
-51
lines changed

Files.Launcher/Win32API.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ public static (string icon, bool isCustom) GetFileOverlayIcon(string path)
120120
if (ret == IntPtr.Zero) return (null, false);
121121
bool isCustom = !shfi.szDisplayName.StartsWith(Environment.GetFolderPath(Environment.SpecialFolder.Windows));
122122
User32.DestroyIcon(shfi.hIcon);
123-
Shell32.SHGetImageList(Shell32.SHIL.SHIL_EXTRALARGE, typeof(ComCtl32.IImageList).GUID, out var tmp);
123+
Shell32.SHGetImageList(Shell32.SHIL.SHIL_LARGE, typeof(ComCtl32.IImageList).GUID, out var tmp);
124124
using var imageList = ComCtl32.SafeHIMAGELIST.FromIImageList(tmp);
125125
if (imageList.IsNull || imageList.IsInvalid) return (null, isCustom);
126126
var overlay_idx = shfi.iIcon >> 24;
@@ -129,7 +129,7 @@ public static (string icon, bool isCustom) GetFileOverlayIcon(string path)
129129
var overlay_image = imageList.Interface.GetOverlayImage(overlay_idx);
130130
using var hIcon = imageList.Interface.GetIcon(overlay_image, ComCtl32.IMAGELISTDRAWFLAGS.ILD_TRANSPARENT);
131131
if (hIcon.IsNull || hIcon.IsInvalid) return (null, isCustom);
132-
var image = hIcon.ToIcon().ToBitmap();
132+
using var image = hIcon.ToIcon().ToBitmap();
133133
byte[] bitmapData = (byte[])new ImageConverter().ConvertTo(image, typeof(byte[]));
134134
return (Convert.ToBase64String(bitmapData, 0, bitmapData.Length), isCustom);
135135
}

Files/View Models/ItemViewModel.cs

Lines changed: 50 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -483,23 +483,6 @@ public async void LoadExtendedItemProperties(ListedItem item, uint thumbnailSize
483483
matchingItem.LoadFileIcon = true;
484484
}
485485
}
486-
if (App.Connection != null)
487-
{
488-
var value = new ValueSet();
489-
value.Add("Arguments", "GetIconOverlay");
490-
value.Add("filePath", matchingItem.ItemPath);
491-
var response = await App.Connection.SendMessageAsync(value);
492-
var iconOverlay = response.Message.Get("IconOverlay", (string)null);
493-
if (iconOverlay != null)
494-
{
495-
matchingItem.IconOverlay = new BitmapImage();
496-
byte[] bitmapData = Convert.FromBase64String(iconOverlay);
497-
using (var ms = new MemoryStream(bitmapData))
498-
{
499-
await matchingItem.IconOverlay.SetSourceAsync(ms.AsRandomAccessStream());
500-
}
501-
}
502-
}
503486
if (item.IsShortcutItem)
504487
{
505488
// Reset cloud sync status icon
@@ -511,6 +494,7 @@ public async void LoadExtendedItemProperties(ListedItem item, uint thumbnailSize
511494
matchingItem.ItemType = matchingStorageItem.DisplayType;
512495
var syncStatus = await CheckCloudDriveSyncStatus(matchingStorageItem);
513496
matchingItem.SyncStatusUI = CloudDriveSyncStatusUI.FromCloudDriveSyncStatus(syncStatus);
497+
matchingItem.IconOverlay = (await LoadIconOverlay(matchingItem.ItemPath)).Icon;
514498
}
515499
}
516500
}
@@ -533,44 +517,35 @@ public async void LoadExtendedItemProperties(ListedItem item, uint thumbnailSize
533517
StorageFolder matchingStorageItem = await StorageFileExtensions.GetFolderFromPathAsync((item as ShortcutItem)?.TargetPath ?? item.ItemPath, _workingRoot, _currentStorageFolder);
534518
if (matchingItem != null && matchingStorageItem != null)
535519
{
536-
if (App.Connection != null)
520+
var iconOverlay = await LoadIconOverlay(matchingItem.ItemPath);
521+
if (iconOverlay.IsCustom)
537522
{
538-
var value = new ValueSet();
539-
value.Add("Arguments", "GetIconOverlay");
540-
value.Add("filePath", matchingItem.ItemPath);
541-
var response = await App.Connection.SendMessageAsync(value);
542-
var hasCustomIcon = (response.Status == Windows.ApplicationModel.AppService.AppServiceResponseStatus.Success)
543-
&& response.Message.Get("HasCustomIcon", false);
544-
if (hasCustomIcon)
523+
// Only set folder icon if it's a custom icon
524+
using (var Thumbnail = await matchingStorageItem.GetThumbnailAsync(ThumbnailMode.SingleItem, thumbnailSize, ThumbnailOptions.UseCurrentScale))
545525
{
546-
// Only set folder icon if it's a custom icon
547-
using (var Thumbnail = await matchingStorageItem.GetThumbnailAsync(ThumbnailMode.SingleItem, thumbnailSize, ThumbnailOptions.UseCurrentScale))
526+
if (Thumbnail != null)
548527
{
549-
if (Thumbnail != null)
550-
{
551-
matchingItem.FileImage = new BitmapImage();
552-
await matchingItem.FileImage.SetSourceAsync(Thumbnail);
553-
matchingItem.LoadUnknownTypeGlyph = false;
554-
matchingItem.LoadFolderGlyph = false;
555-
matchingItem.LoadFileIcon = true;
556-
}
557-
}
558-
}
559-
var iconOverlay = response.Message.Get("IconOverlay", (string)null);
560-
if (iconOverlay != null)
561-
{
562-
matchingItem.IconOverlay = new BitmapImage();
563-
byte[] bitmapData = Convert.FromBase64String(iconOverlay);
564-
using (var ms = new MemoryStream(bitmapData))
565-
{
566-
await matchingItem.IconOverlay.SetSourceAsync(ms.AsRandomAccessStream());
528+
matchingItem.FileImage = new BitmapImage();
529+
await matchingItem.FileImage.SetSourceAsync(Thumbnail);
530+
matchingItem.LoadUnknownTypeGlyph = false;
531+
matchingItem.LoadFolderGlyph = false;
532+
matchingItem.LoadFileIcon = true;
567533
}
568534
}
569535
}
570-
matchingItem.FolderRelativeId = matchingStorageItem.FolderRelativeId;
571-
matchingItem.ItemType = matchingStorageItem.DisplayType;
572-
var syncStatus = await CheckCloudDriveSyncStatus(matchingStorageItem);
573-
matchingItem.SyncStatusUI = CloudDriveSyncStatusUI.FromCloudDriveSyncStatus(syncStatus);
536+
if (item.IsShortcutItem)
537+
{
538+
// Reset cloud sync status icon
539+
matchingItem.SyncStatusUI = new CloudDriveSyncStatusUI() { LoadSyncStatus = false };
540+
}
541+
else
542+
{
543+
matchingItem.FolderRelativeId = matchingStorageItem.FolderRelativeId;
544+
matchingItem.ItemType = matchingStorageItem.DisplayType;
545+
var syncStatus = await CheckCloudDriveSyncStatus(matchingStorageItem);
546+
matchingItem.SyncStatusUI = CloudDriveSyncStatusUI.FromCloudDriveSyncStatus(syncStatus);
547+
matchingItem.IconOverlay = iconOverlay.Icon;
548+
}
574549
}
575550
}
576551
catch (Exception)
@@ -589,6 +564,32 @@ public async void LoadExtendedItemProperties(ListedItem item, uint thumbnailSize
589564
}
590565
}
591566

567+
private async Task<(BitmapImage Icon, bool IsCustom)> LoadIconOverlay(string filePath)
568+
{
569+
if (App.Connection != null)
570+
{
571+
var value = new ValueSet();
572+
value.Add("Arguments", "GetIconOverlay");
573+
value.Add("filePath", filePath);
574+
var response = await App.Connection.SendMessageAsync(value);
575+
var hasCustomIcon = (response.Status == Windows.ApplicationModel.AppService.AppServiceResponseStatus.Success)
576+
&& response.Message.Get("HasCustomIcon", false);
577+
var iconOverlay = response.Message.Get("IconOverlay", (string)null);
578+
if (iconOverlay != null)
579+
{
580+
var image = new BitmapImage();
581+
byte[] bitmapData = Convert.FromBase64String(iconOverlay);
582+
using (var ms = new MemoryStream(bitmapData))
583+
{
584+
await image.SetSourceAsync(ms.AsRandomAccessStream());
585+
}
586+
return (image, hasCustomIcon);
587+
}
588+
return (null, hasCustomIcon);
589+
}
590+
return (null, false);
591+
}
592+
592593
public void RefreshItems()
593594
{
594595
AddItemsToCollectionAsync(WorkingDirectory);

0 commit comments

Comments
 (0)