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 1af1a4ab8..8e4c60120 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 @@ -83,7 +83,7 @@ fun baseProject(sdkFilter: ((Sdk) -> Boolean)? = null, val saveLocation = stringParameter { name = R.string.wizard_save_location default = Environment.PROJECTS_DIR.absolutePath - endIcon = R.drawable.ic_folder + endIcon = { R.drawable.ic_folder } constraints = listOf(NONEMPTY, DIRECTORY, EXISTS) } @@ -162,7 +162,7 @@ fun baseAndroidModule(isLibrary: Boolean = false, val type = enumParameter { name = R.string.wizard_module_type default = AndroidLibrary - startIcon = R.drawable.ic_android + startIcon = { R.drawable.ic_android } displayName = ModuleType::typeName } 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 9d78b4ad6..caefc7d32 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 @@ -19,6 +19,7 @@ package com.itsaky.androidide.templates import androidx.annotation.StringRes import com.itsaky.androidide.templates.Language.Java +import com.itsaky.androidide.templates.Language.Kotlin import com.itsaky.androidide.templates.ParameterConstraint.NONEMPTY import com.itsaky.androidide.templates.ParameterConstraint.PACKAGE import com.itsaky.androidide.templates.R.string @@ -217,20 +218,24 @@ class BooleanParameterBuilder : ParameterBuilder() { */ abstract class TextFieldParameter(@StringRes name: Int, @StringRes description: Int?, default: T, - val startIcon: Int?, val endIcon: Int?, + val startIcon: ((TextFieldParameter) -> Int)?, + val endIcon: ((TextFieldParameter) -> Int)?, val onStartIconClick: (() -> Unit)?, val onEndIconClick: (() -> Unit)?, constraints: List ) : Parameter(name, description, default, constraints) -abstract class TextFieldParameterBuilder(var startIcon: Int? = null, - var endIcon: Int? = null, - var onStartIconClick: (() -> Unit)? = null, - var onEndIconClick: (() -> Unit)? = null +abstract class TextFieldParameterBuilder( + var startIcon: ((TextFieldParameter) -> Int)? = null, + var endIcon: ((TextFieldParameter) -> Int)? = null, + var onStartIconClick: (() -> Unit)? = null, + var onEndIconClick: (() -> Unit)? = null ) : ParameterBuilder() class StringParameter(@StringRes name: Int, @StringRes description: Int?, - default: String, startIcon: Int?, endIcon: Int?, + default: String, + startIcon: ((TextFieldParameter) -> Int)?, + endIcon: ((TextFieldParameter) -> Int)?, onStartIconClick: (() -> Unit)?, onEndIconClick: (() -> Unit)?, constraints: List @@ -249,7 +254,8 @@ class StringParameterBuilder : TextFieldParameterBuilder() { class EnumParameter>(@StringRes name: Int, @StringRes description: Int?, default: T, - startIcon: Int?, endIcon: Int?, + startIcon: ((TextFieldParameter) -> Int)?, + endIcon: ((TextFieldParameter) -> Int)?, onStartIconClick: (() -> Unit)?, onEndIconClick: (() -> Unit)?, constraints: List, @@ -290,7 +296,7 @@ fun projectNameParameter(configure: StringParameterBuilder.() -> Unit = {}) = stringParameter { name = string.project_app_name default = "My Application" - startIcon = R.drawable.ic_android + startIcon = { R.drawable.ic_android } constraints = listOf(NONEMPTY) configure() @@ -300,7 +306,7 @@ fun packageNameParameter(configure: StringParameterBuilder.() -> Unit = {}) = stringParameter { name = string.package_name default = "com.example.myapplication" - startIcon = R.drawable.ic_package + startIcon = { R.drawable.ic_package } constraints = listOf(NONEMPTY, PACKAGE) configure() @@ -312,7 +318,10 @@ fun projectLanguageParameter( name = string.wizard_language default = Java displayName = Language::lang - startIcon = R.drawable.ic_language_java + startIcon = { + if (it.value == Kotlin) R.drawable.ic_language_kotlin + else R.drawable.ic_language_java + } configure() } @@ -322,7 +331,7 @@ fun minSdkParameter(configure: EnumParameterBuilder.() -> Unit = {}) = name = string.minimum_sdk default = Sdk.Lollipop displayName = Sdk::displayName - startIcon = R.drawable.ic_min_sdk + startIcon = { R.drawable.ic_min_sdk } configure() } 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 fd88eeae0..7e2a9282e 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 @@ -113,6 +113,7 @@ class TemplateWidgetViewProviderImpl : ITemplateWidgetViewProvider { param.configureTextField(context, root) { value -> observer.disableAndRun { param.setValue(value) + param.resetStartAndEndIcons(root.context, root) } val err = @@ -174,12 +175,6 @@ class TemplateWidgetViewProviderImpl : ITemplateWidgetViewProvider { } } - param.configureTextField(context, root) { - observer.disableAndRun { - param.setValue(nameToEnum[it] ?: param.default) - } - } - if (param.default != nameToEnum[defaultName]) { // the default value may have been filtered // reset the value to the first item @@ -188,6 +183,13 @@ class TemplateWidgetViewProviderImpl : ITemplateWidgetViewProvider { param.setValue(first) } + param.configureTextField(context, root) { + observer.disableAndRun { + param.setValue(nameToEnum[it] ?: param.default) + param.resetStartAndEndIcons(root.context, root) + } + } + param.observe(observer) }.root } @@ -197,21 +199,7 @@ class TemplateWidgetViewProviderImpl : ITemplateWidgetViewProvider { onTextChanged: (String) -> Unit = {} ) { root.setHint(name) - - startIcon?.let { - root.startIconDrawable = ContextCompat.getDrawable(context, it) - onStartIconClick?.let { onClick -> - root.setStartIconOnClickListener { onClick() } - } - } - - endIcon?.let { - root.endIconDrawable = ContextCompat.getDrawable(context, it) - onEndIconClick?.let { onClick -> - root.setEndIconOnClickListener { onClick() } - } - } - + resetStartAndEndIcons(context, root) root.editText!!.addTextChangedListener(object : SingleTextWatcher() { override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int @@ -220,4 +208,22 @@ class TemplateWidgetViewProviderImpl : ITemplateWidgetViewProvider { } }) } + + private fun TextFieldParameter.resetStartAndEndIcons(context: Context, + root: TextInputLayout + ) { + startIcon?.let { + root.startIconDrawable = ContextCompat.getDrawable(context, it(this)) + onStartIconClick?.let { onClick -> + root.setStartIconOnClickListener { onClick() } + } + } + + endIcon?.let { + root.endIconDrawable = ContextCompat.getDrawable(context, it(this)) + onEndIconClick?.let { onClick -> + root.setEndIconOnClickListener { onClick() } + } + } + } } \ No newline at end of file