From 2961202d056a7bc17181b2cd77933a1dbc7f7105 Mon Sep 17 00:00:00 2001 From: Jobobby04 Date: Mon, 17 Oct 2022 15:24:52 -0400 Subject: [PATCH] Re-add debug menu button styling --- .../more/settings/PreferenceItem.kt | 8 +++ .../more/settings/PreferenceModel.kt | 16 +++++ .../settings/screen/SettingsAdvancedScreen.kt | 9 ++- .../settings/widget/TextPreferenceWidget.kt | 58 +++++++++++++++++++ app/src/main/java/exh/util/AnnotatedString.kt | 37 ++++++++++++ 5 files changed, 126 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/exh/util/AnnotatedString.kt diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceItem.kt b/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceItem.kt index 39759bf6a..822e6d498 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceItem.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceItem.kt @@ -203,6 +203,14 @@ internal fun PreferenceItem( }, ) } + is Preference.PreferenceItem.AnnotatedTextPreference -> { + TextPreferenceWidget( + title = item.title, + subtitle = item.annotatedSubtitle, + icon = item.icon, + onPreferenceClick = item.onClick, + ) + } // SY <-- } } diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceModel.kt b/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceModel.kt index ee8e2e711..25cdb563d 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceModel.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceModel.kt @@ -1,6 +1,7 @@ package eu.kanade.presentation.more.settings import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.text.AnnotatedString import eu.kanade.domain.ui.model.AppTheme import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.tachiyomi.core.preference.Preference as PreferenceData @@ -150,6 +151,21 @@ sealed class Preference { override val icon: ImageVector? = null override val onValueChanged: suspend (newValue: String) -> Boolean = { true } } + + /** + * A basic [PreferenceItem] that only displays texts. + */ + data class AnnotatedTextPreference( + override val title: String, + val annotatedSubtitle: AnnotatedString, + override val icon: ImageVector? = null, + override val enabled: Boolean = true, + override val onValueChanged: suspend (newValue: String) -> Boolean = { true }, + + val onClick: (() -> Unit)? = null, + ) : PreferenceItem() { + override val subtitle: String = annotatedSubtitle.text + } // SY <-- } diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt index 1a4b8e244..70cde9128 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt @@ -35,6 +35,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.window.DialogProperties import androidx.core.net.toUri +import androidx.core.text.HtmlCompat import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.domain.UnsortedPreferences @@ -88,6 +89,7 @@ import exh.pref.DelegateSourcePreferences import exh.source.BlacklistedSources import exh.source.EH_SOURCE_ID import exh.source.EXH_SOURCE_ID +import exh.util.toAnnotatedString import kotlinx.coroutines.Job import kotlinx.coroutines.launch import logcat.LogPriority @@ -729,9 +731,12 @@ class SettingsAdvancedScreen : SearchableSettings { stringResource(R.string.app_name), ), ), - Preference.PreferenceItem.TextPreference( + Preference.PreferenceItem.AnnotatedTextPreference( title = stringResource(R.string.open_debug_menu), - subtitle = stringResource(R.string.open_debug_menu_summary), // todo make red + annotatedSubtitle = remember { + HtmlCompat.fromHtml(context.getString(R.string.open_debug_menu_summary), HtmlCompat.FROM_HTML_MODE_COMPACT) + .toAnnotatedString() + }, onClick = { router.pushController(SettingsDebugController()) }, ), ), diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/widget/TextPreferenceWidget.kt b/app/src/main/java/eu/kanade/presentation/more/settings/widget/TextPreferenceWidget.kt index ef5e1e526..15bc63848 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/widget/TextPreferenceWidget.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/widget/TextPreferenceWidget.kt @@ -12,6 +12,10 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.withStyle import androidx.compose.ui.tooling.preview.Preview import eu.kanade.presentation.util.secondaryItemAlpha @@ -58,6 +62,47 @@ fun TextPreferenceWidget( ) } +// SY --> +@Composable +fun TextPreferenceWidget( + modifier: Modifier = Modifier, + title: String? = null, + subtitle: AnnotatedString, + icon: ImageVector? = null, + iconTint: Color = MaterialTheme.colorScheme.primary, + widget: @Composable (() -> Unit)? = null, + onPreferenceClick: (() -> Unit)? = null, +) { + BasePreferenceWidget( + modifier = modifier, + title = title, + subcomponent = { + Text( + text = subtitle, + modifier = Modifier + .padding(horizontal = HorizontalPadding) + .secondaryItemAlpha(), + style = MaterialTheme.typography.bodyMedium, + maxLines = 10, + ) + }, + icon = if (icon != null) { + { + Icon( + imageVector = icon, + tint = iconTint, + contentDescription = null, + ) + } + } else { + null + }, + onClick = onPreferenceClick, + widget = widget, + ) +} +// SY <-- + @Preview @Composable private fun TextPreferenceWidgetPreview() { @@ -75,6 +120,19 @@ private fun TextPreferenceWidgetPreview() { subtitle = "Text preference summary", onPreferenceClick = {}, ) + // SY --> + TextPreferenceWidget( + title = "Text preference", + subtitle = buildAnnotatedString { + append("Text preference ") + + withStyle(SpanStyle(Color.Red)) { + append("summary") + } + }, + onPreferenceClick = {}, + ) + // SY <-- } } } diff --git a/app/src/main/java/exh/util/AnnotatedString.kt b/app/src/main/java/exh/util/AnnotatedString.kt new file mode 100644 index 000000000..8bf540cdf --- /dev/null +++ b/app/src/main/java/exh/util/AnnotatedString.kt @@ -0,0 +1,37 @@ +package exh.util + +import android.graphics.Typeface +import android.text.Spanned +import android.text.style.ForegroundColorSpan +import android.text.style.StyleSpan +import android.text.style.UnderlineSpan +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextDecoration + +/** + * Converts a [Spanned] into an [AnnotatedString] trying to keep as much formatting as possible. + * + * Currently supports `bold`, `italic`, `underline` and `color`. + */ +fun Spanned.toAnnotatedString(): AnnotatedString = buildAnnotatedString { + val spanned = this@toAnnotatedString + append(spanned.toString()) + getSpans(0, spanned.length, Any::class.java).forEach { span -> + val start = getSpanStart(span) + val end = getSpanEnd(span) + when (span) { + is StyleSpan -> when (span.style) { + Typeface.BOLD -> addStyle(SpanStyle(fontWeight = FontWeight.Bold), start, end) + Typeface.ITALIC -> addStyle(SpanStyle(fontStyle = FontStyle.Italic), start, end) + Typeface.BOLD_ITALIC -> addStyle(SpanStyle(fontWeight = FontWeight.Bold, fontStyle = FontStyle.Italic), start, end) + } + is UnderlineSpan -> addStyle(SpanStyle(textDecoration = TextDecoration.Underline), start, end) + is ForegroundColorSpan -> addStyle(SpanStyle(color = Color(span.foregroundColor)), start, end) + } + } +}