Skip to content

Commit 5863422

Browse files
author
cairui
committed
Merge remote-tracking branch 'github/master' into github_master
2 parents ec5ea45 + 0316326 commit 5863422

File tree

4 files changed

+116
-12
lines changed

4 files changed

+116
-12
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.crzsc.plugin.actions
2+
3+
import com.crzsc.plugin.utils.FileGenerator
4+
import com.crzsc.plugin.utils.FileHelper.shouldActivateFor
5+
import com.crzsc.plugin.utils.PluginUtils.showNotify
6+
import com.intellij.openapi.actionSystem.AnAction
7+
import com.intellij.openapi.actionSystem.AnActionEvent
8+
import com.intellij.openapi.actionSystem.PlatformDataKeys
9+
10+
class GenerateDirAction : AnAction() {
11+
private var fileGenerator: FileGenerator? = null
12+
13+
override fun actionPerformed(e: AnActionEvent) {
14+
val project = e.getData(PlatformDataKeys.PROJECT)
15+
if (shouldActivateFor(project!!)) {
16+
fileGenerator = fileGenerator ?: FileGenerator(project)
17+
fileGenerator!!.buildYaml()
18+
} else {
19+
showNotify("This project is not the flutter project")
20+
}
21+
}
22+
}

src/main/java/com/crzsc/plugin/utils/FileGenerator.kt

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,16 @@ import com.crzsc.plugin.utils.PluginUtils.toLowCamelCase
66
import com.crzsc.plugin.utils.PluginUtils.toUpperCaseFirst
77
import com.intellij.openapi.command.WriteCommandAction
88
import com.intellij.openapi.project.Project
9+
import com.intellij.openapi.project.guessProjectDir
910
import com.intellij.openapi.vfs.VirtualFile
1011
import com.intellij.psi.PsiDocumentManager
1112
import com.intellij.psi.PsiManager
13+
import com.intellij.psi.util.PsiTreeUtil
14+
import org.jetbrains.kotlin.idea.core.util.toPsiFile
15+
import org.jetbrains.yaml.YAMLElementGenerator
16+
import org.jetbrains.yaml.psi.YAMLFile
17+
import org.jetbrains.yaml.psi.YAMLMapping
18+
import org.jetbrains.yaml.psi.YAMLSequence
1219

1320
class FileGenerator(private val project: Project) {
1421
private val ignoreDir = listOf("2.0x", "3.0x", "Mx", "Nx")
@@ -78,6 +85,53 @@ class FileGenerator(private val project: Project) {
7885
}
7986
}
8087

88+
fun buildYaml() {
89+
val guessProjectDir = project.guessProjectDir() ?: return
90+
val assetsFile = guessProjectDir.children.firstOrNull { it.name == "assets" } ?: return
91+
val fileAssetsDir =
92+
FileHelper.getAssetsFiles(assetsFile)?.map { "${it.path}/".replaceFirst("${guessProjectDir.path}/", "") }
93+
?.toMutableList()?.takeIf { it.isNotEmpty() } ?: return
94+
//由于本地修改后有几秒缓存,所以每次数据都修改,不判断是否有变动
95+
/*al mergeDir=fileAssetsDir.toMutableList()
96+
FileHelper.getPubSpecConfig(project)?.let { pubSpecConfig ->
97+
(pubSpecConfig.map["flutter"] as? Map<*, *>)?.let { configureMap ->
98+
val assets = (configureMap["assets"] as? ArrayList<*>) ?: return
99+
assets.forEach { ass ->
100+
mergeDir.remove(ass)
101+
}
102+
}
103+
}
104+
if(mergeDir.isEmpty()){
105+
println("-----没有需要添加的数据")
106+
return
107+
}*/
108+
fileAssetsDir.forEach {
109+
println("全部文件夹:$it")
110+
}
111+
val yaml = guessProjectDir.children.firstOrNull { it.name == "pubspec.yaml" } ?: return
112+
val yamlFile = (yaml.toPsiFile(project) as? YAMLFile) ?: return
113+
val psiElement =
114+
yamlFile.node.getChildren(null)
115+
.firstOrNull()?.psi?.children?.firstOrNull()?.children?.firstOrNull { it.text.startsWith("flutter:") }
116+
?: return
117+
val yamlMapping = psiElement.children.first() as YAMLMapping
118+
val assetsValue = yamlMapping.keyValues.firstOrNull { it.keyText == "assets" }?:return
119+
WriteCommandAction.runWriteCommandAction(project) {
120+
val stringBuilder = StringBuilder("assets:")
121+
fileAssetsDir.forEach {
122+
stringBuilder.append("\n - $it")
123+
}
124+
val yamlValue = PsiTreeUtil.collectElementsOfType(
125+
YAMLElementGenerator.getInstance(project)
126+
.createDummyYamlWithText(stringBuilder.toString()), YAMLSequence::class.java
127+
).iterator().next()
128+
assetsValue.setValue(yamlValue)
129+
130+
}
131+
132+
133+
}
134+
81135
private fun checkName(name: String): Boolean {
82136
return !ignoreDir.contains(name)
83137
}

