Skip to content

Commit 6183dfc

Browse files
committed
Add export functionality
1 parent dd3dc51 commit 6183dfc

File tree

3 files changed

+69
-15
lines changed

3 files changed

+69
-15
lines changed

p5js/js/package.json

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,32 @@
22
"name": "p5js-mode-scaffold",
33
"version": "0.1.0",
44
"main": "main.js",
5+
"build": {
6+
"appId": "org.processing.user.p5mode",
7+
"electronLanguages": [],
8+
"linux": {
9+
"target": [
10+
"AppImage"
11+
]
12+
},
13+
"mac": {
14+
"target": [
15+
"dmg"
16+
]
17+
},
18+
"win": {
19+
"target": [
20+
"portable"
21+
]
22+
}
23+
},
24+
"scripts": {
25+
"sketch:start": "electron .",
26+
"app:pack": "electron-builder"
27+
},
528
"devDependencies": {
6-
"electron": "^37.4.0"
29+
"electron": "^37.4.0",
30+
"electron-builder": "24.6.3"
731
},
832
"dependencies": {
933
"p5": "^1.11.10"

p5js/src/main/kotlin/p5jsEditor.kt

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,27 +17,23 @@ import androidx.compose.ui.text.font.FontWeight
1717
import androidx.compose.ui.unit.dp
1818
import kotlinx.coroutines.CoroutineScope
1919
import kotlinx.coroutines.Dispatchers
20+
import kotlinx.coroutines.GlobalScope
2021
import kotlinx.coroutines.launch
2122
import kotlinx.serialization.json.*
22-
import processing.app.Base
23-
import processing.app.Formatter
24-
import processing.app.Messages
25-
import processing.app.Mode
26-
import processing.app.SketchException
23+
import processing.app.*
2724
import processing.app.syntax.JEditTextArea
2825
import processing.app.syntax.PdeTextArea
2926
import processing.app.syntax.PdeTextAreaDefaults
30-
import processing.app.ui.Editor
31-
import processing.app.ui.EditorFooter
32-
import processing.app.ui.EditorState
33-
import processing.app.ui.EditorToolbar
27+
import processing.app.ui.*
3428
import processing.app.ui.theme.ProcessingTheme
29+
import java.awt.event.ActionEvent
30+
import java.awt.event.ActionListener
3531
import java.io.BufferedReader
3632
import java.io.File
37-
import java.io.IOException
3833
import java.io.InputStreamReader
3934
import java.net.URL
4035
import javax.swing.JMenu
36+
import javax.swing.JMenuItem
4137

4238

4339
class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): Editor(base, path, state, mode) {
@@ -85,10 +81,8 @@ class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): E
8581

8682
// TODO: refactor into functions
8783
// Check whether `pnpm` is already installed; horrible code—my apologies!
88-
// TODO: Make more robust, cross-platform, etc. Only job for now is to get a PDEX file out that works on MacOS
8984
statusNotice("Looking for pnpm…")
9085
try {
91-
// TODO: Only an interactive shell allows me access to pnpm
9286
runCommand("pnpm -v")
9387
}
9488
catch (e: Exception) {
@@ -127,9 +121,45 @@ class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): E
127121
}
128122

129123
override fun buildFileMenu(): JMenu {
130-
return super.buildFileMenu(arrayOf())
124+
val exportApp: JMenuItem = Toolkit.newJMenuItemShift(Language.text("menu.file.export_application"), 'E'.code)
125+
exportApp.addActionListener(ActionListener { e: ActionEvent? ->
126+
if (sketch.isUntitled || sketch.isReadOnly) {
127+
Messages.showMessage("Save First", "Please first save the sketch.");
128+
} else {
129+
// TODO: I’m sure this is not the best way to ensure that this runs async, so the ActionListener can return
130+
// but works for now
131+
scope.launch {
132+
handleExport()
133+
}
134+
}
135+
})
136+
return super.buildFileMenu(arrayOf(exportApp))
137+
}
138+
139+
private fun handleExport() {
140+
statusNotice(Language.text("export.notice.exporting"))
141+
142+
val electronBuilderBin = File(sketch.folder, "node_modules/.bin/electron-builder")
143+
if (!electronBuilderBin.exists()) {
144+
runCommand("pnpm install --dangerously-allow-all-builds --force")
145+
}
146+
147+
runCommand("pnpm app:pack", onFinished = {
148+
Platform.openFolder(sketch.folder)
149+
statusNotice(Language.text("export.notice.exporting.done"))
150+
})
131151
}
132152

153+
// override fun handleSaveAs(): Boolean {
154+
// val saved = super.handleSaveAs()
155+
// statusNotice("Rebuilding Node dependencies…")
156+
// TODO: Saving is async and might not be finished once the function returns
157+
// runCommand("pnpm install --force", onFinished = {
158+
// statusNotice("Rebuilding Node dependencies… Done.")
159+
// })
160+
// return saved
161+
// }
162+
133163
override fun buildSketchMenu(): JMenu {
134164
return super.buildSketchMenu(arrayOf())
135165
}

p5js/src/main/kotlin/p5jsEditorToolbar.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class p5jsEditorToolbar(editor: p5jsEditor?) : EditorToolbar(editor) {
1414

1515
runButton.setSelected(true)
1616
editor.statusNotice("Starting up sketch…")
17-
editor.runCommand("npx electron .") {
17+
editor.runCommand("pnpm sketch:start") {
1818
runButton.setSelected(false)
1919
}
2020
}

0 commit comments

Comments
 (0)