界面优化
This commit is contained in:
1 file changed
+17
-54
@@ -1,7 +1,6 @@
|
|||||||
package io.legado.app.ui.ai.chat
|
package io.legado.app.ui.ai.chat
|
||||||
|
|
||||||
import androidx.compose.animation.AnimatedVisibility
|
import androidx.compose.animation.AnimatedVisibility
|
||||||
import androidx.compose.animation.animateContentSize
|
|
||||||
import androidx.compose.animation.core.LinearEasing
|
import androidx.compose.animation.core.LinearEasing
|
||||||
import androidx.compose.animation.core.RepeatMode
|
import androidx.compose.animation.core.RepeatMode
|
||||||
import androidx.compose.animation.core.animateDpAsState
|
import androidx.compose.animation.core.animateDpAsState
|
||||||
@@ -17,7 +16,6 @@ import androidx.compose.foundation.layout.PaddingValues
|
|||||||
import androidx.compose.foundation.layout.Row
|
import androidx.compose.foundation.layout.Row
|
||||||
import androidx.compose.foundation.layout.Spacer
|
import androidx.compose.foundation.layout.Spacer
|
||||||
import androidx.compose.foundation.layout.WindowInsets
|
import androidx.compose.foundation.layout.WindowInsets
|
||||||
import androidx.compose.foundation.text.BasicTextField
|
|
||||||
import androidx.compose.foundation.layout.asPaddingValues
|
import androidx.compose.foundation.layout.asPaddingValues
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
@@ -34,16 +32,16 @@ import androidx.compose.foundation.layout.width
|
|||||||
import androidx.compose.foundation.lazy.LazyColumn
|
import androidx.compose.foundation.lazy.LazyColumn
|
||||||
import androidx.compose.foundation.lazy.items
|
import androidx.compose.foundation.lazy.items
|
||||||
import androidx.compose.foundation.lazy.rememberLazyListState
|
import androidx.compose.foundation.lazy.rememberLazyListState
|
||||||
import androidx.compose.foundation.shape.CircleShape
|
|
||||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||||
|
import androidx.compose.foundation.text.BasicTextField
|
||||||
import androidx.compose.foundation.text.selection.SelectionContainer
|
import androidx.compose.foundation.text.selection.SelectionContainer
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.automirrored.filled.Send
|
|
||||||
import androidx.compose.material.icons.filled.Add
|
|
||||||
import androidx.compose.material.icons.filled.ContentCopy
|
|
||||||
import androidx.compose.material.icons.automirrored.filled.KeyboardArrowLeft
|
import androidx.compose.material.icons.automirrored.filled.KeyboardArrowLeft
|
||||||
import androidx.compose.material.icons.automirrored.filled.KeyboardArrowRight
|
import androidx.compose.material.icons.automirrored.filled.KeyboardArrowRight
|
||||||
|
import androidx.compose.material.icons.automirrored.filled.Send
|
||||||
|
import androidx.compose.material.icons.filled.Add
|
||||||
import androidx.compose.material.icons.filled.Check
|
import androidx.compose.material.icons.filled.Check
|
||||||
|
import androidx.compose.material.icons.filled.ContentCopy
|
||||||
import androidx.compose.material.icons.filled.KeyboardArrowDown
|
import androidx.compose.material.icons.filled.KeyboardArrowDown
|
||||||
import androidx.compose.material.icons.filled.Lightbulb
|
import androidx.compose.material.icons.filled.Lightbulb
|
||||||
import androidx.compose.material.icons.filled.Menu
|
import androidx.compose.material.icons.filled.Menu
|
||||||
@@ -51,7 +49,6 @@ import androidx.compose.material.icons.filled.Refresh
|
|||||||
import androidx.compose.material.icons.filled.Search
|
import androidx.compose.material.icons.filled.Search
|
||||||
import androidx.compose.material.icons.filled.Stop
|
import androidx.compose.material.icons.filled.Stop
|
||||||
import androidx.compose.material3.DrawerValue
|
import androidx.compose.material3.DrawerValue
|
||||||
import androidx.compose.material3.DismissibleNavigationDrawer
|
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
import androidx.compose.material3.Icon
|
import androidx.compose.material3.Icon
|
||||||
import androidx.compose.material3.ModalDrawerSheet
|
import androidx.compose.material3.ModalDrawerSheet
|
||||||
@@ -61,7 +58,6 @@ import androidx.compose.material3.SnackbarHostState
|
|||||||
import androidx.compose.material3.Surface
|
import androidx.compose.material3.Surface
|
||||||
import androidx.compose.material3.rememberDrawerState
|
import androidx.compose.material3.rememberDrawerState
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.DisposableEffect
|
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
import androidx.compose.runtime.derivedStateOf
|
import androidx.compose.runtime.derivedStateOf
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
@@ -75,7 +71,6 @@ import androidx.compose.runtime.snapshotFlow
|
|||||||
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.clip
|
import androidx.compose.ui.draw.clip
|
||||||
import androidx.compose.ui.draw.shadow
|
|
||||||
import androidx.compose.ui.focus.FocusRequester
|
import androidx.compose.ui.focus.FocusRequester
|
||||||
import androidx.compose.ui.focus.focusRequester
|
import androidx.compose.ui.focus.focusRequester
|
||||||
import androidx.compose.ui.graphics.Brush
|
import androidx.compose.ui.graphics.Brush
|
||||||
@@ -91,17 +86,17 @@ import androidx.compose.ui.unit.dp
|
|||||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
import io.legado.app.R
|
import io.legado.app.R
|
||||||
import io.legado.app.domain.model.AiMessagePart
|
import io.legado.app.domain.model.AiMessagePart
|
||||||
import io.legado.app.domain.model.AiReasoningLevel
|
|
||||||
import io.legado.app.domain.model.AiMessageRole
|
import io.legado.app.domain.model.AiMessageRole
|
||||||
|
import io.legado.app.domain.model.AiReasoningLevel
|
||||||
import io.legado.app.ui.theme.LegadoTheme
|
import io.legado.app.ui.theme.LegadoTheme
|
||||||
import io.legado.app.ui.widget.components.AppTextField
|
|
||||||
import io.legado.app.ui.widget.components.AppScaffold
|
import io.legado.app.ui.widget.components.AppScaffold
|
||||||
|
import io.legado.app.ui.widget.components.AppTextField
|
||||||
import io.legado.app.ui.widget.components.button.series.MediumTonalButton
|
import io.legado.app.ui.widget.components.button.series.MediumTonalButton
|
||||||
import io.legado.app.ui.widget.components.button.series.SmallPlainButton
|
import io.legado.app.ui.widget.components.button.series.SmallPlainButton
|
||||||
import io.legado.app.ui.widget.components.card.GlassCard
|
import io.legado.app.ui.widget.components.card.GlassCard
|
||||||
import io.legado.app.ui.widget.components.card.NormalCard
|
import io.legado.app.ui.widget.components.card.NormalCard
|
||||||
import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
|
|
||||||
import io.legado.app.ui.widget.components.image.cover.CoilBookCover
|
import io.legado.app.ui.widget.components.image.cover.CoilBookCover
|
||||||
|
import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
|
||||||
import io.legado.app.ui.widget.components.text.AppText
|
import io.legado.app.ui.widget.components.text.AppText
|
||||||
import io.legado.app.ui.widget.components.text.MarkdownBlock
|
import io.legado.app.ui.widget.components.text.MarkdownBlock
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
@@ -386,8 +381,8 @@ fun AiChatScreen(
|
|||||||
colorStops = arrayOf(
|
colorStops = arrayOf(
|
||||||
0f to bottomGradientColor.copy(alpha = 0f),
|
0f to bottomGradientColor.copy(alpha = 0f),
|
||||||
0.58f to bottomGradientColor.copy(alpha = 0f),
|
0.58f to bottomGradientColor.copy(alpha = 0f),
|
||||||
0.82f to bottomGradientColor.copy(alpha = 0.24f),
|
0.82f to bottomGradientColor.copy(alpha = 0.64f),
|
||||||
1f to bottomGradientColor.copy(alpha = 0.68f)
|
1f to bottomGradientColor.copy(alpha = 0.88f)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -492,9 +487,9 @@ fun AiChatScreen(
|
|||||||
.background(
|
.background(
|
||||||
Brush.verticalGradient(
|
Brush.verticalGradient(
|
||||||
colorStops = arrayOf(
|
colorStops = arrayOf(
|
||||||
0f to LegadoTheme.colorScheme.surface.copy(alpha = 0.66f),
|
0f to LegadoTheme.colorScheme.surface.copy(alpha = 0.88f),
|
||||||
0.38f to LegadoTheme.colorScheme.surface.copy(alpha = 0.46f),
|
0.38f to LegadoTheme.colorScheme.surface.copy(alpha = 0.72f),
|
||||||
0.72f to LegadoTheme.colorScheme.surface.copy(alpha = 0.12f),
|
0.72f to LegadoTheme.colorScheme.surface.copy(alpha = 0.40f),
|
||||||
1f to LegadoTheme.colorScheme.surface.copy(alpha = 0f)
|
1f to LegadoTheme.colorScheme.surface.copy(alpha = 0f)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -512,11 +507,6 @@ fun AiChatScreen(
|
|||||||
onClick = onBackClick,
|
onClick = onBackClick,
|
||||||
icon = Icons.AutoMirrored.Filled.KeyboardArrowLeft,
|
icon = Icons.AutoMirrored.Filled.KeyboardArrowLeft,
|
||||||
contentDescription = stringResource(R.string.back),
|
contentDescription = stringResource(R.string.back),
|
||||||
modifier = Modifier.shadow(
|
|
||||||
elevation = 2.dp,
|
|
||||||
shape = CircleShape,
|
|
||||||
clip = false
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
Box(
|
Box(
|
||||||
modifier = Modifier.weight(1f),
|
modifier = Modifier.weight(1f),
|
||||||
@@ -525,9 +515,7 @@ fun AiChatScreen(
|
|||||||
Surface(
|
Surface(
|
||||||
modifier = Modifier.height(40.dp),
|
modifier = Modifier.height(40.dp),
|
||||||
shape = RoundedCornerShape(50),
|
shape = RoundedCornerShape(50),
|
||||||
color = LegadoTheme.colorScheme.surfaceContainerLow,
|
color = LegadoTheme.colorScheme.surfaceContainerLow
|
||||||
tonalElevation = 2.dp,
|
|
||||||
shadowElevation = 2.dp
|
|
||||||
) {
|
) {
|
||||||
Column(
|
Column(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
@@ -556,22 +544,12 @@ fun AiChatScreen(
|
|||||||
MediumTonalButton(
|
MediumTonalButton(
|
||||||
onClick = { scope.launch { drawerState.open() } },
|
onClick = { scope.launch { drawerState.open() } },
|
||||||
icon = Icons.Default.Menu,
|
icon = Icons.Default.Menu,
|
||||||
contentDescription = stringResource(R.string.ai_recent_chats),
|
contentDescription = stringResource(R.string.ai_recent_chats)
|
||||||
modifier = Modifier.shadow(
|
|
||||||
elevation = 2.dp,
|
|
||||||
shape = CircleShape,
|
|
||||||
clip = false
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
MediumTonalButton(
|
MediumTonalButton(
|
||||||
onClick = { onIntent(AiChatIntent.NewConversation) },
|
onClick = { onIntent(AiChatIntent.NewConversation) },
|
||||||
icon = Icons.Default.Add,
|
icon = Icons.Default.Add,
|
||||||
contentDescription = stringResource(R.string.ai_new_chat),
|
contentDescription = stringResource(R.string.ai_new_chat)
|
||||||
modifier = Modifier.shadow(
|
|
||||||
elevation = 2.dp,
|
|
||||||
shape = CircleShape,
|
|
||||||
clip = false
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1223,14 +1201,7 @@ private fun ChatInputBar(
|
|||||||
AiReasoningLevel.HIGH -> "High"
|
AiReasoningLevel.HIGH -> "High"
|
||||||
AiReasoningLevel.XHIGH -> "Max"
|
AiReasoningLevel.XHIGH -> "Max"
|
||||||
}
|
}
|
||||||
val description = when (level) {
|
|
||||||
AiReasoningLevel.OFF -> "No thinking"
|
|
||||||
AiReasoningLevel.AUTO -> "Automatic"
|
|
||||||
AiReasoningLevel.LOW -> "1K tokens"
|
|
||||||
AiReasoningLevel.MEDIUM -> "2K tokens"
|
|
||||||
AiReasoningLevel.HIGH -> "8K tokens"
|
|
||||||
AiReasoningLevel.XHIGH -> "16K tokens"
|
|
||||||
}
|
|
||||||
Row(
|
Row(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
@@ -1254,12 +1225,6 @@ private fun ChatInputBar(
|
|||||||
color = if (isSelected) LegadoTheme.colorScheme.onPrimaryContainer
|
color = if (isSelected) LegadoTheme.colorScheme.onPrimaryContainer
|
||||||
else LegadoTheme.colorScheme.onSurface
|
else LegadoTheme.colorScheme.onSurface
|
||||||
)
|
)
|
||||||
AppText(
|
|
||||||
text = description,
|
|
||||||
style = LegadoTheme.typography.bodySmall,
|
|
||||||
color = if (isSelected) LegadoTheme.colorScheme.onPrimaryContainer.copy(alpha = 0.7f)
|
|
||||||
else LegadoTheme.colorScheme.outline
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
if (isSelected) {
|
if (isSelected) {
|
||||||
Icon(
|
Icon(
|
||||||
@@ -1287,9 +1252,7 @@ private fun ChatInputBar(
|
|||||||
bottom = bottomPadding
|
bottom = bottomPadding
|
||||||
),
|
),
|
||||||
shape = RoundedCornerShape(32.dp),
|
shape = RoundedCornerShape(32.dp),
|
||||||
color = LegadoTheme.colorScheme.surfaceContainerHigh,
|
color = LegadoTheme.colorScheme.surfaceContainerHigh
|
||||||
tonalElevation = 2.dp,
|
|
||||||
shadowElevation = 8.dp
|
|
||||||
) {
|
) {
|
||||||
Row(
|
Row(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
|
|||||||
Reference in new issue
Block a user