Added «Double click translation» with external translator.

This commit is contained in:
acclorite 2024-07-17 04:47:55 +03:00
parent 7f8f7daa23
commit 3aefb37935
6 changed files with 112 additions and 3 deletions

View file

@ -330,6 +330,7 @@ private fun ReaderScreen(
) { line -> ) { line ->
ReaderTextParagraph( ReaderTextParagraph(
line = line.second, line = line.second,
context = context,
fontFamily = fontFamily, fontFamily = fontFamily,
fontColor = fontColor, fontColor = fontColor,
lineHeight = lineHeight, lineHeight = lineHeight,
@ -337,6 +338,9 @@ private fun ReaderScreen(
fontSize = mainState.value.fontSize!!.sp, fontSize = mainState.value.fontSize!!.sp,
sidePadding = sidePadding, sidePadding = sidePadding,
paragraphIndentation = mainState.value.paragraphIndentation!!, paragraphIndentation = mainState.value.paragraphIndentation!!,
doubleClickTranslationEnabled = mainState.value.doubleClickTranslation!!,
toolbarHidden = toolbarHidden,
onEvent = onEvent
) )
} }

View file

@ -1,5 +1,10 @@
package ua.acclorite.book_story.presentation.screens.reader.components package ua.acclorite.book_story.presentation.screens.reader.components
import android.content.Context
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
@ -15,13 +20,16 @@ import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.style.LineBreak import androidx.compose.ui.text.style.LineBreak
import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.TextUnit
import ua.acclorite.book_story.R
import ua.acclorite.book_story.domain.model.FontWithName import ua.acclorite.book_story.domain.model.FontWithName
import ua.acclorite.book_story.domain.model.ReaderLine import ua.acclorite.book_story.domain.model.ReaderLine
import ua.acclorite.book_story.presentation.screens.reader.data.ReaderEvent
/** /**
* Reader Text Paragraph item. * Reader Text Paragraph item.
* *
* @param line Current line. * @param line Current line.
* @param context Context.
* @param fontFamily Line's font family. * @param fontFamily Line's font family.
* @param fontColor Line's font color. * @param fontColor Line's font color.
* @param lineHeight Line's line height. * @param lineHeight Line's line height.
@ -29,17 +37,25 @@ import ua.acclorite.book_story.domain.model.ReaderLine
* @param fontSize Line's font size. * @param fontSize Line's font size.
* @param sidePadding Line's side padding. * @param sidePadding Line's side padding.
* @param paragraphIndentation Whether Paragraph Indentation is enabled for this line. * @param paragraphIndentation Whether Paragraph Indentation is enabled for this line.
* @param doubleClickTranslationEnabled Whether Double Click Translation is enabled.
* @param toolbarHidden Whether selection toolBar is hidden.
* @param onEvent [ReaderEvent] callback.
*/ */
@OptIn(ExperimentalFoundationApi::class)
@Composable @Composable
fun LazyItemScope.ReaderTextParagraph( fun LazyItemScope.ReaderTextParagraph(
line: ReaderLine, line: ReaderLine,
context: Context,
fontFamily: FontWithName, fontFamily: FontWithName,
fontColor: Color, fontColor: Color,
lineHeight: TextUnit, lineHeight: TextUnit,
fontStyle: FontStyle, fontStyle: FontStyle,
fontSize: TextUnit, fontSize: TextUnit,
sidePadding: Dp, sidePadding: Dp,
paragraphIndentation: Boolean paragraphIndentation: Boolean,
doubleClickTranslationEnabled: Boolean,
toolbarHidden: Boolean,
onEvent: (ReaderEvent) -> Unit
) { ) {
Column( Column(
modifier = Modifier modifier = Modifier
@ -58,6 +74,39 @@ fun LazyItemScope.ReaderTextParagraph(
append(line.line) append(line.line)
}, },
modifier = Modifier.then(
if (
doubleClickTranslationEnabled &&
toolbarHidden
) {
Modifier.combinedClickable(
interactionSource = null,
indication = null,
onDoubleClick = {
onEvent(
ReaderEvent.OnOpenTranslator(
textToTranslate = line.line,
context = context as ComponentActivity,
noAppsFound = {
Toast.makeText(
context,
context.getString(R.string.error_no_translator),
Toast.LENGTH_SHORT
).show()
}
)
)
},
onClick = {
onEvent(
ReaderEvent.OnShowHideMenu(context = context as ComponentActivity)
)
}
)
} else {
Modifier
}
),
style = TextStyle( style = TextStyle(
fontFamily = fontFamily.font, fontFamily = fontFamily.font,
fontStyle = fontStyle, fontStyle = fontStyle,

View file

@ -249,6 +249,34 @@ fun ReaderSettingsBottomSheet(
) )
} }
} }
item {
Spacer(modifier = Modifier.height(22.dp))
}
item {
CategoryTitle(
title = stringResource(id = R.string.translator_reader_settings),
color = MaterialTheme.colorScheme.onSurface
)
}
item {
Spacer(modifier = Modifier.height(8.dp))
}
item {
SwitchWithTitle(
selected = mainState.value.doubleClickTranslation!!,
title = stringResource(id = R.string.translator_double_click_to_translate_option),
description = stringResource(id = R.string.translator_double_click_to_translate_option_desc),
onClick = {
onMainEvent(
MainEvent.OnChangeDoubleClickTranslation(
!mainState.value.doubleClickTranslation!!
)
)
}
)
}
} }
if (page == 1) { if (page == 1) {

View file

@ -238,6 +238,34 @@ private fun ReaderSettings(
} }
} }
item {
Spacer(modifier = Modifier.height(22.dp))
}
item {
CategoryTitle(
title = stringResource(id = R.string.translator_reader_settings),
color = MaterialTheme.colorScheme.primary
)
}
item {
Spacer(modifier = Modifier.height(8.dp))
}
item {
SwitchWithTitle(
selected = state.value.doubleClickTranslation!!,
title = stringResource(id = R.string.translator_double_click_to_translate_option),
description = stringResource(id = R.string.translator_double_click_to_translate_option_desc),
onClick = {
onMainEvent(
MainEvent.OnChangeDoubleClickTranslation(
!state.value.doubleClickTranslation!!
)
)
}
)
}
item { Spacer(modifier = Modifier.height(48.dp)) } item { Spacer(modifier = Modifier.height(48.dp)) }
} }
} }

View file

@ -184,7 +184,7 @@
<string name="appearance_settings">Зовнішній вигляд</string> <string name="appearance_settings">Зовнішній вигляд</string>
<string name="appearance_settings_desc">Тема, кольори</string> <string name="appearance_settings_desc">Тема, кольори</string>
<string name="reader_settings">Читач</string> <string name="reader_settings">Читач</string>
<string name="reader_settings_desc">Перекладач, шрифт, текст</string> <string name="reader_settings_desc">Шрифт, текст, перекладач</string>
<!-- Settings subcategories --> <!-- Settings subcategories -->
<string name="font_reader_settings">Шрифт</string> <string name="font_reader_settings">Шрифт</string>

View file

@ -202,7 +202,7 @@
<string name="appearance_settings">Appearance</string> <string name="appearance_settings">Appearance</string>
<string name="appearance_settings_desc">Theme, colors</string> <string name="appearance_settings_desc">Theme, colors</string>
<string name="reader_settings">Reader</string> <string name="reader_settings">Reader</string>
<string name="reader_settings_desc">Translator, font, text</string> <string name="reader_settings_desc">Font, text, translator</string>
<!-- Settings subcategories --> <!-- Settings subcategories -->
<string name="font_reader_settings">Font</string> <string name="font_reader_settings">Font</string>