diff --git a/templates-api/src/main/java/com/itsaky/androidide/templates/base/base.kt b/templates-api/src/main/java/com/itsaky/androidide/templates/base/base.kt index 6996ebf1a..840cefa16 100644 --- a/templates-api/src/main/java/com/itsaky/androidide/templates/base/base.kt +++ b/templates-api/src/main/java/com/itsaky/androidide/templates/base/base.kt @@ -20,6 +20,7 @@ package com.itsaky.androidide.templates.base import com.itsaky.androidide.templates.CheckBoxWidget import com.itsaky.androidide.templates.FileTemplate import com.itsaky.androidide.templates.FileTemplateRecipeResult +import com.itsaky.androidide.templates.Language import com.itsaky.androidide.templates.ModuleTemplate import com.itsaky.androidide.templates.ModuleTemplateData import com.itsaky.androidide.templates.ModuleType @@ -33,6 +34,7 @@ import com.itsaky.androidide.templates.ProjectTemplate import com.itsaky.androidide.templates.ProjectTemplateData import com.itsaky.androidide.templates.ProjectVersionData import com.itsaky.androidide.templates.R +import com.itsaky.androidide.templates.Sdk import com.itsaky.androidide.templates.SpinnerWidget import com.itsaky.androidide.templates.TextFieldWidget import com.itsaky.androidide.templates.base.util.moduleNameToDir @@ -49,20 +51,25 @@ import java.io.File typealias AndroidModuleTemplateConfigurator = AndroidModuleTemplateBuilder.() -> Unit - /** * Setup base files for project templates. * * @param block Function to configure the template. */ -fun baseProject(block: ProjectTemplateBuilder.() -> Unit +fun baseProject(sdkFilter: ((Sdk) -> Boolean)? = null, + languageFilter: ((Language) -> Boolean)? = null, + block: ProjectTemplateBuilder.() -> Unit ): ProjectTemplate { return ProjectTemplateBuilder().apply { val projectName = projectNameParameter() - val language = projectLanguageParameter() - val minSdk = minSdkParameter() val packageName = packageNameParameter() val useKts = useKtsParameter() + val minSdk = minSdkParameter { + filter = sdkFilter + } + val language = projectLanguageParameter { + filter = languageFilter + } // When project name is changed, change the package name accordingly projectName.observe { name -> @@ -170,8 +177,8 @@ fun baseAndroidModule(isLibrary: Boolean = false, ModuleTemplateData(name = moduleName.value, appName = appName?.value, packageName = packageName.value, projectDir = requireProjectData().moduleNameToDir(moduleName.value), - type = type.value, language = language.value, - minSdk = minSdk.value, useKts = useKts.value) + type = type.value, language = language.value, minSdk = minSdk.value, + useKts = useKts.value) } postRecipe = commonPostRecipe() diff --git a/templates-api/src/main/java/com/itsaky/androidide/templates/parameters.kt b/templates-api/src/main/java/com/itsaky/androidide/templates/parameters.kt index 9756753e7..9d78b4ad6 100644 --- a/templates-api/src/main/java/com/itsaky/androidide/templates/parameters.kt +++ b/templates-api/src/main/java/com/itsaky/androidide/templates/parameters.kt @@ -253,19 +253,21 @@ class EnumParameter>(@StringRes name: Int, onStartIconClick: (() -> Unit)?, onEndIconClick: (() -> Unit)?, constraints: List, - val displayName: ((T) -> String)? = null + val displayName: ((T) -> String)? = null, + val filter: ((T) -> Boolean)? = null ) : TextFieldParameter(name, description, default, startIcon, endIcon, onStartIconClick, onEndIconClick, constraints) class EnumParameterBuilder> : TextFieldParameterBuilder() { var displayName: ((T) -> String)? = null + var filter: ((T) -> Boolean)? = null override fun build(): EnumParameter { return EnumParameter(name = name!!, description = description, default = default!!, startIcon = startIcon, endIcon = endIcon, onStartIconClick = onStartIconClick, onEndIconClick = onEndIconClick, - constraints = constraints, displayName = displayName) + constraints = constraints, displayName = displayName, filter = filter) } } diff --git a/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/TemplateWidgetViewProviderImpl.kt b/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/TemplateWidgetViewProviderImpl.kt index f4574e0a1..fd88eeae0 100644 --- a/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/TemplateWidgetViewProviderImpl.kt +++ b/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/TemplateWidgetViewProviderImpl.kt @@ -138,6 +138,12 @@ class TemplateWidgetViewProviderImpl : ITemplateWidgetViewProvider { val nameToEnum = mutableMapOf>() val enumToName = mutableMapOf, String>() param.default.javaClass.enumConstants?.forEach { + + // remove the elements for which the filter fails + if (param.filter?.invoke(it) == false) { + return@forEach + } + val displayName = param.displayName?.invoke(it) ?: it.name nameToEnum[displayName] = it enumToName[it] = displayName @@ -174,6 +180,14 @@ class TemplateWidgetViewProviderImpl : ITemplateWidgetViewProvider { } } + if (param.default != nameToEnum[defaultName]) { + // the default value may have been filtered + // reset the value to the first item + val first = checkNotNull( + nameToEnum.values.firstOrNull()) { "No entries available for enum parameter (all entries filtered out?)." } + param.setValue(first) + } + param.observe(observer) }.root } diff --git a/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/base.kt b/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/base.kt index c1b9b9e2c..13db85a83 100644 --- a/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/base.kt +++ b/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/base.kt @@ -17,7 +17,9 @@ package com.itsaky.androidide.templates.impl +import com.itsaky.androidide.templates.Language import com.itsaky.androidide.templates.ProjectTemplate +import com.itsaky.androidide.templates.Sdk import com.itsaky.androidide.templates.base.AndroidModuleTemplateBuilder import com.itsaky.androidide.templates.base.ProjectTemplateBuilder import com.itsaky.androidide.templates.base.baseProject @@ -43,8 +45,10 @@ internal fun AndroidModuleTemplateBuilder.templateAsset(name: String, return "templates/${name}/${path}" } -internal fun baseProjectImpl(block: ProjectTemplateBuilder.() -> Unit -): ProjectTemplate = baseProject { +internal fun baseProjectImpl(sdkFilter: ((Sdk) -> Boolean)? = null, + languageFilter: ((Language) -> Boolean)? = null, + block: ProjectTemplateBuilder.() -> Unit +): ProjectTemplate = baseProject(sdkFilter = sdkFilter, languageFilter = languageFilter) { block() // make sure we return a proper result