mirror of
https://github.com/Suwayomi/TachideskJUI.git
synced 2025-12-12 07:42:03 +01:00
Update Dependencies
Re-add package and notarize workflow tasks Update code for Compose updates
This commit is contained in:
2
.github/workflows/Preview.yml
vendored
2
.github/workflows/Preview.yml
vendored
@@ -30,7 +30,7 @@ jobs:
|
|||||||
arch: x64
|
arch: x64
|
||||||
os: macOS-latest
|
os: macOS-latest
|
||||||
shell: bash
|
shell: bash
|
||||||
build: packageUberJarForCurrentOS # packageDmg notarizeDmg
|
build: packageUberJarForCurrentOS packageDmg notarizeDmg
|
||||||
setupCl: ./scripts/SetupClUnix.sh
|
setupCl: ./scripts/SetupClUnix.sh
|
||||||
|
|
||||||
- runtime: win-x64
|
- runtime: win-x64
|
||||||
|
|||||||
@@ -8,10 +8,10 @@ import org.jmailen.gradle.kotlinter.tasks.FormatTask
|
|||||||
import org.jmailen.gradle.kotlinter.tasks.LintTask
|
import org.jmailen.gradle.kotlinter.tasks.LintTask
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
kotlin("jvm") version "1.5.30"
|
kotlin("jvm") version "1.5.31"
|
||||||
kotlin("kapt") version "1.5.30"
|
kotlin("kapt") version "1.5.31"
|
||||||
kotlin("plugin.serialization") version "1.5.30"
|
kotlin("plugin.serialization") version "1.5.31"
|
||||||
id("org.jetbrains.compose") version "1.0.0-alpha4-build328"
|
id("org.jetbrains.compose") version "1.0.0-beta1"
|
||||||
id("com.github.gmazzo.buildconfig") version "3.0.3"
|
id("com.github.gmazzo.buildconfig") version "3.0.3"
|
||||||
id("org.jmailen.kotlinter") version "3.6.0"
|
id("org.jmailen.kotlinter") version "3.6.0"
|
||||||
id("com.github.ben-manes.versions") version "0.39.0"
|
id("com.github.ben-manes.versions") version "0.39.0"
|
||||||
@@ -33,8 +33,8 @@ dependencies {
|
|||||||
implementation(compose.materialIconsExtended)
|
implementation(compose.materialIconsExtended)
|
||||||
implementation(compose("org.jetbrains.compose.ui:ui-util"))
|
implementation(compose("org.jetbrains.compose.ui:ui-util"))
|
||||||
implementation("ca.gosyer:compose-router:0.24.2-jetbrains-2")
|
implementation("ca.gosyer:compose-router:0.24.2-jetbrains-2")
|
||||||
implementation("ca.gosyer:accompanist-pager:0.14.0")
|
implementation("ca.gosyer:accompanist-pager:0.18.1")
|
||||||
implementation("ca.gosyer:accompanist-flowlayout:0.14.0")
|
implementation("ca.gosyer:accompanist-flowlayout:0.18.1")
|
||||||
|
|
||||||
// UI (Swing)
|
// UI (Swing)
|
||||||
implementation("com.github.weisj:darklaf-core:2.7.3")
|
implementation("com.github.weisj:darklaf-core:2.7.3")
|
||||||
@@ -58,7 +58,7 @@ dependencies {
|
|||||||
kapt("com.github.stephanenicolas.toothpick:toothpick-compiler:$toothpickVersion")
|
kapt("com.github.stephanenicolas.toothpick:toothpick-compiler:$toothpickVersion")
|
||||||
|
|
||||||
// Http client
|
// Http client
|
||||||
val ktorVersion = "1.6.3"
|
val ktorVersion = "1.6.4"
|
||||||
implementation("io.ktor:ktor-client-core:$ktorVersion")
|
implementation("io.ktor:ktor-client-core:$ktorVersion")
|
||||||
implementation("io.ktor:ktor-client-okhttp:$ktorVersion")
|
implementation("io.ktor:ktor-client-okhttp:$ktorVersion")
|
||||||
implementation("io.ktor:ktor-client-serialization:$ktorVersion")
|
implementation("io.ktor:ktor-client-serialization:$ktorVersion")
|
||||||
|
|||||||
@@ -6,10 +6,10 @@
|
|||||||
|
|
||||||
package ca.gosyer.data.ui.model
|
package ca.gosyer.data.ui.model
|
||||||
|
|
||||||
|
import androidx.compose.ui.unit.DpSize
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.window.WindowPlacement
|
import androidx.compose.ui.window.WindowPlacement
|
||||||
import androidx.compose.ui.window.WindowPosition
|
import androidx.compose.ui.window.WindowPosition
|
||||||
import androidx.compose.ui.window.WindowSize
|
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
@@ -26,13 +26,13 @@ data class WindowSettings(
|
|||||||
if (maximized == true) {
|
if (maximized == true) {
|
||||||
return WindowGet(
|
return WindowGet(
|
||||||
WindowPosition.PlatformDefault,
|
WindowPosition.PlatformDefault,
|
||||||
WindowSize(800.dp, 600.dp),
|
DpSize(800.dp, 600.dp),
|
||||||
WindowPlacement.Maximized
|
WindowPlacement.Maximized
|
||||||
)
|
)
|
||||||
} else if (fullscreen == true) {
|
} else if (fullscreen == true) {
|
||||||
return WindowGet(
|
return WindowGet(
|
||||||
WindowPosition.PlatformDefault,
|
WindowPosition.PlatformDefault,
|
||||||
WindowSize(800.dp, 600.dp),
|
DpSize(800.dp, 600.dp),
|
||||||
WindowPlacement.Fullscreen
|
WindowPlacement.Fullscreen
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -42,7 +42,7 @@ data class WindowSettings(
|
|||||||
} else {
|
} else {
|
||||||
WindowPosition.PlatformDefault
|
WindowPosition.PlatformDefault
|
||||||
}
|
}
|
||||||
val size = WindowSize((width ?: 800).dp, (height ?: 600).dp)
|
val size = DpSize((width ?: 800).dp, (height ?: 600).dp)
|
||||||
return WindowGet(
|
return WindowGet(
|
||||||
offset,
|
offset,
|
||||||
size,
|
size,
|
||||||
@@ -60,7 +60,7 @@ data class WindowSettings(
|
|||||||
|
|
||||||
data class WindowGet(
|
data class WindowGet(
|
||||||
val offset: WindowPosition,
|
val offset: WindowPosition,
|
||||||
val size: WindowSize,
|
val size: DpSize,
|
||||||
val placement: WindowPlacement
|
val placement: WindowPlacement
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,10 +29,10 @@ import androidx.compose.ui.Modifier
|
|||||||
import androidx.compose.ui.input.key.Key
|
import androidx.compose.ui.input.key.Key
|
||||||
import androidx.compose.ui.input.key.KeyEvent
|
import androidx.compose.ui.input.key.KeyEvent
|
||||||
import androidx.compose.ui.input.key.key
|
import androidx.compose.ui.input.key.key
|
||||||
|
import androidx.compose.ui.unit.DpSize
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.window.Window
|
import androidx.compose.ui.window.Window
|
||||||
import androidx.compose.ui.window.WindowPosition
|
import androidx.compose.ui.window.WindowPosition
|
||||||
import androidx.compose.ui.window.WindowSize
|
|
||||||
import androidx.compose.ui.window.rememberWindowState
|
import androidx.compose.ui.window.rememberWindowState
|
||||||
import ca.gosyer.common.di.AppScope
|
import ca.gosyer.common.di.AppScope
|
||||||
import ca.gosyer.data.translation.XmlResourceBundle
|
import ca.gosyer.data.translation.XmlResourceBundle
|
||||||
@@ -46,7 +46,7 @@ import kotlinx.coroutines.DelicateCoroutinesApi
|
|||||||
@Suppress("FunctionName")
|
@Suppress("FunctionName")
|
||||||
fun WindowDialog(
|
fun WindowDialog(
|
||||||
title: String = "Dialog",
|
title: String = "Dialog",
|
||||||
size: WindowSize = WindowSize(400.dp, 200.dp),
|
size: DpSize = DpSize(400.dp, 200.dp),
|
||||||
onCloseRequest: (() -> Unit)? = null,
|
onCloseRequest: (() -> Unit)? = null,
|
||||||
forceFocus: Boolean = true,
|
forceFocus: Boolean = true,
|
||||||
showNegativeButton: Boolean = true,
|
showNegativeButton: Boolean = true,
|
||||||
@@ -130,7 +130,7 @@ fun WindowDialog(
|
|||||||
@OptIn(DelicateCoroutinesApi::class)
|
@OptIn(DelicateCoroutinesApi::class)
|
||||||
fun WindowDialog(
|
fun WindowDialog(
|
||||||
title: String = "Dialog",
|
title: String = "Dialog",
|
||||||
size: WindowSize = WindowSize(400.dp, 200.dp),
|
size: DpSize = DpSize(400.dp, 200.dp),
|
||||||
onCloseRequest: (() -> Unit)? = null,
|
onCloseRequest: (() -> Unit)? = null,
|
||||||
forceFocus: Boolean = true,
|
forceFocus: Boolean = true,
|
||||||
keyboardShortcuts: Map<Key, (KeyEvent) -> Boolean> = emptyMap(),
|
keyboardShortcuts: Map<Key, (KeyEvent) -> Boolean> = emptyMap(),
|
||||||
|
|||||||
@@ -6,12 +6,11 @@
|
|||||||
|
|
||||||
package ca.gosyer.ui.base.components
|
package ca.gosyer.ui.base.components
|
||||||
|
|
||||||
import androidx.compose.foundation.BoxWithTooltip
|
import androidx.compose.foundation.TooltipArea
|
||||||
import androidx.compose.foundation.TooltipPlacement
|
import androidx.compose.foundation.TooltipPlacement
|
||||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||||
import androidx.compose.material.Surface
|
import androidx.compose.material.Surface
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Alignment
|
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.draw.shadow
|
import androidx.compose.ui.draw.shadow
|
||||||
import androidx.compose.ui.unit.DpOffset
|
import androidx.compose.ui.unit.DpOffset
|
||||||
@@ -21,15 +20,13 @@ import androidx.compose.ui.unit.dp
|
|||||||
fun BoxWithTooltipSurface(
|
fun BoxWithTooltipSurface(
|
||||||
tooltip: @Composable () -> Unit,
|
tooltip: @Composable () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
contentAlignment: Alignment = Alignment.TopStart,
|
delayMillis: Int = 500,
|
||||||
propagateMinConstraints: Boolean = false,
|
tooltipPlacement: TooltipPlacement = TooltipPlacement.CursorPoint(
|
||||||
delay: Int = 500,
|
|
||||||
offset: TooltipPlacement = TooltipPlacement.CursorPoint(
|
|
||||||
offset = DpOffset(0.dp, 16.dp)
|
offset = DpOffset(0.dp, 16.dp)
|
||||||
),
|
),
|
||||||
content: @Composable () -> Unit
|
content: @Composable () -> Unit
|
||||||
) {
|
) {
|
||||||
BoxWithTooltip(
|
TooltipArea(
|
||||||
{
|
{
|
||||||
Surface(
|
Surface(
|
||||||
modifier = Modifier.shadow(4.dp),
|
modifier = Modifier.shadow(4.dp),
|
||||||
@@ -39,10 +36,8 @@ fun BoxWithTooltipSurface(
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
modifier,
|
modifier,
|
||||||
contentAlignment,
|
delayMillis,
|
||||||
propagateMinConstraints,
|
tooltipPlacement,
|
||||||
delay,
|
|
||||||
offset,
|
|
||||||
content
|
content
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,10 +62,10 @@ import androidx.compose.ui.graphics.toArgb
|
|||||||
import androidx.compose.ui.input.pointer.PointerInputScope
|
import androidx.compose.ui.input.pointer.PointerInputScope
|
||||||
import androidx.compose.ui.input.pointer.pointerInput
|
import androidx.compose.ui.input.pointer.pointerInput
|
||||||
import androidx.compose.ui.layout.onSizeChanged
|
import androidx.compose.ui.layout.onSizeChanged
|
||||||
|
import androidx.compose.ui.unit.DpSize
|
||||||
import androidx.compose.ui.unit.IntSize
|
import androidx.compose.ui.unit.IntSize
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.util.fastForEachIndexed
|
import androidx.compose.ui.util.fastForEachIndexed
|
||||||
import androidx.compose.ui.window.WindowSize
|
|
||||||
import ca.gosyer.ui.base.WindowDialog
|
import ca.gosyer.ui.base.WindowDialog
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlin.math.round
|
import kotlin.math.round
|
||||||
@@ -81,7 +81,7 @@ fun ColorPickerDialog(
|
|||||||
|
|
||||||
WindowDialog(
|
WindowDialog(
|
||||||
onCloseRequest = onCloseRequest,
|
onCloseRequest = onCloseRequest,
|
||||||
size = WindowSize(300.dp, 520.dp),
|
size = DpSize(300.dp, 520.dp),
|
||||||
title = title,
|
title = title,
|
||||||
content = {
|
content = {
|
||||||
val showPresetsState by showPresets.collectAsState()
|
val showPresetsState by showPresets.collectAsState()
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
package ca.gosyer.ui.base.components
|
package ca.gosyer.ui.base.components
|
||||||
|
|
||||||
import androidx.compose.foundation.ContextMenuItem
|
import androidx.compose.foundation.ContextMenuItem
|
||||||
import androidx.compose.foundation.ExperimentalDesktopApi
|
|
||||||
import androidx.compose.foundation.MouseClickScope
|
import androidx.compose.foundation.MouseClickScope
|
||||||
import androidx.compose.foundation.mouseClickable
|
import androidx.compose.foundation.mouseClickable
|
||||||
import androidx.compose.material.CursorDropdownMenu
|
import androidx.compose.material.CursorDropdownMenu
|
||||||
@@ -28,7 +27,6 @@ import androidx.compose.ui.semantics.Role
|
|||||||
import androidx.compose.ui.semantics.SemanticsPropertyKey
|
import androidx.compose.ui.semantics.SemanticsPropertyKey
|
||||||
import androidx.compose.ui.semantics.semantics
|
import androidx.compose.ui.semantics.semantics
|
||||||
|
|
||||||
@OptIn(ExperimentalDesktopApi::class)
|
|
||||||
fun Modifier.contextMenuClickable(
|
fun Modifier.contextMenuClickable(
|
||||||
items: () -> List<ContextMenuItem>,
|
items: () -> List<ContextMenuItem>,
|
||||||
onClickLabel: String? = null,
|
onClickLabel: String? = null,
|
||||||
@@ -75,7 +73,6 @@ fun Modifier.contextMenuClickable(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(ExperimentalDesktopApi::class)
|
|
||||||
fun Modifier.combinedMouseClickable(
|
fun Modifier.combinedMouseClickable(
|
||||||
enabled: Boolean = true,
|
enabled: Boolean = true,
|
||||||
onClickLabel: String? = null,
|
onClickLabel: String? = null,
|
||||||
@@ -116,7 +113,6 @@ fun Modifier.combinedMouseClickable(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(ExperimentalDesktopApi::class)
|
|
||||||
private object DesktopSemanticsActions {
|
private object DesktopSemanticsActions {
|
||||||
val onRightClick = ActionPropertyKey<MouseClickScope.() -> Boolean>("OnRightClick")
|
val onRightClick = ActionPropertyKey<MouseClickScope.() -> Boolean>("OnRightClick")
|
||||||
val onMiddleClick = ActionPropertyKey<MouseClickScope.() -> Boolean>("OnMiddleClick")
|
val onMiddleClick = ActionPropertyKey<MouseClickScope.() -> Boolean>("OnMiddleClick")
|
||||||
|
|||||||
@@ -235,32 +235,31 @@ fun <T> ChoiceDialog(
|
|||||||
WindowDialog(
|
WindowDialog(
|
||||||
onCloseRequest = onCloseRequest,
|
onCloseRequest = onCloseRequest,
|
||||||
buttons = buttons,
|
buttons = buttons,
|
||||||
title = title,
|
title = title
|
||||||
content = {
|
) {
|
||||||
LazyColumn(Modifier.fillMaxSize()) {
|
LazyColumn(Modifier.fillMaxSize()) {
|
||||||
items(items) { (value, text) ->
|
items(items) { (value, text) ->
|
||||||
Row(
|
Row(
|
||||||
modifier = Modifier.requiredHeight(48.dp).fillMaxWidth().clickable(
|
modifier = Modifier.requiredHeight(48.dp).fillMaxWidth().clickable(
|
||||||
onClick = {
|
onClick = {
|
||||||
onSelected(value)
|
onSelected(value)
|
||||||
it()
|
it()
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
verticalAlignment = Alignment.CenterVertically
|
verticalAlignment = Alignment.CenterVertically
|
||||||
) {
|
) {
|
||||||
RadioButton(
|
RadioButton(
|
||||||
selected = value == selected,
|
selected = value == selected,
|
||||||
onClick = {
|
onClick = {
|
||||||
onSelected(value)
|
onSelected(value)
|
||||||
it()
|
it()
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
Text(text = text, modifier = Modifier.padding(start = 24.dp))
|
Text(text = text, modifier = Modifier.padding(start = 24.dp))
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|||||||
@@ -7,15 +7,20 @@
|
|||||||
package ca.gosyer.ui.base.theme
|
package ca.gosyer.ui.base.theme
|
||||||
|
|
||||||
import androidx.compose.desktop.DesktopMaterialTheme
|
import androidx.compose.desktop.DesktopMaterialTheme
|
||||||
|
import androidx.compose.foundation.LocalScrollbarStyle
|
||||||
|
import androidx.compose.foundation.ScrollbarStyle
|
||||||
import androidx.compose.foundation.isSystemInDarkTheme
|
import androidx.compose.foundation.isSystemInDarkTheme
|
||||||
import androidx.compose.material.Colors
|
import androidx.compose.material.Colors
|
||||||
|
import androidx.compose.material.MaterialTheme
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.CompositionLocalProvider
|
||||||
import androidx.compose.runtime.collectAsState
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.graphics.luminance
|
import androidx.compose.ui.graphics.luminance
|
||||||
import androidx.compose.ui.graphics.takeOrElse
|
import androidx.compose.ui.graphics.takeOrElse
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
import ca.gosyer.data.ui.UiPreferences
|
import ca.gosyer.data.ui.UiPreferences
|
||||||
import ca.gosyer.data.ui.model.ThemeMode
|
import ca.gosyer.data.ui.model.ThemeMode
|
||||||
import ca.gosyer.ui.base.vm.ViewModel
|
import ca.gosyer.ui.base.vm.ViewModel
|
||||||
@@ -36,7 +41,19 @@ fun AppTheme(content: @Composable () -> Unit) {
|
|||||||
val colors = vm.getColors()
|
val colors = vm.getColors()
|
||||||
/*val systemUiController = rememberSystemUiController()*/
|
/*val systemUiController = rememberSystemUiController()*/
|
||||||
|
|
||||||
DesktopMaterialTheme(colors = colors, content = content)
|
MaterialTheme(colors = colors) {
|
||||||
|
CompositionLocalProvider(
|
||||||
|
LocalScrollbarStyle provides ScrollbarStyle(
|
||||||
|
minimalHeight = 16.dp,
|
||||||
|
thickness = 8.dp,
|
||||||
|
shape = MaterialTheme.shapes.small,
|
||||||
|
hoverDurationMillis = 300,
|
||||||
|
unhoverColor = MaterialTheme.colors.onSurface.copy(alpha = 0.12f),
|
||||||
|
hoverColor = MaterialTheme.colors.onSurface.copy(alpha = 0.50f)
|
||||||
|
),
|
||||||
|
content = content
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class AppThemeViewModel @Inject constructor(
|
private class AppThemeViewModel @Inject constructor(
|
||||||
|
|||||||
@@ -42,9 +42,9 @@ import androidx.compose.ui.graphics.Color
|
|||||||
import androidx.compose.ui.text.SpanStyle
|
import androidx.compose.ui.text.SpanStyle
|
||||||
import androidx.compose.ui.text.buildAnnotatedString
|
import androidx.compose.ui.text.buildAnnotatedString
|
||||||
import androidx.compose.ui.text.withStyle
|
import androidx.compose.ui.text.withStyle
|
||||||
|
import androidx.compose.ui.unit.DpSize
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.unit.sp
|
import androidx.compose.ui.unit.sp
|
||||||
import androidx.compose.ui.window.WindowSize
|
|
||||||
import androidx.compose.ui.window.rememberWindowState
|
import androidx.compose.ui.window.rememberWindowState
|
||||||
import ca.gosyer.build.BuildConfig
|
import ca.gosyer.build.BuildConfig
|
||||||
import ca.gosyer.data.models.Extension
|
import ca.gosyer.data.models.Extension
|
||||||
@@ -66,7 +66,7 @@ import java.util.Locale
|
|||||||
@OptIn(DelicateCoroutinesApi::class)
|
@OptIn(DelicateCoroutinesApi::class)
|
||||||
fun openExtensionsMenu() {
|
fun openExtensionsMenu() {
|
||||||
launchApplication {
|
launchApplication {
|
||||||
val state = rememberWindowState(size = WindowSize(550.dp, 700.dp))
|
val state = rememberWindowState(size = DpSize(550.dp, 700.dp))
|
||||||
ThemedWindow(::exitApplication, state, title = BuildConfig.NAME) {
|
ThemedWindow(::exitApplication, state, title = BuildConfig.NAME) {
|
||||||
Surface {
|
Surface {
|
||||||
ExtensionsMenu()
|
ExtensionsMenu()
|
||||||
|
|||||||
@@ -7,7 +7,8 @@
|
|||||||
package ca.gosyer.ui.sources
|
package ca.gosyer.ui.sources
|
||||||
|
|
||||||
import androidx.compose.animation.Crossfade
|
import androidx.compose.animation.Crossfade
|
||||||
import androidx.compose.foundation.BoxWithTooltip
|
import androidx.compose.foundation.TooltipArea
|
||||||
|
import androidx.compose.foundation.TooltipPlacement
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.Row
|
import androidx.compose.foundation.layout.Row
|
||||||
@@ -34,6 +35,7 @@ import androidx.compose.runtime.getValue
|
|||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.draw.shadow
|
import androidx.compose.ui.draw.shadow
|
||||||
|
import androidx.compose.ui.unit.DpOffset
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import ca.gosyer.build.BuildConfig
|
import ca.gosyer.build.BuildConfig
|
||||||
import ca.gosyer.ui.base.components.ActionIcon
|
import ca.gosyer.ui.base.components.ActionIcon
|
||||||
@@ -133,7 +135,7 @@ fun SourcesMenu(bundle: Bundle, onSourceSettingsClick: (Long) -> Unit, onMangaCl
|
|||||||
Surface(elevation = 1.dp) {
|
Surface(elevation = 1.dp) {
|
||||||
LazyColumn(Modifier.fillMaxHeight().width(64.dp)) {
|
LazyColumn(Modifier.fillMaxHeight().width(64.dp)) {
|
||||||
items(sourceTabs) { source ->
|
items(sourceTabs) { source ->
|
||||||
BoxWithTooltip(
|
TooltipArea(
|
||||||
{
|
{
|
||||||
Surface(
|
Surface(
|
||||||
modifier = Modifier.shadow(4.dp),
|
modifier = Modifier.shadow(4.dp),
|
||||||
@@ -143,7 +145,10 @@ fun SourcesMenu(bundle: Bundle, onSourceSettingsClick: (Long) -> Unit, onMangaCl
|
|||||||
Text(source?.name ?: stringResource("sources_home"), modifier = Modifier.padding(10.dp))
|
Text(source?.name ?: stringResource("sources_home"), modifier = Modifier.padding(10.dp))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
modifier = Modifier.size(64.dp)
|
modifier = Modifier.size(64.dp),
|
||||||
|
tooltipPlacement = TooltipPlacement.CursorPoint(
|
||||||
|
offset = DpOffset(0.dp, 16.dp)
|
||||||
|
)
|
||||||
) {
|
) {
|
||||||
Box(Modifier.fillMaxSize()) {
|
Box(Modifier.fillMaxSize()) {
|
||||||
val modifier = Modifier
|
val modifier = Modifier
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
package ca.gosyer.ui.sources.components
|
package ca.gosyer.ui.sources.components
|
||||||
|
|
||||||
import androidx.compose.foundation.BoxWithTooltip
|
import androidx.compose.foundation.TooltipArea
|
||||||
import androidx.compose.foundation.VerticalScrollbar
|
import androidx.compose.foundation.VerticalScrollbar
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
@@ -97,7 +97,7 @@ fun SourceItem(
|
|||||||
serverUrl: String,
|
serverUrl: String,
|
||||||
onSourceClicked: (Source) -> Unit
|
onSourceClicked: (Source) -> Unit
|
||||||
) {
|
) {
|
||||||
BoxWithTooltip(
|
TooltipArea(
|
||||||
{
|
{
|
||||||
Surface(
|
Surface(
|
||||||
modifier = Modifier.shadow(4.dp),
|
modifier = Modifier.shadow(4.dp),
|
||||||
|
|||||||
@@ -7,19 +7,19 @@
|
|||||||
package ca.gosyer.util.compose
|
package ca.gosyer.util.compose
|
||||||
|
|
||||||
import androidx.compose.ui.graphics.ImageBitmap
|
import androidx.compose.ui.graphics.ImageBitmap
|
||||||
import androidx.compose.ui.graphics.asImageBitmap
|
import androidx.compose.ui.graphics.toComposeImageBitmap
|
||||||
import ca.gosyer.data.server.Http
|
import ca.gosyer.data.server.Http
|
||||||
import io.ktor.client.request.HttpRequestBuilder
|
import io.ktor.client.request.HttpRequestBuilder
|
||||||
import io.ktor.client.request.get
|
import io.ktor.client.request.get
|
||||||
import io.ktor.utils.io.ByteReadChannel
|
import io.ktor.utils.io.ByteReadChannel
|
||||||
import io.ktor.utils.io.jvm.javaio.copyTo
|
import io.ktor.utils.io.jvm.javaio.copyTo
|
||||||
import org.jetbrains.skija.Image
|
import org.jetbrains.skia.Image
|
||||||
import java.io.ByteArrayOutputStream
|
import java.io.ByteArrayOutputStream
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
import kotlin.io.path.readBytes
|
import kotlin.io.path.readBytes
|
||||||
|
|
||||||
fun imageFromFile(file: Path): ImageBitmap {
|
fun imageFromFile(file: Path): ImageBitmap {
|
||||||
return Image.makeFromEncoded(file.readBytes()).asImageBitmap()
|
return Image.makeFromEncoded(file.readBytes()).toComposeImageBitmap()
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun imageFromUrl(client: Http, url: String, block: HttpRequestBuilder.() -> Unit): ImageBitmap {
|
suspend fun imageFromUrl(client: Http, url: String, block: HttpRequestBuilder.() -> Unit): ImageBitmap {
|
||||||
@@ -27,5 +27,5 @@ suspend fun imageFromUrl(client: Http, url: String, block: HttpRequestBuilder.()
|
|||||||
client.get<ByteReadChannel>(url, block).copyTo(it)
|
client.get<ByteReadChannel>(url, block).copyTo(it)
|
||||||
it.toByteArray()
|
it.toByteArray()
|
||||||
}
|
}
|
||||||
return Image.makeFromEncoded(bytes).asImageBitmap()
|
return Image.makeFromEncoded(bytes).toComposeImageBitmap()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ fun ThemedWindow(
|
|||||||
title: String = "Untitled",
|
title: String = "Untitled",
|
||||||
icon: Painter? = null,
|
icon: Painter? = null,
|
||||||
undecorated: Boolean = false,
|
undecorated: Boolean = false,
|
||||||
|
transparent: Boolean = false,
|
||||||
resizable: Boolean = true,
|
resizable: Boolean = true,
|
||||||
enabled: Boolean = true,
|
enabled: Boolean = true,
|
||||||
focusable: Boolean = true,
|
focusable: Boolean = true,
|
||||||
@@ -39,18 +40,19 @@ fun ThemedWindow(
|
|||||||
) {
|
) {
|
||||||
val resources = remember { AppScope.getInstance<XmlResourceBundle>() }
|
val resources = remember { AppScope.getInstance<XmlResourceBundle>() }
|
||||||
Window(
|
Window(
|
||||||
onCloseRequest,
|
onCloseRequest = onCloseRequest,
|
||||||
state,
|
state = state,
|
||||||
visible,
|
visible = visible,
|
||||||
title,
|
title = title,
|
||||||
icon,
|
icon = icon,
|
||||||
undecorated,
|
undecorated = undecorated,
|
||||||
resizable,
|
transparent = transparent,
|
||||||
enabled,
|
resizable = resizable,
|
||||||
focusable,
|
enabled = enabled,
|
||||||
alwaysOnTop,
|
focusable = focusable,
|
||||||
onPreviewKeyEvent,
|
alwaysOnTop = alwaysOnTop,
|
||||||
onKeyEvent
|
onPreviewKeyEvent = onPreviewKeyEvent,
|
||||||
|
onKeyEvent = onKeyEvent
|
||||||
) {
|
) {
|
||||||
setIcon()
|
setIcon()
|
||||||
CompositionLocalProvider(
|
CompositionLocalProvider(
|
||||||
|
|||||||
Reference in New Issue
Block a user