add PainterIconSource

This commit is contained in:
AmirHossein Abdolmotallebi 2025-01-20 05:14:55 +03:30
parent 9eb141ae8a
commit c3ed0dd541
2 changed files with 37 additions and 6 deletions

View File

@ -1,22 +1,29 @@
package com.abdownloadmanager.desktop.utils package com.abdownloadmanager.desktop.utils
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.graphics.painter.BitmapPainter
import androidx.compose.ui.graphics.toComposeImageBitmap 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.awt.image.BufferedImage
import java.io.File import java.io.File
import javax.swing.filechooser.FileSystemView import javax.swing.filechooser.FileSystemView
object FileIconProvider { class OSFileIconProvider(
private val icons: IMyIcons
) : FileIconProvider {
private val registeredIcons = mutableMapOf<String, ImageBitmap>() private val registeredIcons = mutableMapOf<String, ImageBitmap>()
private val lock=Any() private val lock = Any()
fun getIconOfFileExtension( private fun getIconOfFileExtension(
extension: String, extension: String,
): ImageBitmap? { ): ImageBitmap? {
val imageBitmap = registeredIcons[extension] val imageBitmap = registeredIcons[extension]
if (imageBitmap != null) { if (imageBitmap != null) {
return imageBitmap return imageBitmap
} else { } else {
synchronized(lock){ synchronized(lock) {
val bitmapFoundInSync = registeredIcons[extension] val bitmapFoundInSync = registeredIcons[extension]
if (bitmapFoundInSync != null) { if (bitmapFoundInSync != null) {
return bitmapFoundInSync return bitmapFoundInSync
@ -29,7 +36,7 @@ object FileIconProvider {
val icon = fileSystemView.getSystemIcon(file, w, h) val icon = fileSystemView.getSystemIcon(file, w, h)
bufferedImageToImageBitmap(iconToImage(icon)) bufferedImageToImageBitmap(iconToImage(icon))
}.onSuccess { }.onSuccess {
registeredIcons[extension]=it registeredIcons[extension] = it
}.getOrNull() }.getOrNull()
} }
} }
@ -48,4 +55,19 @@ object FileIconProvider {
private fun bufferedImageToImageBitmap(bufferedImage: BufferedImage): ImageBitmap { private fun bufferedImageToImageBitmap(bufferedImage: BufferedImage): ImageBitmap {
return bufferedImage.toComposeImageBitmap() 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)
}
} }

View File

@ -41,6 +41,15 @@ sealed interface IconSource {
override fun rememberPainter(): Painter = rememberVectorPainter(value) 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 companion object
} }