mirror of
https://github.com/amir1376/ab-download-manager.git
synced 2025-02-20 11:43:24 +08:00
add PainterIconSource
This commit is contained in:
parent
9eb141ae8a
commit
c3ed0dd541
@ -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<String, ImageBitmap>()
|
||||
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)
|
||||
}
|
||||
}
|
@ -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() }
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user