Milan Jurkulak 1 anno fa
parent
commit
8506eed1cf
100 ha cambiato i file con 562 aggiunte e 187 eliminazioni
  1. 0 24
      .run/mjdev-desktop [wasm run].run.xml
  2. 1 0
      CHANGELOG.md
  3. 37 5
      build.gradle.kts
  4. 15 0
      buildSrc/src/main/kotlin/BuildExt.kt
  5. 4 2
      buildSrc/src/main/kotlin/TaskExt.kt
  6. 39 57
      composeApp/composeApp.gradle.kts
  7. 1 1
      composeApp/src/androidMain/kotlin/org/mjdev/desktop/activity/MainActivity.kt
  8. 78 0
      composeApp/src/androidMain/kotlin/org/mjdev/desktop/components/video/MediaPlayer.kt
  9. 104 0
      composeApp/src/androidMain/kotlin/org/mjdev/desktop/components/video/VideoPlayer.kt
  10. 30 0
      composeApp/src/androidMain/kotlin/org/mjdev/desktop/components/video/VideoPlayerState.kt
  11. 1 1
      composeApp/src/androidMain/kotlin/org/mjdev/desktop/main/MainView.kt
  12. 4 0
      composeApp/src/androidMain/kotlin/org/mjdev/desktop/system/Filesystem.android.kt
  13. 4 4
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/appbar/AppBar.kt
  14. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/AppsMenu.kt
  15. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/components/AppsBottomBar.kt
  16. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/components/AppsList.kt
  17. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/components/AppsMenuActions.kt
  18. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/components/AppsMenuApp.kt
  19. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/components/AppsMenuCategory.kt
  20. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/background/BackgroundImage.kt
  21. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/blur/BlurPanel.kt
  22. 65 0
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/blur/BlurPanelHaze.kt
  23. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/button/ButtonPrimary.kt
  24. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/button/ButtonSecondary.kt
  25. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/button/TransparentButton.kt
  26. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/card/Card.kt
  27. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/card/CardContent.kt
  28. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/card/ClassicCard.kt
  29. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/card/FocusableCard.kt
  30. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/card/ItemCard.kt
  31. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/card/PhotoCard.kt
  32. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/card/WideClassicCard.kt
  33. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/chart/DonutChart.kt
  34. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/controlcenter/ControlCenter.kt
  35. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/controlcenter/base/PageHeader.kt
  36. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/controlcenter/pages/about/AboutPage.kt
  37. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/controlcenter/pages/ai/AIPage.kt
  38. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/controlcenter/pages/main/MainSettingsPage.kt
  39. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/controlcenter/pages/sound/SoundSettingsPage.kt
  40. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/controlcenter/pages/wifi/WifiRow.kt
  41. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/custom/BrushedLayout.kt
  42. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/custom/Clock.kt
  43. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/custom/DateTime.kt
  44. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/custom/MeasureUnconstrainedView.kt
  45. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/custom/PowerBlock.kt
  46. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/custom/VerticalScrollableBox.kt
  47. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/desktop/Desktop.kt
  48. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/desktop/widgets/MemoryChart.kt
  49. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/desktoppanel/DesktopPanel.kt
  50. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/desktoppanel/applets/DesktopMenuIcon.kt
  51. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/desktoppanel/applets/DesktopPanelDateTime.kt
  52. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/desktoppanel/applets/DesktopPanelFavoriteApps.kt
  53. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/desktoppanel/applets/DesktopPanelIcon.kt
  54. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/desktoppanel/applets/DesktopPanelLanguage.kt
  55. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/desktoppanel/applets/DesktopPanelText.kt
  56. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/desktoppanel/applets/DesktopPanelTray.kt
  57. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/draggable/DraggableView.kt
  58. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/file/FolderIcon.kt
  59. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/file/FolderView.kt
  60. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/fonticon/FontIcon.kt
  61. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/gallery/BoxWithControls.kt
  62. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/gallery/Gallery.kt
  63. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/gallery/ItemInfo.kt
  64. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/greeter/Greeter.kt
  65. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/grid/GridPlaced.kt
  66. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/guide/GuideView.kt
  67. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/icon/ShapedIcon.kt
  68. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/icon/WifiLevelIcon.kt
  69. 13 7
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/image/ImageAny.kt
  70. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/image/PhotoImage.kt
  71. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/immersivelist/ImmersiveList.kt
  72. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/info/Info.kt
  73. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/input/PasswordTextView.kt
  74. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/input/SearchFieldPassive.kt
  75. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/input/SelectableOutlineEditText.kt
  76. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/installer/Installer.kt
  77. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/menu/ContextMenu.kt
  78. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/progress/DashedProgressIndicator.kt
  79. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/qrcode/QrCodeView.kt
  80. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/remote/RemoteView.kt
  81. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/sliding/SlidingPanel.kt
  82. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/surface/Surface.kt
  83. 2 2
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/text/AutoHideEmptyText.kt
  84. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/text/AutoResizeText.kt
  85. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/text/CircleText.kt
  86. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/text/TextAny.kt
  87. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/text/TextArea.kt
  88. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/text/TextWithShadow.kt
  89. 1 1
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/tooltip/Tooltip.kt
  90. 2 2
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/user/UserAvatar.kt
  91. 22 0
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/video/MediaPlayer.kt
  92. 6 0
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/video/VideoInfo.kt
  93. 12 0
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/video/VideoPlayer.kt
  94. 11 0
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/video/VideoPlayerState.kt
  95. 13 7
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/video/VideoView.kt
  96. 2 2
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/web/ComposeWebView.kt
  97. 23 0
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/web/CookieManagerCompat.kt
  98. 0 0
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/web/WebEngineKt.kt
  99. 0 0
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/web/WebView.kt
  100. 0 0
      composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/web/WebViewImpl.kt

+ 0 - 24
.run/mjdev-desktop [wasm run].run.xml

@@ -1,24 +0,0 @@
-<component name="ProjectRunConfigurationManager">
-  <configuration default="false" name="mjdev-desktop [wasm run]" type="GradleRunConfiguration" factoryName="Gradle">
-    <ExternalSystemSettings>
-      <option name="executionName" />
-      <option name="externalProjectPath" value="$PROJECT_DIR$" />
-      <option name="externalSystemIdString" value="GRADLE" />
-      <option name="scriptParameters" value="-t --stacktrace" />
-      <option name="taskDescriptions">
-        <list />
-      </option>
-      <option name="taskNames">
-        <list>
-          <option value="wasmJsBrowserDevelopmentRun" />
-        </list>
-      </option>
-      <option name="vmOptions" />
-    </ExternalSystemSettings>
-    <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
-    <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
-    <DebugAllEnabled>false</DebugAllEnabled>
-    <RunAsTest>false</RunAsTest>
-    <method v="2" />
-  </configuration>
-</component>

+ 1 - 0
CHANGELOG.md

@@ -0,0 +1 @@
+### Changelog

+ 37 - 5
build.gradle.kts

@@ -15,16 +15,48 @@ plugins {
     alias(libs.plugins.manes.versions) apply false
     alias(libs.plugins.kotlin.android) apply false
 //    alias(libs.plugins.vlc.setup) apply true
+//    id("com.github.gmazzo.buildconfig") version "5.6.5"
 }
 
