Ver Fonte

design improvements

milan jurkulák há 2 anos atrás
pai
commit
e2afb42839

+ 5 - 3
src/main/kotlin/eu/mjdev/desktop/Main.kt

@@ -1,11 +1,11 @@
 package eu.mjdev.desktop
 
-import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.material.MaterialTheme
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.window.application
+import eu.mjdev.dadb.helpers.log
 import eu.mjdev.desktop.components.appsmenu.AppsMenu
 import eu.mjdev.desktop.components.controlcenter.ControlCenter
 import eu.mjdev.desktop.components.desktoppanel.DesktopPanel
@@ -14,7 +14,6 @@ import eu.mjdev.desktop.provider.DesktopProvider
 import eu.mjdev.desktop.provider.DesktopProvider.Companion.LocalDesktop
 import eu.mjdev.desktop.windows.MainWindow
 
-@OptIn(ExperimentalFoundationApi::class)
 fun main() = application(
     exitProcessOnExit = true
 ) {
@@ -35,13 +34,16 @@ fun main() = application(
             DesktopPanel(
                 panelState = panelState,
                 onMenuIconClicked = {
+                    log { "menu icon clicked" }
                     menuState.toggle()
                 }
             )
             AppsMenu(
-                panelState = panelState,
                 bottomY = 64.dp,
                 menuState = menuState,
+                onVisibilityChange = { visible ->
+                    log { "Menu visible : $visible" }
+                }
             )
             ControlCenter(
                 controlCenterState = controlCenterState

+ 10 - 7
src/main/kotlin/eu/mjdev/desktop/components/appsmenu/AppsMenu.kt

@@ -25,7 +25,6 @@ import androidx.compose.ui.window.rememberWindowState
 import eu.mjdev.desktop.components.custom.UserAvatar
 import eu.mjdev.desktop.components.slidemenu.VisibilityState
 import eu.mjdev.desktop.components.slidemenu.VisibilityState.Companion.rememberVisibilityState
-import eu.mjdev.desktop.components.window.TopWindow
 import eu.mjdev.desktop.extensions.Compose.launchedEffect
 import eu.mjdev.desktop.extensions.Compose.setWindowBounds
 import eu.mjdev.desktop.helpers.WindowFocusState.Companion.windowFocusHandler
@@ -33,6 +32,7 @@ import eu.mjdev.desktop.provider.DesktopProvider
 import eu.mjdev.desktop.provider.DesktopProvider.Companion.LocalDesktop
 import eu.mjdev.desktop.provider.data.App
 import eu.mjdev.desktop.provider.data.Category
+import eu.mjdev.desktop.windows.TopWindow
 
 @Composable
 fun AppsMenu(
@@ -44,7 +44,6 @@ fun AppsMenu(
     backgroundColor: Color = api.currentUser.theme.backgroundColor,
     menuPadding: PaddingValues = PaddingValues(2.dp), // todo
     menuState: VisibilityState = rememberVisibilityState(),
-    panelState: VisibilityState = rememberVisibilityState(),
     items: MutableState<List<Any>> = remember { mutableStateOf(api.appsProvider.appCategories) },
     onVisibilityChange: (visible: Boolean) -> Unit = {},
 ) {
@@ -52,14 +51,18 @@ fun AppsMenu(
         placement = WindowPlacement.Floating,
         position = WindowPosition.Aligned(api.currentUser.theme.panelLocation.alignment),
         size = api.containerSize.copy(
-            width = if (panelState.isVisible) appMenuMinHeight else 0.dp
+            width = if (menuState.isVisible) appMenuMinHeight else 0.dp
         ),
         isMinimized = false
     )
     TopWindow(
         windowState = windowState,
     ) {
-        windowFocusHandler { hasFocus -> if (!hasFocus) menuState.hide() }
+        windowFocusHandler { hasFocus ->
+            if (!hasFocus) {
+                menuState.hide()
+            }
+        }
         AnimatedVisibility(
             menuState.isVisible,
             modifier = modifier,
@@ -105,8 +108,8 @@ fun AppsMenu(
                                             backgroundColor = backgroundColor,
                                             iconTint = Color.White
                                         ) { category ->
-                                            items.value =
-                                                api.appsProvider.categoriesAndApps[category.name] ?: emptyList()
+                                            items.value = api.appsProvider.categoriesAndApps[category.name]
+                                                ?: emptyList()
                                         }
                                     }
                                 }
@@ -141,7 +144,7 @@ fun AppsMenu(
                     true -> (api.containerSize.height - appMenuMinHeight)
                     else -> api.containerSize.height
                 }
-                val width = api.containerSize.width
+                val width = appMenuExpandedWidth
                 val height = when (isVisible) {
                     true -> appMenuMinHeight
                     else -> 0.dp

+ 3 - 1
src/main/kotlin/eu/mjdev/desktop/components/appsmenu/AppsMenuApp.kt

@@ -43,7 +43,9 @@ fun AppsMenuApp(
         iconBackgroundColor = backgroundColor,
         outerPadding = PaddingValues(2.dp),
         innerPadding = PaddingValues(0.dp)
-    )
+    ) {
+        onClick(app)
+    }
     TextAny(
         modifier = Modifier.padding(start = 4.dp).fillMaxWidth(),
         text = app?.name ?: "",

+ 3 - 1
src/main/kotlin/eu/mjdev/desktop/components/appsmenu/AppsMenuCategory.kt

@@ -42,7 +42,9 @@ fun AppsMenuCategory(
         iconBackgroundColor = backgroundColor,
         outerPadding = PaddingValues(2.dp),
         innerPadding = PaddingValues(0.dp)
-    )
+    ) {
+        onClick(category)
+    }
     TextAny(
         modifier = Modifier.padding(start = 4.dp).fillMaxWidth(),
         text = category.name,

+ 2 - 1
src/main/kotlin/eu/mjdev/desktop/components/background/BackgroundImage.kt

@@ -15,6 +15,7 @@ import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.layout.ContentScale
 import eu.mjdev.desktop.components.image.ImageAny
+import eu.mjdev.desktop.extensions.Compose.SuperDarkGray
 import eu.mjdev.desktop.extensions.Compose.launchedEffect
 import eu.mjdev.desktop.helpers.Queue.Companion.mutableQueue
 import kotlinx.coroutines.delay
@@ -26,7 +27,7 @@ fun BackgroundImage(
     switchDelay: Long = 5000L,
     fadeInDuration: Long = 3000L,
     fadeOutDuration: Long = 5000L,
-    backgroundColor: Color = Color.Transparent,
+    backgroundColor: Color = Color.SuperDarkGray,
     backgrounds: List<Any> = emptyList(),
     onChange: (bck: Any?) -> Unit = {}
 ) = Box(

+ 3 - 3
src/main/kotlin/eu/mjdev/desktop/components/controlcenter/ControlCenter.kt

@@ -1,7 +1,6 @@
 package eu.mjdev.desktop.components.controlcenter
 
 import androidx.compose.animation.*
-import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.background
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.gestures.Orientation
@@ -32,19 +31,19 @@ import eu.mjdev.desktop.components.shadow.RightShadow
 import eu.mjdev.desktop.components.slidemenu.SlidingMenu
 import eu.mjdev.desktop.components.slidemenu.VisibilityState
 import eu.mjdev.desktop.components.slidemenu.VisibilityState.Companion.rememberVisibilityState
-import eu.mjdev.desktop.components.window.TopWindow
 import eu.mjdev.desktop.extensions.Compose.launchedEffect
 import eu.mjdev.desktop.extensions.Compose.setWindowBounds
 import eu.mjdev.desktop.helpers.WindowFocusState.Companion.windowFocusHandler
 import eu.mjdev.desktop.provider.DesktopProvider
 import eu.mjdev.desktop.provider.DesktopProvider.Companion.LocalDesktop
+import eu.mjdev.desktop.windows.TopWindow
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.launch
 
 @Suppress("FunctionName")
-@OptIn(ExperimentalFoundationApi::class)
 @Composable
 fun ControlCenter(
+    modifier: Modifier = Modifier,
     api: DesktopProvider = LocalDesktop.current,
     backgroundColor: Color = api.currentUser.theme.backgroundColor,
     backgroundAlpha: Float = api.currentUser.theme.controlCenterBackgroundAlpha,
@@ -71,6 +70,7 @@ fun ControlCenter(
     ) {
         windowFocusHandler { hasFocus -> if (!hasFocus) controlCenterState.hide() }
         SlidingMenu(
+            modifier = modifier,
             orientation = Orientation.Horizontal,
             state = controlCenterState,
             onVisibilityChange = onVisibilityChange

+ 12 - 4
src/main/kotlin/eu/mjdev/desktop/components/desktoppanel/DesktopPanel.kt

@@ -30,7 +30,6 @@ import eu.mjdev.desktop.components.shadow.TopShadow
 import eu.mjdev.desktop.components.slidemenu.SlidingMenu
 import eu.mjdev.desktop.components.slidemenu.VisibilityState
 import eu.mjdev.desktop.components.slidemenu.VisibilityState.Companion.rememberVisibilityState
-import eu.mjdev.desktop.components.window.TopWindow
 import eu.mjdev.desktop.extensions.Compose.height
 import eu.mjdev.desktop.extensions.Compose.launchedEffect
 import eu.mjdev.desktop.extensions.Compose.setWindowBounds
@@ -38,11 +37,13 @@ import eu.mjdev.desktop.helpers.WindowFocusState.Companion.windowFocusHandler
 import eu.mjdev.desktop.provider.DesktopProvider
 import eu.mjdev.desktop.provider.DesktopProvider.Companion.LocalDesktop
 import eu.mjdev.desktop.provider.data.App
+import eu.mjdev.desktop.windows.TopWindow
 
 @OptIn(ExperimentalFoundationApi::class)
 @Suppress("FunctionName")
 @Composable
 fun DesktopPanel(
+    modifier: Modifier = Modifier,
     api: DesktopProvider = LocalDesktop.current,
     backgroundColor: Color = api.currentUser.theme.backgroundColor,
     shadowColor: Color = backgroundColor,
@@ -56,7 +57,7 @@ fun DesktopPanel(
     showMenuIcon: Boolean = true,
     panelState: VisibilityState = rememberVisibilityState(),
     onVisibilityChange: (visible: Boolean) -> Unit = {},
-    onMenuIconClicked: () -> Unit = {},
+    onMenuIconClicked: () -> Unit,
 ) {
     val panelSize = api.containerSize.copy(height = iconSize.height + iconPadding.height + iconOuterPadding.height)
     val windowState: WindowState = rememberWindowState(
@@ -72,6 +73,7 @@ fun DesktopPanel(
     ) {
         windowFocusHandler { hasFocus -> if (!hasFocus) panelState.hide() }
         SlidingMenu(
+            modifier = modifier,
             orientation = Orientation.Vertical,
             state = panelState,
             onVisibilityChange = onVisibilityChange
@@ -158,14 +160,20 @@ fun DesktopPanel(
                                     iconSize = iconSize,
                                     iconPadding = iconPadding,
                                     iconOuterPadding = iconOuterPadding,
-                                    onToolTip = onToolTip
+                                    onToolTip = onToolTip,
+                                    onClick = {
+                                        app.start()
+                                    }
                                 )
                             }
                             item {
                                 DesktopPanelText(
                                     text = api.appsProvider.currentLocale.country,
                                     backgroundHover = Color.White.copy(alpha = 0.3f),
-                                    onToolTip = onToolTip
+                                    onToolTip = onToolTip,
+                                    onClick = {
+                                        // todo
+                                    }
                                 )
                             }
                         }

+ 5 - 3
src/main/kotlin/eu/mjdev/desktop/components/desktoppanel/DesktopPanelIcon.kt

@@ -41,7 +41,7 @@ fun DesktopPanelIcon(
     iconOuterPadding: PaddingValues = PaddingValues(2.dp),
     iconState: MutableState<Boolean> = remember { mutableStateOf(false) },
     onToolTip: (item: Any?) -> Unit = {},
-    onClick: () -> Unit = { app?.start() },
+    onClick: () -> Unit,
 ) {
     val materialIcon = api.appsProvider.iconForApp(app?.name ?: icon) ?: "?".toInt()
     val background = remember(iconState.value) { if (iconState.value) iconBackgroundHover else Color.Transparent }
@@ -73,8 +73,10 @@ fun DesktopPanelIcon(
                 iconBackgroundColor = iconBackgroundColor,
                 iconSize = iconSize,
                 innerPadding = iconPadding,
-                outerPadding = iconOuterPadding,
-            )
+                outerPadding = iconOuterPadding
+            ) {
+                onClick()
+            }
         }
     }
 }

+ 1 - 1
src/main/kotlin/eu/mjdev/desktop/components/desktoppanel/DesktopPanelText.kt

@@ -32,7 +32,7 @@ fun DesktopPanelText(
     textPadding: PaddingValues = PaddingValues(4.dp),
     buttonState: MutableState<Boolean> = remember { mutableStateOf(false) },
     onToolTip: (item: Any?) -> Unit = {},
-    onClick: () -> Unit = {},
+    onClick: () -> Unit,
 ) = Box(
     modifier = Modifier
         .wrapContentSize()

+ 5 - 15
src/main/kotlin/eu/mjdev/desktop/components/fonticon/FontFile.kt

@@ -1,25 +1,15 @@
 package eu.mjdev.desktop.components.fonticon
 
+import androidx.compose.ui.text.font.Font
 import androidx.compose.ui.text.font.FontFamily
 import androidx.compose.ui.text.font.FontWeight
-import androidx.compose.ui.text.platform.Typeface
+import androidx.compose.ui.text.platform.Font
 import eu.mjdev.desktop.helpers.ResourceStream
-import org.jetbrains.skia.Data
-import org.jetbrains.skia.FontVariation
-import org.jetbrains.skia.Typeface
 
 class FontFile(
     private val ttfFileName: String,
     private val ttfResource: ResourceStream = ResourceStream(ttfFileName),
     private val fontWeight: FontWeight = FontWeight.Normal,
-    val fontFamily: FontFamily = Typeface.makeFromData(Data.makeFromBytes(ttfResource.bytes))
-        .makeClone(fontWeight).let {
-            FontFamily(typeface = Typeface(it, "alias${fontWeight.weight}"))
-        }
-) {
-    companion object {
-        fun Typeface.makeClone(weight: FontWeight): Typeface {
-            return makeClone(FontVariation("wght", weight.weight.toFloat()))
-        }
-    }
-}
+    private val font: Font = Font(ttfFileName, ttfResource.bytes, fontWeight),
+    val fontFamily: FontFamily = FontFamily(font)
+)

+ 3 - 1
src/main/kotlin/eu/mjdev/desktop/components/fonticon/MaterialIcon.kt

@@ -31,6 +31,7 @@ fun MaterialIcon(
     contentDescription: String = "",
     outerPadding: PaddingValues = PaddingValues(2.dp),
     iconShape: Shape = CircleShape,
+    onClick: () -> Unit
 ) = ShapedIcon(
     iconSize = iconSize,
     iconColor = iconColor,
@@ -51,5 +52,6 @@ fun MaterialIcon(
             fontFamily = iconicFont.fontFile.fontFamily,
             textAlign = TextAlign.Center
         )
-    }
+    },
+    onClick = onClick
 )

+ 7 - 0
src/main/kotlin/eu/mjdev/desktop/components/icon/ShapedIcon.kt

@@ -1,7 +1,9 @@
 package eu.mjdev.desktop.components.icon
 
+import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.onClick
 import androidx.compose.foundation.shape.CircleShape
 import androidx.compose.material.Icon
 import androidx.compose.material.icons.Icons
@@ -16,6 +18,7 @@ import androidx.compose.ui.unit.DpSize
 import androidx.compose.ui.unit.dp
 import eu.mjdev.desktop.extensions.Compose.size
 
+@OptIn(ExperimentalFoundationApi::class)
 @Composable
 fun ShapedIcon(
     imageVector: ImageVector = Icons.Filled.Apps,
@@ -27,6 +30,7 @@ fun ShapedIcon(
     iconShape: Shape = CircleShape,
     innerPadding: PaddingValues = PaddingValues(4.dp),
     outerPadding: PaddingValues = PaddingValues(2.dp),
+    onClick: () -> Unit = {}
 ) = Box(
     modifier = Modifier
         .padding(outerPadding)
@@ -34,6 +38,9 @@ fun ShapedIcon(
         .background(iconBackgroundColor, iconShape)
         .clip(iconShape)
         .padding(innerPadding)
+        .onClick {
+            onClick()
+        }
 ) {
     if (customContent != null) {
         customContent()

+ 5 - 1
src/main/kotlin/eu/mjdev/desktop/components/slidemenu/VisibilityState.kt

@@ -13,7 +13,11 @@ class VisibilityState(
     var isVisible: Boolean
         get() = visible.value
         set(value) {
-            visible.value = value
+            if (enabled) {
+                visible.value = value
+            } else {
+                println("Visible state disabled, can not set value.")
+            }
         }
 
     private val visible: MutableState<Boolean> = mutableStateOf(startState)

+ 5 - 3
src/main/kotlin/eu/mjdev/desktop/helpers/WindowFocusState.kt

@@ -16,12 +16,12 @@ class WindowFocusState(
     val isFocused: Boolean
         get() = focusState.value
 
-    override fun windowGainedFocus(p0: WindowEvent?) {
+    override fun windowGainedFocus(we: WindowEvent?) {
         focusState.value = true
         onFocusChange(isFocused)
     }
 
-    override fun windowLostFocus(p0: WindowEvent?) {
+    override fun windowLostFocus(we: WindowEvent?) {
         focusState.value = false
         onFocusChange(isFocused)
     }
@@ -39,7 +39,9 @@ class WindowFocusState(
         fun FrameWindowScope.windowFocusHandler(
             onFocusChange: (focused: Boolean) -> Unit = {}
         ) {
-            val state = remember(window) { WindowFocusState(window, onFocusChange) }
+            val state = remember(window) {
+                WindowFocusState(window, onFocusChange)
+            }
             DisposableEffect(Unit) {
                 state.init()
                 onDispose {

+ 8 - 0
src/main/kotlin/eu/mjdev/desktop/provider/DesktopProvider.kt

@@ -5,6 +5,7 @@ import androidx.compose.runtime.compositionLocalOf
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.ui.unit.DpSize
 import androidx.compose.ui.unit.dp
+import eu.mjdev.dadb.AdbDiscover.Companion.adbDevicesHandler
 import eu.mjdev.desktop.components.controlcenter.ControlCenterPage
 import eu.mjdev.desktop.components.controlcenter.pages.*
 import eu.mjdev.desktop.provider.data.User
@@ -43,6 +44,13 @@ class DesktopProvider(
         }
     }
 
+    val adbHandler = adbDevicesHandler(
+        coroutineScope = scope
+    ) { device ->
+        println("Device discovered : $device")
+        // when device connected
+    }
+
     val containerSize: DpSize by lazy {
         Toolkit.getDefaultToolkit().screenSize.let {
             DpSize(

+ 2 - 9
src/main/kotlin/eu/mjdev/desktop/provider/data/Theme.kt

@@ -1,7 +1,5 @@
 package eu.mjdev.desktop.provider.data
 
-import androidx.compose.animation.Animatable
-import androidx.compose.animation.core.tween
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.unit.Dp
@@ -11,7 +9,6 @@ import eu.mjdev.desktop.components.fonticon.MaterialIconFont
 import eu.mjdev.desktop.components.fonticon.MaterialSymbolsSharp
 import eu.mjdev.desktop.extensions.Compose.SuperDarkGray
 import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.launch
 
 // todo all customizable
 @Suppress("unused", "MemberVisibilityCanBePrivate")
@@ -35,7 +32,7 @@ class Theme(
     iconSet: MaterialIconFont,
 ) {
 
-    val backgroundColorState = Animatable(backgroundColor)
+    val backgroundColorState = mutableStateOf(backgroundColor)
     val panelLocationState = mutableStateOf(panelLocation)
     val panelHideDelayState = mutableStateOf(panelHideDelay)
     val controlCenterLocationState = mutableStateOf(controlCenterLocation)
@@ -52,11 +49,7 @@ class Theme(
     var backgroundColor
         get() = backgroundColorState.value
         set(value) {
-            scope?.launch {
-                backgroundColorState.animateTo(value, animationSpec = tween(1500))
-            } ?: {
-                println("Can not set background color")
-            }
+            backgroundColorState.value = value
         }
     val panelLocation get() = panelLocationState.value
     val panelHideDelay get() = panelHideDelayState.value

+ 1 - 1
src/main/kotlin/eu/mjdev/desktop/components/window/FullScreenWindow.kt → src/main/kotlin/eu/mjdev/desktop/windows/FullScreenWindow.kt

@@ -1,4 +1,4 @@
-package eu.mjdev.desktop.components.window
+package eu.mjdev.desktop.windows
 
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.graphics.painter.Painter

+ 3 - 2
src/main/kotlin/eu/mjdev/desktop/windows/MainWindow.kt

@@ -11,7 +11,6 @@ import androidx.compose.ui.input.pointer.PointerEventType
 import androidx.compose.ui.input.pointer.onPointerEvent
 import eu.mjdev.desktop.components.background.BackgroundImage
 import eu.mjdev.desktop.components.slidemenu.VisibilityState
-import eu.mjdev.desktop.components.window.FullScreenWindow
 import eu.mjdev.desktop.helpers.Palette
 import eu.mjdev.desktop.helpers.Palette.Companion.rememberPalette
 import eu.mjdev.desktop.provider.DesktopProvider
@@ -26,7 +25,8 @@ fun MainWindow(
     panelState: VisibilityState,
     menuState: VisibilityState,
     api: DesktopProvider = LocalDesktop.current,
-    palette: Palette = rememberPalette(api.currentUser.theme.backgroundColor)
+    palette: Palette = rememberPalette(api.currentUser.theme.backgroundColor),
+    content: @Composable () -> Unit = {}
 ) = FullScreenWindow {
     Box(
         modifier = Modifier
@@ -53,6 +53,7 @@ fun MainWindow(
 //            modifier = Modifier
 //                .fillMaxSize()
 //        )
+        content()
     }
 //    launchedEffect {
 //        runCatching {

+ 4 - 6
src/main/kotlin/eu/mjdev/desktop/components/window/TopWindow.kt → src/main/kotlin/eu/mjdev/desktop/windows/TopWindow.kt

@@ -1,4 +1,4 @@
-package eu.mjdev.desktop.components.window
+package eu.mjdev.desktop.windows
 
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.graphics.painter.Painter
@@ -10,8 +10,6 @@ import androidx.compose.ui.window.WindowState
 @Composable
 fun TopWindow(
     resizable: Boolean = false,
-    undecorated: Boolean = true,
-    visible: Boolean = true,
     title: String = "",
     icon: Painter? = null,
     focusable: Boolean = true,
@@ -23,9 +21,9 @@ fun TopWindow(
 ) = Window(
     state = windowState,
     resizable = resizable,
-    undecorated = undecorated,
+    undecorated = true,
     onCloseRequest = onCloseRequest,
-    visible = visible,
+    visible = true,
     transparent = true,
     title = title,
     icon = icon,
@@ -34,4 +32,4 @@ fun TopWindow(
     onPreviewKeyEvent = onPreviewKeyEvent,
     onKeyEvent = onKeyEvent,
     content = content
-)
+)