diff --git a/android/build.gradle.kts b/android/build.gradle.kts index faa26337..cb064e4b 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -80,6 +80,7 @@ dependencies { // Utility implementation(libs.krokiCoroutines) + implementation(libs.klock) // Localization implementation(libs.moko.core) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 1b8f3213..b7713f26 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -48,6 +48,7 @@ kotlin { api(libs.multiplatformSettings.coroutines) api(libs.multiplatformSettings.serialization) api(libs.locale) + api(libs.klock) } } val commonTest by getting { diff --git a/core/src/commonMain/kotlin/ca/gosyer/core/io/FileSystems.kt b/core/src/commonMain/kotlin/ca/gosyer/core/io/FileSystems.kt index 6eb2d856..fb844d57 100644 --- a/core/src/commonMain/kotlin/ca/gosyer/core/io/FileSystems.kt +++ b/core/src/commonMain/kotlin/ca/gosyer/core/io/FileSystems.kt @@ -8,4 +8,5 @@ package ca.gosyer.core.io import okio.FileSystem +@Suppress("EXTENSION_SHADOWED_BY_MEMBER") expect val FileSystem.Companion.SYSTEM: FileSystem diff --git a/core/src/commonMain/kotlin/ca/gosyer/core/lang/Dispatchers.kt b/core/src/commonMain/kotlin/ca/gosyer/core/lang/Dispatchers.kt index 48856f93..c9324a3b 100644 --- a/core/src/commonMain/kotlin/ca/gosyer/core/lang/Dispatchers.kt +++ b/core/src/commonMain/kotlin/ca/gosyer/core/lang/Dispatchers.kt @@ -9,4 +9,5 @@ package ca.gosyer.core.lang import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers +@Suppress("EXTENSION_SHADOWED_BY_MEMBER") expect val Dispatchers.IO: CoroutineDispatcher diff --git a/core/src/commonMain/kotlin/ca/gosyer/core/lang/Locale.kt b/core/src/commonMain/kotlin/ca/gosyer/core/lang/Locale.kt index 5c3763c1..53604d35 100644 --- a/core/src/commonMain/kotlin/ca/gosyer/core/lang/Locale.kt +++ b/core/src/commonMain/kotlin/ca/gosyer/core/lang/Locale.kt @@ -9,3 +9,9 @@ package ca.gosyer.core.lang import io.fluidsonic.locale.Locale expect fun Locale.Companion.getDefault(): Locale + +expect fun Locale.getDisplayLanguage(displayLocale: Locale): String + +expect fun Locale.getDisplayName(displayLocale: Locale): String + +expect val Locale.displayName: String \ No newline at end of file diff --git a/core/src/commonMain/kotlin/ca/gosyer/core/lang/String.kt b/core/src/commonMain/kotlin/ca/gosyer/core/lang/String.kt index 6057b5ae..cdab4810 100644 --- a/core/src/commonMain/kotlin/ca/gosyer/core/lang/String.kt +++ b/core/src/commonMain/kotlin/ca/gosyer/core/lang/String.kt @@ -6,6 +6,8 @@ package ca.gosyer.core.lang +import io.fluidsonic.locale.Locale + /** * Replaces the given string to have at most [count] characters using [replacement] at its end. * If [replacement] is longer than [count] an exception will be thrown when `length > count`. @@ -17,3 +19,9 @@ fun String.chop(count: Int, replacement: String = "…"): String { this } } + +expect fun String.uppercase(locale: Locale): String + +expect fun String.lowercase(locale: Locale): String + +expect fun Char.titlecase(locale: Locale): String \ No newline at end of file diff --git a/core/src/jvmMain/kotlin/ca/gosyer/core/lang/JvmLocale.kt b/core/src/jvmMain/kotlin/ca/gosyer/core/lang/JvmLocale.kt index 8768b5d2..94da8695 100644 --- a/core/src/jvmMain/kotlin/ca/gosyer/core/lang/JvmLocale.kt +++ b/core/src/jvmMain/kotlin/ca/gosyer/core/lang/JvmLocale.kt @@ -8,6 +8,15 @@ package ca.gosyer.core.lang import io.fluidsonic.locale.Locale import io.fluidsonic.locale.toCommon +import io.fluidsonic.locale.toPlatform import java.util.Locale as PlatformLocale actual fun Locale.Companion.getDefault(): Locale = PlatformLocale.getDefault().toCommon() + +actual fun Locale.getDisplayLanguage(displayLocale: Locale): String = toPlatform() + .getDisplayLanguage(displayLocale.toPlatform()) + +actual fun Locale.getDisplayName(displayLocale: Locale): String = toPlatform() + .getDisplayName(displayLocale.toPlatform()) + +actual val Locale.displayName get() = toPlatform().displayName \ No newline at end of file diff --git a/core/src/jvmMain/kotlin/ca/gosyer/core/lang/String.kt b/core/src/jvmMain/kotlin/ca/gosyer/core/lang/JvmString.kt similarity index 56% rename from core/src/jvmMain/kotlin/ca/gosyer/core/lang/String.kt rename to core/src/jvmMain/kotlin/ca/gosyer/core/lang/JvmString.kt index 7d29c5bf..8fc318de 100644 --- a/core/src/jvmMain/kotlin/ca/gosyer/core/lang/String.kt +++ b/core/src/jvmMain/kotlin/ca/gosyer/core/lang/JvmString.kt @@ -7,7 +7,15 @@ package ca.gosyer.core.lang -import java.util.Locale +import io.fluidsonic.locale.Locale +import io.fluidsonic.locale.toPlatform fun String.capitalize(locale: Locale = Locale.getDefault()) = replaceFirstChar { if (it.isLowerCase()) it.titlecase(locale) else it.toString() } + + +actual fun String.uppercase(locale: Locale): String = uppercase(locale.toPlatform()) + +actual fun String.lowercase(locale: Locale): String = lowercase(locale.toPlatform()) + +actual fun Char.titlecase(locale: Locale): String = titlecase(locale.toPlatform()) \ No newline at end of file diff --git a/data/build.gradle.kts b/data/build.gradle.kts index 7d8af167..2f2f6c25 100644 --- a/data/build.gradle.kts +++ b/data/build.gradle.kts @@ -43,9 +43,10 @@ kotlin { api(libs.ktor.websockets) api(libs.ktor.okHttp) api(libs.okio) + api(libs.locale) + api(libs.klock) api(projects.core) api(projects.i18n) - api(libs.locale) } } val commonTest by getting { diff --git a/desktop/build.gradle.kts b/desktop/build.gradle.kts index b3e6ac67..d0bd6f9c 100644 --- a/desktop/build.gradle.kts +++ b/desktop/build.gradle.kts @@ -81,6 +81,7 @@ dependencies { // Utility implementation(libs.krokiCoroutines) + implementation(libs.klock) // Localization implementation(libs.moko.core) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 68670d74..05b8b238 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -50,6 +50,7 @@ multiplatformSettings = "0.8.1" # Utility kroki = "1.22" desugarJdkLibs = "1.1.5" +klock = "2.2.0" # Localization locale = "0.11.0" @@ -137,6 +138,7 @@ multiplatformSettings-coroutines = { module = "com.russhwolf:multiplatform-setti # Utility krokiCoroutines = { module = "io.github.kerubistan.kroki:kroki-coroutines", version.ref = "kroki" } desugarJdkLibs = { module = "com.android.tools:desugar_jdk_libs", version.ref = "desugarJdkLibs" } +klock = { module = "com.soywiz.korlibs.klock:klock", version.ref = "klock" } # Localization moko-core = { module = "dev.icerock.moko:resources", version.ref = "moko" } diff --git a/presentation/build.gradle.kts b/presentation/build.gradle.kts index 25482188..0bbebb34 100644 --- a/presentation/build.gradle.kts +++ b/presentation/build.gradle.kts @@ -51,6 +51,7 @@ kotlin { api(libs.accompanist.flowLayout) api(libs.krokiCoroutines) api(libs.locale) + api(libs.klock) api(projects.core) api(projects.i18n) api(projects.data) diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/UiComponent.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/base/UiComponent.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/UiComponent.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/base/UiComponent.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/chapter/ChapterDownloadButtons.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/base/chapter/ChapterDownloadButtons.kt similarity index 99% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/chapter/ChapterDownloadButtons.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/base/chapter/ChapterDownloadButtons.kt index aebcd587..48bd6b84 100644 --- a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/chapter/ChapterDownloadButtons.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/ui/base/chapter/ChapterDownloadButtons.kt @@ -14,7 +14,6 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.CircularProgressIndicator import androidx.compose.material.ContentAlpha -import androidx.compose.material.DropdownMenuItem import androidx.compose.material.Icon import androidx.compose.material.IconButton import androidx.compose.material.LocalContentColor @@ -39,6 +38,7 @@ import ca.gosyer.data.models.Manga import ca.gosyer.data.server.interactions.ChapterInteractionHandler import ca.gosyer.i18n.MR import ca.gosyer.uicore.components.DropdownIconButton +import ca.gosyer.uicore.components.DropdownMenuItem import ca.gosyer.uicore.resources.stringResource import io.ktor.client.statement.HttpResponse import kotlinx.coroutines.flow.Flow diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/components/LocaleToString.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/base/components/LocaleToString.kt similarity index 61% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/components/LocaleToString.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/base/components/LocaleToString.kt index 98c241c4..f47e1834 100644 --- a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/components/LocaleToString.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/ui/base/components/LocaleToString.kt @@ -6,9 +6,10 @@ package ca.gosyer.ui.base.components -import java.util.Locale +import ca.gosyer.core.lang.getDefault +import ca.gosyer.core.lang.getDisplayLanguage +import io.fluidsonic.locale.Locale fun localeToString(locale: String) = Locale.forLanguageTag(locale) - ?.getDisplayLanguage(Locale.getDefault()) - ?.ifBlank { null } - ?: locale.uppercase() + .getDisplayLanguage(Locale.getDefault()) + .ifBlank { locale.uppercase() } diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/components/TooltipArea.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/base/components/TooltipArea.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/components/TooltipArea.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/base/components/TooltipArea.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/dialog/MaterialDialogProperties.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/base/dialog/MaterialDialogProperties.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/dialog/MaterialDialogProperties.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/base/dialog/MaterialDialogProperties.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/file/FileChooser.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/base/file/FileChooser.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/file/FileChooser.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/base/file/FileChooser.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/file/FileSaver.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/base/file/FileSaver.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/file/FileSaver.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/base/file/FileSaver.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/image/KamelConfigProvider.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/base/image/KamelConfigProvider.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/image/KamelConfigProvider.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/base/image/KamelConfigProvider.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/navigation/ActionIcon.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/base/navigation/ActionIcon.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/navigation/ActionIcon.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/base/navigation/ActionIcon.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/navigation/ActionMenu.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/base/navigation/ActionMenu.kt similarity index 98% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/navigation/ActionMenu.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/base/navigation/ActionMenu.kt index 3b22996f..dc87f760 100644 --- a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/navigation/ActionMenu.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/ui/base/navigation/ActionMenu.kt @@ -6,8 +6,6 @@ package ca.gosyer.ui.base.navigation -import androidx.compose.material.DropdownMenu -import androidx.compose.material.DropdownMenuItem import androidx.compose.material.LocalContentAlpha import androidx.compose.material.MaterialTheme import androidx.compose.material.Text @@ -24,6 +22,8 @@ import androidx.compose.runtime.remember import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.util.fastForEach import ca.gosyer.i18n.MR +import ca.gosyer.uicore.components.DropdownMenu +import ca.gosyer.uicore.components.DropdownMenuItem import ca.gosyer.uicore.resources.stringResource // Originally from https://gist.github.com/MachFour/369ebb56a66e2f583ebfb988dda2decf diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/navigation/BackHandler.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/base/navigation/BackHandler.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/navigation/BackHandler.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/base/navigation/BackHandler.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/navigation/DisplayController.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/base/navigation/DisplayController.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/navigation/DisplayController.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/base/navigation/DisplayController.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/navigation/Toolbar.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/base/navigation/Toolbar.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/navigation/Toolbar.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/base/navigation/Toolbar.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/prefs/ColorPickerDialog.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/base/prefs/ColorPickerDialog.kt similarity index 98% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/prefs/ColorPickerDialog.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/base/prefs/ColorPickerDialog.kt index 05b30ca0..15e0bc3b 100644 --- a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/prefs/ColorPickerDialog.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/ui/base/prefs/ColorPickerDialog.kt @@ -56,7 +56,6 @@ import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.graphics.isSpecified import androidx.compose.ui.graphics.luminance import androidx.compose.ui.graphics.takeOrElse -import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.input.pointer.PointerInputScope import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.layout.onSizeChanged @@ -65,6 +64,8 @@ import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.dp import androidx.compose.ui.util.fastForEachIndexed import ca.gosyer.ui.base.dialog.getMaterialDialogProperties +import ca.gosyer.ui.util.compose.toHexString +import ca.gosyer.ui.util.compose.toLong import ca.gosyer.uicore.components.keyboardHandler import com.vanpra.composematerialdialogs.MaterialDialog import com.vanpra.composematerialdialogs.MaterialDialogState @@ -203,7 +204,7 @@ private fun ColorPresetItem( } private fun getColorShades(color: Color): List { - val f = String.format("%06X", 0xFFFFFF and color.toArgb()).toLong(16) + val f = color.toLong() return listOf( shadeColor(f, 0.9), shadeColor(f, 0.7), shadeColor(f, 0.5), shadeColor(f, 0.333), shadeColor(f, 0.166), shadeColor(f, -0.125), @@ -422,10 +423,6 @@ private fun hueToColor(hue: Float): Color { return hsvToColor(hue, 1f, 1f) } -private fun Color.toHexString(): String { - return String.format("#%06X", (0xFFFFFF and toArgb())) -} - internal expect fun hexStringToColor(hex: String): Color? private val presetColors = listOf( diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/prefs/PreferencesUiBuilder.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/base/prefs/PreferencesUiBuilder.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/prefs/PreferencesUiBuilder.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/base/prefs/PreferencesUiBuilder.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/theme/AppColorsPreference.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/base/theme/AppColorsPreference.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/theme/AppColorsPreference.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/base/theme/AppColorsPreference.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/theme/AppTheme.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/base/theme/AppTheme.kt similarity index 99% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/theme/AppTheme.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/base/theme/AppTheme.kt index 0c5cb79a..938e9f2f 100644 --- a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/theme/AppTheme.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/ui/base/theme/AppTheme.kt @@ -4,8 +4,6 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -@file:JvmName("ThemeScrollbarStyleKt") - package ca.gosyer.ui.base.theme import androidx.compose.foundation.isSystemInDarkTheme diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/theme/ThemeScrollbarStyle.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/base/theme/ThemeScrollbarStyle.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/theme/ThemeScrollbarStyle.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/base/theme/ThemeScrollbarStyle.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/vm/ViewModelFactory.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/base/vm/ViewModelFactory.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/base/vm/ViewModelFactory.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/base/vm/ViewModelFactory.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/categories/CategoriesScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/categories/CategoriesScreen.kt similarity index 98% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/categories/CategoriesScreen.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/categories/CategoriesScreen.kt index 2ec5b612..f768d494 100644 --- a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/categories/CategoriesScreen.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/ui/categories/CategoriesScreen.kt @@ -13,6 +13,7 @@ import ca.gosyer.uicore.vm.viewModel import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.core.screen.ScreenKey import cafe.adriel.voyager.core.screen.uniqueScreenKey +import kotlin.jvm.Transient expect class CategoriesLauncher { diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/categories/CategoriesScreenViewModel.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/categories/CategoriesScreenViewModel.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/categories/CategoriesScreenViewModel.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/categories/CategoriesScreenViewModel.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/categories/components/CategoriesDialogs.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/categories/components/CategoriesDialogs.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/categories/components/CategoriesDialogs.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/categories/components/CategoriesDialogs.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/categories/components/CategoriesScreenContent.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/categories/components/CategoriesScreenContent.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/categories/components/CategoriesScreenContent.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/categories/components/CategoriesScreenContent.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/downloads/DownloadService.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/downloads/DownloadService.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/downloads/DownloadService.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/downloads/DownloadService.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/downloads/DownloadsScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/downloads/DownloadsScreen.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/downloads/DownloadsScreen.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/downloads/DownloadsScreen.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/downloads/DownloadsScreenViewModel.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/downloads/DownloadsScreenViewModel.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/downloads/DownloadsScreenViewModel.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/downloads/DownloadsScreenViewModel.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/downloads/components/DownloadsScreenContent.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/downloads/components/DownloadsScreenContent.kt similarity index 99% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/downloads/components/DownloadsScreenContent.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/downloads/components/DownloadsScreenContent.kt index cf29c89a..e9e59748 100644 --- a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/downloads/components/DownloadsScreenContent.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/ui/downloads/components/DownloadsScreenContent.kt @@ -20,7 +20,6 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.material.DropdownMenuItem import androidx.compose.material.Icon import androidx.compose.material.LinearProgressIndicator import androidx.compose.material.MaterialTheme @@ -48,6 +47,7 @@ import ca.gosyer.i18n.MR import ca.gosyer.ui.base.navigation.ActionItem import ca.gosyer.ui.base.navigation.Toolbar import ca.gosyer.uicore.components.DropdownIconButton +import ca.gosyer.uicore.components.DropdownMenuItem import ca.gosyer.uicore.components.MangaListItem import ca.gosyer.uicore.components.MangaListItemColumn import ca.gosyer.uicore.components.MangaListItemImage diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/extensions/ExtensionsScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/extensions/ExtensionsScreen.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/extensions/ExtensionsScreen.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/extensions/ExtensionsScreen.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/extensions/ExtensionsScreenViewModel.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/extensions/ExtensionsScreenViewModel.kt similarity index 97% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/extensions/ExtensionsScreenViewModel.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/extensions/ExtensionsScreenViewModel.kt index 43dcd1e6..d75b143a 100644 --- a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/extensions/ExtensionsScreenViewModel.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/ui/extensions/ExtensionsScreenViewModel.kt @@ -6,6 +6,7 @@ package ca.gosyer.ui.extensions +import ca.gosyer.core.lang.displayName import ca.gosyer.core.logging.CKLogger import ca.gosyer.data.extension.ExtensionPreferences import ca.gosyer.data.models.Extension @@ -13,6 +14,7 @@ import ca.gosyer.data.server.interactions.ExtensionInteractionHandler import ca.gosyer.i18n.MR import ca.gosyer.uicore.vm.ContextWrapper import ca.gosyer.uicore.vm.ViewModel +import io.fluidsonic.locale.Locale import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.asStateFlow @@ -24,7 +26,6 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn import me.tatarka.inject.annotations.Inject -import java.util.Locale class ExtensionsScreenViewModel @Inject constructor( private val extensionHandler: ExtensionInteractionHandler, @@ -128,7 +129,7 @@ class ExtensionsScreenViewModel @Inject constructor( val queries = searchQuery.split(" ") val filteredExtensions = extensions.toMutableList() queries.forEach { query -> - filteredExtensions.removeIf { !it.name.contains(query, true) } + filteredExtensions.removeAll { !it.name.contains(query, true) } } filteredExtensions.toList().splitSort() } diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/extensions/components/ExtensionsScreenContent.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/extensions/components/ExtensionsScreenContent.kt similarity index 97% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/extensions/components/ExtensionsScreenContent.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/extensions/components/ExtensionsScreenContent.kt index 7460784a..52f6bd3c 100644 --- a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/extensions/components/ExtensionsScreenContent.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/ui/extensions/components/ExtensionsScreenContent.kt @@ -46,6 +46,9 @@ import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.withStyle import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import ca.gosyer.core.lang.getDefault +import ca.gosyer.core.lang.getDisplayName +import ca.gosyer.core.lang.uppercase import ca.gosyer.data.models.Extension import ca.gosyer.i18n.MR import ca.gosyer.presentation.build.BuildKonfig @@ -61,8 +64,8 @@ import com.vanpra.composematerialdialogs.MaterialDialog import com.vanpra.composematerialdialogs.MaterialDialogState import com.vanpra.composematerialdialogs.rememberMaterialDialogState import com.vanpra.composematerialdialogs.title +import io.fluidsonic.locale.Locale import io.kamel.image.lazyPainterResource -import java.util.Locale @Composable fun ExtensionsScreenContent( @@ -233,7 +236,7 @@ fun LanguageDialog( horizontalArrangement = Arrangement.SpaceBetween ) { val langName by derivedStateOf { - Locale.forLanguageTag(lang)?.getDisplayName(locale) ?: lang + Locale.forLanguageTag(lang).getDisplayName(locale).ifBlank { lang } } Text(langName) Switch( diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/library/LibraryScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/library/LibraryScreen.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/library/LibraryScreen.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/library/LibraryScreen.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/library/LibraryScreenViewModel.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/library/LibraryScreenViewModel.kt similarity index 97% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/library/LibraryScreenViewModel.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/library/LibraryScreenViewModel.kt index e9a90887..725acb4c 100644 --- a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/library/LibraryScreenViewModel.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/ui/library/LibraryScreenViewModel.kt @@ -6,6 +6,8 @@ package ca.gosyer.ui.library +import ca.gosyer.core.lang.getDefault +import ca.gosyer.core.lang.lowercase import ca.gosyer.core.lang.withDefaultContext import ca.gosyer.core.logging.CKLogger import ca.gosyer.data.library.LibraryPreferences @@ -16,8 +18,10 @@ import ca.gosyer.data.server.interactions.CategoryInteractionHandler import ca.gosyer.data.server.interactions.LibraryInteractionHandler import ca.gosyer.data.server.interactions.UpdatesInteractionHandler import ca.gosyer.i18n.MR +import ca.gosyer.ui.util.lang.Collator import ca.gosyer.uicore.vm.ContextWrapper import ca.gosyer.uicore.vm.ViewModel +import io.fluidsonic.locale.Locale import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.flow.MutableStateFlow @@ -36,9 +40,6 @@ import kotlinx.coroutines.flow.single import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.toList import me.tatarka.inject.annotations.Inject -import java.text.Collator -import java.util.Collections -import java.util.Locale private typealias CategoryItems = Pair>, MutableStateFlow>> private typealias LibraryMap = MutableMap @@ -117,9 +118,7 @@ class LibraryScreenViewModel @Inject constructor( val sortFn = when (sortMode) { Sort.ALPHABETICAL -> { val locale = Locale.getDefault() - val collator = Collator.getInstance(locale).apply { - strength = Collator.PRIMARY - }; + val collator = Collator(locale); { a: Manga, b: Manga -> collator.compare(a.title.lowercase(locale), b.title.lowercase(locale)) @@ -139,7 +138,7 @@ class LibraryScreenViewModel @Inject constructor( return if (ascending) { Comparator(sortFn) } else { - Collections.reverseOrder(sortFn) + Comparator(sortFn).reversed() } } diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/library/components/LibraryMangaBadges.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/library/components/LibraryMangaBadges.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/library/components/LibraryMangaBadges.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/library/components/LibraryMangaBadges.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/library/components/LibraryMangaList.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/library/components/LibraryMangaList.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/library/components/LibraryMangaList.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/library/components/LibraryMangaList.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/library/components/LibraryPager.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/library/components/LibraryPager.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/library/components/LibraryPager.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/library/components/LibraryPager.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/library/components/LibraryScreenContent.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/library/components/LibraryScreenContent.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/library/components/LibraryScreenContent.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/library/components/LibraryScreenContent.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/library/components/LibraryTabs.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/library/components/LibraryTabs.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/library/components/LibraryTabs.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/library/components/LibraryTabs.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/library/components/MangaComfortableGrid.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/library/components/MangaComfortableGrid.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/library/components/MangaComfortableGrid.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/library/components/MangaComfortableGrid.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/library/components/MangaCompactGrid.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/library/components/MangaCompactGrid.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/library/components/MangaCompactGrid.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/library/components/MangaCompactGrid.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/library/components/MangaCoverOnlyGrid.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/library/components/MangaCoverOnlyGrid.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/library/components/MangaCoverOnlyGrid.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/library/components/MangaCoverOnlyGrid.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/MainMenu.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/main/MainMenu.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/MainMenu.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/main/MainMenu.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/MainViewModel.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/main/MainViewModel.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/MainViewModel.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/main/MainViewModel.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/Routes.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/main/Routes.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/Routes.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/main/Routes.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/TopLevelMenus.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/main/TopLevelMenus.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/TopLevelMenus.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/main/TopLevelMenus.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/components/BottomNav.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/main/components/BottomNav.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/components/BottomNav.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/main/components/BottomNav.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/components/DebugOverlay.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/main/components/DebugOverlay.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/components/DebugOverlay.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/main/components/DebugOverlay.kt diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/ui/main/components/DebugOverlayViewModel.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/main/components/DebugOverlayViewModel.kt new file mode 100644 index 00000000..8d4fe400 --- /dev/null +++ b/presentation/src/commonMain/kotlin/ca/gosyer/ui/main/components/DebugOverlayViewModel.kt @@ -0,0 +1,15 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +package ca.gosyer.ui.main.components + +import ca.gosyer.uicore.vm.ViewModel +import kotlinx.coroutines.flow.MutableStateFlow + +expect class DebugOverlayViewModel : ViewModel { + val maxMemory: String + val usedMemoryFlow: MutableStateFlow +} diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/components/DownloadsExtraInfo.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/main/components/DownloadsExtraInfo.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/components/DownloadsExtraInfo.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/main/components/DownloadsExtraInfo.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/components/SideMenu.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/main/components/SideMenu.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/components/SideMenu.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/main/components/SideMenu.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/components/SideMenuItem.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/main/components/SideMenuItem.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/components/SideMenuItem.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/main/components/SideMenuItem.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/more/MoreScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/main/more/MoreScreen.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/more/MoreScreen.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/main/more/MoreScreen.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/more/components/MoreContent.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/main/more/components/MoreContent.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/more/components/MoreContent.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/main/more/components/MoreContent.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/manga/MangaScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/manga/MangaScreen.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/manga/MangaScreen.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/manga/MangaScreen.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/manga/MangaScreenViewModel.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/manga/MangaScreenViewModel.kt similarity index 95% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/manga/MangaScreenViewModel.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/manga/MangaScreenViewModel.kt index 9517be5b..2d2130c4 100644 --- a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/manga/MangaScreenViewModel.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/ui/manga/MangaScreenViewModel.kt @@ -20,6 +20,9 @@ import ca.gosyer.data.ui.UiPreferences import ca.gosyer.ui.base.chapter.ChapterDownloadItem import ca.gosyer.uicore.vm.ContextWrapper import ca.gosyer.uicore.vm.ViewModel +import com.soywiz.klock.DateFormat +import com.soywiz.klock.KlockLocale +import com.soywiz.klock.PatternDateFormat import kotlinx.coroutines.async import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow @@ -35,10 +38,6 @@ import kotlinx.coroutines.flow.single import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import me.tatarka.inject.annotations.Inject -import java.time.ZoneId -import java.time.format.DateTimeFormatter -import java.time.format.FormatStyle -import java.util.Locale class MangaScreenViewModel @Inject constructor( private val mangaHandler: MangaInteractionHandler, @@ -214,12 +213,9 @@ class MangaScreenViewModel @Inject constructor( } } - private fun getDateFormat(format: String): DateTimeFormatter = when (format) { - "" -> DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT) - .withLocale(Locale.getDefault()) - .withZone(ZoneId.systemDefault()) - else -> DateTimeFormatter.ofPattern(format) - .withZone(ZoneId.systemDefault()) + private fun getDateFormat(format: String): DateFormat = when (format) { + "" -> KlockLocale.default.formatDateShort + else -> PatternDateFormat(format) } fun toggleRead(index: Int) { diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/manga/components/ChapterItem.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/manga/components/ChapterItem.kt similarity index 97% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/manga/components/ChapterItem.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/manga/components/ChapterItem.kt index ef10ae2e..19a6461c 100644 --- a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/manga/components/ChapterItem.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/ui/manga/components/ChapterItem.kt @@ -32,7 +32,7 @@ import ca.gosyer.i18n.MR import ca.gosyer.ui.base.chapter.ChapterDownloadIcon import ca.gosyer.ui.base.chapter.ChapterDownloadItem import ca.gosyer.uicore.resources.stringResource -import java.time.Instant +import com.soywiz.klock.DateTime expect fun Modifier.chapterItemModifier( onClick: () -> Unit, @@ -44,7 +44,7 @@ expect fun Modifier.chapterItemModifier( @Composable fun ChapterItem( chapterDownload: ChapterDownloadItem, - format: (Instant) -> String, + format: (DateTime) -> String, onClick: (Int) -> Unit, toggleRead: (Int) -> Unit, toggleBookmarked: (Int) -> Unit, @@ -86,7 +86,7 @@ fun ChapterItem( } val subtitleStr = buildAnnotatedString { if (chapter.uploadDate > 0) { - append(format(Instant.ofEpochMilli(chapter.uploadDate))) + append(format(DateTime.fromUnix(chapter.uploadDate))) } if (!chapter.read && chapter.lastPageRead > 0) { if (length > 0) append(" • ") diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/manga/components/MangaMenu.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/manga/components/MangaMenu.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/manga/components/MangaMenu.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/manga/components/MangaMenu.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/manga/components/MangaScreenContent.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/manga/components/MangaScreenContent.kt similarity index 98% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/manga/components/MangaScreenContent.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/manga/components/MangaScreenContent.kt index 2a6c0816..8a83e0b1 100644 --- a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/manga/components/MangaScreenContent.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/ui/manga/components/MangaScreenContent.kt @@ -38,16 +38,17 @@ import ca.gosyer.uicore.components.LoadingScreen import ca.gosyer.uicore.components.VerticalScrollbar import ca.gosyer.uicore.components.rememberScrollbarAdapter import ca.gosyer.uicore.resources.stringResource +import com.soywiz.klock.DateFormat +import com.soywiz.klock.format import com.vanpra.composematerialdialogs.rememberMaterialDialogState import kotlinx.coroutines.flow.SharedFlow -import java.time.format.DateTimeFormatter @Composable fun MangaScreenContent( isLoading: Boolean, manga: Manga?, chapters: List, - dateTimeFormatter: DateTimeFormatter, + dateTimeFormatter: DateFormat, categoriesExist: Boolean, chooseCategoriesFlow: SharedFlow, availableCategories: List, diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/ChapterLoader.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/ChapterLoader.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/ChapterLoader.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/ChapterLoader.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/ReaderMenu.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/ReaderMenu.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/ReaderMenu.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/ReaderMenu.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/ReaderMenuViewModel.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/ReaderMenuViewModel.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/ReaderMenuViewModel.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/ReaderMenuViewModel.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/ReaderSideMenu.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/ReaderSideMenu.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/ReaderSideMenu.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/ReaderSideMenu.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/loader/PageLoader.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/loader/PageLoader.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/loader/PageLoader.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/loader/PageLoader.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/loader/TachideskPageLoader.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/loader/TachideskPageLoader.kt similarity index 95% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/loader/TachideskPageLoader.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/loader/TachideskPageLoader.kt index 4aba2fdc..305ea6d6 100644 --- a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/loader/TachideskPageLoader.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/loader/TachideskPageLoader.kt @@ -6,6 +6,7 @@ package ca.gosyer.ui.reader.loader +import ca.gosyer.core.lang.IO import ca.gosyer.core.lang.throwIfCancellation import ca.gosyer.core.logging.CKLogger import ca.gosyer.data.reader.ReaderPreferences @@ -13,7 +14,8 @@ import ca.gosyer.data.server.interactions.ChapterInteractionHandler import ca.gosyer.ui.reader.model.ReaderChapter import ca.gosyer.ui.reader.model.ReaderPage import ca.gosyer.ui.util.compose.toImageBitmap -import io.github.kerubistan.kroki.coroutines.priorityChannel +import ca.gosyer.ui.util.lang.priorityChannel +import cafe.adriel.voyager.core.concurrent.AtomicInt32 import io.ktor.client.features.onDownload import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -27,7 +29,6 @@ import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch -import java.util.concurrent.atomic.AtomicInteger class TachideskPageLoader( val chapter: ReaderChapter, @@ -39,7 +40,7 @@ class TachideskPageLoader( /** * A channel used to manage requests one by one while allowing priorities. */ - private val channel = priorityChannel() + private val channel = priorityChannel(scope = scope) /** * The amount of pages to preload before stopping @@ -169,10 +170,10 @@ class TachideskPageLoader( val priority: Int ) : Comparable { companion object { - private val idGenerator = AtomicInteger() + private val idGenerator = AtomicInt32(1) } - private val identifier = idGenerator.incrementAndGet() + private val identifier = idGenerator.getAndIncrement() override fun compareTo(other: PriorityPage): Int { val p = other.priority.compareTo(priority) diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/model/MoveTo.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/model/MoveTo.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/model/MoveTo.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/model/MoveTo.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/model/Navigation.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/model/Navigation.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/model/Navigation.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/model/Navigation.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/model/PageMove.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/model/PageMove.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/model/PageMove.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/model/PageMove.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/model/ReaderChapter.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/model/ReaderChapter.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/model/ReaderChapter.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/model/ReaderChapter.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/model/ReaderPage.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/model/ReaderPage.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/model/ReaderPage.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/model/ReaderPage.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/model/ViewerChapters.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/model/ViewerChapters.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/model/ViewerChapters.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/model/ViewerChapters.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/navigation/EdgeNavigation.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/navigation/EdgeNavigation.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/navigation/EdgeNavigation.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/navigation/EdgeNavigation.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/navigation/KindlishNavigation.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/navigation/KindlishNavigation.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/navigation/KindlishNavigation.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/navigation/KindlishNavigation.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/navigation/LNavigation.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/navigation/LNavigation.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/navigation/LNavigation.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/navigation/LNavigation.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/navigation/NavigationClickable.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/navigation/NavigationClickable.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/navigation/NavigationClickable.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/navigation/NavigationClickable.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/navigation/RightAndLeftNavigation.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/navigation/RightAndLeftNavigation.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/navigation/RightAndLeftNavigation.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/navigation/RightAndLeftNavigation.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/navigation/ViewerNavigation.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/navigation/ViewerNavigation.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/navigation/ViewerNavigation.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/navigation/ViewerNavigation.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/viewer/Continuous.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/viewer/Continuous.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/viewer/Continuous.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/viewer/Continuous.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/viewer/Pager.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/viewer/Pager.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/reader/viewer/Pager.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/reader/viewer/Pager.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsAdvancedScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsAdvancedScreen.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsAdvancedScreen.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsAdvancedScreen.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsAppearanceScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsAppearanceScreen.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsAppearanceScreen.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsAppearanceScreen.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsBackupScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsBackupScreen.kt similarity index 98% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsBackupScreen.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsBackupScreen.kt index 57bd7d0d..a68e0c16 100644 --- a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsBackupScreen.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsBackupScreen.kt @@ -33,6 +33,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp +import ca.gosyer.core.io.SYSTEM import ca.gosyer.core.io.copyTo import ca.gosyer.core.io.saveTo import ca.gosyer.core.lang.throwIfCancellation @@ -44,6 +45,7 @@ import ca.gosyer.ui.base.file.rememberFileChooser import ca.gosyer.ui.base.file.rememberFileSaver import ca.gosyer.ui.base.navigation.Toolbar import ca.gosyer.ui.base.prefs.PreferenceRow +import ca.gosyer.ui.util.lang.toSource import ca.gosyer.uicore.components.VerticalScrollbar import ca.gosyer.uicore.components.rememberScrollbarAdapter import ca.gosyer.uicore.resources.stringResource @@ -60,7 +62,6 @@ import com.vanpra.composematerialdialogs.title import io.ktor.client.features.onDownload import io.ktor.client.features.onUpload import io.ktor.http.isSuccess -import io.ktor.utils.io.jvm.javaio.toInputStream import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharedFlow @@ -79,7 +80,6 @@ import okio.Path import okio.Sink import okio.Source import okio.buffer -import okio.source import kotlin.random.Random class SettingsBackupScreen : Screen { @@ -208,9 +208,7 @@ class SettingsBackupViewModel @Inject constructor( mutex.tryLock() scope.launch { try { - backup.content.toInputStream() - .source() - .saveTo(it) + backup.content.toSource().saveTo(it) } catch (e: Exception) { e.throwIfCancellation() info(e) { "Error creating backup" } diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsBrowseScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsBrowseScreen.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsBrowseScreen.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsBrowseScreen.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsDownloadsScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsDownloadsScreen.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsDownloadsScreen.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsDownloadsScreen.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsGeneralScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsGeneralScreen.kt similarity index 92% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsGeneralScreen.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsGeneralScreen.kt index 02bd9805..45379416 100644 --- a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsGeneralScreen.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsGeneralScreen.kt @@ -20,6 +20,8 @@ import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp +import ca.gosyer.core.lang.getDefault +import ca.gosyer.core.lang.getDisplayName import ca.gosyer.data.ui.UiPreferences import ca.gosyer.data.ui.model.StartScreen import ca.gosyer.i18n.MR @@ -37,17 +39,17 @@ import ca.gosyer.uicore.vm.viewModel import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.core.screen.ScreenKey import cafe.adriel.voyager.core.screen.uniqueScreenKey +import com.soywiz.klock.DateTime +import com.soywiz.klock.KlockLocale +import com.soywiz.klock.PatternDateFormat +import com.soywiz.klock.format +import io.fluidsonic.locale.Locale import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.jsonArray import kotlinx.serialization.json.jsonPrimitive import me.tatarka.inject.annotations.Inject -import java.time.Instant -import java.time.ZoneId -import java.time.format.DateTimeFormatter -import java.time.format.FormatStyle -import java.util.Locale class SettingsGeneralScreen : Screen { override val key: ScreenKey = uniqueScreenKey @@ -77,7 +79,7 @@ class SettingsGeneralViewModel @Inject constructor( val language = uiPreferences.language().asStateFlow() val dateFormat = uiPreferences.dateFormat().asStateFlow() - private val now: Instant = Instant.now() + private val now = DateTime.now() private val currentLocale = Locale.getDefault() @Composable @@ -99,7 +101,7 @@ class SettingsGeneralViewModel @Inject constructor( } return mapOf("" to stringResource(MR.strings.language_system_default, currentLocale.getDisplayName(currentLocale))) .plus(langs) - .toSortedMap(compareBy(String.CASE_INSENSITIVE_ORDER) { it }) + .toMap() } @Composable @@ -115,10 +117,8 @@ class SettingsGeneralViewModel @Inject constructor( @Composable private fun getFormattedDate(prefValue: String): String { return when (prefValue) { - "" -> DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT) - .withLocale(Locale.getDefault()) - .withZone(ZoneId.systemDefault()) - else -> DateTimeFormatter.ofPattern(prefValue).withZone(ZoneId.systemDefault()) + "" -> KlockLocale.default.formatDateShort + else -> PatternDateFormat(prefValue) }.format(now) } } diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsLibraryScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsLibraryScreen.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsLibraryScreen.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsLibraryScreen.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsParentalControlsScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsParentalControlsScreen.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsParentalControlsScreen.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsParentalControlsScreen.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsReaderScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsReaderScreen.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsReaderScreen.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsReaderScreen.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsScreen.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsScreen.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsScreen.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsSecurityScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsSecurityScreen.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsSecurityScreen.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsSecurityScreen.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsServerScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsServerScreen.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsServerScreen.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsServerScreen.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsTrackingScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsTrackingScreen.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/settings/SettingsTrackingScreen.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/settings/SettingsTrackingScreen.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/SourcesScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/SourcesScreen.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/SourcesScreen.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/SourcesScreen.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/browse/SourceScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/browse/SourceScreen.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/browse/SourceScreen.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/browse/SourceScreen.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/browse/SourceScreenViewModel.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/browse/SourceScreenViewModel.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/browse/SourceScreenViewModel.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/browse/SourceScreenViewModel.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/browse/components/SourceMangaBadges.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/browse/components/SourceMangaBadges.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/browse/components/SourceMangaBadges.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/browse/components/SourceMangaBadges.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/browse/components/SourceMangaComfortableGrid.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/browse/components/SourceMangaComfortableGrid.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/browse/components/SourceMangaComfortableGrid.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/browse/components/SourceMangaComfortableGrid.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/browse/components/SourceMangaCompactGrid.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/browse/components/SourceMangaCompactGrid.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/browse/components/SourceMangaCompactGrid.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/browse/components/SourceMangaCompactGrid.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/browse/components/SourceMangaList.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/browse/components/SourceMangaList.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/browse/components/SourceMangaList.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/browse/components/SourceMangaList.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/browse/components/SourceScreenContent.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/browse/components/SourceScreenContent.kt similarity index 99% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/browse/components/SourceScreenContent.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/browse/components/SourceScreenContent.kt index eb7ddda3..985d23d7 100644 --- a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/browse/components/SourceScreenContent.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/browse/components/SourceScreenContent.kt @@ -18,8 +18,6 @@ import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width -import androidx.compose.material.DropdownMenu -import androidx.compose.material.DropdownMenuItem import androidx.compose.material.ExtendedFloatingActionButton import androidx.compose.material.Icon import androidx.compose.material.ModalBottomSheetLayout @@ -54,6 +52,8 @@ import ca.gosyer.ui.base.navigation.BackHandler import ca.gosyer.ui.base.navigation.Toolbar import ca.gosyer.ui.sources.browse.filter.SourceFiltersMenu import ca.gosyer.ui.sources.browse.filter.model.SourceFiltersView +import ca.gosyer.uicore.components.DropdownMenu +import ca.gosyer.uicore.components.DropdownMenuItem import ca.gosyer.uicore.components.LoadingScreen import ca.gosyer.uicore.resources.stringResource diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/browse/filter/SourceFiltersMenu.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/browse/filter/SourceFiltersMenu.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/browse/filter/SourceFiltersMenu.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/browse/filter/SourceFiltersMenu.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/browse/filter/SourceFiltersViewModel.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/browse/filter/SourceFiltersViewModel.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/browse/filter/SourceFiltersViewModel.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/browse/filter/SourceFiltersViewModel.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/browse/filter/model/SourceFiltersView.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/browse/filter/model/SourceFiltersView.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/browse/filter/model/SourceFiltersView.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/browse/filter/model/SourceFiltersView.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/components/SourcesMenu.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/components/SourcesMenu.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/components/SourcesMenu.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/components/SourcesMenu.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/components/SourcesNavigator.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/components/SourcesNavigator.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/components/SourcesNavigator.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/components/SourcesNavigator.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/globalsearch/GlobalSearchScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/globalsearch/GlobalSearchScreen.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/globalsearch/GlobalSearchScreen.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/globalsearch/GlobalSearchScreen.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/globalsearch/GlobalSearchViewModel.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/globalsearch/GlobalSearchViewModel.kt similarity index 99% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/globalsearch/GlobalSearchViewModel.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/globalsearch/GlobalSearchViewModel.kt index 73edae4f..4bb91fd9 100644 --- a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/globalsearch/GlobalSearchViewModel.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/globalsearch/GlobalSearchViewModel.kt @@ -7,6 +7,7 @@ package ca.gosyer.ui.sources.globalsearch import androidx.compose.runtime.snapshots.SnapshotStateMap +import ca.gosyer.core.lang.IO import ca.gosyer.core.logging.CKLogger import ca.gosyer.data.catalog.CatalogPreferences import ca.gosyer.data.models.MangaPage diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/globalsearch/components/GlobalSearchMangaComfortableGrid.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/globalsearch/components/GlobalSearchMangaComfortableGrid.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/globalsearch/components/GlobalSearchMangaComfortableGrid.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/globalsearch/components/GlobalSearchMangaComfortableGrid.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/globalsearch/components/GlobalSearchMangaCompactGrid.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/globalsearch/components/GlobalSearchMangaCompactGrid.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/globalsearch/components/GlobalSearchMangaCompactGrid.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/globalsearch/components/GlobalSearchMangaCompactGrid.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/globalsearch/components/GlobalSearchScreenContent.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/globalsearch/components/GlobalSearchScreenContent.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/globalsearch/components/GlobalSearchScreenContent.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/globalsearch/components/GlobalSearchScreenContent.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/home/SourceHomeScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/home/SourceHomeScreen.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/home/SourceHomeScreen.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/home/SourceHomeScreen.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/home/SourceHomeScreenViewModel.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/home/SourceHomeScreenViewModel.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/home/SourceHomeScreenViewModel.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/home/SourceHomeScreenViewModel.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/home/components/SourceHomeScreenContent.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/home/components/SourceHomeScreenContent.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/home/components/SourceHomeScreenContent.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/home/components/SourceHomeScreenContent.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/settings/SourceSettingsScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/settings/SourceSettingsScreen.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/settings/SourceSettingsScreen.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/settings/SourceSettingsScreen.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/settings/SourceSettingsScreenViewModel.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/settings/SourceSettingsScreenViewModel.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/settings/SourceSettingsScreenViewModel.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/settings/SourceSettingsScreenViewModel.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/settings/components/SourceSettingsScreenContent.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/settings/components/SourceSettingsScreenContent.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/settings/components/SourceSettingsScreenContent.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/settings/components/SourceSettingsScreenContent.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/settings/model/SourceSettingsView.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/settings/model/SourceSettingsView.kt similarity index 98% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/settings/model/SourceSettingsView.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/settings/model/SourceSettingsView.kt index d9d44db0..66da03a4 100644 --- a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/sources/settings/model/SourceSettingsView.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/ui/sources/settings/model/SourceSettingsView.kt @@ -13,10 +13,10 @@ import ca.gosyer.data.models.sourcepreference.MultiSelectListPreference import ca.gosyer.data.models.sourcepreference.SourcePreference import ca.gosyer.data.models.sourcepreference.SwitchPreference import ca.gosyer.data.models.sourcepreference.TwoStateProps +import ca.gosyer.ui.util.lang.stringFormat import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow -import java.util.Formatter import kotlin.collections.List as KtList sealed class SourceSettingsView { @@ -159,9 +159,7 @@ sealed class SourceSettingsView { } private fun withFormat(text: String, value: Any?): String { - return Formatter().use { - it.format(text, value).toString() - } + return stringFormat(text, value) } fun SourceSettingsView(index: Int, preference: SourcePreference): SourceSettingsView<*, *> { diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/updates/UpdatesScreen.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/updates/UpdatesScreen.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/updates/UpdatesScreen.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/updates/UpdatesScreen.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/updates/UpdatesScreenViewModel.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/updates/UpdatesScreenViewModel.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/updates/UpdatesScreenViewModel.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/updates/UpdatesScreenViewModel.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/updates/components/UpdatesScreenContent.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/updates/components/UpdatesScreenContent.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/updates/components/UpdatesScreenContent.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/updates/components/UpdatesScreenContent.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/util/compose/Color.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/util/compose/Color.kt similarity index 81% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/util/compose/Color.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/util/compose/Color.kt index 75625ec9..d38b3693 100644 --- a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/util/compose/Color.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/ui/util/compose/Color.kt @@ -9,3 +9,7 @@ package ca.gosyer.ui.util.compose import androidx.compose.ui.graphics.Color val Long.color get() = Color(this) + +expect fun Color.toHexString(): String + +expect fun Color.toLong(): Long \ No newline at end of file diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/util/compose/Image.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/util/compose/Image.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/util/compose/Image.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/util/compose/Image.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/util/compose/Offset.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/util/compose/Offset.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/util/compose/Offset.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/util/compose/Offset.kt diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/ui/util/lang/Collator.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/util/lang/Collator.kt new file mode 100644 index 00000000..8069ef01 --- /dev/null +++ b/presentation/src/commonMain/kotlin/ca/gosyer/ui/util/lang/Collator.kt @@ -0,0 +1,15 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +package ca.gosyer.ui.util.lang + +import io.fluidsonic.locale.Locale + +expect fun Collator(locale: Locale): Collator + +expect class Collator { + fun compare(source: String, target: String): Int +} \ No newline at end of file diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/ui/util/lang/Okio.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/util/lang/Okio.kt new file mode 100644 index 00000000..d6037155 --- /dev/null +++ b/presentation/src/commonMain/kotlin/ca/gosyer/ui/util/lang/Okio.kt @@ -0,0 +1,12 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +package ca.gosyer.ui.util.lang + +import io.ktor.utils.io.ByteReadChannel +import okio.Source + +expect fun ByteReadChannel.toSource(): Source \ No newline at end of file diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/ui/util/lang/PriorityChannel.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/util/lang/PriorityChannel.kt new file mode 100644 index 00000000..dd0a034f --- /dev/null +++ b/presentation/src/commonMain/kotlin/ca/gosyer/ui/util/lang/PriorityChannel.kt @@ -0,0 +1,18 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +package ca.gosyer.ui.util.lang + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.channels.Channel + +@OptIn(DelicateCoroutinesApi::class) +expect inline fun > priorityChannel( + maxCapacity: Int = 4096, + scope: CoroutineScope = GlobalScope +): Channel \ No newline at end of file diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/ui/util/lang/StringFormat.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/util/lang/StringFormat.kt new file mode 100644 index 00000000..b03767bb --- /dev/null +++ b/presentation/src/commonMain/kotlin/ca/gosyer/ui/util/lang/StringFormat.kt @@ -0,0 +1,9 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +package ca.gosyer.ui.util.lang + +expect fun stringFormat(string: String, vararg args: Any?): String \ No newline at end of file diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/util/system/Flow.kt b/presentation/src/commonMain/kotlin/ca/gosyer/ui/util/system/Flow.kt similarity index 100% rename from presentation/src/jvmMain/kotlin/ca/gosyer/ui/util/system/Flow.kt rename to presentation/src/commonMain/kotlin/ca/gosyer/ui/util/system/Flow.kt diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/components/DebugOverlayViewModel.kt b/presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/components/DebugOverlayViewModel.kt index a74d6578..a56bffaa 100644 --- a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/components/DebugOverlayViewModel.kt +++ b/presentation/src/jvmMain/kotlin/ca/gosyer/ui/main/components/DebugOverlayViewModel.kt @@ -16,12 +16,12 @@ import kotlinx.coroutines.launch import me.tatarka.inject.annotations.Inject import kotlin.time.Duration.Companion.milliseconds -class DebugOverlayViewModel @Inject constructor(contextWrapper: ContextWrapper) : ViewModel(contextWrapper) { +actual class DebugOverlayViewModel @Inject constructor(contextWrapper: ContextWrapper) : ViewModel(contextWrapper) { override val scope = MainScope() val runtime: Runtime = Runtime.getRuntime() - val maxMemory = runtime.maxMemory().formatSize() - val usedMemoryFlow = MutableStateFlow(runtime.usedMemory().formatSize()) + actual val maxMemory = runtime.maxMemory().formatSize() + actual val usedMemoryFlow = MutableStateFlow(runtime.usedMemory().formatSize()) init { scope.launch { diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/util/compose/JvmColor.kt b/presentation/src/jvmMain/kotlin/ca/gosyer/ui/util/compose/JvmColor.kt new file mode 100644 index 00000000..5de41a93 --- /dev/null +++ b/presentation/src/jvmMain/kotlin/ca/gosyer/ui/util/compose/JvmColor.kt @@ -0,0 +1,16 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +package ca.gosyer.ui.util.compose + +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.toArgb + +actual fun Color.toHexString(): String { + return String.format("#%06X", (0xFFFFFF and toArgb())) +} + +actual fun Color.toLong() = String.format("%06X", 0xFFFFFF and toArgb()).toLong(16) \ No newline at end of file diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/util/lang/Collator.kt b/presentation/src/jvmMain/kotlin/ca/gosyer/ui/util/lang/Collator.kt new file mode 100644 index 00000000..57a1c800 --- /dev/null +++ b/presentation/src/jvmMain/kotlin/ca/gosyer/ui/util/lang/Collator.kt @@ -0,0 +1,24 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +package ca.gosyer.ui.util.lang + +import io.fluidsonic.locale.Locale +import io.fluidsonic.locale.toPlatform +import java.text.Collator as JvmCollator + +actual fun Collator(locale: Locale): Collator { + return Collator(JvmCollator.getInstance(locale.toPlatform())) +} + +actual class Collator(private val jvmCollator: JvmCollator) { + init { + jvmCollator.strength = JvmCollator.PRIMARY + } + actual fun compare(source: String, target: String): Int { + return jvmCollator.compare(source, target) + } +} \ No newline at end of file diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/util/lang/JvmOkio.kt b/presentation/src/jvmMain/kotlin/ca/gosyer/ui/util/lang/JvmOkio.kt new file mode 100644 index 00000000..d57aa3bb --- /dev/null +++ b/presentation/src/jvmMain/kotlin/ca/gosyer/ui/util/lang/JvmOkio.kt @@ -0,0 +1,16 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +package ca.gosyer.ui.util.lang + +import io.ktor.utils.io.ByteReadChannel +import io.ktor.utils.io.jvm.javaio.toInputStream +import okio.Source +import okio.source + +actual fun ByteReadChannel.toSource(): Source { + return toInputStream().source() +} \ No newline at end of file diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/util/lang/JvmPriorityChannel.kt b/presentation/src/jvmMain/kotlin/ca/gosyer/ui/util/lang/JvmPriorityChannel.kt new file mode 100644 index 00000000..83667013 --- /dev/null +++ b/presentation/src/jvmMain/kotlin/ca/gosyer/ui/util/lang/JvmPriorityChannel.kt @@ -0,0 +1,16 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +package ca.gosyer.ui.util.lang + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.channels.Channel +import io.github.kerubistan.kroki.coroutines.priorityChannel as krokiCoroutinesPriorityChannel + +actual inline fun > priorityChannel( + maxCapacity: Int, + scope: CoroutineScope +): Channel = krokiCoroutinesPriorityChannel() \ No newline at end of file diff --git a/presentation/src/jvmMain/kotlin/ca/gosyer/ui/util/lang/StringFormat.kt b/presentation/src/jvmMain/kotlin/ca/gosyer/ui/util/lang/StringFormat.kt new file mode 100644 index 00000000..2e84c691 --- /dev/null +++ b/presentation/src/jvmMain/kotlin/ca/gosyer/ui/util/lang/StringFormat.kt @@ -0,0 +1,15 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +package ca.gosyer.ui.util.lang + +import java.util.Formatter + +actual fun stringFormat(string: String, vararg args: Any?): String { + return Formatter().use { + it.format(string, *args).toString() + } +} \ No newline at end of file diff --git a/ui-core/build.gradle.kts b/ui-core/build.gradle.kts index 5e92bf35..511812d5 100644 --- a/ui-core/build.gradle.kts +++ b/ui-core/build.gradle.kts @@ -40,6 +40,7 @@ kotlin { api(libs.kamel) api(libs.voyager.core) api(libs.locale) + api(libs.klock) api(projects.core) api(projects.i18n) api(compose.desktop.currentOs)