mirror of
https://github.com/jlengrand/compose-multiplatform.git
synced 2026-03-10 08:11:20 +00:00
ImageViewer fix simple warnings and code style issues (#3025)
This commit is contained in:
@@ -23,8 +23,6 @@ import kotlinx.serialization.json.Json
|
||||
import org.jetbrains.compose.resources.ExperimentalResourceApi
|
||||
import org.jetbrains.compose.resources.resource
|
||||
import java.io.File
|
||||
import java.util.UUID
|
||||
|
||||
|
||||
private const val maxStorableImageSizePx = 2000
|
||||
private const val storableThumbnailSizePx = 200
|
||||
|
||||
@@ -67,7 +67,7 @@ fun ImageViewerWithProvidedDependencies(
|
||||
slideInHorizontally { w -> multiplier * w } with
|
||||
slideOutHorizontally { w -> multiplier * -1 * w }
|
||||
}
|
||||
}) { (index, page) ->
|
||||
}) { (_, page) ->
|
||||
when (page) {
|
||||
is GalleryPage -> {
|
||||
GalleryScreen(
|
||||
|
||||
@@ -2,7 +2,12 @@ package example.imageviewer
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.remember
|
||||
import kotlinx.datetime.*
|
||||
import kotlinx.datetime.Clock
|
||||
import kotlinx.datetime.LocalDateTime
|
||||
import kotlinx.datetime.Month
|
||||
import kotlinx.datetime.TimeZone
|
||||
import kotlinx.datetime.toInstant
|
||||
import kotlinx.datetime.toLocalDateTime
|
||||
|
||||
class NameAndDescription(
|
||||
val name: String,
|
||||
|
||||
@@ -2,7 +2,6 @@ package example.imageviewer
|
||||
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import example.imageviewer.model.PictureData
|
||||
import kotlinx.coroutines.CoroutineDispatcher
|
||||
|
||||
expect fun Modifier.notchPadding(): Modifier
|
||||
|
||||
@@ -5,46 +5,18 @@ import androidx.compose.material.LocalTextStyle
|
||||
import androidx.compose.material.MaterialTheme
|
||||
import androidx.compose.material.ProvideTextStyle
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.graphics.Brush
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.unit.sp
|
||||
|
||||
object ImageviewerColors {
|
||||
val Gray = Color.DarkGray
|
||||
val LightGray = Color(100, 100, 100)
|
||||
val DarkGray = Color(32, 32, 32)
|
||||
val PreviewImageAreaHoverColor = Color(45, 45, 45)
|
||||
val ToastBackground = Color(23, 23, 23)
|
||||
val MiniatureColor = Color(50, 50, 50)
|
||||
val MiniatureHoverColor = Color(55, 55, 55)
|
||||
val Foreground = Color(210, 210, 210)
|
||||
val TranslucentBlack = Color(0, 0, 0, 60)
|
||||
val TranslucentWhite = Color(255, 255, 255, 20)
|
||||
val Transparent = Color.Transparent
|
||||
|
||||
val background = Color(0xFFFFFFFF)
|
||||
val onBackground = Color(0xFF19191C)
|
||||
|
||||
val fullScreenImageBackground = Color(0xFF19191C)
|
||||
val filterButtonsBackground = fullScreenImageBackground.copy(alpha = 0.7f)
|
||||
val uiLightBlack = Color(25, 25, 28).copy(alpha = 0.7f)
|
||||
val textOnImage = Color.White
|
||||
val noteBlockBackground = Color(0xFFF3F3F4)
|
||||
|
||||
|
||||
val KotlinGradient0 = Color(0xFF7F52FF)
|
||||
val KotlinGradient50 = Color(0xFFC811E2)
|
||||
val KotlinGradient100 = Color(0xFFE54857)
|
||||
|
||||
val kotlinHorizontalGradientBrush = Brush.horizontalGradient(
|
||||
colors = listOf(
|
||||
KotlinGradient0,
|
||||
KotlinGradient50,
|
||||
KotlinGradient100
|
||||
)
|
||||
)
|
||||
|
||||
fun buttonBackground(isHover: Boolean) = if (isHover) TranslucentBlack else Transparent
|
||||
}
|
||||
|
||||
@Composable
|
||||
|
||||
@@ -3,7 +3,12 @@ package example.imageviewer.view
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import example.imageviewer.LocalImageProvider
|
||||
|
||||
@@ -2,9 +2,11 @@ package example.imageviewer.view
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
import example.imageviewer.ImageStorage
|
||||
import example.imageviewer.PlatformStorableImage
|
||||
import example.imageviewer.model.PictureData
|
||||
|
||||
@Composable
|
||||
expect fun CameraView(modifier: Modifier, onCapture: (picture: PictureData.Camera, image: PlatformStorableImage)->Unit)
|
||||
expect fun CameraView(
|
||||
modifier: Modifier,
|
||||
onCapture: (picture: PictureData.Camera, image: PlatformStorableImage) -> Unit
|
||||
)
|
||||
|
||||
@@ -37,7 +37,6 @@ import example.imageviewer.isShareFeatureSupported
|
||||
import example.imageviewer.model.*
|
||||
import example.imageviewer.shareIcon
|
||||
import example.imageviewer.style.ImageviewerColors
|
||||
import org.jetbrains.compose.resources.ExperimentalResourceApi
|
||||
|
||||
@Composable
|
||||
fun MemoryScreen(
|
||||
@@ -197,7 +196,6 @@ private fun MemoryHeader(bitmap: ImageBitmap, picture: PictureData, onClick: ()
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalResourceApi::class)
|
||||
@Composable
|
||||
fun BoxScope.MagicButtonOverlay(onClick: () -> Unit) {
|
||||
Column(
|
||||
@@ -248,7 +246,7 @@ fun BoxScope.MemoryTextOverlay(picture: PictureData) {
|
||||
@OptIn(ExperimentalFoundationApi::class)
|
||||
@Composable
|
||||
fun Collapsible(s: String, onEdit: () -> Unit) {
|
||||
val interctionSource = remember { MutableInteractionSource() }
|
||||
val interactionSource = remember { MutableInteractionSource() }
|
||||
var isCollapsed by remember { mutableStateOf(true) }
|
||||
val text = if (isCollapsed) s.lines().first() + "... (see more)" else s
|
||||
Text(
|
||||
@@ -265,7 +263,7 @@ fun Collapsible(s: String, onEdit: () -> Unit) {
|
||||
stiffness = Spring.StiffnessLow
|
||||
)
|
||||
).combinedClickable(
|
||||
interactionSource = interctionSource, indication = null,
|
||||
interactionSource = interactionSource, indication = null,
|
||||
onClick = {
|
||||
isCollapsed = !isCollapsed
|
||||
},
|
||||
|
||||
@@ -5,7 +5,8 @@ import androidx.compose.foundation.gestures.detectTransformGestures
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.BoxWithConstraints
|
||||
import androidx.compose.foundation.layout.BoxWithConstraintsScope
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.SideEffect
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.drawWithContent
|
||||
import androidx.compose.ui.geometry.Offset
|
||||
@@ -44,8 +45,14 @@ fun ScalableImage(scalableState: ScalableState, image: ImageBitmap, modifier: Mo
|
||||
drawIntoCanvas {
|
||||
it.withSave {
|
||||
it.translate(areaCenter.x, areaCenter.y)
|
||||
it.translate(scalableState.transformation.offset.x, scalableState.transformation.offset.y)
|
||||
it.scale(scalableState.transformation.scale, scalableState.transformation.scale)
|
||||
it.translate(
|
||||
scalableState.transformation.offset.x,
|
||||
scalableState.transformation.offset.y
|
||||
)
|
||||
it.scale(
|
||||
scalableState.transformation.scale,
|
||||
scalableState.transformation.scale
|
||||
)
|
||||
it.translate(-imageCenter.x, -imageCenter.y)
|
||||
drawImage(image)
|
||||
}
|
||||
@@ -90,4 +97,4 @@ private val ImageBitmap.size get() = Size(width.toFloat(), height.toFloat())
|
||||
private val BoxWithConstraintsScope.areaSize
|
||||
@Composable get() = with(LocalDensity.current) {
|
||||
Size(maxWidth.toPx(), maxHeight.toPx())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,12 @@
|
||||
package example.imageviewer.view
|
||||
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.ImageBitmap
|
||||
import androidx.compose.ui.layout.ContentScale
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package example.imageviewer.view
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
|
||||
@Composable
|
||||
expect fun Tooltip(
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package example.imageviewer.view
|
||||
|
||||
import androidx.compose.foundation.layout.BoxScope
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
import example.imageviewer.model.ScalableState
|
||||
|
||||
@@ -2,7 +2,6 @@ package example.imageviewer
|
||||
|
||||
import androidx.compose.runtime.snapshots.SnapshotStateList
|
||||
import androidx.compose.ui.graphics.ImageBitmap
|
||||
import androidx.compose.ui.graphics.asImageBitmap
|
||||
import androidx.compose.ui.graphics.toAwtImage
|
||||
import androidx.compose.ui.graphics.toComposeImageBitmap
|
||||
import example.imageviewer.filter.scaleBitmapAspectRatio
|
||||
|
||||
@@ -7,9 +7,8 @@ import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.ImageBitmap
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.unit.dp
|
||||
import example.imageviewer.model.PictureData
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import java.util.*
|
||||
import java.util.UUID
|
||||
|
||||
actual fun Modifier.notchPadding(): Modifier = Modifier.padding(top = 12.dp)
|
||||
|
||||
|
||||
@@ -6,7 +6,6 @@ import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.material.Button
|
||||
import androidx.compose.material.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.remember
|
||||
|
||||
@@ -4,7 +4,16 @@ import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.graphics.ImageBitmap
|
||||
import androidx.compose.ui.graphics.asComposeImageBitmap
|
||||
import androidx.compose.ui.graphics.asSkiaBitmap
|
||||
import org.jetbrains.skia.*
|
||||
import org.jetbrains.skia.Bitmap
|
||||
import org.jetbrains.skia.Canvas
|
||||
import org.jetbrains.skia.ColorAlphaType
|
||||
import org.jetbrains.skia.ColorInfo
|
||||
import org.jetbrains.skia.ColorType
|
||||
import org.jetbrains.skia.FilterTileMode
|
||||
import org.jetbrains.skia.Image
|
||||
import org.jetbrains.skia.ImageFilter
|
||||
import org.jetbrains.skia.ImageInfo
|
||||
import org.jetbrains.skia.Paint
|
||||
|
||||
actual fun grayScaleFilter(bitmap: ImageBitmap, context: PlatformContext): ImageBitmap {
|
||||
return applyGrayScaleFilter(bitmap.asSkiaBitmap()).asComposeImageBitmap()
|
||||
|
||||
@@ -3,6 +3,7 @@ package example.imageviewer
|
||||
import androidx.compose.ui.window.ComposeUIViewController
|
||||
import platform.UIKit.UIViewController
|
||||
|
||||
@Suppress("FunctionName", "unused")
|
||||
fun MainViewController(): UIViewController =
|
||||
ComposeUIViewController {
|
||||
ImageViewerIos()
|
||||
|
||||
@@ -15,7 +15,6 @@ import platform.CoreFoundation.CFUUIDCreateString
|
||||
import platform.Foundation.CFBridgingRelease
|
||||
import platform.UIKit.UIApplication
|
||||
import platform.UIKit.UIImage
|
||||
import platform.UIKit.safeAreaInsets
|
||||
|
||||
private val iosNotchInset = object : WindowInsets {
|
||||
override fun getTop(density: Density): Int {
|
||||
|
||||
@@ -3,18 +3,16 @@ package example.imageviewer.storage
|
||||
import kotlinx.cinterop.*
|
||||
import kotlinx.coroutines.yield
|
||||
import platform.Foundation.*
|
||||
import platform.UIKit.UIImage
|
||||
import platform.UIKit.UIImageJPEGRepresentation
|
||||
import platform.posix.memcpy
|
||||
|
||||
|
||||
val NSFileManager.DocumentDirectory get() = URLForDirectory(
|
||||
directory = NSDocumentDirectory,
|
||||
inDomain = NSUserDomainMask,
|
||||
create = true,
|
||||
appropriateForURL = null,
|
||||
error = null
|
||||
)!!
|
||||
val NSFileManager.DocumentDirectory
|
||||
get() = URLForDirectory(
|
||||
directory = NSDocumentDirectory,
|
||||
inDomain = NSUserDomainMask,
|
||||
create = true,
|
||||
appropriateForURL = null,
|
||||
error = null
|
||||
)!!
|
||||
|
||||
// Mimic to java's File class
|
||||
@Suppress("FunctionName")
|
||||
@@ -78,5 +76,3 @@ fun NSURL.writeText(text: String) {
|
||||
error = null
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -2,26 +2,33 @@ package example.imageviewer.storage
|
||||
|
||||
import androidx.compose.runtime.snapshots.SnapshotStateList
|
||||
import androidx.compose.ui.graphics.ImageBitmap
|
||||
import androidx.compose.ui.graphics.toComposeImageBitmap
|
||||
import example.imageviewer.ImageStorage
|
||||
import example.imageviewer.PlatformStorableImage
|
||||
import example.imageviewer.model.PictureData
|
||||
import example.imageviewer.toImageBitmap
|
||||
import kotlinx.cinterop.CValue
|
||||
import kotlinx.cinterop.addressOf
|
||||
import kotlinx.cinterop.useContents
|
||||
import kotlinx.cinterop.usePinned
|
||||
import kotlinx.coroutines.*
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.IO
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import kotlinx.serialization.decodeFromString
|
||||
import kotlinx.serialization.encodeToString
|
||||
import kotlinx.serialization.json.Json
|
||||
import org.jetbrains.skia.Image
|
||||
import platform.CoreGraphics.CGRectMake
|
||||
import platform.CoreGraphics.CGSize
|
||||
import platform.CoreGraphics.CGSizeMake
|
||||
import platform.Foundation.*
|
||||
import platform.UIKit.*
|
||||
import platform.posix.memcpy
|
||||
import platform.Foundation.NSBundle
|
||||
import platform.Foundation.NSData
|
||||
import platform.Foundation.NSFileManager
|
||||
import platform.Foundation.NSURL
|
||||
import platform.Foundation.writeToURL
|
||||
import platform.UIKit.UIGraphicsBeginImageContextWithOptions
|
||||
import platform.UIKit.UIGraphicsEndImageContext
|
||||
import platform.UIKit.UIGraphicsGetImageFromCurrentImageContext
|
||||
import platform.UIKit.UIImage
|
||||
import platform.UIKit.UIImageJPEGRepresentation
|
||||
|
||||
private const val maxStorableImageSizePx = 1200
|
||||
private const val storableThumbnailSizePx = 180
|
||||
@@ -31,11 +38,18 @@ class IosImageStorage(
|
||||
private val pictures: SnapshotStateList<PictureData>,
|
||||
private val ioScope: CoroutineScope
|
||||
) : ImageStorage {
|
||||
private val savePictureDir = File(NSFileManager.defaultManager.DocumentDirectory, "ImageViewer/takenPhotos/")
|
||||
|
||||
private val PictureData.Camera.jpgFile get() = File(savePictureDir, "$id.jpg")
|
||||
private val PictureData.Camera.thumbnailJpgFile get() = File(savePictureDir, "$id-thumbnail.jpg")
|
||||
private val PictureData.Camera.jsonFile get() = File(savePictureDir, "$id.json")
|
||||
private val savePictureDir =
|
||||
File(NSFileManager.defaultManager.DocumentDirectory, "ImageViewer/takenPhotos/")
|
||||
|
||||
private val PictureData.Camera.jpgFile
|
||||
get() = File(savePictureDir, "$id.jpg")
|
||||
|
||||
private val PictureData.Camera.thumbnailJpgFile
|
||||
get() = File(savePictureDir, "$id-thumbnail.jpg")
|
||||
|
||||
private val PictureData.Camera.jsonFile
|
||||
get() = File(savePictureDir, "$id.json")
|
||||
|
||||
init {
|
||||
if (savePictureDir.isDirectory) {
|
||||
|
||||
Reference in New Issue
Block a user