Skip to content

Commit

Permalink
Merge branch 'refs/heads/dev' into mixinextras-expression
Browse files Browse the repository at this point in the history
# Conflicts:
#	src/main/kotlin/MinecraftConfigurable.kt
#	src/main/kotlin/MinecraftSettings.kt
#	src/main/resources/messages/MinecraftDevelopment.properties
  • Loading branch information
Earthcomputer committed Jul 12, 2024
2 parents a7298d3 + 85e493a commit f929ae0
Show file tree
Hide file tree
Showing 99 changed files with 7,146 additions and 451 deletions.
4 changes: 4 additions & 0 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
submodules: true
- name: Fetch latest submodule updates
run: git submodule update --remote
- uses: actions/setup-java@v3
with:
distribution: 'zulu'
Expand Down
4 changes: 4 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
[submodule "templates"]
path = templates
branch = main
url = https://github.com/minecraft-dev/templates
27 changes: 25 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,26 @@ val gradleToolingExtensionJar = tasks.register<Jar>(gradleToolingExtensionSource
archiveClassifier.set("gradle-tooling-extension")
}

val templatesSourceSet: SourceSet = sourceSets.create("templates") {
resources {
srcDir("templates")
compileClasspath += sourceSets.main.get().output
}
}

val templateSourceSets: List<SourceSet> = (file("templates").listFiles() ?: emptyArray()).mapNotNull { file ->
if (file.isDirectory() && (file.listFiles() ?: emptyArray()).any { it.name.endsWith(".mcdev.template.json") }) {
sourceSets.create("templates-${file.name}") {
resources {
srcDir(file)
compileClasspath += sourceSets.main.get().output
}
}
} else {
null
}
}