src/main/java/com/crzsc/plugin/utils/FileHelper.kt

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package com.crzsc.plugin.utils
22

3+
import com.crzsc.plugin.setting.PluginSetting
34
import com.intellij.openapi.project.Project
45
import com.intellij.openapi.project.guessProjectDir
56
import com.intellij.openapi.vfs.VirtualFile
67
import com.intellij.psi.PsiDirectory
78
import com.intellij.psi.search.FilenameIndex
8-
import com.crzsc.plugin.setting.PluginSetting
99
import io.flutter.pub.PubRoot
1010
import io.flutter.utils.FlutterModuleUtils
1111
import org.yaml.snakeyaml.Yaml
@@ -38,7 +38,30 @@ object FileHelper {
3838
return null
3939
}
4040
return guessProjectDir?.findChild(assetsPath!!)
41-
?: guessProjectDir!!.createChildDirectory(this, assetsPath!!)
41+
?: guessProjectDir!!.createChildDirectory(this, assetsPath!!)
42+
}
43+
44+
/**
45+
* 获取资源路径
46+
*/
47+
@JvmStatic
48+
fun getAssetsFiles(assetsFile: VirtualFile): List<VirtualFile>? {
49+
val list = mutableListOf<VirtualFile>()
50+
checkAddDir(list,assetsFile)
51+
return list.takeIf { it.isNotEmpty() }
52+
}
53+
54+
///递归添加文件夹
55+
private fun checkAddDir(list:MutableList<VirtualFile>,virtualFile: VirtualFile){
56+
if (virtualFile.isDirectory) {
57+
//不全是文件
58+
if (virtualFile.children.any { c -> !c.isDirectory }) {
59+
list.add(virtualFile)
60+
}
61+
virtualFile.children.forEach {
62+
checkAddDir(list,it)
63+
}
64+
}
4265
}
4366

4467
/**
@@ -53,13 +76,13 @@ object FileHelper {
5376
filePath = filePath.trim()
5477
if (!filePath.contains("/")) {
5578
return@let lib.findChild(filePath)
56-
?: lib.createChildDirectory(lib, filePath)
79+
?: lib.createChildDirectory(lib, filePath)
5780
} else {
5881
var file = lib
5982
filePath.split("/").forEach { dir ->
6083
if (dir.isNotEmpty()) {
6184
file = file.findChild(dir)
62-
?: file.createChildDirectory(file, dir)
85+
?: file.createChildDirectory(file, dir)
6386
}
6487
}
6588
return@let file
@@ -98,7 +121,7 @@ object FileHelper {
98121
*/
99122
fun containsDirectoryFile(directory: PsiDirectory, fileName: String): Boolean {
100123
return directory.files.filter { it.name.endsWith(".dart") }
101-
.firstOrNull { it.name.contains(fileName) } != null
124+
.firstOrNull { it.name.contains(fileName) } != null
102125
}
103126

104127
@Suppress("DuplicatedCode")
@@ -132,11 +155,12 @@ object FileHelper {
132155
private const val PROJECT_NAME = "name"
133156

134157
data class PubSpecConfig(
135-
val project: Project,
136-
val pubRoot: PubRoot,
137-
val map: Map<String, Any>,
138-
//项目名称,导包需要
139-
val name: String = ((if (map[PROJECT_NAME] == "null") null else map[PROJECT_NAME])
140-
?: project.name).toString(),
141-
val isFlutterModule: Boolean = FlutterModuleUtils.hasFlutterModule(project))
158+
val project: Project,
159+
val pubRoot: PubRoot,
160+
val map: Map<String, Any>,
161+
//项目名称,导包需要
162+
val name: String = ((if (map[PROJECT_NAME] == "null") null else map[PROJECT_NAME])
163+
?: project.name).toString(),
164+
val isFlutterModule: Boolean = FlutterModuleUtils.hasFlutterModule(project)
165+
)
142166
}

src/main/resources/META-INF/plugin.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,5 +71,9 @@
7171
<add-to-group group-id="BuildMenu" anchor="last"/>
7272
<keyboard-shortcut keymap="$default" first-keystroke="alt g"/>
7373
</action>
74+
<action id="action.generateDir" class="com.crzsc.plugin.actions.GenerateDirAction" text="Generate Flutter Assets Dir"
75+
description="Generate Assets dir">
76+
<add-to-group group-id="BuildMenu" anchor="last"/>
77+
</action>
7478
</actions>
7579
</idea-plugin>

0 commit comments

Comments
 (0)