@@ -12,6 +12,7 @@ import androidx.compose.runtime.*
1212import androidx.compose.ui.Alignment
1313import androidx.compose.ui.Modifier
1414import androidx.compose.ui.draw.clip
15+ import androidx.compose.ui.geometry.Offset
1516import androidx.compose.ui.geometry.Size
1617import androidx.compose.ui.graphics.Brush
1718import androidx.compose.ui.graphics.Color
@@ -20,7 +21,7 @@ import androidx.compose.ui.platform.LocalDensity
2021import androidx.compose.ui.unit.DpSize
2122import androidx.compose.ui.unit.dp
2223import androidx.compose.ui.unit.sp
23- import com.smarttoolfactory.colorpicker.ui.GradientAngle
24+ import com.smarttoolfactory.colorpicker.model.GradientColor
2425import com.smarttoolfactory.colorpicker.ui.GradientOffset
2526import com.smarttoolfactory.colorpicker.ui.Grey800
2627import com.smarttoolfactory.colorpicker.ui.Orange400
@@ -47,9 +48,10 @@ internal val gradientTileModeOptions = listOf("Clamp", "Repeated", "Mirror", "De
4748fun GradientSelector (
4849 color : Color ,
4950 dpSize : DpSize ,
50- onGradientChange : ( Brush ) -> Unit
51+ gradientColor : GradientColor
5152) {
5253
54+
5355 val size = with (LocalDensity .current) {
5456 Size (
5557 dpSize.width.toPx(),
@@ -69,6 +71,7 @@ fun GradientSelector(
6971 else -> TileMode .Decal
7072 }
7173
74+
7275 // Color Stops
7376 val colorStops = remember {
7477 mutableStateListOf(
@@ -78,10 +81,11 @@ fun GradientSelector(
7881 )
7982 }
8083
81- // Offset for Linear Gradient
82- var gradientOffset by remember {
83- mutableStateOf(GradientOffset (GradientAngle .CW0 ))
84- }
84+ gradientColor.size = size
85+ gradientColor.gradientType = gradientType
86+ gradientColor.tileMode = tileMode
87+ gradientColor.colorStops = colorStops
88+
8589
8690 Column (
8791 modifier = Modifier
@@ -113,32 +117,25 @@ fun GradientSelector(
113117
114118 // Display Brush
115119 BrushDisplay (
116- gradientType = gradientType,
117- colorStops = colorStops,
118- gradientOffset = gradientOffset,
119120 size = size,
120- tileMode = tileMode
121- ) { brush: Brush ->
122- onGradientChange(brush)
123- }
121+ gradientColor = gradientColor
122+ )
124123
125124 // Gradient type selection
126125 when (gradientType) {
127- GradientType .Linear -> LinearGradientSelection (
128- size,
129- ) { offset: GradientOffset ->
130- gradientOffset = offset
131- }
132- GradientType .Radial -> RadialGradientSelection (
133- size,
134- ) { offset: GradientOffset ->
135- gradientOffset = offset
136- }
137- GradientType .Sweep -> SweepGradientSelection (
138- size,
139- ) { offset: GradientOffset ->
140- gradientOffset = offset
141- }
126+ GradientType .Linear ->
127+ LinearGradientSelection (size) { offset: GradientOffset ->
128+ gradientColor.gradientOffset = offset
129+ }
130+ GradientType .Radial ->
131+ RadialGradientSelection { centerFriction: Offset , radiusFriction: Float ->
132+ gradientColor.centerFriction = centerFriction
133+ gradientColor.radiusFriction = radiusFriction
134+ }
135+ GradientType .Sweep ->
136+ SweepGradientSelection { centerFriction: Offset ->
137+ gradientColor.centerFriction = centerFriction
138+ }
142139 }
143140
144141 // Color Stops and Colors
@@ -162,68 +159,141 @@ fun GradientSelector(
162159
163160@Composable
164161internal fun BrushDisplay (
165- gradientType : GradientType ,
166- colorStops : List <Pair <Float , Color >>,
167- gradientOffset : GradientOffset ,
168162 size : Size ,
169- tileMode : TileMode ,
170- onBrushChange : (Brush ) -> Unit
163+ gradientColor : GradientColor
171164) {
172- val brush = when (gradientType) {
173- GradientType .Linear -> {
174- if (colorStops.size == 1 ) {
175- val brushColor = colorStops.first().second
176- Brush .linearGradient(listOf (brushColor, brushColor))
177- } else {
178- Brush .linearGradient(
179- colorStops = colorStops.toTypedArray(),
180- start = gradientOffset.start,
181- end = gradientOffset.end,
182- tileMode = tileMode
183- )
184- }
185- }
186- GradientType .Radial -> {
187- Brush .radialGradient(
188- colorStops = colorStops.toTypedArray(),
189- center = gradientOffset.start,
190- radius = size.width
191- )
192- }
193-
194- GradientType .Sweep -> {
195- Brush .sweepGradient(
196- colorStops = colorStops.toTypedArray(),
197- center = gradientOffset.start
198- )
199- }
200-
201- }
202-
203- val contentWidth = size.width
204- val contentHeight = size.height
205-
206- onBrushChange(brush)
207-
208165 // Display Brush
209166 BoxWithConstraints (
210167 modifier = Modifier
211168 .fillMaxWidth()
212169 .height(150 .dp),
213170 contentAlignment = Alignment .Center
214171 ) {
172+
173+ val contentWidth = size.width
174+ val contentHeight = size.height
175+ val contentAspectRatio = contentWidth / contentHeight
176+
177+ val boxHeight = constraints.maxHeight
178+ val boxWidth = boxHeight * contentAspectRatio
179+ val gradientType = gradientColor.gradientType
180+ val colorStops = gradientColor.colorStops
181+ val gradientOffset = gradientColor.gradientOffset
182+ val tileMode = gradientColor.tileMode
183+ val centerFriction = gradientColor.centerFriction
184+ val radiusFriction = gradientColor.radiusFriction
185+
186+ val center = Offset (
187+ boxWidth * centerFriction.x,
188+ boxHeight * centerFriction.y
189+ )
190+
191+ val radius = boxHeight * radiusFriction
192+
193+ val brush = when (gradientType) {
194+ GradientType .Linear -> {
195+ if (colorStops.size == 1 ) {
196+ val brushColor = colorStops.first().second
197+ Brush .linearGradient(listOf (brushColor, brushColor))
198+ } else {
199+ Brush .linearGradient(
200+ colorStops = colorStops.toTypedArray(),
201+ start = gradientOffset.start,
202+ end = gradientOffset.end,
203+ tileMode = tileMode
204+ )
205+ }
206+ }
207+ GradientType .Radial -> {
208+ Brush .radialGradient(
209+ colorStops = colorStops.toTypedArray(),
210+ center = center,
211+ radius = radius
212+ )
213+ }
214+
215+ GradientType .Sweep -> {
216+ Brush .sweepGradient(
217+ colorStops = colorStops.toTypedArray(),
218+ center = center
219+ )
220+ }
221+ }
222+
215223 Box (
216224 modifier = Modifier
217225 .height(maxHeight)
218- .aspectRatio(contentWidth / contentHeight )
226+ .aspectRatio(contentAspectRatio )
219227 .background(brush)
220- ) {
221-
222- }
228+ )
223229 }
224230
225231}
226232
233+ // @Composable
234+ // internal fun BrushDisplay(
235+ // gradientType: GradientType,
236+ // colorStops: List<Pair<Float, Color>>,
237+ // gradientOffset: GradientOffset,
238+ // size: Size,
239+ // tileMode: TileMode,
240+ // onBrushChange: (Brush) -> Unit
241+ // ) {
242+ // val brush = when (gradientType) {
243+ // GradientType.Linear -> {
244+ // if (colorStops.size == 1) {
245+ // val brushColor = colorStops.first().second
246+ // Brush.linearGradient(listOf(brushColor, brushColor))
247+ // } else {
248+ // Brush.linearGradient(
249+ // colorStops = colorStops.toTypedArray(),
250+ // start = gradientOffset.start,
251+ // end = gradientOffset.end,
252+ // tileMode = tileMode
253+ // )
254+ // }
255+ // }
256+ // GradientType.Radial -> {
257+ // Brush.radialGradient(
258+ // colorStops = colorStops.toTypedArray(),
259+ // center = gradientOffset.start,
260+ // radius = size.width
261+ // )
262+ // }
263+ //
264+ // GradientType.Sweep -> {
265+ // Brush.sweepGradient(
266+ // colorStops = colorStops.toTypedArray(),
267+ // center = gradientOffset.start
268+ // )
269+ // }
270+ //
271+ // }
272+ //
273+ // val contentWidth = size.width
274+ // val contentHeight = size.height
275+ //
276+ // onBrushChange(brush)
277+ //
278+ // // Display Brush
279+ // BoxWithConstraints(
280+ // modifier = Modifier
281+ // .fillMaxWidth()
282+ // .height(150.dp),
283+ // contentAlignment = Alignment.Center
284+ // ) {
285+ // Box(
286+ // modifier = Modifier
287+ // .height(maxHeight)
288+ // .aspectRatio(contentWidth / contentHeight)
289+ // .background(brush)
290+ // ) {
291+ //
292+ // }
293+ // }
294+ //
295+ // }
296+
227297@Composable
228298internal fun ColorStopSelection (
229299 color : Color ,
0 commit comments