Bladeren bron

improvements

improvements
Milan Jurkulak 1 jaar geleden
bovenliggende
commit
d18f8d6d1c

+ 14 - 7
composeApp/src/androidMain/kotlin/org/mjdev/desktop/activity/MainActivity.kt

@@ -26,9 +26,13 @@ import androidx.core.view.WindowCompat
 import androidx.core.view.WindowInsetsCompat
 import androidx.core.view.WindowInsetsControllerCompat
 import com.google.accompanist.permissions.ExperimentalPermissionsApi
+import org.mjdev.desktop.activity.MainActivity.Companion.TAG
 import org.mjdev.desktop.main.MainView
 import org.mjdev.desktop.context.DesktopContext.Companion.rememberDesktopContext
 import org.mjdev.desktop.context.LocalDesktopContext
+import org.mjdev.desktop.extensions.Compose.applyTransform
+import org.mjdev.desktop.extensions.Compose.dither
+import org.mjdev.desktop.extensions.Compose.grayScale
 import org.mjdev.desktop.extensions.Compose.preview
 import org.mjdev.desktop.helpers.permission.rememberPermissionManager
 import org.mjdev.desktop.helpers.theme.DesktopTheme
@@ -58,9 +62,7 @@ class MainActivity : ComponentActivity() {
             systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
         }
         setContent {
-            BackHandler(true) {
-                Log.d(TAG, "OnBackPressed")
-            }
+            onBackPress()
             rememberPermissionManager()
             CompositionLocalProvider(
                 LocalDesktopContext provides rememberDesktopContext(baseContext)
@@ -85,10 +87,17 @@ class MainActivity : ComponentActivity() {
     }
 
     companion object {
-        private val TAG = MainActivity::class.simpleName
+        val TAG = MainActivity::class.simpleName
     }
 }
 
+@Composable
+fun onBackPress(
+    action: () -> Unit = {
+        Log.d(TAG, "OnBackPressed")
+    }
+) = BackHandler(true, action)
+
 @OptIn(ExperimentalPermissionsApi::class)
 @Composable
 private fun ActivityMain() {
@@ -101,9 +110,7 @@ private fun ActivityMain() {
                     .fillMaxSize()
                     .padding(paddingValues)
                     .consumeWindowInsets(paddingValues)
-                    .windowInsetsPadding(
-                        WindowInsets.safeDrawing
-                    )
+                    .windowInsetsPadding(WindowInsets.safeDrawing)
             ) {
                 MainView()
             }

+ 15 - 7
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/AppsMenu.kt

@@ -96,7 +96,7 @@ fun AppsMenu(
     SlidingPanel(
         modifier = modifier
             .size(
-                appMenuMinWidth ,
+                appMenuMinWidth,
                 appMenuMinHeight
             )
 //            .widthIn(
@@ -134,10 +134,10 @@ fun AppsMenu(
                     contentAlignment = Alignment.BottomStart
                 ) {
                     val shape = BarShape(
-                        offset = 52f,
-                        circleRadius = 24.dp,
+                        offset = 50.dp,
+                        circleRadius = 32.dp,
                         cornerRadius = 4.dp,
-                        circleGap = 8.dp,
+                        circleGap = 4.dp,
                     )
                     val brush = Brush.horizontalGradient(
                         listOf(
@@ -161,8 +161,13 @@ fun AppsMenu(
                         avatarSize = 64.dp,
                         orientation = Orientation.Horizontal,
                         titleVerticalAlignment = Alignment.Bottom,
-                        iconPadding = PaddingValues(bottom = 16.dp),
-                        titlePadding = PaddingValues(top = 24.dp, start = 20.dp),
+                        iconPadding = PaddingValues(
+                            bottom = 16.dp
+                        ),
+                        titlePadding = PaddingValues(
+                            top = 24.dp,
+                            start = 20.dp
+                        ),
                         onUserAvatarClick = onUserAvatarClick,
                         onTooltip = onTooltip
                     )
@@ -271,5 +276,8 @@ class AppsMenuState(
 @Preview
 @Composable
 fun AppsMenuPreview() = preview {
-    AppsMenu()
+    AppsMenu(
+        appsMenuState = rememberAppsMenuState(true),
+        panelState = rememberVisibilityState(true)
+    )
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/controlcenter/pages/main/MainSettingsPage.kt

@@ -43,7 +43,7 @@ fun MainSettingsPage() = ControlCenterPage(
                 contentAlignment = Alignment.BottomStart
             ) {
                 val shape = BarShape(
-                    offset = 68f,
+                    offset = 80.dp,
                     circleRadius = 52.dp,
                     cornerRadius = 0.dp,
                     circleGap = 4.dp,

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/custom/PowerBlock.kt

@@ -51,7 +51,7 @@ fun PowerBlock(
             contentAlignment = Alignment.BottomCenter
         ) {
             val shape = BarShape(
-                offset = (minWidth / 2).value,
+                offset = (minWidth / 2),
                 circleRadius = 24.dp,
                 cornerRadius = 4.dp,
                 circleGap = 8.dp,

+ 0 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/user/UserAvatar.kt

@@ -47,7 +47,6 @@ import org.mjdev.desktop.extensions.Modifier.conditional
 import org.mjdev.desktop.helpers.compose.Orientation
 import org.jetbrains.compose.ui.tooling.preview.Preview
 
-// todo move back orientation for greeter
 @Suppress("FunctionName", "UNUSED_PARAMETER")
 @Composable
 fun UserAvatar(

+ 97 - 39
composeApp/src/commonMain/kotlin/org/mjdev/desktop/extensions/Compose.kt

@@ -25,10 +25,13 @@ import androidx.compose.runtime.snapshots.SnapshotStateList
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.DrawModifier
+import androidx.compose.ui.draw.drawWithContent
+import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.ColorFilter
 import androidx.compose.ui.graphics.ColorMatrix
+import androidx.compose.ui.graphics.ImageBitmap
 import androidx.compose.ui.graphics.Paint
 import androidx.compose.ui.graphics.drawscope.ContentDrawScope
 import androidx.compose.ui.input.pointer.pointerInput
@@ -48,6 +51,9 @@ import org.mjdev.desktop.helpers.fuzzywuzzy.FuzzySearch
 import org.mjdev.desktop.interfaces.IDesktopContext
 import kotlin.coroutines.CoroutineContext
 import androidx.compose.ui.graphics.drawscope.drawIntoCanvas
+import androidx.compose.ui.graphics.toArgb
+import androidx.compose.ui.unit.IntSize
+import kotlin.text.toInt
 
 object Compose {
 
@@ -279,47 +285,99 @@ object Compose {
         )
     }
 
-    class GreyScaleModifier : DrawModifier {
-        override fun ContentDrawScope.draw() {
-            val saturationMatrix = ColorMatrix().apply { setToSaturation(0f) }
-            val saturationFilter = ColorFilter.colorMatrix(saturationMatrix)
-            val paint = Paint().apply {
-                colorFilter = saturationFilter
-            }
-            drawIntoCanvas { canvas ->
-                val bounds = Rect(0f, 0f, size.width, size.height)
-                canvas.saveLayer(bounds, paint)
-                drawContent()
-                canvas.restore()
-            }
+//    class GreyScaleModifier : DrawModifier {
+//        override fun ContentDrawScope.draw() {
+//            val saturationFilter = ColorMatrix().apply {
+//                setToSaturation(0f)
+//            }.let { cm ->
+//                ColorFilter.colorMatrix(cm)
+//            }
+//            val paint = Paint().apply {
+//                colorFilter = saturationFilter
+//            }
+//            drawIntoCanvas { canvas ->
+//                val bounds = Rect(0f, 0f, size.width, size.height)
+//                canvas.saveLayer(bounds, paint)
+//                drawContent()
+//                canvas.restore()
+//            }
+//        }
+//    }
+
+//    fun Modifier.greyScale(): Modifier = this then GreyScaleModifier()
+
+    fun Modifier.grayScale(): Modifier = this then drawWithContent {
+        val saturationFilter = ColorMatrix().apply {
+            setToSaturation(0f)
+        }.let { cm ->
+            ColorFilter.colorMatrix(cm)
+        }
+        val paint = Paint().apply {
+            colorFilter = saturationFilter
+        }
+        drawIntoCanvas { canvas ->
+            val bounds = Rect(0f, 0f, size.width, size.height)
+            canvas.saveLayer(bounds, paint)
+            drawContent()
+            canvas.restore()
         }
     }
 
-    fun Modifier.greyScale(): Modifier = this then GreyScaleModifier()
-
-//    @Composable
-//    fun DisableBackHandler(
-//        isDisabled: Boolean,
-//        content: @Composable () -> Unit,
-//    ) {
-//        CompositionLocalProvider(
-//            values = LocalOnBackPressedDispatcherOwner.current?.let { parentDispatcherOwner ->
-//                arrayOf(
-//                    LocalOnBackPressedDispatcherOwner provides if (isDisabled) {
-//                        DummyOnBackPressedDispatcherOwner(parentDispatcherOwner.lifecycle)
-//                    } else {
-//                        parentDispatcherOwner
-//                    },
-//                )
-//            } ?: arrayOf(),
-//            content = content,
-//        )
-//    }
+    // todo
+    fun Modifier.applyTransform(
+        transform : (bitmap:ImageBitmap) -> ImageBitmap = { bitmap -> bitmap }
+    ): Modifier = this then drawWithContent {
+        val paint = Paint()
+        val size = IntSize(size.width.toInt(), size.height.toInt())
+        var bitmap = ImageBitmap(size.width, size.height)
+        drawIntoCanvas { canvas ->
+            canvas.drawImage(bitmap, Offset.Zero, paint)
+        }
+        bitmap = transform(bitmap)
+        drawIntoCanvas { canvas ->
+            canvas.drawImage(bitmap, Offset.Zero, paint)
+        }
+    }
 
-//    private class DummyOnBackPressedDispatcherOwner(
-//        override val lifecycle: Lifecycle,
-//    ) : OnBackPressedDispatcherOwner {
-//        override val onBackPressedDispatcher: OnBackPressedDispatcher
-//            get() = OnBackPressedDispatcher()
-//    }
+    // todo
+    fun Modifier.dither(): Modifier = this then drawWithContent {
+        val paint = Paint()
+        val size = IntSize(size.width.toInt(), size.height.toInt())
+        val bitmap = ImageBitmap(size.width, size.height)
+        val pixels = IntArray(size.width * size.height)
+        val bayerMatrix = arrayOf(
+            arrayOf(0, 128, 32, 160),
+            arrayOf(192, 64, 224, 96),
+            arrayOf(48, 176, 16, 144),
+            arrayOf(240, 112, 208, 80)
+        )
+        drawIntoCanvas { canvas ->
+            canvas.drawImage(bitmap, Offset.Zero, paint)
+        }
+        bitmap.readPixels(pixels)
+        val ditheredPixels = pixels.mapIndexed { index, pixel ->
+            val x = index % size.width
+            val y = index / size.width
+            val color = Color(pixel)
+            val intensity = (color.red * 255).toInt()
+            val threshold = bayerMatrix[y % 4][x % 4]
+            if (intensity > threshold) Color.White else Color.Black
+        }.toTypedArray()
+        drawIntoCanvas { canvas ->
+            for (y in 0 until size.height) {
+                for (x in 0 until size.width) {
+                    paint.color = ditheredPixels[y * size.width + x]
+                    canvas.drawRect(
+                        Rect(
+                            x.toFloat(),
+                            y.toFloat(),
+                            (x + 1).toFloat(),
+                            (y + 1).toFloat()
+                        ),
+                        paint
+                    )
+                }
+            }
+        }
+    }
 }

+ 21 - 12
composeApp/src/commonMain/kotlin/org/mjdev/desktop/helpers/shape/BarShape.kt

@@ -20,10 +20,10 @@ import androidx.compose.ui.unit.dp
 
 // todo : shadow
 class BarShape(
-    private val offset: Float,
+    private val offset: Dp,
     private val circleRadius: Dp,
     private val cornerRadius: Dp,
-    private val circleGap: Dp = 5.dp,
+    private val circleGap: Dp = 4.dp,
 ) : Shape {
     override fun createOutline(
         size: Size, layoutDirection: LayoutDirection, density: Density
@@ -32,16 +32,16 @@ class BarShape(
     }
 
     private fun getPath(size: Size, density: Density): Path {
-        val cutoutCenterX = offset
-        val cutoutRadius = density.run { (circleRadius + circleGap).toPx() }
-        val cornerRadiusPx = density.run { cornerRadius.toPx() }
+        val cutoutCenterX: Float = offset.value
+        val cutoutRadius : Float = density.run { (circleRadius + circleGap).toPx() }
+        val cornerRadiusPx: Float = density.run { cornerRadius.toPx() }
         val cornerDiameter = cornerRadiusPx * 2
         return Path().apply {
-            val cutoutEdgeOffset = cutoutRadius * 2.5f
-            val cutoutLeftX = cutoutCenterX - cutoutEdgeOffset
-            val cutoutRightX = cutoutCenterX + cutoutEdgeOffset
+            val cutoutEdgeOffset: Float = cutoutRadius * 2.5f
+            val cutoutLeftX : Float = cutoutCenterX - cutoutEdgeOffset
+            val cutoutRightX : Float = cutoutCenterX + cutoutEdgeOffset
             moveTo(x = 0F, y = size.height)
-            if (cutoutLeftX > 0) {
+            if (cutoutLeftX > 0f) {
                 val realLeftCornerDiameter = if (cutoutLeftX >= cornerRadiusPx) {
                     cornerDiameter
                 } else {
@@ -49,8 +49,14 @@ class BarShape(
                 }
                 arcTo(
                     rect = Rect(
-                        left = 0f, top = 0f, right = realLeftCornerDiameter, bottom = realLeftCornerDiameter
-                    ), startAngleDegrees = 180.0f, sweepAngleDegrees = 90.0f, forceMoveTo = false
+                        left = 0f,
+                        top = 0f,
+                        right = realLeftCornerDiameter,
+                        bottom = realLeftCornerDiameter
+                    ),
+                    startAngleDegrees = 180.0f,
+                    sweepAngleDegrees = 90.0f,
+                    forceMoveTo = false
                 )
             }
             lineTo(cutoutLeftX, 0f)
@@ -82,7 +88,10 @@ class BarShape(
                         top = 0f,
                         right = size.width,
                         bottom = realRightCornerDiameter
-                    ), startAngleDegrees = -90.0f, sweepAngleDegrees = 90.0f, forceMoveTo = false
+                    ),
+                    startAngleDegrees = -90.0f,
+                    sweepAngleDegrees = 90.0f,
+                    forceMoveTo = false
                 )
             }
             lineTo(x = size.width, y = size.height)