diff --git a/src/main/kotlin/CommitChanges.kt b/src/main/kotlin/CommitChanges.kt new file mode 100644 index 0000000..780d96c --- /dev/null +++ b/src/main/kotlin/CommitChanges.kt @@ -0,0 +1,176 @@ +import androidx.compose.foundation.* +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.* +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.ImageBitmap +import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.res.useResource +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import extensions.filePath +import extensions.icon +import extensions.md5 +import extensions.toByteArray +import kotlinx.coroutines.* +import org.eclipse.jgit.diff.DiffEntry +import org.eclipse.jgit.revwalk.RevCommit +import org.jetbrains.skija.Image.makeFromEncoded +import theme.backgroundColorLight +import theme.primaryTextColor +import java.net.HttpURLConnection +import java.net.URL + +@Composable +fun CommitChanges(commitDiff: Pair>, onDiffSelected: (DiffEntry) -> Unit) { + val commit = commitDiff.first + val diff = commitDiff.second + + Column( + modifier = Modifier + .fillMaxSize() + .background(MaterialTheme.colors.background), + ) { + Column( + modifier = Modifier + .padding(all = 8.dp) + .fillMaxWidth(), + ) { + val scroll = rememberScrollState(0) + Text( + text = commit.fullMessage, + modifier = Modifier + .padding(8.dp) + .fillMaxWidth() + .background(MaterialTheme.colors.surface) + .height(120.dp) + .verticalScroll(scroll), + + ) + + Card( + modifier = Modifier + .padding(horizontal = 8.dp, vertical = 8.dp) + .fillMaxWidth() + .height(72.dp) + ) { + Row( + modifier = Modifier + .fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically + ) { + val url = "https://www.gravatar.com/avatar/${commit.authorIdent.emailAddress.md5}" + Image( + bitmap = rememberNetworkImage(url), + modifier = Modifier + .padding(horizontal = 16.dp) + .height(40.dp) + .clip(CircleShape), + contentDescription = null, + ) + + Column( + modifier = Modifier + .fillMaxSize(), + verticalArrangement = Arrangement.Center + ) { + Text(commit.authorIdent.name) + } + } + + } + + + } + + + CommitLogChanges(diff, onDiffSelected = onDiffSelected) + } +} + +suspend fun loadImage(link: String): ByteArray = withContext(Dispatchers.IO) { + val url = URL(link) + val connection = url.openConnection() as HttpURLConnection + connection.connect() + + connection.inputStream.toByteArray() +} + +@Composable +fun rememberNetworkImage(url: String): ImageBitmap { + var image by remember(url) { + mutableStateOf( + useResource("image.jpg") { + makeFromEncoded(it.toByteArray()).asImageBitmap() + } + ) + } + + LaunchedEffect(url) { + loadImage(url).let { + image = makeFromEncoded(it).asImageBitmap() + } + } + + return image +} + +@Composable +fun CommitLogChanges(diffEntries: List, onDiffSelected: (DiffEntry) -> Unit) { + val selectedIndex = remember(diffEntries) { mutableStateOf(-1) } + + LazyColumn( + modifier = Modifier + .background(backgroundColorLight) + .fillMaxSize() + ) { + itemsIndexed(items = diffEntries) { index, diffEntry -> + val textColor = if (selectedIndex.value == index) { + MaterialTheme.colors.primary + } else + MaterialTheme.colors.primaryTextColor + + Column( + modifier = Modifier + .height(56.dp) + .fillMaxWidth() + .clickable { + selectedIndex.value = index + onDiffSelected(diffEntry) + }, + verticalArrangement = Arrangement.Center, + ) { + Spacer(modifier = Modifier.weight(2f)) + + + Row { + Icon( + modifier = Modifier + .padding(start = 16.dp) + .size(24.dp), + imageVector = diffEntry.icon, + contentDescription = null, + tint = MaterialTheme.colors.primary, + ) + + Text( + text = diffEntry.filePath, + modifier = Modifier.padding(horizontal = 16.dp), + color = textColor, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } + + Spacer(modifier = Modifier.weight(2f)) + + Divider() + } + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/RepositorySelected.kt b/src/main/kotlin/RepositorySelected.kt index d227e5f..b3a115e 100644 --- a/src/main/kotlin/RepositorySelected.kt +++ b/src/main/kotlin/RepositorySelected.kt @@ -13,10 +13,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import extensions.filePath -import extensions.icon import git.LogStatus import org.eclipse.jgit.api.Git import org.eclipse.jgit.diff.DiffEntry @@ -26,7 +24,7 @@ import org.eclipse.jgit.revwalk.RevTree import org.eclipse.jgit.revwalk.RevWalk import org.eclipse.jgit.treewalk.AbstractTreeIterator import org.eclipse.jgit.treewalk.CanonicalTreeParser -import theme.backgroundColor +import theme.backgroundColorLight import theme.primaryTextColor import theme.secondaryTextColor import java.io.IOException @@ -170,22 +168,6 @@ fun prepareTreeParser(repository: Repository, commit: RevCommit): AbstractTreeIt } } -@Composable -fun CommitChanges(commitDiff: Pair>, onDiffSelected: (DiffEntry) -> Unit) { - val commit = commitDiff.first - val diff = commitDiff.second - - Column( - modifier = Modifier - .fillMaxSize(), - ) { - Text(commit.fullMessage) - Text(commit.commitTime.toString()) - - CommitLogChanges(diff, onDiffSelected = onDiffSelected) - } -} - @Composable fun Log( gitManager: GitManager, @@ -207,7 +189,7 @@ fun Log( LazyColumn( modifier = Modifier - .background(backgroundColor) + .background(MaterialTheme.colors.surface) .fillMaxSize() ) { if (gitManager.hasUncommitedChanges()) @@ -282,59 +264,4 @@ fun Log( } } } -} - -@Composable -fun CommitLogChanges(diffEntries: List, onDiffSelected: (DiffEntry) -> Unit) { - val selectedIndex = remember(diffEntries) { mutableStateOf(-1) } - - LazyColumn( - modifier = Modifier - .background(backgroundColor) - .fillMaxSize() - ) { - itemsIndexed(items = diffEntries) { index, diffEntry -> - val textColor = if (selectedIndex.value == index) { - MaterialTheme.colors.primary - } else - MaterialTheme.colors.primaryTextColor - - Column( - modifier = Modifier - .height(56.dp) - .fillMaxWidth() - .clickable { - selectedIndex.value = index - onDiffSelected(diffEntry) - }, - verticalArrangement = Arrangement.Center, - ) { - Spacer(modifier = Modifier.weight(2f)) - - - Row { - Icon( - modifier = Modifier - .padding(start = 16.dp) - .size(24.dp), - imageVector = diffEntry.icon, - contentDescription = null, - tint = MaterialTheme.colors.primary, - ) - - Text( - text = diffEntry.filePath, - modifier = Modifier.padding(horizontal = 16.dp), - color = textColor, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - ) - } - - Spacer(modifier = Modifier.weight(2f)) - - Divider() - } - } - } -} +} \ No newline at end of file diff --git a/src/main/kotlin/extensions/InputStreamExtensions.kt b/src/main/kotlin/extensions/InputStreamExtensions.kt new file mode 100644 index 0000000..9619ba3 --- /dev/null +++ b/src/main/kotlin/extensions/InputStreamExtensions.kt @@ -0,0 +1,12 @@ +package extensions + +import java.io.ByteArrayOutputStream +import java.io.InputStream + +fun InputStream.toByteArray(): ByteArray { + val byteArrayOutputStream = ByteArrayOutputStream() + return byteArrayOutputStream.use { byteArrayOutStream -> + this.transferTo(byteArrayOutStream) + byteArrayOutStream.toByteArray() + } +} \ No newline at end of file diff --git a/src/main/kotlin/extensions/StringExtensions.kt b/src/main/kotlin/extensions/StringExtensions.kt new file mode 100644 index 0000000..97744db --- /dev/null +++ b/src/main/kotlin/extensions/StringExtensions.kt @@ -0,0 +1,10 @@ +package extensions + +import java.math.BigInteger +import java.security.MessageDigest + +val String.md5: String +get() { + val md = MessageDigest.getInstance("MD5") + return BigInteger(1, md.digest(this.toByteArray())).toString(16).padStart(32, '0') +} \ No newline at end of file diff --git a/src/main/kotlin/theme/Color.kt b/src/main/kotlin/theme/Color.kt index 6413910..1cff6a3 100644 --- a/src/main/kotlin/theme/Color.kt +++ b/src/main/kotlin/theme/Color.kt @@ -14,4 +14,6 @@ val errorColor = Color(0xFFFA4B4B) val primaryGrayLight = Color(0xFF464646) val accentGrayLight = Color(0xFFCCCCCC) -val backgroundColor = Color(0xFFf9f9f9) \ No newline at end of file +//val backgroundColorLight = Color(0xFFE8E8E8) +val backgroundColorLight = Color(0xFFC2C2C2) +val surfaceColorLight = Color(0xFFf9f9f9) \ No newline at end of file diff --git a/src/main/kotlin/theme/Theme.kt b/src/main/kotlin/theme/Theme.kt index 4fc08de..d1febd8 100644 --- a/src/main/kotlin/theme/Theme.kt +++ b/src/main/kotlin/theme/Theme.kt @@ -14,7 +14,8 @@ private val LightColorPalette = lightColors( primary = primary, primaryVariant = primaryDark, secondary = secondary, - background = backgroundColor, + background = backgroundColorLight, + surface = surfaceColorLight, error = errorColor /* Other default colors to override diff --git a/src/main/resources/image.jpg b/src/main/resources/image.jpg new file mode 100644 index 0000000..514f3f2 Binary files /dev/null and b/src/main/resources/image.jpg differ