diff --git a/components/generator/common/src/main/kotlin/io/github/composegears/valkyrie/generator/ext/CodeBlock.kt b/components/generator/common/src/main/kotlin/io/github/composegears/valkyrie/generator/ext/CodeBlock.kt index 467b7988..c0ae6f4d 100644 --- a/components/generator/common/src/main/kotlin/io/github/composegears/valkyrie/generator/ext/CodeBlock.kt +++ b/components/generator/common/src/main/kotlin/io/github/composegears/valkyrie/generator/ext/CodeBlock.kt @@ -27,3 +27,8 @@ fun CodeBlock.Builder.indention(block: CodeBlock.Builder.() -> Unit) { fun CodeBlock.Builder.newLine() { add("\n") } + +fun CodeBlock.Builder.trailingNewLine() { + add(",") + newLine() +} diff --git a/components/generator/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/imagevector/ImageVectorFileSpec.kt b/components/generator/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/imagevector/ImageVectorFileSpec.kt index 912f0824..95525433 100644 --- a/components/generator/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/imagevector/ImageVectorFileSpec.kt +++ b/components/generator/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/imagevector/ImageVectorFileSpec.kt @@ -15,6 +15,7 @@ internal data class ImageVectorSpecConfig( val generatePreview: Boolean, val useFlatPackage: Boolean, val useExplicitMode: Boolean, + val addTrailingComma: Boolean, ) internal class ImageVectorFileSpec(private val config: ImageVectorSpecConfig) { diff --git a/components/generator/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/imagevector/ImageVectorGenerator.kt b/components/generator/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/imagevector/ImageVectorGenerator.kt index 3080d453..61e0dc39 100644 --- a/components/generator/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/imagevector/ImageVectorGenerator.kt +++ b/components/generator/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/imagevector/ImageVectorGenerator.kt @@ -10,6 +10,7 @@ data class ImageVectorGeneratorConfig( val generatePreview: Boolean, val useFlatPackage: Boolean, val useExplicitMode: Boolean, + val addTrailingComma: Boolean, ) enum class OutputFormat(val key: String) { @@ -50,6 +51,7 @@ object ImageVectorGenerator { generatePreview = config.generatePreview, useFlatPackage = config.useFlatPackage, useExplicitMode = config.useExplicitMode, + addTrailingComma = config.addTrailingComma, ), ).createFileFor(vector) } diff --git a/components/generator/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/imagevector/spec/Common.kt b/components/generator/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/imagevector/spec/Common.kt index 1fec7b50..cedacb0a 100644 --- a/components/generator/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/imagevector/spec/Common.kt +++ b/components/generator/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/imagevector/spec/Common.kt @@ -46,8 +46,14 @@ internal fun CodeBlock.Builder.addImageVectorBlock( }, irVector = irVector, path = { - irVector.nodes.forEach { node -> addVectorNode(node) } + irVector.nodes.forEach { node -> + addVectorNode( + irVectorNode = node, + addTrailingComma = config.addTrailingComma, + ) + } }, + addTrailingComma = config.addTrailingComma, ), ) } @@ -73,17 +79,26 @@ internal fun FileSpec.Builder.addPreview( } } -private fun CodeBlock.Builder.addVectorNode(irVectorNode: IrVectorNode) { +private fun CodeBlock.Builder.addVectorNode( + irVectorNode: IrVectorNode, + addTrailingComma: Boolean, +) { when (irVectorNode) { is IrVectorNode.IrGroup -> { beginControlFlow("%M", MemberNames.Group) irVectorNode.paths.forEach { path -> - addVectorNode(path) + addVectorNode( + irVectorNode = path, + addTrailingComma = addTrailingComma, + ) } endControlFlow() } is IrVectorNode.IrPath -> { - addPath(irVectorNode) { + addPath( + path = irVectorNode, + addTrailingComma = addTrailingComma, + ) { irVectorNode.paths.forEach { pathNode -> // based on https://github.com/square/kotlinpoet/pull/1860#issuecomment-1986825382 addStatement("%L", pathNode.asStatement().replace(' ', 'ยท')) diff --git a/components/generator/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/imagevector/util/ImageVectorBuilderSpec.kt b/components/generator/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/imagevector/util/ImageVectorBuilderSpec.kt index 31ab4633..777ad21a 100644 --- a/components/generator/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/imagevector/util/ImageVectorBuilderSpec.kt +++ b/components/generator/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/imagevector/util/ImageVectorBuilderSpec.kt @@ -3,6 +3,8 @@ package io.github.composegears.valkyrie.generator.imagevector.util import com.squareup.kotlinpoet.CodeBlock import com.squareup.kotlinpoet.buildCodeBlock import io.github.composegears.valkyrie.generator.ext.formatFloat +import io.github.composegears.valkyrie.generator.ext.newLine +import io.github.composegears.valkyrie.generator.ext.trailingNewLine import io.github.composegears.valkyrie.generator.ext.trimTrailingZero import io.github.composegears.valkyrie.ir.IrImageVector @@ -10,6 +12,7 @@ internal fun imageVectorBuilderSpecs( iconName: String, irVector: IrImageVector, path: CodeBlock.Builder.() -> Unit, + addTrailingComma: Boolean, ): CodeBlock = buildCodeBlock { add("%T.Builder(\n", ClassNames.ImageVector) indent() @@ -17,7 +20,12 @@ internal fun imageVectorBuilderSpecs( add("defaultWidth = %L.%M,\n", irVector.defaultWidth.trimTrailingZero(), MemberNames.Dp) add("defaultHeight = %L.%M,\n", irVector.defaultHeight.trimTrailingZero(), MemberNames.Dp) add("viewportWidth = %L,\n", irVector.viewportWidth.formatFloat()) - add("viewportHeight = %L\n", irVector.viewportHeight.formatFloat()) + add("viewportHeight = %L", irVector.viewportHeight.formatFloat()) + if (addTrailingComma) { + trailingNewLine() + } else { + newLine() + } unindent() add(")") diff --git a/components/generator/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/imagevector/util/PathBuilder.kt b/components/generator/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/imagevector/util/PathBuilder.kt index 8eac4703..472e9bc8 100644 --- a/components/generator/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/imagevector/util/PathBuilder.kt +++ b/components/generator/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/imagevector/util/PathBuilder.kt @@ -8,6 +8,7 @@ import io.github.composegears.valkyrie.generator.ext.formatFloat import io.github.composegears.valkyrie.generator.ext.indention import io.github.composegears.valkyrie.generator.ext.newLine import io.github.composegears.valkyrie.generator.ext.toColorHex +import io.github.composegears.valkyrie.generator.ext.trailingNewLine import io.github.composegears.valkyrie.generator.imagevector.util.PathParams.FillAlphaParam import io.github.composegears.valkyrie.generator.imagevector.util.PathParams.FillParam import io.github.composegears.valkyrie.generator.imagevector.util.PathParams.PathFillTypeParam @@ -26,6 +27,7 @@ import io.github.composegears.valkyrie.ir.IrVectorNode internal fun CodeBlock.Builder.addPath( path: IrVectorNode.IrPath, + addTrailingComma: Boolean, pathBody: CodeBlock.Builder.() -> Unit, ) { val pathParams = path.buildPathParams() @@ -55,9 +57,13 @@ internal fun CodeBlock.Builder.addPath( pathParams.forEachIndexed { index, param -> fillPathArgs(param) if (index == pathParams.lastIndex) { - add("\n") + if (addTrailingComma) { + trailingNewLine() + } else { + newLine() + } } else { - add(",\n") + trailingNewLine() } } unindent() diff --git a/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/CustomPackageTest.kt b/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/CustomPackageTest.kt index ecaa7b74..03bfe603 100644 --- a/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/CustomPackageTest.kt +++ b/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/CustomPackageTest.kt @@ -3,6 +3,7 @@ package io.github.composegears.valkyrie.generator.imagevector import assertk.assertThat import assertk.assertions.isEqualTo import io.github.composegears.valkyrie.extensions.ResourceUtils.getResourcePath +import io.github.composegears.valkyrie.generator.imagevector.common.createConfig import io.github.composegears.valkyrie.generator.imagevector.common.toResourceText import io.github.composegears.valkyrie.parser.svgxml.SvgXmlParser import org.junit.jupiter.params.ParameterizedTest @@ -10,26 +11,6 @@ import org.junit.jupiter.params.provider.EnumSource class CustomPackageTest { - private fun createConfig( - packageName: String = "io.github.composegears.valkyrie.icons", - packName: String = "", - nestedPackName: String = "", - outputFormat: OutputFormat, - generatePreview: Boolean = false, - useFlatPackage: Boolean = true, - useExplicitMode: Boolean = false, - ): ImageVectorGeneratorConfig { - return ImageVectorGeneratorConfig( - packageName = packageName, - packName = packName, - nestedPackName = nestedPackName, - outputFormat = outputFormat, - generatePreview = generatePreview, - useFlatPackage = useFlatPackage, - useExplicitMode = useExplicitMode, - ) - } - @ParameterizedTest @EnumSource(value = OutputFormat::class) fun `flat package without icon pack`(outputFormat: OutputFormat) { @@ -38,7 +19,10 @@ class CustomPackageTest { val output = ImageVectorGenerator.convert( vector = parserOutput.vector, kotlinName = parserOutput.kotlinName, - config = createConfig(outputFormat = outputFormat), + config = createConfig( + outputFormat = outputFormat, + useFlatPackage = true, + ), ).content val expected = outputFormat.toResourceText( @@ -59,6 +43,7 @@ class CustomPackageTest { config = createConfig( packName = "ValkyrieIcons", outputFormat = outputFormat, + useFlatPackage = true, ), ).content @@ -81,6 +66,7 @@ class CustomPackageTest { packName = "ValkyrieIcons", nestedPackName = "Filled", outputFormat = outputFormat, + useFlatPackage = true, ), ).content diff --git a/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/ExplicitModeTest.kt b/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/ExplicitModeTest.kt index a9ba26f1..38a1c2dd 100644 --- a/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/ExplicitModeTest.kt +++ b/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/ExplicitModeTest.kt @@ -3,6 +3,7 @@ package io.github.composegears.valkyrie.generator.imagevector import assertk.assertThat import assertk.assertions.isEqualTo import io.github.composegears.valkyrie.extensions.ResourceUtils.getResourcePath +import io.github.composegears.valkyrie.generator.imagevector.common.createConfig import io.github.composegears.valkyrie.generator.imagevector.common.toResourceText import io.github.composegears.valkyrie.parser.svgxml.SvgXmlParser import org.junit.jupiter.params.ParameterizedTest @@ -18,13 +19,8 @@ class ExplicitModeTest { val output = ImageVectorGenerator.convert( vector = parserOutput.vector, kotlinName = parserOutput.kotlinName, - config = ImageVectorGeneratorConfig( - packageName = "io.github.composegears.valkyrie.icons", - packName = "", - nestedPackName = "", + config = createConfig( outputFormat = outputFormat, - generatePreview = false, - useFlatPackage = false, useExplicitMode = true, ), ).content diff --git a/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/ImageVectorWithPreviewTest.kt b/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/ImageVectorWithPreviewTest.kt index d6033bdf..fb3e8420 100644 --- a/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/ImageVectorWithPreviewTest.kt +++ b/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/ImageVectorWithPreviewTest.kt @@ -3,6 +3,7 @@ package io.github.composegears.valkyrie.generator.imagevector import assertk.assertThat import assertk.assertions.isEqualTo import io.github.composegears.valkyrie.extensions.ResourceUtils.getResourcePath +import io.github.composegears.valkyrie.generator.imagevector.common.createConfig import io.github.composegears.valkyrie.generator.imagevector.common.toResourceText import io.github.composegears.valkyrie.parser.svgxml.SvgXmlParser import org.junit.jupiter.params.ParameterizedTest @@ -10,25 +11,6 @@ import org.junit.jupiter.params.provider.EnumSource class ImageVectorWithPreviewTest { - private fun createConfig( - packName: String = "", - nestedPackName: String = "", - outputFormat: OutputFormat, - generatePreview: Boolean = true, - useFlatPackage: Boolean = false, - useExplicitMode: Boolean = false, - ): ImageVectorGeneratorConfig { - return ImageVectorGeneratorConfig( - packageName = "io.github.composegears.valkyrie.icons", - packName = packName, - nestedPackName = nestedPackName, - outputFormat = outputFormat, - generatePreview = generatePreview, - useFlatPackage = useFlatPackage, - useExplicitMode = useExplicitMode, - ) - } - @ParameterizedTest @EnumSource(value = OutputFormat::class) fun `preview generation without icon pack`(outputFormat: OutputFormat) { @@ -37,7 +19,10 @@ class ImageVectorWithPreviewTest { val output = ImageVectorGenerator.convert( vector = parserOutput.vector, kotlinName = parserOutput.kotlinName, - config = createConfig(outputFormat = outputFormat), + config = createConfig( + outputFormat = outputFormat, + generatePreview = true, + ), ).content val expected = outputFormat.toResourceText( @@ -58,6 +43,7 @@ class ImageVectorWithPreviewTest { config = createConfig( packName = "ValkyrieIcons", outputFormat = outputFormat, + generatePreview = true, ), ).content @@ -80,6 +66,7 @@ class ImageVectorWithPreviewTest { packName = "ValkyrieIcons", nestedPackName = "Filled", outputFormat = outputFormat, + generatePreview = true, ), ).content diff --git a/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/SvgWithGradientToImageVectorTest.kt b/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/SvgWithGradientToImageVectorTest.kt index 134d6304..5c5fb0a8 100644 --- a/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/SvgWithGradientToImageVectorTest.kt +++ b/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/SvgWithGradientToImageVectorTest.kt @@ -3,6 +3,7 @@ package io.github.composegears.valkyrie.generator.imagevector import assertk.assertThat import assertk.assertions.isEqualTo import io.github.composegears.valkyrie.extensions.ResourceUtils.getResourcePath +import io.github.composegears.valkyrie.generator.imagevector.common.createConfig import io.github.composegears.valkyrie.generator.imagevector.common.toResourceText import io.github.composegears.valkyrie.parser.svgxml.SvgXmlParser import org.junit.jupiter.params.ParameterizedTest @@ -10,25 +11,6 @@ import org.junit.jupiter.params.provider.EnumSource class SvgWithGradientToImageVectorTest { - private fun createConfig( - packName: String = "", - nestedPackName: String = "", - outputFormat: OutputFormat, - generatePreview: Boolean = false, - useFlatPackage: Boolean = false, - useExplicitMode: Boolean = false, - ): ImageVectorGeneratorConfig { - return ImageVectorGeneratorConfig( - packageName = "io.github.composegears.valkyrie.icons", - packName = packName, - nestedPackName = nestedPackName, - outputFormat = outputFormat, - generatePreview = generatePreview, - useFlatPackage = useFlatPackage, - useExplicitMode = useExplicitMode, - ) - } - @ParameterizedTest @EnumSource(value = OutputFormat::class) fun `svg linear gradient parsing`(outputFormat: OutputFormat) { diff --git a/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/TrailingCommaTest.kt b/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/TrailingCommaTest.kt new file mode 100644 index 00000000..95d7e927 --- /dev/null +++ b/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/TrailingCommaTest.kt @@ -0,0 +1,35 @@ +package io.github.composegears.valkyrie.generator.imagevector + +import assertk.assertThat +import assertk.assertions.isEqualTo +import io.github.composegears.valkyrie.extensions.ResourceUtils.getResourcePath +import io.github.composegears.valkyrie.generator.imagevector.common.createConfig +import io.github.composegears.valkyrie.generator.imagevector.common.toResourceText +import io.github.composegears.valkyrie.parser.svgxml.SvgXmlParser +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.EnumSource + +class TrailingCommaTest { + + @ParameterizedTest + @EnumSource(value = OutputFormat::class) + fun `icon with path and solid color`(outputFormat: OutputFormat) { + val icon = getResourcePath("xml/ic_fill_color_stroke.xml") + val parserOutput = SvgXmlParser.toIrImageVector(icon) + val output = ImageVectorGenerator.convert( + vector = parserOutput.vector, + kotlinName = parserOutput.kotlinName, + config = createConfig( + packName = "ValkyrieIcons", + outputFormat = outputFormat, + addTrailingComma = true, + ), + ).content + + val expected = outputFormat.toResourceText( + pathToBackingProperty = "kt/backing/FillColorStroke.trailing.kt", + pathToLazyProperty = "kt/lazy/FillColorStroke.trailing.kt", + ) + assertThat(output).isEqualTo(expected) + } +} diff --git a/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/XmlToImageVectorTest.kt b/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/XmlToImageVectorTest.kt index 5ed64251..52fc6dbb 100644 --- a/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/XmlToImageVectorTest.kt +++ b/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/XmlToImageVectorTest.kt @@ -3,6 +3,7 @@ package io.github.composegears.valkyrie.generator.imagevector import assertk.assertThat import assertk.assertions.isEqualTo import io.github.composegears.valkyrie.extensions.ResourceUtils.getResourcePath +import io.github.composegears.valkyrie.generator.imagevector.common.createConfig import io.github.composegears.valkyrie.generator.imagevector.common.toResourceText import io.github.composegears.valkyrie.parser.svgxml.SvgXmlParser import org.junit.jupiter.params.ParameterizedTest @@ -10,25 +11,6 @@ import org.junit.jupiter.params.provider.EnumSource class XmlToImageVectorTest { - private fun createConfig( - packName: String = "", - nestedPackName: String = "", - outputFormat: OutputFormat, - generatePreview: Boolean = false, - useFlatPackage: Boolean = false, - useExplicitMode: Boolean = false, - ): ImageVectorGeneratorConfig { - return ImageVectorGeneratorConfig( - packageName = "io.github.composegears.valkyrie.icons", - packName = packName, - nestedPackName = nestedPackName, - outputFormat = outputFormat, - generatePreview = generatePreview, - useFlatPackage = useFlatPackage, - useExplicitMode = useExplicitMode, - ) - } - @ParameterizedTest @EnumSource(value = OutputFormat::class) fun `generation without icon pack`(outputFormat: OutputFormat) { diff --git a/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/common/TestImageVectorConfig.kt b/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/common/TestImageVectorConfig.kt new file mode 100644 index 00000000..f0fb62f8 --- /dev/null +++ b/components/generator/imagevector/src/test/kotlin/io/github/composegears/valkyrie/generator/imagevector/common/TestImageVectorConfig.kt @@ -0,0 +1,25 @@ +package io.github.composegears.valkyrie.generator.imagevector.common + +import io.github.composegears.valkyrie.generator.imagevector.ImageVectorGeneratorConfig +import io.github.composegears.valkyrie.generator.imagevector.OutputFormat + +internal fun createConfig( + packName: String = "", + nestedPackName: String = "", + outputFormat: OutputFormat, + generatePreview: Boolean = false, + useFlatPackage: Boolean = false, + useExplicitMode: Boolean = false, + addTrailingComma: Boolean = false, +): ImageVectorGeneratorConfig { + return ImageVectorGeneratorConfig( + packageName = "io.github.composegears.valkyrie.icons", + packName = packName, + nestedPackName = nestedPackName, + outputFormat = outputFormat, + generatePreview = generatePreview, + useFlatPackage = useFlatPackage, + useExplicitMode = useExplicitMode, + addTrailingComma = addTrailingComma, + ) +} diff --git a/components/generator/imagevector/src/test/resources/kt/backing/FillColorStroke.trailing.kt b/components/generator/imagevector/src/test/resources/kt/backing/FillColorStroke.trailing.kt new file mode 100644 index 00000000..3e5747f4 --- /dev/null +++ b/components/generator/imagevector/src/test/resources/kt/backing/FillColorStroke.trailing.kt @@ -0,0 +1,41 @@ +package io.github.composegears.valkyrie.icons + +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.path +import androidx.compose.ui.unit.dp +import kotlin.Suppress + +val ValkyrieIcons.FillColorStroke: ImageVector + get() { + if (_FillColorStroke != null) { + return _FillColorStroke!! + } + _FillColorStroke = ImageVector.Builder( + name = "FillColorStroke", + defaultWidth = 24.dp, + defaultHeight = 24.dp, + viewportWidth = 18f, + viewportHeight = 18f, + ).apply { + path( + fill = SolidColor(Color(0xFF232F34)), + strokeLineWidth = 1f, + ) { + moveTo(6.75f, 12.127f) + lineTo(3.623f, 9f) + lineTo(2.558f, 10.057f) + lineTo(6.75f, 14.25f) + lineTo(15.75f, 5.25f) + lineTo(14.693f, 4.192f) + lineTo(6.75f, 12.127f) + close() + } + }.build() + + return _FillColorStroke!! + } + +@Suppress("ObjectPropertyName") +private var _FillColorStroke: ImageVector? = null diff --git a/components/generator/imagevector/src/test/resources/kt/lazy/FillColorStroke.trailing.kt b/components/generator/imagevector/src/test/resources/kt/lazy/FillColorStroke.trailing.kt new file mode 100644 index 00000000..ecc4839d --- /dev/null +++ b/components/generator/imagevector/src/test/resources/kt/lazy/FillColorStroke.trailing.kt @@ -0,0 +1,31 @@ +package io.github.composegears.valkyrie.icons + +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.path +import androidx.compose.ui.unit.dp + +val ValkyrieIcons.FillColorStroke: ImageVector by lazy(LazyThreadSafetyMode.NONE) { + ImageVector.Builder( + name = "FillColorStroke", + defaultWidth = 24.dp, + defaultHeight = 24.dp, + viewportWidth = 18f, + viewportHeight = 18f, + ).apply { + path( + fill = SolidColor(Color(0xFF232F34)), + strokeLineWidth = 1f, + ) { + moveTo(6.75f, 12.127f) + lineTo(3.623f, 9f) + lineTo(2.558f, 10.057f) + lineTo(6.75f, 14.25f) + lineTo(15.75f, 5.25f) + lineTo(14.693f, 4.192f) + lineTo(6.75f, 12.127f) + close() + } + }.build() +} diff --git a/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/service/PersistentSettings.kt b/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/service/PersistentSettings.kt index 0d7677bb..935b1484 100644 --- a/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/service/PersistentSettings.kt +++ b/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/service/PersistentSettings.kt @@ -38,6 +38,7 @@ class PersistentSettings : SimplePersistentStateComponent(Valkyri var outputFormat: String? by string() var flatPackage: Boolean by property(false) var useExplicitMode: Boolean by property(false) + var addTrailingComma: Boolean by property(false) var showImageVectorPreview: Boolean by property(true) } diff --git a/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/settings/InMemorySettings.kt b/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/settings/InMemorySettings.kt index b32f8e4f..dfb8ef91 100644 --- a/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/settings/InMemorySettings.kt +++ b/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/settings/InMemorySettings.kt @@ -43,6 +43,7 @@ class InMemorySettings(project: Project) { generatePreview = false flatPackage = false useExplicitMode = false + addTrailingComma = false showImageVectorPreview = true } @@ -66,6 +67,7 @@ class InMemorySettings(project: Project) { generatePreview = generatePreview, flatPackage = flatPackage, useExplicitMode = useExplicitMode, + addTrailingComma = addTrailingComma, showImageVectorPreview = showImageVectorPreview, ) @@ -84,6 +86,7 @@ data class ValkyriesSettings( val generatePreview: Boolean, val flatPackage: Boolean, val useExplicitMode: Boolean, + val addTrailingComma: Boolean, val showImageVectorPreview: Boolean, ) diff --git a/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/mode/iconpack/conversion/IconPackConversionViewModel.kt b/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/mode/iconpack/conversion/IconPackConversionViewModel.kt index c37ac134..bdf9c162 100644 --- a/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/mode/iconpack/conversion/IconPackConversionViewModel.kt +++ b/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/mode/iconpack/conversion/IconPackConversionViewModel.kt @@ -133,6 +133,7 @@ class IconPackConversionViewModel( generatePreview = settings.generatePreview, useFlatPackage = settings.flatPackage, useExplicitMode = settings.useExplicitMode, + addTrailingComma = settings.addTrailingComma, ), ) }.getOrDefault(ImageVectorSpecOutput.empty) @@ -169,6 +170,7 @@ class IconPackConversionViewModel( generatePreview = settings.generatePreview, useFlatPackage = settings.flatPackage, useExplicitMode = settings.useExplicitMode, + addTrailingComma = settings.addTrailingComma, ), ) @@ -194,6 +196,7 @@ class IconPackConversionViewModel( generatePreview = settings.generatePreview, useFlatPackage = settings.flatPackage, useExplicitMode = settings.useExplicitMode, + addTrailingComma = settings.addTrailingComma, ), ) diff --git a/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/mode/simple/conversion/SimpleConversionViewModel.kt b/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/mode/simple/conversion/SimpleConversionViewModel.kt index 702e7753..a219a8fc 100644 --- a/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/mode/simple/conversion/SimpleConversionViewModel.kt +++ b/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/mode/simple/conversion/SimpleConversionViewModel.kt @@ -42,6 +42,7 @@ class SimpleConversionViewModel(inMemorySettings: InMemorySettings) : TiamatView generatePreview = valkyriesSettings.generatePreview, useFlatPackage = false, useExplicitMode = valkyriesSettings.useExplicitMode, + addTrailingComma = valkyriesSettings.addTrailingComma, ), ).content }.getOrElse { diff --git a/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/settings/SettingsViewModel.kt b/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/settings/SettingsViewModel.kt index 16ce23dc..9d3b11bc 100644 --- a/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/settings/SettingsViewModel.kt +++ b/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/settings/SettingsViewModel.kt @@ -6,6 +6,7 @@ import io.github.composegears.valkyrie.settings.updateMode import io.github.composegears.valkyrie.settings.updateOutputFormat import io.github.composegears.valkyrie.ui.domain.model.Mode.Unspecified import io.github.composegears.valkyrie.ui.screen.settings.model.SettingsAction +import io.github.composegears.valkyrie.ui.screen.settings.model.SettingsAction.UpdateAddTrailingComma import io.github.composegears.valkyrie.ui.screen.settings.model.SettingsAction.UpdateExplicitMode import io.github.composegears.valkyrie.ui.screen.settings.model.SettingsAction.UpdateFlatPackage import io.github.composegears.valkyrie.ui.screen.settings.model.SettingsAction.UpdateImageVectorPreview @@ -25,6 +26,7 @@ class SettingsViewModel( is UpdateImageVectorPreview -> showImageVectorPreview = settingsAction.enabled is UpdateFlatPackage -> flatPackage = settingsAction.useFlatPackage is UpdateExplicitMode -> useExplicitMode = settingsAction.useExplicitMode + is UpdateAddTrailingComma -> addTrailingComma = settingsAction.addTrailingComma } } diff --git a/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/settings/model/SettingsAction.kt b/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/settings/model/SettingsAction.kt index c6e482a3..260467b0 100644 --- a/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/settings/model/SettingsAction.kt +++ b/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/settings/model/SettingsAction.kt @@ -7,5 +7,6 @@ sealed interface SettingsAction { data class UpdatePreviewGeneration(val generate: Boolean) : SettingsAction data class UpdateFlatPackage(val useFlatPackage: Boolean) : SettingsAction data class UpdateExplicitMode(val useExplicitMode: Boolean) : SettingsAction + data class UpdateAddTrailingComma(val addTrailingComma: Boolean) : SettingsAction data class UpdateImageVectorPreview(val enabled: Boolean) : SettingsAction } diff --git a/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/settings/tabs/GeneralSettingsScreen.kt b/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/settings/tabs/GeneralSettingsScreen.kt index 0b7a88be..32e71fe4 100644 --- a/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/settings/tabs/GeneralSettingsScreen.kt +++ b/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/settings/tabs/GeneralSettingsScreen.kt @@ -260,6 +260,7 @@ private fun GeneralSettingsPreview() = PreviewTheme(alignment = Alignment.TopSta flatPackage = false, useExplicitMode = false, showImageVectorPreview = true, + addTrailingComma = true, ), onChangeMode = {}, onClearSettings = {}, diff --git a/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/settings/tabs/export/ImageVectorExportSettingsScreen.kt b/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/settings/tabs/export/ImageVectorExportSettingsScreen.kt index 786d17ba..94b5a27b 100644 --- a/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/settings/tabs/export/ImageVectorExportSettingsScreen.kt +++ b/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/settings/tabs/export/ImageVectorExportSettingsScreen.kt @@ -29,6 +29,7 @@ import io.github.composegears.valkyrie.ui.foundation.dim import io.github.composegears.valkyrie.ui.foundation.theme.PreviewTheme import io.github.composegears.valkyrie.ui.screen.settings.SettingsViewModel import io.github.composegears.valkyrie.ui.screen.settings.model.SettingsAction +import io.github.composegears.valkyrie.ui.screen.settings.model.SettingsAction.UpdateAddTrailingComma import io.github.composegears.valkyrie.ui.screen.settings.model.SettingsAction.UpdateExplicitMode import io.github.composegears.valkyrie.ui.screen.settings.model.SettingsAction.UpdateFlatPackage import io.github.composegears.valkyrie.ui.screen.settings.model.SettingsAction.UpdatePreviewGeneration @@ -43,6 +44,7 @@ val ImageVectorExportSettingsScreen by navDestination { generatePreview = settings.generatePreview, useFlatPackage = settings.flatPackage, useExplicitMode = settings.useExplicitMode, + addTrailingComma = settings.addTrailingComma, ) } @@ -52,6 +54,7 @@ private fun ImageVectorExportSettingsUi( generatePreview: Boolean, useFlatPackage: Boolean, useExplicitMode: Boolean, + addTrailingComma: Boolean, onAction: (SettingsAction) -> Unit, modifier: Modifier = Modifier, ) { @@ -78,6 +81,12 @@ private fun ImageVectorExportSettingsUi( checked = useExplicitMode, onCheckedChange = { onAction(UpdateExplicitMode(it)) }, ) + SwitchOption( + title = "Add trailing comma", + description = "Insert a comma after the last element of ImageVector.Builder block and path params", + checked = addTrailingComma, + onCheckedChange = { onAction(UpdateAddTrailingComma(it)) }, + ) SwitchOption( title = "Include @Preview block", description = "Note: Deprecated option, please consider to use build-in ImageVector preview feature", @@ -132,5 +141,6 @@ private fun ImageVectorExportSettingsPreview() = PreviewTheme(alignment = Alignm generatePreview = false, useFlatPackage = true, useExplicitMode = false, + addTrailingComma = false, ) }