From c3ed0dd541b55b89dfca30feeff880b2cde74ca1 Mon Sep 17 00:00:00 2001 From: AmirHossein Abdolmotallebi Date: Mon, 20 Jan 2025 05:14:55 +0330 Subject: [PATCH] add PainterIconSource --- ...eIconProvider.kt => OSFileIconProvider.kt} | 32 ++++++++++++++++--- .../ir/amirab/util/compose/IconSource.kt | 11 ++++++- 2 files changed, 37 insertions(+), 6 deletions(-) rename desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/utils/{FileIconProvider.kt => OSFileIconProvider.kt} (64%) diff --git a/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/utils/FileIconProvider.kt b/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/utils/OSFileIconProvider.kt similarity index 64% rename from desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/utils/FileIconProvider.kt rename to desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/utils/OSFileIconProvider.kt index 76682e9..3ded40b 100644 --- a/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/utils/FileIconProvider.kt +++ b/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/utils/OSFileIconProvider.kt @@ -1,22 +1,29 @@ package com.abdownloadmanager.desktop.utils +import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.ImageBitmap +import androidx.compose.ui.graphics.painter.BitmapPainter import androidx.compose.ui.graphics.toComposeImageBitmap +import com.abdownloadmanager.shared.utils.FileIconProvider +import com.abdownloadmanager.shared.utils.ui.IMyIcons +import ir.amirab.util.compose.IconSource import java.awt.image.BufferedImage import java.io.File import javax.swing.filechooser.FileSystemView -object FileIconProvider { +class OSFileIconProvider( + private val icons: IMyIcons +) : FileIconProvider { private val registeredIcons = mutableMapOf() - private val lock=Any() - fun getIconOfFileExtension( + private val lock = Any() + private fun getIconOfFileExtension( extension: String, ): ImageBitmap? { val imageBitmap = registeredIcons[extension] if (imageBitmap != null) { return imageBitmap } else { - synchronized(lock){ + synchronized(lock) { val bitmapFoundInSync = registeredIcons[extension] if (bitmapFoundInSync != null) { return bitmapFoundInSync @@ -29,7 +36,7 @@ object FileIconProvider { val icon = fileSystemView.getSystemIcon(file, w, h) bufferedImageToImageBitmap(iconToImage(icon)) }.onSuccess { - registeredIcons[extension]=it + registeredIcons[extension] = it }.getOrNull() } } @@ -48,4 +55,19 @@ object FileIconProvider { private fun bufferedImageToImageBitmap(bufferedImage: BufferedImage): ImageBitmap { return bufferedImage.toComposeImageBitmap() } + + override fun getIcon(fileName: String): IconSource { + val extension = fileName.substringAfterLast('.', "") + val imageBitmap = getIconOfFileExtension(extension) + ?: return icons.file + return IconSource.PainterIconSource( + BitmapPainter(imageBitmap), + false + ) + } + + @Composable + override fun rememberIcon(fileName: String): IconSource { + return getIcon(fileName) + } } diff --git a/shared/compose-utils/src/main/kotlin/ir/amirab/util/compose/IconSource.kt b/shared/compose-utils/src/main/kotlin/ir/amirab/util/compose/IconSource.kt index abf1ed2..6045929 100644 --- a/shared/compose-utils/src/main/kotlin/ir/amirab/util/compose/IconSource.kt +++ b/shared/compose-utils/src/main/kotlin/ir/amirab/util/compose/IconSource.kt @@ -41,6 +41,15 @@ sealed interface IconSource { override fun rememberPainter(): Painter = rememberVectorPainter(value) } + @Immutable + data class PainterIconSource( + override val value: Painter, + override val requiredTint: Boolean, + ) : IconSource { + @Composable + override fun rememberPainter(): Painter = value + } + companion object } @@ -66,4 +75,4 @@ fun IconSource.Companion.fromUri(uri: String): IconSourceWithURI? { // .getOrNull() // ?.openStream() }?.takeIf { it.exists() } -} \ No newline at end of file +}