+//buildConfig {
+//    generateAtSync = true
+//    sourceSets  {
+//        main {
+//            packageName = "org.mjdev.desktop"
+//            useKotlin = true
+//            useJava = true
+//            useGroovy = true
+//            useScala = true
+//            useXml = true
+//            useProperties = true
+//        }
+//    }
+//    buildConfigField("APP_NAME", project.name)
+//    buildConfigField("APP_VERSION", provider { "\"${project.version}\"" })
+//    buildConfigField("APP_SECRET", "Z3JhZGxlLWphdmEtYnVpbGRjb25maWctcGx1Z2lu")
+//    buildConfigField<String>("OPTIONAL", null)
+//    buildConfigField("BUILD_TIME", System.currentTimeMillis())
+//    buildConfigField("FEATURE_ENABLED", true)
+//    buildConfigField("MAGIC_NUMBERS", intArrayOf(1, 2, 3, 4))
+//    buildConfigField("STRING_LIST", arrayOf("a", "b", "c"))
+//    buildConfigField("MAP", mapOf("a" to 1, "b" to 2))
+//    buildConfigField("FILE", File("aFile"))
+//    buildConfigField("URI", uri("https://example.io"))
+//    buildConfigField("com.github.gmazzo.buildconfig.demos.kts.SomeData", "DATA", "SomeData(\"a\", 1)")
+//}
+
 // vlc setup
 //vlcSetup {
-//    vlcVersion = "3.0.21"
+//    // todo
+//    //val vlcVersionLibs: String = libs.versions.vlc.get().toString()
+//    vlcVersion.set("3.0.21-2")
+//
 //    shouldCompressVlcFiles = true
-//    shouldIncludeAllVlcFiles = false
-//    pathToCopyVlcLinuxFilesTo = rootDir.resolve("resources/linux/")
-//    pathToCopyVlcMacosFilesTo = rootDir.resolve("resources/macos/")
-//    pathToCopyVlcWindowsFilesTo = rootDir.resolve("resources/windows/")
+//    shouldIncludeAllVlcFiles = true
+//
+//    pathToCopyVlcLinuxFilesTo = rootDir.resolve("composeApp/src/commonMain/composeResources/vlc/")
+//    pathToCopyVlcMacosFilesTo = rootDir.resolve("composeApp/src/commonMain/composeResources/vlc/")
+//    pathToCopyVlcLinuxFilesTo = rootDir.resolve("composeApp/src/commonMain/composeResources/vlc/")
 //}
 
 //dependencies {

+ 15 - 0
buildSrc/src/main/kotlin/BuildExt.kt

@@ -6,6 +6,21 @@ import org.gradle.jvm.toolchain.JavaLanguageVersion
 import org.gradle.kotlin.dsl.getByType
 import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
 
+enum class OS { WINDOWS, LINUX, MAC, OTHER }
+
+fun getCurrentOs(): OS {
+    val osName = System
+        .getProperty("os.name")
+        .lowercase()
+        .trim()
+    return when {
+        osName.startsWith("win") -> OS.WINDOWS
+        osName.startsWith("mac") -> OS.MAC
+        osName == "linux" -> OS.LINUX
+        else -> OS.OTHER
+    }
+}
+
 val Project.java: JavaPluginExtension
     get() = extensions.getByType()
 

+ 4 - 2
buildSrc/src/main/kotlin/ProjectExt.kt → buildSrc/src/main/kotlin/TaskExt.kt

@@ -5,7 +5,9 @@ const val GROUP = "mjdev"
 
 inline fun <reified T : Task> Project.registerTask(
     name: String,
-    group: String = GROUP
+    group: String = GROUP,
+    crossinline block : T.() -> Unit = {}
 ) = tasks.register(name, T::class.java) {
     this.group = group
-}
+    block.invoke(this)
+}.get()

+ 39 - 57
composeApp/composeApp.gradle.kts

@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) Milan Jurkulák 2024.
+ *  Contact:
+ *  e: mimoccc@gmail.com
+ *  e: mj@mjdev.org
+ *  w: https://mjdev.org
+ */
+
 //<editor-fold desc="imports">----------------------------------------------------------------------
 
 import org.jetbrains.compose.ComposeExtension
@@ -11,7 +19,6 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinTargetContainerWithPresetFunctions
 import org.jetbrains.kotlin.gradle.dsl.KotlinTargetContainerWithWasmPresetFunctions
 import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
 import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinWasmJsTargetDsl
-import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig
 import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
 
 //</editor-fold>------------------------------------------------------------------------------------
@@ -23,7 +30,7 @@ plugins {
     alias(libs.plugins.android.application)
     alias(libs.plugins.compose)
     alias(libs.plugins.compose.compiler)
-    alias(libs.plugins.openjfx)
+    alias(libs.plugins.vlc.setup)
 }
 
 //</editor-fold>------------------------------------------------------------------------------------
