2
0
Эх сурвалжийг харах

user backgrounds from providers

user backgrounds from providers

user backgrounds from providers

user backgrounds from providers
milan jurkulák 2 жил өмнө
parent
commit
62a290b5b7

+ 3 - 4
src/main/kotlin/eu/mjdev/desktop/components/background/BackgroundImage.kt

@@ -9,9 +9,9 @@ import androidx.compose.ui.layout.ContentScale
 import eu.mjdev.desktop.components.image.ImageAny
 import eu.mjdev.desktop.extensions.Compose.Crossfade
 import eu.mjdev.desktop.extensions.Compose.launchedEffect
-import eu.mjdev.desktop.extensions.Compose.rememberComputed
 import eu.mjdev.desktop.helpers.internal.Queue
 import eu.mjdev.desktop.provider.DesktopScope.Companion.withDesktopScope
+import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.launch
 
@@ -25,8 +25,7 @@ fun BackgroundImage(
     onChange: (bck: Any?) -> Unit = {}
 ) = withDesktopScope {
     val switchDelay = theme.backgroundRotationDelay
-    val backgrounds by rememberComputed(appsProvider.backgrounds.size) { appsProvider.backgrounds }
-    val backgroundQueue = remember { Queue(backgrounds) }
+    val backgroundQueue = remember(backgrounds, backgrounds.size) { Queue(backgrounds) }
     var currentBackground by remember { mutableStateOf(backgroundQueue.nextOrNull()) }
     Box(
         modifier = modifier.background(backgroundColor)
@@ -36,7 +35,7 @@ fun BackgroundImage(
             fadeInDuration = fadeInDuration,
             fadeOutDuration = fadeOutDuration
         ) { value ->
-            api.scope.launch {
+            api.scope.launch(Dispatchers.IO) {
                 onChange(currentBackground)
             }
             ImageAny(

+ 3 - 4
src/main/kotlin/eu/mjdev/desktop/components/file/FolderView.kt

@@ -2,7 +2,7 @@ package eu.mjdev.desktop.components.file
 
 import androidx.compose.desktop.ui.tooling.preview.Preview
 import androidx.compose.foundation.gestures.Orientation
-import androidx.compose.foundation.layout.BoxWithConstraints
+import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.padding
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.derivedStateOf
@@ -60,7 +60,7 @@ fun FolderView(
     ) { mw, mh ->
         val rows = max(1, ((api.containerSize.height / mh).toInt()))
         val columns = max(1, (files.size.div(rows)))
-        BoxWithConstraints(
+        Box(
             modifier = modifier,
             contentAlignment = Alignment.TopStart
         ) {
@@ -94,8 +94,7 @@ fun FolderView(
             }
             GuideLines(
                 modifier = modifier,
-                rows = (constraints.maxHeight.dp / mh).toInt(),
-                columns = (constraints.maxWidth.dp / mw).toInt(),
+                cellSize = DpSize(mw, mh),
                 color = iconsTintColor.alpha(0.5f),
                 lineSize = 1.dp,
                 visible = guideVisibleState.isVisible

+ 5 - 2
src/main/kotlin/eu/mjdev/desktop/components/guide/GuideView.kt

@@ -17,19 +17,22 @@ import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.StrokeCap
 import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.DpSize
 import androidx.compose.ui.unit.dp
+import kotlin.math.max
 
 @Composable
 fun GuideLines(
     modifier: Modifier = Modifier,
-    rows: Int = 10,
-    columns: Int = 10,
     color: Color = Color.Black,
     lineSize: Dp = 1.dp,
     visible: Boolean = true,
+    cellSize: DpSize = DpSize(10.dp, 10.dp)
 ) = Canvas(
     modifier = modifier
 ) {
+    val rows = max(1, size.height.div(cellSize.height.value).toInt())
+    val columns = max(1, size.width.div(cellSize.width.value).toInt())
     (0..columns).forEach { i ->
         val x = i * size.width / columns
         drawLine(

+ 15 - 7
src/main/kotlin/eu/mjdev/desktop/data/DesktopConfig.kt

@@ -1,8 +1,8 @@
 package eu.mjdev.desktop.data
 
-import androidx.compose.runtime.mutableStateListOf
 import androidx.compose.ui.graphics.Color
 import eu.mjdev.desktop.helpers.backgrounds.ProviderErzvo
+import eu.mjdev.desktop.helpers.backgrounds.ProviderLocal
 import eu.mjdev.desktop.helpers.backgrounds.ProviderSmug
 import eu.mjdev.desktop.helpers.internal.ImagesProvider
 import kotlinx.coroutines.CoroutineScope
@@ -11,10 +11,10 @@ import kotlinx.coroutines.launch
 
 @Suppress("MemberVisibilityCanBePrivate", "unused")
 class DesktopConfig(
+    val scope: CoroutineScope = CoroutineScope(Dispatchers.IO),
     val block: DesktopConfig.() -> Unit = {}
 ) {
-    val desktopBackgroundsState = mutableStateListOf<Any>()
-    val desktopBackgrounds get() = desktopBackgroundsState
+    val desktopBackgrounds = mutableListOf<Any>()
 
     init {
         block()
@@ -30,9 +30,8 @@ class DesktopConfig(
 
     @Suppress("UNCHECKED_CAST")
     fun addBackground(
-        scope: CoroutineScope = CoroutineScope(Dispatchers.IO),
         provider: suspend () -> Any?,
-    ) = scope.launch {
+    ) = scope.launch(Dispatchers.IO) {
         provider().also { bcks ->
             when (bcks) {
                 null -> Unit
@@ -49,10 +48,19 @@ class DesktopConfig(
     }
 
     companion object {
-        val Default = DesktopConfig {
+        val configCache = mutableMapOf<String, DesktopConfig>()
+
+        private val DEFAULT = DesktopConfig {
             addBackground(ProviderSmug())
             addBackground(ProviderErzvo())
-//            addBackground(ProviderLocal(api))
+        }
+
+        // todo load from user settings
+        fun load(
+            user: User
+        ): DesktopConfig = configCache[user.userName] ?: DEFAULT.apply {
+            configCache[user.userName] = this
+            addBackground(ProviderLocal(user))
         }
     }
 }

+ 0 - 2
src/main/kotlin/eu/mjdev/desktop/data/DesktopFile.kt

@@ -49,8 +49,6 @@ class DesktopFile(
     init {
         if (isApp && !isCorrect) {
             runCatching {
-//                println("Correcting file: file:///$absolutePath")
-//                println("Corrected file: file:///${correctedFile.absolutePath}")
                 correctedFile.let { f ->
                     desktopSection?.StartupWMClass = fullAppName
                     desktopSection?.OnlyShowIn = mutableListOf()

+ 32 - 25
src/main/kotlin/eu/mjdev/desktop/data/Theme.kt

@@ -92,31 +92,38 @@ class Theme(
     val appMenuOuterPadding get() = appMenuOuterPaddingState.value
 
     companion object {
-        val Default by lazy {
-            Theme(
-                iconSet = MaterialSymbolsSharp,
-
-                backgroundColor = Color.SuperDarkGray,
-                backgroundRotationDelay = 60000,
-
-                panelLocation = PanelLocation.Bottom,
-                panelDividerWidth = 16.dp,
-                panelContentPadding = 4.dp,
-                panelHideDelay = 0L,
-
-                controlCenterLocation = ControlCenterLocation.Right,
-                controlPanelHideDelay = 5000L,
-                controlCenterExpandedWidthPercent = 25,
-                controlCenterDividerColor = Color.SuperDarkGray,
-                controlCenterDividerWidth = 4.dp,
-                controlCenterIconColor = Color.White,
-                controlCenterIconSize = DpSize(32.dp, 32.dp),
-                controlCenterBackgroundAlpha = 0.8f,
-
-                appMenuMinWidth = 480.dp,
-                appMenuMinHeight = 640.dp,
-                appMenuOuterPadding = 2.dp
-            )
+        val themeCache = mutableMapOf<String, Theme>()
+
+        private val DEFAULT = Theme(
+            iconSet = MaterialSymbolsSharp,
+
+            backgroundColor = Color.SuperDarkGray,
+            backgroundRotationDelay = 60000,
+
+            panelLocation = PanelLocation.Bottom,
+            panelDividerWidth = 16.dp,
+            panelContentPadding = 4.dp,
+            panelHideDelay = 0L,
+
+            controlCenterLocation = ControlCenterLocation.Right,
+            controlPanelHideDelay = 5000L,
+            controlCenterExpandedWidthPercent = 25,
+            controlCenterDividerColor = Color.SuperDarkGray,
+            controlCenterDividerWidth = 4.dp,
+            controlCenterIconColor = Color.White,
+            controlCenterIconSize = DpSize(32.dp, 32.dp),
+            controlCenterBackgroundAlpha = 0.8f,
+
+            appMenuMinWidth = 480.dp,
+            appMenuMinHeight = 640.dp,
+            appMenuOuterPadding = 2.dp
+        )
+
+        // todo load from user settings
+        fun load(
+            user: User
+        ): Theme = themeCache[user.userName] ?: DEFAULT.apply {
+            themeCache[user.userName] = this
         }
     }
 }

+ 9 - 11
src/main/kotlin/eu/mjdev/desktop/data/User.kt

@@ -11,8 +11,6 @@ import java.io.File
 class User(
     val data: String,
     val dataItems: List<String> = data.split(":"),
-    val config: DesktopConfig = DesktopConfig.Default, // todo load
-    val theme: Theme = Theme.Default // todo load
 ) {
     val userName: String
         get() = dataItems[0]
@@ -30,23 +28,25 @@ class User(
         get() = dataItems[6]
     val picture: Any
         get() = loadPicture(dataItems[5], ".face") ?: Icons.User
-
     val homeDir
         get() = File(home)
-
     val isLoggedIn
         get() = isLoggedIn(userName)
-
     val userDirs
         get() = UserDirs(homeDir)
+    val config: DesktopConfig
+        get() = DesktopConfig.load(this) // todo load
+    val theme: Theme
+        get() = Theme.load(this) // todo load
+    val backgrounds
+        get() = config.desktopBackgrounds
 
     override fun toString(): String {
         return userName
     }
 
     fun login(
-        api: DesktopProvider,
-        password: String
+        api: DesktopProvider, password: String
     ): Boolean = api.login(userName, password)
 
     companion object {
@@ -57,13 +57,11 @@ class User(
         ): Boolean = Shell.executeAndRead("whoami").trim().contentEquals(un)
 
         fun loadPicture(
-            home: String,
-            pic: String
+            home: String, pic: String
         ): File? = loadPicture(File(home), pic)
 
         fun loadPicture(
-            homeDir: File,
-            picName: String
+            homeDir: File, picName: String
         ): File? = File(homeDir, picName).let { f ->
             if (f.exists()) f else null
         }

+ 3 - 4
src/main/kotlin/eu/mjdev/desktop/helpers/backgrounds/ProviderLocal.kt

@@ -8,21 +8,20 @@
 
 package eu.mjdev.desktop.helpers.backgrounds
 
+import eu.mjdev.desktop.data.User
 import eu.mjdev.desktop.extensions.Custom.get
 import eu.mjdev.desktop.extensions.Custom.listFilesOnly
 import eu.mjdev.desktop.helpers.internal.ImagesProvider
 import eu.mjdev.desktop.provider.AppsProvider.Companion.DIR_NAME_BACKGROUNDS
 import eu.mjdev.desktop.provider.AppsProvider.Companion.DIR_NAME_DOT_LOCAL
 import eu.mjdev.desktop.provider.AppsProvider.Companion.DIR_NAME_SHARE
-import eu.mjdev.desktop.provider.DesktopProvider
 
-// todo
 @Suppress("unused")
 class ProviderLocal(
-    private val api: DesktopProvider
+    private val user: User
 ) : ImagesProvider {
     private val localDir
-        get() = api.homeDir[DIR_NAME_DOT_LOCAL]
+        get() = user.homeDir[DIR_NAME_DOT_LOCAL]
     private val localShareDir
         get() = localDir[DIR_NAME_SHARE]
     private val backgroundFilesDir

+ 2 - 1
src/main/kotlin/eu/mjdev/desktop/helpers/internal/Palette.kt

@@ -15,6 +15,7 @@ import eu.mjdev.desktop.managers.GnomeManager
 import eu.mjdev.desktop.managers.GnomeManager.Companion.THEME_MJDEV
 import eu.mjdev.desktop.provider.DesktopProvider
 import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
 
 @Suppress("CanBeParameter", "MemberVisibilityCanBePrivate", "unused")
@@ -68,7 +69,7 @@ class Palette(
     // todo
     val disabledColor = Color.SuperDarkGray
 
-    fun update(src: Any?) = scope.launch {
+    fun update(src: Any?) = scope.launch(Dispatchers.IO) {
         loadPicture(src).getOrNull()?.let { image ->
             val width = image.width
             val height = image.height

+ 1 - 1
src/main/kotlin/eu/mjdev/desktop/managers/ProcessManager.kt

@@ -26,7 +26,7 @@ class ProcessManager(
     private var job: Job? = null
 
     init {
-        job = scope.launch {
+        job = scope.launch(Dispatchers.IO) {
             while (isActive) {
                 ProcessHandle.allProcesses().toList().filterNotNull().let { phList ->
                     phList.forEach { ph ->

+ 3 - 2
src/main/kotlin/eu/mjdev/desktop/provider/AIProvider.kt

@@ -10,6 +10,7 @@ import kotlinx.coroutines.async
 import kotlinx.coroutines.launch
 import nl.marc_apps.tts.TextToSpeechFactory
 import nl.marc_apps.tts.experimental.ExperimentalDesktopTarget
+
 /*
 * Gemini key : https://makersuite.google.com/app/apikey
 * */
@@ -24,7 +25,7 @@ class AIProvider(
     fun ask(
         question: String,
         block: AIProvider.(question: String, result: String) -> Unit
-    ) = scope.launch {
+    ) = scope.launch(Dispatchers.IO) {
         pluginAI.ask(question).also { result ->
             block.invoke(this@AIProvider, question, result)
         }
@@ -63,7 +64,7 @@ class AIProvider(
 
         override fun talk(text: String, clearQueue: Boolean) {
             println("talking: $text")
-            scope.launch {
+            scope.launch(Dispatchers.IO) {
                 textToSpeech.await()?.say(text, clearQueue)
             }
         }

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

@@ -7,12 +7,10 @@ import eu.mjdev.desktop.data.App
 import eu.mjdev.desktop.data.Category
 import eu.mjdev.desktop.extensions.Custom.desktopFiles
 import eu.mjdev.desktop.extensions.Custom.dirsOnly
-import eu.mjdev.desktop.extensions.Custom.filesOnly
 import eu.mjdev.desktop.extensions.Custom.flowBlock
 import eu.mjdev.desktop.extensions.Custom.get
 import eu.mjdev.desktop.extensions.Custom.jsonToList
 import eu.mjdev.desktop.extensions.Custom.lines
-import eu.mjdev.desktop.extensions.Custom.sortedByName
 import eu.mjdev.desktop.extensions.Custom.text
 import eu.mjdev.desktop.extensions.Custom.textAsLocale
 import eu.mjdev.desktop.helpers.system.Shell
@@ -139,9 +137,9 @@ class AppsProvider(
     val allApps
         get() = allAppsDesktopFiles.map { file -> App(file) }
 
-    val backgrounds by lazy {
-        backgroundFilesDir.filesOnly.sortedByName()
-    }
+//    val backgrounds by lazy {
+//        backgroundFilesDir.filesOnly.sortedByName()
+//    }
 
     val appCategories = flowBlock {
         allApps.asSequence().flatMap { app ->

+ 3 - 0
src/main/kotlin/eu/mjdev/desktop/provider/DesktopScope.kt

@@ -116,6 +116,9 @@ open class DesktopScope(
     val panelAutoHideEnabled
         get() = theme.panelHideDelay > 0L
 
+    val backgrounds
+        get() = currentUser.backgrounds
+
     companion object {
         @Composable
         fun withDesktopScope(