Wizard: introduce Android & JS multiplatform project kinds

#KT-36155 fixed
This commit is contained in:
Ilya Kirillov
2020-02-12 18:26:02 +03:00
parent a5a72a89fc
commit e1b99580eb
7 changed files with 23 additions and 14 deletions
@@ -1,15 +1,11 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.firstStep
import org.jetbrains.kotlin.idea.KotlinIcons
import org.jetbrains.kotlin.tools.projectWizard.core.entity.DropDownSettingType
import org.jetbrains.kotlin.tools.projectWizard.core.ValuesReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.DropDownSettingType
import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference
import org.jetbrains.kotlin.tools.projectWizard.plugins.projectTemplates.ProjectTemplatesPlugin
import org.jetbrains.kotlin.tools.projectWizard.projectTemplates.ProjectTemplate
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.ImmutableSingleSelectableListWithIcon
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.UiConstants
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.bordered
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.panel
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.*
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.SettingComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.ValidationIndicator
import java.awt.BorderLayout
@@ -28,7 +24,7 @@ class ProjectTemplateSettingComponent(
private val list = ImmutableSingleSelectableListWithIcon(
setting.type.values,
renderValue = { value ->
icon = KotlinIcons.SMALL_LOGO
icon = value.projectKind.icon
append(value.title)
},
onValueSelected = {
@@ -28,7 +28,7 @@ class ModulesEditorComponent(
ModulesEditorTree(
onSelected = { oneEntrySelected(it) },
addModule = { component ->
val isMppProject = KotlinPlugin::projectKind.value == ProjectKind.Multiplatform
val isMppProject = KotlinPlugin::projectKind.value == ProjectKind.Singleplatform
moduleCreator.create(
target = null, // The empty tree case
allowMultiplatform = isMppProject,
@@ -55,7 +55,7 @@ class ModulesEditorComponent(
moduleCreator = moduleCreator,
model = model,
getModules = { value ?: emptyList() },
isMultiplatformProject = { KotlinPlugin::projectKind.value == ProjectKind.Multiplatform }
isMultiplatformProject = { KotlinPlugin::projectKind.value != ProjectKind.Singleplatform }
)
override val component: JComponent by lazy(LazyThreadSafetyMode.NONE) {
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.SimpleTarget
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.TargetConfigurator
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleSubType
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ProjectKind
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind
@@ -95,6 +96,14 @@ val Module.icon: Icon
ModuleKind.singleplatformJvm -> AllIcons.Nodes.Module
}
val ProjectKind.icon: Icon
get() = when (this) {
ProjectKind.Singleplatform -> KotlinIcons.SMALL_LOGO
ProjectKind.Multiplatform -> KotlinIcons.MPP
ProjectKind.Android -> KotlinIcons.SMALL_LOGO
ProjectKind.Js -> KotlinIcons.JS
}
val ModuleSubType.icon: Icon
get() = moduleType.icon
@@ -31,9 +31,10 @@ abstract class BuildSystemPlugin(context: Context) : Plugin(context) {
validate { buildSystemType ->
if (!buildSystemType.isGradle
&& KotlinPlugin::projectKind.reference.notRequiredSettingValue == ProjectKind.Multiplatform
&& KotlinPlugin::projectKind.reference.notRequiredSettingValue != ProjectKind.Singleplatform
) {
ValidationResult.ValidationError("Multiplatform project cannot be generated using ${buildSystemType.text}")
val projectKind = KotlinPlugin::projectKind.reference.notRequiredSettingValue?.text?.capitalize() ?: "Project"
ValidationResult.ValidationError("$projectKind cannot be generated using ${buildSystemType.text}")
} else ValidationResult.OK
}
}
@@ -123,7 +123,9 @@ class KotlinPlugin(context: Context) : Plugin(context) {
enum class ProjectKind(override val text: String) : DisplayableSettingItem {
Singleplatform("Singleplatform JVM project"),
Multiplatform("Multiplatform project")
Multiplatform("Multiplatform project"),
Android("Android project"),
Js("Kotlin/JS project")
}
fun List<Module>.withAllSubModules(includeSourcesets: Boolean = false): List<Module> = buildList {
@@ -200,7 +200,7 @@ object AndroidApplication : ProjectTemplate() {
Simple <b>Android</b> application with single activity
""".trimIndent()
override val suggestedProjectName = "myAndroidApplication"
override val projectKind = ProjectKind.Multiplatform
override val projectKind = ProjectKind.Android
override val setsPluginSettings: List<SettingWithValue<*, *>>
get() = listOf(
@@ -248,7 +248,7 @@ object JsBrowserApplication : ProjectTemplate() {
override val title = "Kotlin/JS Frontend Application"
override val htmlDescription = "Gradle project for a Kotlin/JS frontend web application"
override val suggestedProjectName = "myKotlinJsApplication"
override val projectKind = ProjectKind.Multiplatform
override val projectKind = ProjectKind.Js
override val setsPluginSettings: List<SettingWithValue<*, *>>
get() = listOf(
@@ -78,6 +78,7 @@ class Module(
configurator == MppModuleConfigurator -> "MPP Module"
configurator == AndroidSinglePlatformModuleConfigurator -> "Android Module"
configurator == IOSSinglePlatformModuleConfigurator -> "IOS Module"
configurator == JsSingleplatformModuleConfigurator -> "JS Module"
else -> "Module"
}