From a01dac767a0a75bb8bc04ca6431e4ebec2b19df6 Mon Sep 17 00:00:00 2001 From: crschnick Date: Mon, 3 Mar 2025 12:45:56 +0000 Subject: [PATCH] Improve icon cache handling of blank images --- .../app/comp/store/StoreIconChoiceComp.java | 16 ++++++++-------- .../java/io/xpipe/app/icon/SystemIconCache.java | 15 ++++++++++++++- .../io/xpipe/app/icon/SystemIconManager.java | 13 ++++++++++++- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreIconChoiceComp.java b/app/src/main/java/io/xpipe/app/comp/store/StoreIconChoiceComp.java index 49bb98b35..f6771960b 100644 --- a/app/src/main/java/io/xpipe/app/comp/store/StoreIconChoiceComp.java +++ b/app/src/main/java/io/xpipe/app/comp/store/StoreIconChoiceComp.java @@ -6,6 +6,7 @@ import io.xpipe.app.core.AppI18n; import io.xpipe.app.icon.SystemIcon; import io.xpipe.app.icon.SystemIconCache; import io.xpipe.app.icon.SystemIconManager; +import io.xpipe.app.resources.AppImages; import io.xpipe.app.util.BooleanScope; import io.xpipe.app.util.LabelGraphic; import io.xpipe.app.util.ThreadHelper; @@ -106,14 +107,13 @@ public class StoreIconChoiceComp extends SimpleComp { } private void updateData(TableView> table, String filterString) { - var displayedIcons = filterString == null || filterString.isBlank() || filterString.length() < 2 - ? icons.stream() - .sorted(Comparator.comparing(systemIcon -> systemIcon.getId())) - .toList() - : icons.stream() - .filter(icon -> containsString(icon.getId(), filterString)) - .toList(); - + var stream = icons.stream() + .filter(systemIcon -> AppImages.hasNormalImage("icons/" + systemIcon.getSource().getId() + "/" + systemIcon.getId() + "-40.png")) + .sorted(Comparator.comparing(systemIcon -> systemIcon.getId())); + if (filterString != null && !filterString.isBlank() && filterString.length() >= 2) { + stream = stream.filter(icon -> containsString(icon.getId(), filterString)); + } + var displayedIcons = stream.toList(); var data = partitionList(displayedIcons, columns); table.getItems().setAll(data); } diff --git a/app/src/main/java/io/xpipe/app/icon/SystemIconCache.java b/app/src/main/java/io/xpipe/app/icon/SystemIconCache.java index 94e85cee4..429290196 100644 --- a/app/src/main/java/io/xpipe/app/icon/SystemIconCache.java +++ b/app/src/main/java/io/xpipe/app/icon/SystemIconCache.java @@ -23,6 +23,7 @@ public class SystemIconCache { private static enum ImageColorScheme { + TRANSPARENT, MIXED, LIGHT, DARK @@ -63,6 +64,10 @@ public class SystemIconCache { } var scheme = rasterizeSizes(icon.getFile(), target, icon.getName(), dark); + if (scheme == ImageColorScheme.TRANSPARENT) { + continue; + } + if (scheme != ImageColorScheme.DARK || icon.getColorSchemeData() != SystemIconSourceFile.ColorSchemeData.DEFAULT) { continue; } @@ -106,10 +111,13 @@ public class SystemIconCache { if (image == null) { continue; } - write(dir, name, dark, size, image); if (c == null) { c = determineColorScheme(image); + if (c == ImageColorScheme.TRANSPARENT) { + return ImageColorScheme.TRANSPARENT; + } } + write(dir, name, dark, size, image); } return c; } catch (Exception ex) { @@ -205,6 +213,11 @@ public class SystemIconCache { counter++; } } + + if (counter == 0) { + return ImageColorScheme.TRANSPARENT; + } + mean /= counter * 3; if (mean < 50) { return ImageColorScheme.DARK; diff --git a/app/src/main/java/io/xpipe/app/icon/SystemIconManager.java b/app/src/main/java/io/xpipe/app/icon/SystemIconManager.java index f6adc6607..d5a65e3b1 100644 --- a/app/src/main/java/io/xpipe/app/icon/SystemIconManager.java +++ b/app/src/main/java/io/xpipe/app/icon/SystemIconManager.java @@ -80,7 +80,18 @@ public class SystemIconManager { }); } - public static void reloadImages() { + private static void reloadImages() { + AppImages.remove(s -> s.startsWith("icons/")); + try { + for (var source : getEffectiveSources()) { + AppImages.loadRasterImages(SystemIconCache.getDirectory(source), "icons/" + source.getId()); + } + } catch (Exception e) { + ErrorEvent.fromThrowable(e).handle(); + } + } + + private static void clearInvalidImages() { AppImages.remove(s -> s.startsWith("icons/")); try { for (var source : getEffectiveSources()) {