@@ -85,6 +92,11 @@ fun Project.kotlinSourceSets(
 // java version
 setJavaLanguageVersion(libs.versions.java.language.version)
 
+// kotlin toolchain java version
+kotlin {
+    jvmToolchain(libs.versions.java.language.version.get().toInt())
+}
+
 // resources config
 composeResources {
     publicResClass = true
@@ -92,14 +104,16 @@ composeResources {
     generateResClass = always
 }
 
-javafx {
-    version = "21.0.3"
-    modules = listOf(
-        "javafx.controls",
-        "javafx.web",
-        "javafx.graphics",
-        "javafx.media"
-    )
+// setup vlc plugin configuration
+vlcSetup {
+    val appVlcDir: String = libs.versions.vlc.dir.get()
+    val appVlcVersion: String = libs.versions.vlc.version.get()
+    vlcVersion.set(appVlcVersion)
+    shouldCompressVlcFiles = true
+    shouldIncludeAllVlcFiles = false
+    pathToCopyVlcLinuxFilesTo = rootDir.resolve(appVlcDir)
+//        pathToCopyVlcMacosFilesTo = rootDir.resolve(appVlcDir)
+//        pathToCopyVlcWindowsFilesTo = rootDir.resolve(appVlcDir)
 }
 
 //</editor-fold>------------------------------------------------------------------------------------
@@ -116,24 +130,6 @@ targets {
         }
     }
 
-    wasmJsTarget {
-        outputModuleName = "composeApp"
-        browser {
-            val rootDirPath = project.rootDir.path
-            val projectDirPath = project.projectDir.path
-            commonWebpackConfig {
-                outputFileName = "composeApp.js"
-                devServer = (devServer ?: KotlinWebpackConfig.DevServer()).apply {
-                    static = (static ?: mutableListOf()).apply {
-                        // Serve sources to debug inside browser
-                        add(rootDirPath)
-                        add(projectDirPath)
-                    }
-                }
-            }
-        }
-        binaries.executable()
-    }
 }
 
 //</editor-fold>------------------------------------------------------------------------------------
@@ -160,11 +156,11 @@ kotlin {
                 implementation(compose.animation)
                 implementation(compose.animationGraphics)
                 implementation(compose.components.resources)
+                // lifecycles
                 implementation(libs.androidx.lifecycle.viewmodel)
                 implementation(libs.androidx.lifecycle.runtime.compose)
                 // date time
                 implementation(libs.kotlinx.datetime)
-                implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0")
                 // images
                 implementation(libs.coil.compose)
                 implementation(libs.coil.svg)
@@ -174,16 +170,22 @@ kotlin {
                 // qr code
                 implementation(libs.qrose)
                 // json
-                implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1")
+                implementation(libs.kotlinx.serialization.json)
                 // desktop file linux
                 implementation(libs.ini4j)
                 // tts
                 implementation(libs.tts)
                 implementation(libs.tts.compose)
+                // blur
+                implementation(libs.haze)
+                // vlc
+                implementation(libs.vlcj)
+                // mo po gettext
+                implementation(libs.gettext.lib)
+                // timeline
+                implementation(libs.jetlime)
                 // notification
                 // implementation("io.github.shadmanadman:knotif:0.56.0")
-                // media player
-                implementation("io.github.shadmanadman:kmpShaPlayer:1.0.2")
                 // sensors
                 //implementation("io.github.shadmanadman:KSensor:0.59.0")
                 // flowmvi
@@ -194,10 +196,6 @@ kotlin {
 //                implementation(libs.flowmvi.debugger)
                 // locale
 //            implementation(libs.i18n4k)
-                // mo po gettext
-                implementation(libs.gettext.lib)
-                // timeline
-                implementation(libs.jetlime)
                 // anims kottie
 //            implementation("io.github.ismai117:kottie:2.0.1")
                 // kbd
@@ -221,7 +219,7 @@ kotlin {
                 // tor
                 // implementation("io.matthewnelson.kmp-tor:runtime:2.1.0")
                 // files
-                implementation("com.squareup.okio:okio:3.10.2")
+                implementation(libs.okio)
             }
         }
 
@@ -249,18 +247,6 @@ kotlin {
             }
         }
 
-        // wasm dependencies
-        wasmJsMain {
-            dependencies {
-                // reflection
-                implementation(kotlin("reflect"))
-                // preview
-                implementation(compose.components.uiToolingPreview)
-                // ai gemini
-                implementation(libs.sh.google.generative.ai)
-            }
-        }
-
         // desktop dependencies
         desktopMain {
             dependencies {
@@ -367,12 +353,12 @@ desktop {
                 vendor = libs.versions.app.vendor.get()
             }
             targetFormats(
-                TargetFormat.Dmg,
-                TargetFormat.Msi,
+//                TargetFormat.Dmg,
+//                TargetFormat.Msi,
                 TargetFormat.Deb,
-                TargetFormat.Exe,
+//                TargetFormat.Exe,
                 TargetFormat.AppImage,
-                TargetFormat.Pkg,
+//                TargetFormat.Pkg,
                 TargetFormat.Rpm
             )
             buildTypes.release.proguard {
@@ -383,8 +369,4 @@ desktop {
     }
 }
 
-// wasm config
-wasmjs {
-}
-
 //</editor-fold>------------------------------------------------------------------------------------

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

@@ -108,6 +108,6 @@ private fun ActivityMain() {
 
 @Preview
 @Composable
-fun MainActivityPreview() = preview {
+fun PreviewMainActivity() = preview {
     ActivityMain()
 }

+ 78 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/components/video/MediaPlayer.kt

@@ -0,0 +1,78 @@
+package org.mjdev.desktop.components.video
+
+import android.media.MediaPlayer
+import android.os.Build
+import kotlinx.coroutines.*
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.collectLatest
+
+@Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING")
+actual class MediaPlayer(
+    private val mediaPlayer: MediaPlayer
+) {
+    private val mediaPlayerCoroutineScope = CoroutineScope(Dispatchers.Main)
+    private val isPlayingStateFlow = MutableStateFlow(false)
+
+    actual fun play() {
+        isPlayingStateFlow.value = true
+        mediaPlayer.start()
+    }
+
+    actual fun pause() {
+        isPlayingStateFlow.value = false
+        mediaPlayer.pause()
+    }
+
+    actual val isPlaying: Boolean
+        get() = mediaPlayer.isPlaying
+
+    actual fun setRate(rate: Float) {
+        val wasPaused = !mediaPlayer.isPlaying
+        mediaPlayer.playbackParams = mediaPlayer.playbackParams.apply {
+            speed = rate
+        }
+        if (wasPaused) {
+            mediaPlayer.pause()
+        }
+    }
+
+    actual fun setTime(millis: Long) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            mediaPlayer.seekTo(millis, MediaPlayer.SEEK_CLOSEST_SYNC)
+        } else {
+            // todo
+        }
+    }
+    actual fun setTimeAccurate(millis: Long) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            mediaPlayer.seekTo(millis, MediaPlayer.SEEK_CLOSEST)
+        } else {
+            // todo
+        }
+    }
+
+    actual fun getTimeMillis(): Long {
+        return mediaPlayer.currentPosition.toLong()
+    }
+
+    actual fun getLengthMillis(): Long {
+        return mediaPlayer.duration.toLong()
+    }
+
+    actual fun addOnTimeChangedListener(listener: OnTimeChangedListener) {
+        mediaPlayerCoroutineScope.launch {
+            isPlayingStateFlow.collectLatest {
+                if (it) {
+                    while (true) {
+                        delay(33)
+                        listener.onTimeChanged(mediaPlayer.currentPosition.toLong())
+                    }
+                }
+            }
+        }
+    }
+
+    actual fun dispose() {
+        mediaPlayerCoroutineScope.cancel()
+    }
+}

+ 104 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/components/video/VideoPlayer.kt

@@ -0,0 +1,104 @@
+package org.mjdev.desktop.components.video
+
+import android.graphics.SurfaceTexture
+import android.media.MediaPlayer
+import android.media.MediaPlayer.SEEK_CLOSEST
+import android.os.Build
+import android.view.Surface
+import android.view.TextureView
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.aspectRatio
+import androidx.compose.runtime.*
+import androidx.compose.runtime.saveable.rememberSaveable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.viewinterop.AndroidView
+import androidx.core.net.toUri
+
+@Composable
+actual fun VideoPlayer(
+    mrl: String,
+    videoInfo: VideoInfo,
+    state: VideoPlayerState,
+    modifier: Modifier,
+) withDesktopContext {
+    val time = rememberSaveable(mrl) { mutableIntStateOf(-1) }
+    var videoRatio by rememberSaveable(mrl) { mutableFloatStateOf(-1f) }
+    Box(modifier = modifier) {
+        AndroidView(
+            factory = { context ->
+                TextureView(context).also { it ->
+                    it.surfaceTextureListener = object : TextureView.SurfaceTextureListener {
+                        lateinit var mediaPlayer: MediaPlayer
+                        override fun onSurfaceTextureAvailable(
+                            surfaceTexture: SurfaceTexture,
+                            p1: Int,
+                            p2: Int
+                        ) {
+                            val surface = Surface(surfaceTexture)
+                            try {
+                                mediaPlayer = MediaPlayer()
+                                mediaPlayer.setDataSource(context, mrl.toUri())
+                                mediaPlayer.setSurface(surface)
+                                mediaPlayer.prepareAsync()
+                                // Play video when the media source is ready for playback.
+                                mediaPlayer.setOnPreparedListener { mediaPlayer ->
+                                    if (time.intValue != -1) {
+                                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+                                            mediaPlayer.seekTo(time.intValue.toLong(), SEEK_CLOSEST)
+                                        } else {
+                                            // todo
+                                        }
+                                    }
+                                    videoRatio =
+                                        mediaPlayer.videoWidth.toFloat() / mediaPlayer.videoHeight
+//                                val containerRatio =
+//                                    binding.constraintContainer.width.toDouble() / binding.constraintContainer.height.toDouble()
+//                                val videoRatio = mediaPlayer.videoWidth.toDouble() / mediaPlayer.videoHeight.toDouble()
+//
+//                                val constraintLayoutParams = binding.textureView.layoutParams as ConstraintLayout.LayoutParams
+//                                if (containerRatio > videoRatio) {
+//                                    constraintLayoutParams.width = 0
+//                                    constraintLayoutParams.height = ConstraintLayout.LayoutParams.MATCH_PARENT
+//                                    constraintLayoutParams.dimensionRatio =
+//                                        "W,${mediaPlayer.videoWidth}:${mediaPlayer.videoHeight}"
+//                                } else {
+//                                    constraintLayoutParams.width = ConstraintLayout.LayoutParams.MATCH_PARENT
+//                                    constraintLayoutParams.height = 0
+//                                    constraintLayoutParams.dimensionRatio =
+//                                        "H,${mediaPlayer.videoWidth}:${mediaPlayer.videoHeight}"
+//                                }
+//                                binding.textureView.layoutParams = constraintLayoutParams
+//                                initViewModel(projectItem, mediaPlayer.duration.toLong(), mediaPlayer)
+                                    state.onMediaPlayerReady(mediaPlayer)
+                                }
+                            } catch (e: Exception) {
+                                e.printStackTrace()
+                            }
+                        }
+                        override fun onSurfaceTextureSizeChanged(
+                            p0: SurfaceTexture,
+                            p1: Int,
+                            p2: Int
+                        ) {}
+                        override fun onSurfaceTextureDestroyed(p0: SurfaceTexture): Boolean {
+                            time.value = mediaPlayer.currentPosition
+                            state.doWithMediaPlayer { mp ->
+                                mp.dispose()
+                            }
+                            return false
+                        }
+                        override fun onSurfaceTextureUpdated(p0: SurfaceTexture) {}
+                    }
+                }
+            },
+            modifier = Modifier.let {
+                if (videoRatio != -1f) {
+                    it.aspectRatio(videoRatio).align(Alignment.Center)
+                } else {
+                    it
+                }
+            }
+        )
+    }
+}

+ 30 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/components/video/VideoPlayerState.kt

@@ -0,0 +1,30 @@
+package org.mjdev.desktop.components.video
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+@Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING")
+actual class VideoPlayerState {
+    private var mediaPlayer: MediaPlayer? = null
+    private val defferredEffects = mutableListOf<(MediaPlayer) -> Unit>()
+
+    actual fun doWithMediaPlayer(block: (MediaPlayer) -> Unit) {
+        mediaPlayer?.let {
+            block(it)
+        }?:run {
+            defferredEffects.add(block)
+        }
+    }
+
+    internal fun onMediaPlayerReady(mediaPlayer:  android.media.MediaPlayer) {
+        val mp = MediaPlayer(mediaPlayer)
+        this.mediaPlayer = mp
+        defferredEffects.forEach { block ->
+            block(mp)
+        }
+        defferredEffects.clear()
+    }
+}
+
+@Composable
+actual fun rememberVideoPlayerState() = remember { VideoPlayerState() }

+ 1 - 1
composeApp/src/androidMain/kotlin/org/mjdev/desktop/main/MainView.kt

@@ -120,6 +120,6 @@ fun MainView() = withDesktopContext {
 
 @Preview(device = Devices.TABLET)
 @Composable
-fun MainViewPreview() = preview {
+fun PreviewMainView() = preview {
     MainView()
 }

+ 4 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/system/Filesystem.android.kt

@@ -122,4 +122,8 @@ actual object Filesystem : FileSystem() {
     actual fun listFiles(path: Path): List<Path> {
         return listOrNull(path) ?: emptyList()
     }
+
+    actual fun deleteDir(path: Path) {
+        SYSTEM.deleteRecursively(path)
+    }
 }

+ 4 - 4
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/appbar/AppBar.kt

@@ -126,7 +126,7 @@ fun AppBar(
 
 @Preview
 @Composable
-fun AppBarHorizontalPreview() = preview {
+fun PreviewAppBarHorizontal() = preview {
     AppBar(
         modifier = Modifier.height(48.dp)
             .background(Color.Green),
@@ -155,7 +155,7 @@ fun AppBarHorizontalPreview() = preview {
 
 @Preview
 @Composable
-fun AppBarHorizontalFillPreview() = preview {
+fun PreviewAppBarHorizontalFill() = preview {
     AppBar(
         modifier = Modifier.height(48.dp)
             .background(Color.Green),
@@ -185,7 +185,7 @@ fun AppBarHorizontalFillPreview() = preview {
 
 @Preview
 @Composable
-fun AppBarVerticalPreview() = preview {
+fun PreviewAppBarVertical() = preview {
     AppBar(
         modifier = Modifier.background(Color.Green),
         orientation = Orientation.Vertical,
@@ -213,7 +213,7 @@ fun AppBarVerticalPreview() = preview {
 
 @Preview
 @Composable
-fun AppBarVerticalFillPreview() = preview {
+fun PreviewAppBarVerticalFill() = preview {
     AppBar(
         modifier = Modifier.background(Color.Green),
         orientation = Orientation.Vertical,

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

@@ -272,7 +272,7 @@ class AppsMenuState(
 
 @Preview
 @Composable
-fun AppsMenuPreview() = preview {
+fun PreviewAppsMenu() = preview {
     AppsMenu(
         appsMenuState = rememberAppsMenuState(true),
         panelState = rememberVisibilityState(true)

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/components/AppsBottomBar.kt

@@ -76,7 +76,7 @@ fun AppsBottomBar(
 
 @Preview
 @Composable
-fun AppsBottomBarPreview() = preview {
+fun PreviewAppsBottomBar() = preview {
     AppsBottomBar(
         modifier = Modifier.background(Color.SuperDarkGray)
     )

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/components/AppsList.kt

@@ -81,7 +81,7 @@ fun AppsList(
 
 @Preview
 @Composable
-fun AppsListPreview() = preview(320, 640) {
+fun PreviewAppsList() = preview(320, 640) {
     AppsList(
         modifier = Modifier
             .background(

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/components/AppsMenuActions.kt

@@ -92,7 +92,7 @@ fun AppsMenuActions(
 
 @Preview
 @Composable
-fun AppsMenuActionsPreview() = preview {
+fun PreviewAppsMenuActions() = preview {
     AppsMenuActions(
         modifier = Modifier
             .background(Color.SuperDarkGray, RoundedCornerShape(16.dp))

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/components/AppsMenuApp.kt

@@ -104,7 +104,7 @@ fun AppsMenuApp(
 
 @Preview
 @Composable
-fun AppsMenuAppPreview() = preview {
+fun PreviewAppsMenuApp() = preview {
     AppsMenuApp(
         modifier = Modifier.padding(8.dp)
             .background(

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/components/AppsMenuCategory.kt

@@ -93,7 +93,7 @@ fun AppsMenuCategory(
 
 @Preview
 @Composable
-fun AppsMenuCategoryPreview() = preview {
+fun PreviewAppsMenuCategory() = preview {
     AppsMenuCategory(
         modifier = Modifier.padding(8.dp)
             .background(

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/background/BackgroundImage.kt

@@ -101,6 +101,6 @@ fun BackgroundImage(
 @Suppress("unused")
 @Preview
 @Composable
-fun BackgroundImagePreview() = preview {
+fun PreviewBackgroundImage() = preview {
     BackgroundImage()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/blur/BlurPanel.kt

@@ -81,6 +81,6 @@ fun BlurPanel(
 
 @Preview
 @Composable
-fun BlurPanelPreview() = preview(480, 800) {
+fun PreviewBlurPanel() = preview(480, 800) {
     BlurPanel()
 }

+ 65 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/blur/BlurPanelHaze.kt

@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) Milan Jurkulák 2024.
+ *  Contact:
+ *  e: mimoccc@gmail.com
+ *  e: mj@mjdev.org
+ *  w: https://mjdev.org
+ */
+
+package org.mjdev.desktop.components.blur
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.LargeTopAppBar
+import androidx.compose.material3.TopAppBarDefaults
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import dev.chrisbanes.haze.HazeState
+import dev.chrisbanes.haze.hazeEffect
+import dev.chrisbanes.haze.hazeSource
+import dev.chrisbanes.haze.rememberHazeState
+import org.jetbrains.compose.ui.tooling.preview.Preview
+import org.mjdev.desktop.components.text.TextAny
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+fun BlurPanelHaze(
+    modifier: Modifier = Modifier,
+    hazeState: HazeState = rememberHazeState()
+) {
+    Box {
+        LazyColumn(
+            modifier = Modifier
+                .fillMaxSize()
+                .hazeSource(state = hazeState)
+        ) {
+            // todo
+        }
+        LargeTopAppBar(
+            // Need to make app bar transparent to see the content behind
+            colors = TopAppBarDefaults.largeTopAppBarColors(Color.Transparent),
+            title = {
+                TextAny("Test Blur Panel Haze")
+            },
+            modifier = Modifier
+                // We use hazeEffect on anything where we want the background
+                // blurred.
+                .hazeEffect
+                    (
+                    state = hazeState,
+//                    style = HazeMaterials.ultraThin()
+                )
+                .fillMaxWidth(),
+        )
+    }
+}
+
+@Preview()
+@Composable
+private fun PreviewBlurPanelHaze() {
+    BlurPanelHaze()
+}

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/button/ButtonPrimary.kt

@@ -34,6 +34,6 @@ fun ButtonPrimary(
 
 @Preview
 @Composable
-fun ButtonPrimaryPreview() = preview {
+fun PreviewButtonPrimary() = preview {
     ButtonPrimary()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/button/ButtonSecondary.kt

@@ -35,6 +35,6 @@ fun ButtonSecondary(
 
 @Preview
 @Composable
-fun ButtonSecondaryPreview() = preview {
+fun PreviewButtonSecondary() = preview {
     ButtonSecondary()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/button/TransparentButton.kt

@@ -39,7 +39,7 @@ fun TransparentButton(
 
 @Preview
 @Composable
-fun TransparentButtonPreview() = preview {
+fun PreviewTransparentButton() = preview {
     TransparentButton {
         Icon(
             imageVector = AccountCircle,

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/card/Card.kt

@@ -61,7 +61,7 @@ fun Card(
 
 @Preview
 @Composable
-fun CardPreview() = preview {
+fun PreviewCard() = preview {
     Card(
         modifier = Modifier.size(200.dp, 128.dp),
         colors = CardDefaults.colors(

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/card/CardContent.kt

@@ -44,7 +44,7 @@ fun CardContent(
 
 @Preview
 @Composable
-fun CardContentPreview() = preview {
+fun PreviewCardContent() = preview {
     CardContent(
         title = {
             Text("title")

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/card/ClassicCard.kt

@@ -69,7 +69,7 @@ fun ClassicCard(
 
 @Preview
 @Composable
-fun ClassicCardPreview() = preview {
+fun PreviewClassicCard() = preview {
     ClassicCard(
         modifier = Modifier.size(320.dp, 200.dp),
         colors = CardDefaults.colors(

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/card/FocusableCard.kt

@@ -170,7 +170,7 @@ fun FocusableCard(
 
 @Preview
 @Composable
-fun FocusableCardPreview() = preview {
+fun PreviewFocusableCard() = preview {
     FocusableCard(
         item = "test",
         modifier = Modifier.size(200.dp, 128.dp),

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/card/ItemCard.kt

@@ -104,7 +104,7 @@ fun ItemCard(
 
 @Preview
 @Composable
-fun ItemCardPreview() = preview {
+fun PreviewItemCard() = preview {
     ItemCard(
         item = "test",
         modifier = Modifier.size(200.dp, 128.dp),

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/card/PhotoCard.kt

@@ -96,7 +96,7 @@ fun computeCardWidth(
 
 @Preview
 @Composable
-fun PhotoCardPreview() = preview {
+fun PreviewPhotoCard() = preview {
     PhotoCard(
         item = "test",
         modifier = Modifier.size(200.dp, 128.dp),

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/card/WideClassicCard.kt

@@ -69,7 +69,7 @@ fun WideClassicCard(
 
 @Preview
 @Composable
-fun WideClassicCardPreview() = preview {
+fun PreviewWideClassicCard() = preview {
     WideClassicCard(
         colors = CardDefaults.colors(
             containerColor = Color.White

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/chart/DonutChart.kt

@@ -68,7 +68,7 @@ fun DonutChart(
 
 @Preview
 @Composable
-fun DonutChartPreview() = preview(480) {
+fun PreviewDonutChart() = preview(480) {
     DonutChart(
         textColor = Color.White,
         outerCircularColor = Color.White,

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/controlcenter/ControlCenter.kt

@@ -187,7 +187,7 @@ fun ControlCenter(
 
 @Preview
 @Composable
-fun ControlCenterPreview() = preview {
+fun PreviewControlCenter() = preview {
     ControlCenter(
         controlCenterState = rememberVisibilityState(true)
     )

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/controlcenter/base/PageHeader.kt

@@ -75,7 +75,7 @@ fun PageHeader(
 
 @Preview
 @Composable
-fun PageHeaderPreview() = preview {
+fun PreviewPageHeader() = preview {
     PageHeader(
         page = ControlCenterPage(context)
     )

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

@@ -26,6 +26,6 @@ fun AboutPage(
 
 @Preview
 @Composable
-fun AboutPagePreview() = preview {
+fun PreviewAboutPage() = preview {
     AboutPage(context).Render()
 }

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

@@ -197,6 +197,6 @@ fun TextBlock(
 
 @Preview
 @Composable
-fun AIPagePreview() = preview {
+fun PreviewAIPage() = preview {
     AIPage(context).Render()
 }

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

@@ -143,6 +143,6 @@ fun MainSettingsPage(
 
 @Preview
 @Composable
-fun MainSettingsPagePreview() = preview {
+fun PreviewMainSettingsPage() = preview {
     MainSettingsPage(context).Render()
 }

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

@@ -26,6 +26,6 @@ fun SoundSettingsPage(
 
 @Preview
 @Composable
-fun SoundSettingsPagePreview() = preview {
+fun PreviewSoundSettingsPage() = preview {
     SoundSettingsPage(context).Render()
 }

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

@@ -157,7 +157,7 @@ fun WifiRow(
 
 @Preview
 @Composable
-fun WifiRowPreview1() = preview {
+fun PreviewWifiRow() = preview {
     WifiRow(
         item = WifiNetwork(),
         expandedState = mutableStateOf(false)

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

@@ -32,6 +32,6 @@ fun BrushedLayout(
 
 @Preview
 @Composable
-fun BrushedLayoutPreview() = preview(320) {
+fun PreviewBrushedLayout() = preview(320) {
     BrushedLayout()
 }

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

@@ -88,7 +88,7 @@ fun Clock(
 
 @Preview
 @Composable
-fun ClockPreview() = preview {
+fun PreviewClock() = preview {
     Clock(
         modifier = Modifier.size(320, 200)
     )

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

@@ -52,7 +52,7 @@ fun DateTime(
 
 @Preview
 @Composable
-fun DateTimePreview() = preview {
+fun PreviewDateTime() = preview {
     DateTime(
         modifier = Modifier.size(320, 200)
     )

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

@@ -36,7 +36,7 @@ fun MeasureUnconstrainedView(
 
 @Preview
 @Composable
-fun MeasureUnconstrainedViewPreview() = preview {
+fun PreviewMeasureUnconstrainedView() = preview {
     MeasureUnconstrainedView({
         TextAny("test")
     }, { size ->

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

@@ -92,6 +92,6 @@ fun PowerBlock(
 
 @Preview
 @Composable
-fun PowerBlockPreview() = preview {
+fun PreviewPowerBlock() = preview {
     PowerBlock()
 }

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

@@ -36,6 +36,6 @@ fun VerticalScrollableBox(
 
 @Preview
 @Composable
-fun VerticalScrollableBoxPreview() = preview {
+fun PreviewVerticalScrollableBox() = preview {
     VerticalScrollableBox()
 }

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

@@ -94,6 +94,6 @@ fun Desktop(
 // todo
 @Preview
 @Composable
-fun DesktopPreview() = preview {
+fun PreviewDesktop() = preview {
     Desktop()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/desktop/widgets/MemoryChart.kt

@@ -63,6 +63,6 @@ fun MemoryChart(
 // todo
 @Preview
 @Composable
-fun MemoryChartPreview() = preview {
+fun PreviewMemoryChart() = preview {
     MemoryChart()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/desktoppanel/DesktopPanel.kt

@@ -218,7 +218,7 @@ fun DesktopPanel(
 
 @Preview
 @Composable
-fun DesktopPanelPreview() = preview {
+fun PreviewDesktopPanel() = preview {
     DesktopPanel(
         panelState = rememberVisibilityState(true)
     )

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/desktoppanel/applets/DesktopMenuIcon.kt

@@ -45,6 +45,6 @@ fun DesktopMenuIcon(
 
 @Preview
 @Composable
-fun DesktopMenuIconPreview() = preview {
+fun PreviewDesktopMenuIcon() = preview {
     DesktopMenuIcon()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/desktoppanel/applets/DesktopPanelDateTime.kt

@@ -68,6 +68,6 @@ fun DesktopPanelDateTime(
 
 @Preview
 @Composable
-fun DesktopPanelDateTimePreview() = preview {
+fun PreviewDesktopPanelDateTime() = preview {
     DesktopPanelDateTime()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/desktoppanel/applets/DesktopPanelFavoriteApps.kt

@@ -78,6 +78,6 @@ fun DesktopPanelFavoriteApps(
 // todo
 @Preview
 @Composable
-fun DesktopPanelFavoriteAppsPreview() = preview {
+fun PreviewDesktopPanelFavoriteApps() = preview {
     DesktopPanelFavoriteApps()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/desktoppanel/applets/DesktopPanelIcon.kt

@@ -121,7 +121,7 @@ fun DesktopPanelIcon(
 
 @Preview
 @Composable
-fun DesktopPanelIconPreview() = preview {
+fun PreviewDesktopPanelIcon() = preview {
     DesktopPanelIcon(
         app = null //App.Test
     )

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/desktoppanel/applets/DesktopPanelLanguage.kt

@@ -23,6 +23,6 @@ fun DesktopPanelLanguage(
 
 @Preview
 @Composable
-fun DesktopPanelLanguagePreview() = preview {
+fun vDesktopPanelLanguage() = preview {
     DesktopPanelLanguage()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/desktoppanel/applets/DesktopPanelText.kt

@@ -61,6 +61,6 @@ fun DesktopPanelText(
 
 @Preview
 @Composable
-fun DesktopPanelTextPreview() = preview {
+fun PreviewDesktopPanelText() = preview {
     DesktopPanelText()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/desktoppanel/applets/DesktopPanelTray.kt

@@ -32,6 +32,6 @@ fun DesktopPanelTray(
 
 @Preview
 @Composable
-fun DesktopPanelTrayPreview() = preview {
+fun PreviewDesktopPanelTray() = preview {
     DesktopPanelTray()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/draggable/DraggableView.kt

@@ -90,6 +90,6 @@ fun DraggableView(
 
 @Preview
 @Composable
-fun DraggableViewPreview() = preview {
+fun PreviewDraggableView() = preview {
     DraggableView()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/file/FolderIcon.kt

@@ -97,6 +97,6 @@ fun FolderIcon(
 
 @Preview
 @Composable
-fun FolderIconPreview() = preview {
+fun PreviewFolderIcon() = preview {
     FolderIcon()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/file/FolderView.kt

@@ -147,7 +147,7 @@ private fun rememberFiles(
 // todo
 @Preview
 @Composable
-fun FolderViewPreview() = preview {
+fun PreviewFolderView() = preview {
     FolderView(
         modifier = Modifier.fillMaxSize()
     )

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/fonticon/FontIcon.kt

@@ -101,7 +101,7 @@ fun FontIcon(
 
 @Preview
 @Composable
-fun FontIconPreview() = preview {
+fun PreviewFontIcon() = preview {
     Column {
         Column {
             FontIcon(iconId = 0)

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/gallery/BoxWithControls.kt

@@ -43,7 +43,7 @@ package org.mjdev.desktop.components.gallery
 //
 //@Preview
 //@Composable
-//fun BoxWithControlsPreview() = preview {
+//fun PreviewBoxWithControls() = preview {
 //    BoxWithControls()
 //}
 //

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/gallery/Gallery.kt

@@ -212,7 +212,7 @@ package org.mjdev.desktop.components.gallery
 //
 //@Preview
 //@Composable
-//fun GalleryPreview() = preview {
+//fun PreviewGallery() = preview {
 //    Gallery(
 //        list = listOf(App.Test, App.Test, App.Test),
 //    )

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/gallery/ItemInfo.kt

@@ -89,6 +89,6 @@ package org.mjdev.desktop.components.gallery
 //
 //@Preview
 //@Composable
-//fun ItemInfoPreview() = preview {
+//fun PreviewItemInfo() = preview {
 //    ItemInfo()
 //}

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/greeter/Greeter.kt

@@ -70,6 +70,6 @@ fun Greeter(
 
 @Preview
 @Composable
-fun GreeterPreview() = preview(320, 320) {
+fun PreviewGreeter() = preview(320, 320) {
     Greeter()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/grid/GridPlaced.kt

@@ -57,6 +57,6 @@ fun GridPlaced(
 
 @Preview
 @Composable
-fun GridPlacedPreview() = preview {
+fun PreviewGridPlaced() = preview {
     GridPlaced()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/guide/GuideView.kt

@@ -60,7 +60,7 @@ fun GuideLines(
 
 @Preview
 @Composable
-fun GuideLinesPreview() = preview(320, 320) {
+fun PreviewGuideLines() = preview(320, 320) {
     GuideLines(
         modifier = Modifier.fillMaxSize(),
         cellSize = DpSize(32.dp, 32.dp),

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/icon/ShapedIcon.kt

@@ -70,6 +70,6 @@ fun ShapedIcon(
 
 @Preview
 @Composable
-fun ShapedIconPreview() = preview {
+fun PreviewShapedIcon() = preview {
     ShapedIcon()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/icon/WifiLevelIcon.kt

@@ -53,7 +53,7 @@ fun WifiLevelIcon(
 
 @Preview
 @Composable
-fun WifiLevelIconPreview() = preview {
+fun PreviewWifiLevelIcon() = preview {
     WifiLevelIcon(
         level = 55,
         color = Color.White

+ 13 - 7
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/image/ImageAny.kt

@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) Milan Jurkulák 2024.
+ *  Contact:
+ *  e: mimoccc@gmail.com
+ *  e: mj@mjdev.org
+ *  w: https://mjdev.org
+ */
+
 package org.mjdev.desktop.components.image
 
 import androidx.compose.foundation.background
@@ -17,12 +25,12 @@ import androidx.compose.ui.layout.ContentScale
 import coil3.ImageLoader
 import coil3.compose.AsyncImage
 import okio.Path
-import org.adman.kmp.player.KmpShaPlayer
 import org.mjdev.desktop.extensions.Compose.preview
 import org.mjdev.desktop.helpers.image.ImageLoader.asyncImageLoader
 import org.mjdev.desktop.icons.image.BrokenImage
 import androidx.compose.foundation.Image as ComposeImage
 import org.jetbrains.compose.ui.tooling.preview.Preview
+import org.mjdev.desktop.components.video.VideoView
 import org.mjdev.desktop.extensions.PathExt.absolutePath
 
 @Suppress("FunctionName", "UNUSED_PARAMETER")
@@ -113,16 +121,14 @@ fun ImageAny(
 //            onAnimationFinish = onAnimationFinish
 //        )
 
-        isVideo -> KmpShaPlayer(
+        isVideo -> VideoView (
             modifier = modifier,
-            urlOrPathToFile = when {
+            src = when {
                 src is Path -> src.absolutePath
                 else -> src.toString()
             },
-            isLandscape = true,
-            stop = false,
             onLoading = { onLoading() },
-            onError = onFail
+            onFail = onFail
         )
 
         else -> AsyncImage(
@@ -140,6 +146,6 @@ fun ImageAny(
 
 @Preview
 @Composable
-fun ImageAnyPreview() = preview {
+fun PreviewImageAny() = preview {
     ImageAny()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/image/PhotoImage.kt

@@ -127,6 +127,6 @@ fun PhotoImage(
 
 @Preview
 @Composable
-fun PhotoImagePreview() = preview {
+fun PreviewPhotoImage() = preview {
     PhotoImage()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/immersivelist/ImmersiveList.kt

@@ -58,6 +58,6 @@ fun ImmersiveList(
 // todo
 @Preview
 @Composable
-fun ImmersiveListPreview() = preview {
+fun PreviewImmersiveList() = preview {
     ImmersiveList()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/info/Info.kt

@@ -76,6 +76,6 @@ fun Info(
 
 @Preview
 @Composable
-fun InfoPreview() = preview(320, 320) {
+fun PreviewInfo() = preview(320, 320) {
     Info()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/input/PasswordTextView.kt

@@ -109,7 +109,7 @@ fun PasswordTextView(
 
 @Preview
 @Composable
-fun PasswordTextViewPreview() = preview {
+fun PreviewPasswordTextView() = preview {
     PasswordTextView(
         password = mutableStateOf("test")
     )

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/input/SearchFieldPassive.kt

@@ -73,7 +73,7 @@ fun SearchFieldPassive(
 
 @Preview
 @Composable
-fun SearchFieldPassivePreview() = preview {
+fun PreviewSearchFieldPassive() = preview {
     SearchFieldPassive(
         textState = mutableStateOf("test")
     )

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/input/SelectableOutlineEditText.kt

@@ -111,7 +111,7 @@ fun SelectableOutlineEditText(
 
 @Preview
 @Composable
-fun SelectableOutlineEditTextPreview() = preview {
+fun PreviewSelectableOutlineEditText() = preview {
     SelectableOutlineEditText(
         value = "test"
     )

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/installer/Installer.kt

@@ -52,6 +52,6 @@ fun Installer(
 
 @Preview
 @Composable
-fun InstallerPreview() = preview(320, 320) {
+fun PreviewInstaller() = preview(320, 320) {
     Installer()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/menu/ContextMenu.kt

@@ -61,6 +61,6 @@ fun ContextMenu(
 
 @Preview
 @Composable
-fun ContextMenuPreview() = preview {
+fun PreviewContextMenu() = preview {
     ContextMenu()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/progress/DashedProgressIndicator.kt

@@ -50,7 +50,7 @@ fun DashedProgressIndicator(
 
 @Preview
 @Composable
-fun DashedProgressIndicatorPreview() = preview {
+fun PreviewDashedProgressIndicator() = preview {
     DashedProgressIndicator(
         modifier = Modifier.fillMaxWidth()
     )

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/qrcode/QrCodeView.kt

@@ -67,6 +67,6 @@ fun QrCodeView(
 
 @Preview
 @Composable
-fun QrCodeViewPreview() = preview(320, 320) {
+fun PreviewQrCodeView() = preview(320, 320) {
     QrCodeView()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/remote/RemoteView.kt

@@ -18,6 +18,6 @@ fun RemoteView(
 
 @Preview
 @Composable
-private fun PreviewRemoteView() {
+private fun PreviewPreviewRemote() {
     RemoteView()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/sliding/SlidingPanel.kt

@@ -79,6 +79,6 @@ fun SlidingPanel(
 
 @Preview
 @Composable
-fun SlidingMenuPreview() = preview {
+fun PreviewSlidingMenu() = preview {
     SlidingPanel()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/surface/Surface.kt

@@ -232,6 +232,6 @@ private const val NonFocusedZIndex = 0f
 
 @Preview
 @Composable
-fun SurfacePreview() = preview {
+fun PreviewSurface() = preview {
     Surface()
 }

+ 2 - 2
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/text/AutoHideEmptyText.kt

@@ -64,7 +64,7 @@ fun AutoHideEmptyText(
 
 @Preview
 @Composable
-fun AutoHideEmptyTextPreview() = preview {
+fun PreviewAutoHideEmptyText() = preview {
     AutoHideEmptyText(
         modifier = Modifier.background(Color.White),
         text = "test"
@@ -73,7 +73,7 @@ fun AutoHideEmptyTextPreview() = preview {
 
 @Preview
 @Composable
-fun AutoHideEmptyTextEmptyPreview() = preview {
+fun PreviewAutoHideEmptyTextEmpty() = preview {
     AutoHideEmptyText(
         modifier = Modifier.background(Color.White),
         text = ""

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/text/AutoResizeText.kt

@@ -69,7 +69,7 @@ fun AutoResizeText(
 
 @Preview
 @Composable
-fun AutoResizeTextPreview() = preview(64, 64) {
+fun PreviewAutoResizeText() = preview(64, 64) {
     AutoResizeText(
         modifier = Modifier
             .background(Color.White)

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/text/CircleText.kt

@@ -60,6 +60,6 @@ fun CircleText(
 
 @Preview
 @Composable
-fun CircleTextPreview() = preview {
+fun PreviewCircleText() = preview {
     CircleText()
 }

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/text/TextAny.kt

@@ -78,7 +78,7 @@ fun TextAny(
 
 @Preview
 @Composable
-fun TextAnyPreview() = preview {
+fun PreviewTextAny() = preview {
     TextAny(
         modifier = Modifier.height(48.dp).background(Color.White),
         text = "test" // App.Test

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/text/TextArea.kt

@@ -89,7 +89,7 @@ fun TextArea(
 
 @Preview
 @Composable
-fun TextAreaPreview() {
+fun PreviewTextArea() {
     TextArea(
         textState = remember { mutableStateOf("Hello") }
     )

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/text/TextWithShadow.kt

@@ -57,7 +57,7 @@ fun TextWithShadow(
 
 @Preview
 @Composable
-fun TextWithShadowPreview() = preview {
+fun PreviewTextWithShadow() = preview {
     TextWithShadow(
         modifier = Modifier.height(48.dp).background(Color.White),
         text = "...Test..." // App.Test

+ 1 - 1
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/tooltip/Tooltip.kt

@@ -93,7 +93,7 @@ fun rememberTooltipState() = remember { TooltipState() }
 
 @Preview
 @Composable
-fun TooltipPreview() = preview {
+fun PreviewTooltip() = preview {
     Tooltip(
         tooltipState = rememberTooltipState().apply{ show("test tooltip") }
     )

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

@@ -162,7 +162,7 @@ fun UserAvatar(
 
 @Preview
 @Composable
-fun UserAvatarHorizontalFillPreview() = preview {
+fun PreviewUserAvatarHorizontalFill() = preview {
     UserAvatar(
         modifier = Modifier.fillMaxWidth()
             .wrapContentHeight()
@@ -173,7 +173,7 @@ fun UserAvatarHorizontalFillPreview() = preview {
 
 @Preview
 @Composable
-fun UserAvatarVerticalPreview() = preview {
+fun PreviewUserAvatarVertical() = preview {
     UserAvatar(
         modifier = Modifier.fillMaxWidth()
             .wrapContentHeight()

+ 22 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/video/MediaPlayer.kt

@@ -0,0 +1,22 @@
+package org.mjdev.desktop.components.video
+
+@Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING")
+expect class MediaPlayer {
+    fun play()
+    fun pause()
+    val isPlaying: Boolean
+
+    fun setRate(rate: Float)
+    fun setTime(millis: Long)
+    fun setTimeAccurate(millis: Long)
+
+    fun getTimeMillis(): Long
+    fun getLengthMillis(): Long
+    fun addOnTimeChangedListener(listener: OnTimeChangedListener)
+
+    fun dispose()
+}
+
+interface OnTimeChangedListener {
+    fun onTimeChanged(timeMillis: Long)
+}

+ 6 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/video/VideoInfo.kt

@@ -0,0 +1,6 @@
+package org.mjdev.desktop.components.video
+
+data class VideoInfo(
+    val videoHeight: Int,
+    val videoWidth: Int,
+)

+ 12 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/video/VideoPlayer.kt

@@ -0,0 +1,12 @@
+package org.mjdev.desktop.components.video
+
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+
+@Composable
+expect fun VideoPlayer(
+    mrl: String,
+    videoInfo: VideoInfo,
+    state: VideoPlayerState,
+    modifier: Modifier = Modifier,
+)

+ 11 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/video/VideoPlayerState.kt

@@ -0,0 +1,11 @@
+package org.mjdev.desktop.components.video
+
+import androidx.compose.runtime.Composable
+
+@Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING")
+expect class VideoPlayerState {
+    fun doWithMediaPlayer(block: (MediaPlayer) -> Unit)
+}
+
+@Composable
+expect fun rememberVideoPlayerState(): VideoPlayerState

+ 13 - 7
composeApp/src/desktopMain/kotlin/org/mjdev/desktop/components/video/VideoView.kt → composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/video/VideoView.kt

@@ -1,7 +1,6 @@
 package org.mjdev.desktop.components.video
 
-import androidx.compose.desktop.ui.tooling.preview.Preview
-import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.BoxWithConstraints
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
@@ -9,7 +8,7 @@ import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.ColorFilter
 import androidx.compose.ui.layout.ContentScale
-import org.mjdev.desktop.components.web.ComposeWebView
+import org.jetbrains.compose.ui.tooling.preview.Preview
 import org.mjdev.desktop.extensions.Compose.preview
 import org.mjdev.desktop.log.Log
 import org.mjdev.desktop.context.DesktopContextScope.Companion.withDesktopContext
@@ -23,10 +22,12 @@ fun VideoView(
     contentDescription: String? = "",
     colorFilter: ColorFilter? = null,
     contentScale: ContentScale = ContentScale.Crop,
+    state: VideoPlayerState = rememberVideoPlayerState(),
     onFail: (Throwable) -> Unit = { e -> Log.e(e) },
+    onLoading: () -> Unit = {},
     onVideoFinish: () -> Unit = {}
 ) = withDesktopContext {
-    Box(
+    BoxWithConstraints(
         modifier = modifier,
         contentAlignment = alignment
     ) {
@@ -37,15 +38,20 @@ fun VideoView(
             }
         }
         println("Playing: $url")
-        ComposeWebView(
+        VideoPlayer(
             modifier = Modifier.fillMaxSize(),
-            url = url,
+            mrl = url,
+            videoInfo = VideoInfo(
+                videoWidth = maxWidth.value.toInt(),
+                videoHeight = maxHeight.value.toInt(),
+            ),
+            state = state,
         )
     }
 }
 
 @Preview
 @Composable
-fun VideoViewPreview() = preview {
+fun PreviewVideoView() = preview {
     VideoView()
 }

+ 2 - 2
composeApp/src/desktopMain/kotlin/org/mjdev/desktop/components/web/ComposeWebView.kt → composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/web/ComposeWebView.kt

@@ -1,8 +1,8 @@
 package org.mjdev.desktop.components.web
 
-import androidx.compose.desktop.ui.tooling.preview.Preview
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
+import org.jetbrains.compose.ui.tooling.preview.Preview
 import org.mjdev.desktop.extensions.Compose.preview
 import org.mjdev.desktop.context.DesktopContextScope.Companion.withDesktopContext
 
@@ -23,6 +23,6 @@ fun ComposeWebView(
 
 @Preview
 @Composable
-fun ComposeWebViewPreview() = preview {
+fun PreviewComposeWebView() = preview {
     ComposeWebView()
 }

+ 23 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/web/CookieManagerCompat.kt

@@ -0,0 +1,23 @@
+package org.mjdev.desktop.components.web
+
+//import java.net.CookieHandler
+//import java.net.URI
+
+object CookieManagerCompat {
+//    fun setCookie(
+//        url: String,
+//        headers: HashMap<String, String>
+//    ) {
+//        LinkedHashMap<String, List<String>>().apply {
+//            this["Set-Cookie"] = headers.map { "${it.key}=${it.value}" }
+//        }.also { nHeaders ->
+//            CookieHandler.getDefault().put(URI.create(url), nHeaders)
+//        }
+//    }
+//
+//    fun getCookie(uri: URI): MutableMap<String, String>? {
+//        return CookieHandler.getDefault().get(uri, HashMap()).map {
+//            it.key to it.value[0]
+//        }.toMap().toMutableMap()
+//    }
+}

+ 0 - 0
composeApp/src/desktopMain/kotlin/org/mjdev/desktop/components/web/WebEngineKt.kt → composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/web/WebEngineKt.kt


+ 0 - 0
composeApp/src/desktopMain/kotlin/org/mjdev/desktop/components/web/WebView.kt → composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/web/WebView.kt


+ 0 - 0
composeApp/src/desktopMain/kotlin/org/mjdev/desktop/components/web/WebViewImpl.kt → composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/web/WebViewImpl.kt


Some files were not shown because too many files changed in this diff