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
|
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)
|
||||||
|
}
|
||||||
}
|
}
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -66,4 +75,4 @@ fun IconSource.Companion.fromUri(uri: String): IconSourceWithURI? {
|
|||||||
// .getOrNull()
|
// .getOrNull()
|
||||||
// ?.openStream()
|
// ?.openStream()
|
||||||
}?.takeIf { it.exists() }
|
}?.takeIf { it.exists() }
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user