Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion gradle/version-catalog/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ composeBom = "2025.02.00"
appcompat = "1.7.0"
material = "1.12.0"
composeMaterial = "1.7.8"
kvColorPalette = "2.1.1"
kvColorPalette = "3.2.0"

[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
Expand Down
2 changes: 1 addition & 1 deletion kv-color-picker/gradle.properties
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
kvColorPaletteGroupId=com.github.KvColorPalette
kvColorPickerArtifactId=KvColorPicker-Android
kvColorPickerVersion=2.1.0
kvColorPickerVersion=2.2.0
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ import com.kavi.droid.color.picker.ui.pickers.RGBAColorPicker
* RGBAColorPicker: This a color picker with RGB and Alpha values. Consumer can create their own color by changing
* RED, GREEN and BLUE values in a color.
*
* @param lastSelectedColor: Color: variable to pass last selected color.
* @param showSheet: MutableState<Boolean>: State variable to show and hide bottom sheet.
* @param sheetState: SheetState: State variable to control the bottom sheet.
* @param onColorSelected: (selectedColor: Color) -> Unit: Callback to invoke when a color is selected.
Expand All @@ -55,16 +56,21 @@ import com.kavi.droid.color.picker.ui.pickers.RGBAColorPicker
*/
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun KvColorPickerBottomSheet(showSheet: MutableState<Boolean>, sheetState: SheetState, onColorSelected: (selectedColor: Color) -> Unit) {
fun KvColorPickerBottomSheet(
lastSelectedColor: Color = Color.White,
showSheet: MutableState<Boolean>,
sheetState: SheetState,
onColorSelected: (selectedColor: Color) -> Unit) {
ModalBottomSheet (
onDismissRequest = {
showSheet.value = false
},
sheetState = sheetState,
containerColor = MaterialTheme.colorScheme.background
containerColor = MaterialTheme.colorScheme.background,
scrimColor = MaterialTheme.colorScheme.onSurface.copy(alpha = .5f)
) {
Column {
var selectedColor by remember { mutableStateOf(Color.Black) }
var selectedColor by remember { mutableStateOf(lastSelectedColor) }
val colorHex = remember { mutableStateOf(TextFieldValue("#000000")) }
var tabIndex by remember { mutableIntStateOf(0) }
val tabs = listOf(
Expand Down Expand Up @@ -114,20 +120,23 @@ fun KvColorPickerBottomSheet(showSheet: MutableState<Boolean>, sheetState: Sheet
when(tabIndex) {
0 -> RGBAColorPicker(
modifier = Modifier.padding(16.dp),
lastSelectedColor = selectedColor,
onColorSelected = {
selectedColor = it
colorHex.value = TextFieldValue(ColorUtil.getHex(it))
}
)
1 -> GridColorPicker(
modifier = Modifier.padding(16.dp),
lastSelectedColor = selectedColor,
onColorSelected = {
selectedColor = it
colorHex.value = TextFieldValue(ColorUtil.getHex(it))
}
)
2 -> HSLAColorPicker(
modifier = Modifier.padding(16.dp),
lastSelectedColor = selectedColor,
onColorSelected = {
selectedColor = it
colorHex.value = TextFieldValue(ColorUtil.getHex(it))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.kavi.droid.color.palette.KvColorPalette
Expand Down Expand Up @@ -307,24 +308,35 @@ internal fun SelectedColorDetail(color: Color, colorHex: MutableState<TextFieldV
* @param onSelect: (color: Color) -> Unit: Callback to invoke when a color is selected.
*/
@Composable
internal fun ColorColum(givenColor: KvColor, selectedColor: Color, onSelect: (color: Color) -> Unit) {
internal fun ColorColum(
boxSize: Dp,
givenColor: KvColor,
selectedColor: Color,
onSelect: (color: Color) -> Unit
) {
val colors = KvColorPalette.instance.generateColorPalette(givenColor = givenColor)
Column {
colors.forEach {
ColorBox(givenColor = it, selectedColor = selectedColor, onSelect = onSelect)
ColorBox(
boxSize = boxSize,
givenColor = it,
selectedColor = selectedColor,
onSelect = onSelect
)
}
}
}

/**
* A composable function that displays a single color box.
*
* @param boxSize: Dp: Size of the color box.
* @param givenColor: Color: The color to display.
* @param selectedColor: Color: The selected color to highlight.
* @param onSelect: (color: Color) -> Unit: Callback to invoke when a color is selected.
*/
@Composable
internal fun ColorBox(givenColor: Color, selectedColor: Color?, onSelect: (color: Color) -> Unit) {
internal fun ColorBox(boxSize: Dp = 24.dp, givenColor: Color, selectedColor: Color?, onSelect: (color: Color) -> Unit) {
var isSelected by remember { mutableStateOf(false) }

selectedColor?.let {
Expand All @@ -333,8 +345,8 @@ internal fun ColorBox(givenColor: Color, selectedColor: Color?, onSelect: (color

Box(
modifier = Modifier
.width(24.dp)
.height(24.dp)
.width(boxSize)
.height(boxSize)
.background(givenColor, RectangleShape)
.clickable {
isSelected = true
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.kavi.droid.color.picker.ui.pickers

import android.annotation.SuppressLint
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
Expand Down Expand Up @@ -35,15 +37,21 @@ import com.kavi.droid.color.picker.ui.common.ColorColum
* 16 predefined major colors and those color's 10 color variances.
*
* @param modifier: Modifier: The modifier to apply to this layout.
* @param lastSelectedColor: Color: variable to pass last selected color.
* @param onColorSelected: (selectedColor: Color) -> Unit: Callback to invoke when a color is selected.
*
* @return @Composable: A grid UI to select colors.
*/
@SuppressLint("UnusedBoxWithConstraintsScope")
@Composable
fun GridColorPicker(modifier: Modifier = Modifier, onColorSelected: (selectedColor: Color) -> Unit) {
fun GridColorPicker(
modifier: Modifier = Modifier,
lastSelectedColor: Color = Color.White,
onColorSelected: (selectedColor: Color) -> Unit
) {

var selectedColor by remember { mutableStateOf(Color.White) }
val colorHex = remember { mutableStateOf(TextFieldValue("#ffffff")) }
var selectedColor by remember { mutableStateOf(lastSelectedColor) }
val colorHex = remember { mutableStateOf(TextFieldValue(ColorUtil.getHex(lastSelectedColor))) }

val onSelectColor: (color: Color) -> Unit = {
selectedColor = it
Expand Down Expand Up @@ -76,88 +84,108 @@ fun GridColorPicker(modifier: Modifier = Modifier, onColorSelected: (selectedCol
fontSize = 12.sp
)

Row(
modifier = Modifier
.fillMaxWidth()
.padding(top = 16.dp, start = 4.dp, end = 4.dp, bottom = 12.dp),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Center
) {
ColorColum(
givenColor = MatPackage.MatRed,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
givenColor = MatPackage.MatRose,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
givenColor = MatPackage.MatLPurple,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
givenColor = MatPackage.MatDPurple,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
givenColor = MatPackage.MatDBlue,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
givenColor = MatPackage.MatLBlue,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
givenColor = MatPackage.MatLLBlue,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
givenColor = MatPackage.MatLCyan,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
givenColor = MatPackage.MatDCyan,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
givenColor = MatPackage.MatDGreen,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
givenColor = MatPackage.MatLGreen,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
givenColor = MatPackage.MatLLGreen,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
givenColor = MatPackage.MatYellow,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
givenColor = MatPackage.MatGold,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
givenColor = MatPackage.MatOrange,
selectedColor = selectedColor,
onSelect = onSelectColor
)
BoxWithConstraints {
val screenWidth = maxWidth
val boxSize = screenWidth * .065f

Row(
modifier = Modifier
.fillMaxWidth()
.padding(top = 16.dp, start = 4.dp, end = 4.dp, bottom = 12.dp),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Center
) {
ColorColum(
boxSize = boxSize,
givenColor = MatPackage.MatRed,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
boxSize = boxSize,
givenColor = MatPackage.MatRose,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
boxSize = boxSize,
givenColor = MatPackage.MatLPurple,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
boxSize = boxSize,
givenColor = MatPackage.MatDPurple,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
boxSize = boxSize,
givenColor = MatPackage.MatDBlue,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
boxSize = boxSize,
givenColor = MatPackage.MatLBlue,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
boxSize = boxSize,
givenColor = MatPackage.MatLLBlue,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
boxSize = boxSize,
givenColor = MatPackage.MatLCyan,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
boxSize = boxSize,
givenColor = MatPackage.MatDCyan,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
boxSize = boxSize,
givenColor = MatPackage.MatDGreen,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
boxSize = boxSize,
givenColor = MatPackage.MatLGreen,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
boxSize = boxSize,
givenColor = MatPackage.MatLLGreen,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
boxSize = boxSize,
givenColor = MatPackage.MatYellow,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
boxSize = boxSize,
givenColor = MatPackage.MatGold,
selectedColor = selectedColor,
onSelect = onSelectColor
)
ColorColum(
boxSize = boxSize,
givenColor = MatPackage.MatOrange,
selectedColor = selectedColor,
onSelect = onSelectColor
)
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,18 +40,22 @@ import com.kavi.droid.color.picker.ui.common.SliderHue
* By adjusting these values, consumer can select or generate their desired color.
*
* @param modifier: Modifier: The modifier to apply to this layout.
* @param lastSelectedColor: Color: variable to pass last selected color.
* @param onColorSelected: (selectedColor: Color) -> Unit: Callback to invoke when a color is selected.
*
* @return @Composable: A color picker UI for selecting HSL-A colors.
*/
@Composable
fun HSLAColorPicker(modifier: Modifier = Modifier, onColorSelected: (selectedColor: Color) -> Unit) {

fun HSLAColorPicker(
modifier: Modifier = Modifier,
lastSelectedColor: Color = Color.White,
onColorSelected: (selectedColor: Color) -> Unit
) {
// State variables for HSL-A values
val hue = rememberSaveable { mutableFloatStateOf(0f) }
val saturation = rememberSaveable { mutableFloatStateOf(0f) }
val lightness = rememberSaveable { mutableFloatStateOf(0.5f) }
val alpha = rememberSaveable { mutableFloatStateOf(1f) }
val hue = rememberSaveable { mutableFloatStateOf(lastSelectedColor.hsl.hue) }
val saturation = rememberSaveable { mutableFloatStateOf(lastSelectedColor.hsl.saturation) }
val lightness = rememberSaveable { mutableFloatStateOf(lastSelectedColor.hsl.lightness) }
val alpha = rememberSaveable { mutableFloatStateOf(lastSelectedColor.alpha) }

val colorHex = remember { mutableStateOf(TextFieldValue("")) }

Expand Down
Loading