diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/app/edit/MarkDown.kt b/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/app/edit/MarkDown.kt index ed17109..7422fb5 100644 --- a/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/app/edit/MarkDown.kt +++ b/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/app/edit/MarkDown.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.List @@ -46,11 +47,13 @@ fun MarkDownContent( .fillMaxSize() .verticalScroll(rememberScrollState()) ) { - Markdown( - modifier = Modifier - .padding(15.dp), - content = textContent.text, - ) + SelectionContainer { + Markdown( + modifier = Modifier + .padding(15.dp), + content = textContent.text, + ) + } } } else { GenericTextField( diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/app/grid/GridScreen.kt b/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/app/grid/GridScreen.kt index cddb5ff..3be1424 100644 --- a/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/app/grid/GridScreen.kt +++ b/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/app/grid/GridScreen.kt @@ -23,6 +23,8 @@ import androidx.compose.foundation.lazy.staggeredgrid.LazyVerticalStaggeredGrid import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan import androidx.compose.foundation.lazy.staggeredgrid.rememberLazyStaggeredGridState +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.pullrefresh.PullRefreshIndicator import androidx.compose.material.pullrefresh.pullRefresh @@ -299,7 +301,7 @@ private fun GridNotesView( count = gridNotes.itemCount, key = gridNotes.itemKey { it.note.id } ) { index -> - val gridNote = gridNotes[index] ?: return@items + val gridNote = gridNotes[index] ?: return@items NoteCard( gridNote = gridNote, @@ -407,17 +409,11 @@ private fun NoteCard( ) if (gridNote.note.fileExtension() is FileExtension.Md) { -// MarkdownText( -// markdown = gridNote.note.content, -// disableLinkMovementMethod = true, -// isTextSelectable = false, -// onLinkClicked = { } -// ) - Text( - text = gridNote.note.content, - modifier = Modifier, - overflow = TextOverflow.Ellipsis, - color = MaterialTheme.colorScheme.onSurface + MarkdownCustom( + modifier = Modifier + .verticalScroll(state = rememberScrollState(), enabled = false), + content = gridNote.note.content, + lookupLinks = false ) } else { Text( diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/app/grid/markdownHelper.kt b/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/app/grid/markdownHelper.kt new file mode 100644 index 0000000..841a3ce --- /dev/null +++ b/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/app/grid/markdownHelper.kt @@ -0,0 +1,136 @@ +package io.github.wiiznokes.gitnote.ui.screen.app.grid + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.TextLinkStyles +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.unit.TextUnit +import androidx.compose.ui.unit.isSpecified +import com.mikepenz.markdown.compose.MarkdownSuccess +import com.mikepenz.markdown.compose.components.MarkdownComponents +import com.mikepenz.markdown.compose.components.markdownComponents +import com.mikepenz.markdown.m3.elements.MarkdownCheckBox +import com.mikepenz.markdown.m3.markdownColor +import com.mikepenz.markdown.m3.markdownTypography +import com.mikepenz.markdown.model.ImageTransformer +import com.mikepenz.markdown.model.MarkdownAnimations +import com.mikepenz.markdown.model.MarkdownAnnotator +import com.mikepenz.markdown.model.MarkdownColors +import com.mikepenz.markdown.model.MarkdownDimens +import com.mikepenz.markdown.model.MarkdownExtendedSpans +import com.mikepenz.markdown.model.MarkdownInlineContent +import com.mikepenz.markdown.model.MarkdownPadding +import com.mikepenz.markdown.model.MarkdownTypography +import com.mikepenz.markdown.model.NoOpImageTransformerImpl +import com.mikepenz.markdown.model.ReferenceLinkHandler +import com.mikepenz.markdown.model.ReferenceLinkHandlerImpl +import com.mikepenz.markdown.model.State +import com.mikepenz.markdown.model.markdownAnimations +import com.mikepenz.markdown.model.markdownAnnotator +import com.mikepenz.markdown.model.markdownDimens +import com.mikepenz.markdown.model.markdownExtendedSpans +import com.mikepenz.markdown.model.markdownInlineContent +import com.mikepenz.markdown.model.markdownPadding +import org.intellij.markdown.flavours.MarkdownFlavourDescriptor +import org.intellij.markdown.flavours.gfm.GFMFlavourDescriptor +import org.intellij.markdown.parser.MarkdownParser + +@Composable +fun MarkdownCustom( + content: String, + colors: MarkdownColors = markdownColor(), + typography: MarkdownTypography = markdownTypographyScaled(), + modifier: Modifier = Modifier.fillMaxSize(), + padding: MarkdownPadding = markdownPadding(), + dimens: MarkdownDimens = markdownDimens(), + flavour: MarkdownFlavourDescriptor = GFMFlavourDescriptor(), + parser: MarkdownParser = MarkdownParser(flavour), + imageTransformer: ImageTransformer = NoOpImageTransformerImpl(), + annotator: MarkdownAnnotator = markdownAnnotator(), + extendedSpans: MarkdownExtendedSpans = markdownExtendedSpans(), + inlineContent: MarkdownInlineContent = markdownInlineContent(), + components: MarkdownComponents = markdownComponents(checkbox = { MarkdownCheckBox(it.content, it.node, it.typography.text) }), + animations: MarkdownAnimations = markdownAnimations(), + referenceLinkHandler: ReferenceLinkHandler = ReferenceLinkHandlerImpl(), + lookupLinks: Boolean = true, + loading: @Composable (modifier: Modifier) -> Unit = { Box(modifier) }, + success: @Composable (state: State.Success, components: MarkdownComponents, modifier: Modifier) -> Unit = { state, components, modifier -> + MarkdownSuccess(state = state, components = components, modifier = modifier) + }, + error: @Composable (modifier: Modifier) -> Unit = { Box(modifier) }, +) = com.mikepenz.markdown.compose.Markdown( + content = content, + colors = colors, + typography = typography, + modifier = modifier, + padding = padding, + dimens = dimens, + flavour = flavour, + parser = parser, + imageTransformer = imageTransformer, + annotator = annotator, + extendedSpans = extendedSpans, + inlineContent = inlineContent, + components = components, + animations = animations, + referenceLinkHandler = referenceLinkHandler, + lookupLinks = lookupLinks, + loading = loading, + success = success, + error = error, +) + + + +private fun TextStyle.scaled(scale: Float): TextStyle = copy( + fontSize = fontSize.scale(scale), + lineHeight = lineHeight.scale(scale), + letterSpacing = letterSpacing.scale(scale) +) + +private fun TextUnit.scale(scale: Float): TextUnit = + if (this.isSpecified) this * scale else this + +@Composable +fun markdownTypographyScaled( + scale: Float = 0.85f +): MarkdownTypography = markdownTypography( + h1 = MaterialTheme.typography.headlineLarge, + h2 = MaterialTheme.typography.headlineMedium, + h3 = MaterialTheme.typography.headlineSmall, + h4 = MaterialTheme.typography.titleLarge, + h5 = MaterialTheme.typography.titleMedium, + h6 = MaterialTheme.typography.titleSmall, + text = MaterialTheme.typography.bodyLarge.scaled(scale), + code = MaterialTheme.typography.bodyMedium + .scaled(scale) + .copy(fontFamily = FontFamily.Monospace), + inlineCode = MaterialTheme.typography.bodyLarge + .scaled(scale) + .copy(fontFamily = FontFamily.Monospace), + quote = MaterialTheme.typography.bodyMedium + .scaled(scale) + .plus(SpanStyle(fontStyle = FontStyle.Italic)), + paragraph = MaterialTheme.typography.bodyLarge.scaled(scale), + ordered = MaterialTheme.typography.bodyLarge.scaled(scale), + bullet = MaterialTheme.typography.bodyLarge.scaled(scale), + list = MaterialTheme.typography.bodyLarge.scaled(scale), + table = MaterialTheme.typography.bodyLarge.scaled(scale), + textLink = TextLinkStyles( + style = MaterialTheme.typography.bodyLarge + .scaled(scale) + .copy( + fontWeight = FontWeight.Bold, + textDecoration = TextDecoration.Underline + ) + .toSpanStyle() + ) +) \ No newline at end of file