val externalAnnotationsJar = tasks.register<Jar>("externalAnnotationsJar") {
from("externalAnnotations")
destinationDirectory.set(layout.buildDirectory.dir("externalAnnotations"))
Expand Down Expand Up @@ -392,6 +412,9 @@ tasks.withType<PrepareSandboxTask> {
from(externalAnnotationsJar) {
into("Minecraft Development/lib/resources")
}
from("templates") {
into("Minecraft Development/lib/resources/builtin-templates")
}
}

tasks.runIde {
Expand All @@ -402,8 +425,8 @@ tasks.runIde {
systemProperty("idea.debug.mode", "true")
}
// Set these properties to test different languages
// systemProperty("user.language", "en")
// systemProperty("user.country", "US")
systemProperty("user.language", "fr")
systemProperty("user.country", "FR")
}

tasks.buildSearchableOptions {
Expand Down
15 changes: 15 additions & 0 deletions src/main/kotlin/MinecraftConfigurable.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ package com.demonwav.mcdev

import com.demonwav.mcdev.asset.MCDevBundle
import com.demonwav.mcdev.asset.PlatformAssets
import com.demonwav.mcdev.creator.custom.templateRepoTable
import com.demonwav.mcdev.update.ConfigurePluginUpdatesDialog
import com.intellij.ide.projectView.ProjectView
import com.intellij.openapi.options.Configurable
Expand All @@ -31,6 +32,7 @@ import com.intellij.ui.EnumComboBoxModel
import com.intellij.ui.components.Label
import com.intellij.ui.dsl.builder.AlignX
import com.intellij.ui.dsl.builder.BottomGap
import com.intellij.ui.dsl.builder.MutableProperty
import com.intellij.ui.dsl.builder.bindItem
import com.intellij.ui.dsl.builder.bindSelected
import com.intellij.ui.dsl.builder.panel
Expand Down Expand Up @@ -84,6 +86,19 @@ class MinecraftConfigurable : Configurable {
}
}

group(MCDevBundle("minecraft.settings.creator")) {
row(MCDevBundle("minecraft.settings.creator.repos")) {}

row {
templateRepoTable(
MutableProperty(
{ settings.creatorTemplateRepos.toMutableList() },
{ settings.creatorTemplateRepos = it }
)
)
}.resizableRow()
}

onApply {
for (project in ProjectManager.getInstance().openProjects) {
ProjectView.getInstance(project).refresh()
Expand Down
90 changes: 80 additions & 10 deletions src/main/kotlin/MinecraftSettings.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,27 +20,97 @@

package com.demonwav.mcdev

import com.demonwav.mcdev.asset.MCDevBundle
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.components.PersistentStateComponent
import com.intellij.openapi.components.State
import com.intellij.openapi.components.Storage
import com.intellij.openapi.editor.markup.EffectType
import com.intellij.util.xmlb.XmlSerializerUtil
import com.intellij.util.xmlb.annotations.Attribute
import com.intellij.util.xmlb.annotations.Tag
import com.intellij.util.xmlb.annotations.Text

@State(name = "MinecraftSettings", storages = [Storage("minecraft_dev.xml")])
class MinecraftSettings : PersistentStateComponent<MinecraftSettings> {
override fun getState() = this
class MinecraftSettings : PersistentStateComponent<MinecraftSettings.State> {

override fun loadState(state: MinecraftSettings) {
XmlSerializerUtil.copyBean(state, this)
data class State(
var isShowProjectPlatformIcons: Boolean = true,
var isShowEventListenerGutterIcons: Boolean = true,
var isShowChatColorGutterIcons: Boolean = true,
var isShowChatColorUnderlines: Boolean = false,
var underlineType: UnderlineType = UnderlineType.DOTTED,

var creatorTemplateRepos: List<TemplateRepo> = listOf(TemplateRepo.makeBuiltinRepo()),
)

@Tag("repo")
data class TemplateRepo(
@get:Attribute("name")
var name: String,
@get:Attribute("provider")
var provider: String,
@get:Text
var data: String
) {
constructor() : this("", "", "")

companion object {

fun makeBuiltinRepo(): TemplateRepo {
return TemplateRepo(MCDevBundle("minecraft.settings.creator.repo.builtin_name"), "builtin", "true")
}
}
}

var isShowProjectPlatformIcons = true
var isShowEventListenerGutterIcons = true
var isShowChatColorGutterIcons = true
var isShowChatColorUnderlines = false
private var state = State()

var underlineType = UnderlineType.DOTTED
override fun getState(): State {
return state
}

override fun loadState(state: State) {
this.state = state
if (state.creatorTemplateRepos.isEmpty()) {
state.creatorTemplateRepos = listOf()
}
}

// State mappings
var isShowProjectPlatformIcons: Boolean
get() = state.isShowProjectPlatformIcons
set(showProjectPlatformIcons) {
state.isShowProjectPlatformIcons = showProjectPlatformIcons
}

var isShowEventListenerGutterIcons: Boolean
get() = state.isShowEventListenerGutterIcons
set(showEventListenerGutterIcons) {
state.isShowEventListenerGutterIcons = showEventListenerGutterIcons
}

var isShowChatColorGutterIcons: Boolean
get() = state.isShowChatColorGutterIcons
set(showChatColorGutterIcons) {
state.isShowChatColorGutterIcons = showChatColorGutterIcons
}

var isShowChatColorUnderlines: Boolean
get() = state.isShowChatColorUnderlines
set(showChatColorUnderlines) {
state.isShowChatColorUnderlines = showChatColorUnderlines
}

var underlineType: UnderlineType
get() = state.underlineType
set(underlineType) {
state.underlineType = underlineType
}

var creatorTemplateRepos: List<TemplateRepo>
get() = state.creatorTemplateRepos.map { it.copy() }
set(creatorTemplateRepos) {
state.creatorTemplateRepos = creatorTemplateRepos.map { it.copy() }
}

enum class UnderlineType(private val regular: String, val effectType: EffectType) {

Expand Down
2 changes: 1 addition & 1 deletion src/main/kotlin/creator/MinecraftModuleBuilder.kt
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ import com.intellij.openapi.roots.ModifiableRootModel

class MinecraftModuleBuilder : AbstractNewProjectWizardBuilder() {

override fun getPresentableName() = "Minecraft"
override fun getPresentableName() = "Minecraft (Old Wizard)"
override fun getNodeIcon() = PlatformAssets.MINECRAFT_ICON
override fun getGroupName() = "Minecraft"
override fun getBuilderId() = "MINECRAFT_MODULE"
Expand Down
4 changes: 3 additions & 1 deletion src/main/kotlin/creator/ProjectSetupFinalizerWizardStep.kt
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,9 @@ class JdkProjectSetupFinalizer(
private var preferredJdkLabel: Placeholder? = null
private var preferredJdkReason = MCDevBundle("creator.validation.jdk_preferred_default_reason")

var preferredJdk: JavaSdkVersion = JavaSdkVersion.JDK_17
val preferredJdkProperty = propertyGraph.property(JavaSdkVersion.JDK_17)

var preferredJdk: JavaSdkVersion by preferredJdkProperty
private set

fun setPreferredJdk(value: JavaSdkVersion, reason: String) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ abstract class AbstractBuildSystemStep(

override val self get() = this
override val label
get() = MCDevBundle("creator.ui.build_system.label.generic")
get() = MCDevBundle("creator.ui.build_system.label")

override fun initSteps(): LinkedHashMap<String, NewProjectWizardStep> {
context.putUserData(PLATFORM_NAME_KEY, platformName)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ class BuildSystemPropertiesStep<ParentStep>(private val parent: ParentStep) : Ab
val groupIdProperty = propertyGraph.property("org.example")
.bindStorage("${javaClass.name}.groupId")
val artifactIdProperty = propertyGraph.lazyProperty(::suggestArtifactId)
private val versionProperty = propertyGraph.property("1.0-SNAPSHOT")
val versionProperty = propertyGraph.property("1.0-SNAPSHOT")
.bindStorage("${javaClass.name}.version")

var groupId by groupIdProperty
Expand Down
16 changes: 16 additions & 0 deletions src/main/kotlin/creator/creator-utils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,15 @@ import com.demonwav.mcdev.creator.step.LicenseStep
import com.demonwav.mcdev.util.MinecraftTemplates
import com.intellij.ide.fileTemplates.FileTemplateManager
import com.intellij.ide.starters.local.GeneratorTemplateFile
import com.intellij.ide.util.projectWizard.WizardContext
import com.intellij.ide.wizard.AbstractNewProjectWizardStep
import com.intellij.ide.wizard.AbstractWizard
import com.intellij.ide.wizard.GitNewProjectWizardData
import com.intellij.ide.wizard.NewProjectWizardStep
import com.intellij.notification.Notification
import com.intellij.notification.NotificationType
import com.intellij.openapi.application.ModalityState
import com.intellij.openapi.diagnostic.thisLogger
import com.intellij.openapi.observable.properties.ObservableMutableProperty
import com.intellij.openapi.observable.properties.ObservableProperty
import com.intellij.openapi.project.Project
Expand Down Expand Up @@ -160,3 +164,15 @@ fun notifyCreatedProjectNotOpened() {
NotificationType.ERROR,
).notify(null)
}

val WizardContext.modalityState: ModalityState
get() {
val contentPanel = this.getUserData(AbstractWizard.KEY)?.contentPanel

if (contentPanel == null) {
thisLogger().error("Wizard content panel is null, using default modality state")
return ModalityState.defaultModalityState()
}

return ModalityState.stateForComponent(contentPanel)
}
78 changes: 78 additions & 0 deletions src/main/kotlin/creator/custom/BuiltinValidations.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
/*
* Minecraft Development for IntelliJ
*
* https://mcdev.io/
*
* Copyright (C) 2024 minecraft-dev
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, version 3.0 only.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

package com.demonwav.mcdev.creator.custom

import com.demonwav.mcdev.asset.MCDevBundle
import com.demonwav.mcdev.platform.fabric.util.FabricVersions
import com.demonwav.mcdev.util.SemanticVersion
import com.intellij.openapi.ui.ComboBox
import com.intellij.openapi.ui.ValidationInfo
import com.intellij.openapi.ui.validation.DialogValidation
import com.intellij.openapi.ui.validation.validationErrorIf
import com.intellij.openapi.util.text.StringUtil
import javax.swing.JComponent

object BuiltinValidations {
val nonBlank = validationErrorIf<String>(MCDevBundle("creator.validation.blank")) { it.isBlank() }

val validVersion = validationErrorIf<String>(MCDevBundle("creator.validation.semantic_version")) {
SemanticVersion.tryParse(it) == null
}

val nonEmptyVersion = DialogValidation.WithParameter<ComboBox<SemanticVersion>> { combobox ->
DialogValidation {
if (combobox.item?.parts.isNullOrEmpty()) {
ValidationInfo(MCDevBundle("creator.validation.semantic_version"))
} else {
null
}
}
}

val nonEmptyYarnVersion = DialogValidation.WithParameter<ComboBox<FabricVersions.YarnVersion>> { combobox ->
DialogValidation {
if (combobox.item == null) {
ValidationInfo(MCDevBundle("creator.validation.semantic_version"))
} else {
null
}
}
}

val validClassFqn = validationErrorIf<String>(MCDevBundle("creator.validation.class_fqn")) {
it.isBlank() || it.split('.').any { part -> !StringUtil.isJavaIdentifier(part) }
}

fun byRegex(regex: Regex): DialogValidation.WithParameter<() -> String> =
validationErrorIf<String>(MCDevBundle("creator.validation.regex", regex)) { !it.matches(regex) }

fun <T> isAnyOf(
selectionGetter: () -> T,
options: Collection<T>,
component: JComponent? = null
): DialogValidation = DialogValidation {
if (selectionGetter() !in options) {
return@DialogValidation ValidationInfo(MCDevBundle("creator.validation.invalid_option"), component)
}

return@DialogValidation null
}
}
Loading

0 comments on commit f929ae0

Please sign in to comment.