Skip to content

Commit 1fae461

Browse files
committed
UI Cleanup
1 parent f762a3e commit 1fae461

File tree

2 files changed

+63
-30
lines changed

2 files changed

+63
-30
lines changed

app/src/processing/app/gradle/GradleService.kt

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import androidx.compose.runtime.mutableStateListOf
44
import androidx.compose.runtime.mutableStateOf
55
import com.sun.jdi.Bootstrap
66
import com.sun.jdi.VirtualMachine
7-
import com.sun.jdi.VirtualMachineManager
87
import com.sun.jdi.connect.AttachingConnector
98
import kotlinx.coroutines.*
9+
import org.gradle.internal.logging.events.OutputEvent
1010
import org.gradle.tooling.BuildLauncher
1111
import org.gradle.tooling.GradleConnector
1212
import org.gradle.tooling.ProjectConnection
@@ -17,12 +17,13 @@ import processing.app.Base
1717
import processing.app.Messages
1818
import processing.app.Platform
1919
import processing.app.ui.Editor
20-
import java.io.File
20+
import java.io.*
2121
import javax.swing.SwingUtilities
2222
import javax.swing.event.DocumentEvent
2323
import javax.swing.event.DocumentListener
2424
import kotlin.io.path.writeText
2525

26+
2627
class GradleService(val editor: Editor) {
2728
val availableTasks = mutableStateListOf<String>()
2829
val finishedTasks = mutableStateListOf<String>()
@@ -39,6 +40,7 @@ class GradleService(val editor: Editor) {
3940

4041
val folder: File get() = editor.sketch.folder
4142

43+
// TODO: Capture output & enable at start of running
4244

4345
fun prepare(){
4446
Messages.log("Preparing sketch")
@@ -64,6 +66,7 @@ class GradleService(val editor: Editor) {
6466
startRun {
6567
connection.newSketchBuild()
6668
.addDebugging()
69+
.addProgressListener(listOf(":run"))
6770
.forTasks("run")
6871
.withCancellationToken(cancel.token())
6972
.run()
@@ -77,6 +80,7 @@ class GradleService(val editor: Editor) {
7780
Messages.log("Exporting sketch")
7881
startRun {
7982
connection.newSketchBuild()
83+
.addProgressListener(listOf(":runDistributable"))
8084
.forTasks("runDistributable")
8185
.withCancellationToken(cancel.token())
8286
.run()
@@ -118,6 +122,7 @@ class GradleService(val editor: Editor) {
118122

119123
// TODO: Attach listener if new tab is created
120124
}
125+
// TODO: Stop on dispose
121126
}
122127

123128
private fun startRun(action: () -> Unit){
@@ -128,7 +133,16 @@ class GradleService(val editor: Editor) {
128133

129134
cancel.cancel()
130135
cancel = GradleConnector.newCancellationTokenSource()
131-
action()
136+
137+
editor.console.clear()
138+
139+
try{
140+
action()
141+
}catch (e: Exception){
142+
Messages.log("Error while running sketch: ${e.message}")
143+
return@launch
144+
}
145+
132146
}
133147
run?.invokeOnCompletion { running.value = run?.isActive ?: false }
134148
}
@@ -138,18 +152,33 @@ class GradleService(val editor: Editor) {
138152
if(event !is TaskStartEvent) return@ProgressListener
139153
if(event.descriptor.name != ":run") return@ProgressListener
140154

141-
Messages.log("Running sketch")
155+
Messages.log("Attaching to VM")
142156
val connector = Bootstrap.virtualMachineManager().allConnectors()
143157
.firstOrNull { it.name() == "com.sun.jdi.SocketAttach" }
144158
as AttachingConnector?
145159
?: return@ProgressListener
146160
val args = connector.defaultArguments()
147161
args["port"]?.setValue(debugPort.toString())
148-
vm = connector.attach(args)
162+
val vm = connector.attach(args)
163+
this@GradleService.vm = vm
164+
Messages.log("Attached to VM: ${vm.name()}")
149165
})
150166
return this
151167
}
152168

169+
private fun BuildLauncher.addProgressListener(skipping: List<String> ): BuildLauncher{
170+
this.addProgressListener(ProgressListener { event ->
171+
val name = event.descriptor.name
172+
if(skipping.contains(name)) return@ProgressListener
173+
if(event is TaskStartEvent) {
174+
if(!availableTasks.contains(name)) availableTasks.add(name)
175+
}
176+
if(event is TaskFinishEvent){
177+
finishedTasks.add(name)
178+
}
179+
})
180+
return this
181+
}
153182

154183
private fun ProjectConnection.newSketchBuild(): BuildLauncher{
155184
finishedTasks.clear()
@@ -226,25 +255,12 @@ class GradleService(val editor: Editor) {
226255
}
227256

228257
return this.newBuild()
229-
// .setJavaHome(Platform.getJavaHome())
258+
.setJavaHome(Platform.getJavaHome())
230259
.withArguments(
231260
"--init-script", initGradle.toAbsolutePath().toString(),
232261
*variables.entries.map { "-Pprocessing.${it.key}=${it.value}" }.toTypedArray()
233262
)
234-
.addProgressListener(ProgressListener { event ->
235-
val name = event.descriptor.name
236-
if(event is TaskStartEvent) {
237-
if(!availableTasks.contains(name)) availableTasks.add(name)
238-
}
239-
if(event is TaskFinishEvent){
240-
finishedTasks.add(name)
241-
}
242-
})
243-
.apply {
244-
if(Base.DEBUG) {
245-
setStandardError(System.err)
246-
setStandardOutput(System.out)
247-
}
248-
}
263+
.setStandardError(System.err)
264+
.setStandardOutput(System.out)
249265
}
250266
}

app/src/processing/app/gradle/ui/Toolbar.kt

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import androidx.compose.ui.awt.SwingPanel
1919
import androidx.compose.ui.draw.clip
2020
import androidx.compose.ui.graphics.Brush
2121
import androidx.compose.ui.graphics.Color
22+
import androidx.compose.ui.graphics.StrokeCap
2223
import androidx.compose.ui.input.pointer.PointerEventType
2324
import androidx.compose.ui.input.pointer.onPointerEvent
2425
import androidx.compose.ui.unit.dp
@@ -70,24 +71,35 @@ class Toolbar(val editor: Editor) {
7071
.padding(start = Editor.LEFT_GUTTER.dp)
7172
.padding(vertical = 11.dp)
7273
,
73-
horizontalArrangement = Arrangement.spacedBy(16.dp)
74+
horizontalArrangement = Arrangement.spacedBy(8.dp)
7475
){
75-
val available = editor.service.availableTasks
76-
val finished = editor.service.finishedTasks
76+
val available = editor.service.availableTasks.count()
77+
val finished = editor.service.finishedTasks.count()
7778
val isRunning = editor.service.running.value
7879
ActionButton(
80+
active = isRunning,
7981
modifier = Modifier
8082
.onPointerEvent(PointerEventType.Press){
8183
editor.service.run()
8284
}
83-
.padding(1.dp)
85+
.padding(2.dp)
8486
) {
8587
val color = LocalContentColor.current
8688
Fading(visible = isRunning) {
87-
CircularProgressIndicator(
88-
//progress = finished.count().toFloat() / (available.count() - 1),
89-
color = color
90-
)
89+
if(finished == 0) {
90+
CircularProgressIndicator(
91+
color = color,
92+
strokeCap = StrokeCap.Round,
93+
strokeWidth = 3.dp
94+
)
95+
}else{
96+
CircularProgressIndicator(
97+
progress = finished.toFloat() / available,
98+
color = color,
99+
strokeCap = StrokeCap.Round,
100+
strokeWidth = 3.dp
101+
)
102+
}
91103
}
92104
Box(modifier = Modifier.padding(4.dp)) {
93105
Icon(
@@ -119,7 +131,7 @@ class Toolbar(val editor: Editor) {
119131

120132
@OptIn(ExperimentalComposeUiApi::class)
121133
@Composable
122-
fun ActionButton(modifier: Modifier = Modifier, content: @Composable () -> Unit){
134+
fun ActionButton(modifier: Modifier = Modifier, active: Boolean = false, content: @Composable () -> Unit){
123135
val baseColor = Theme.get("toolbar.button.enabled.field")
124136
val baseTextColor = Theme.get("toolbar.button.enabled.glyph")
125137

@@ -131,13 +143,18 @@ fun ActionButton(modifier: Modifier = Modifier, content: @Composable () -> Unit
131143
val pressedColor = Theme.get("toolbar.button.pressed.field")
132144
val pressedTextColor = Theme.get("toolbar.button.pressed.glyph")
133145

146+
val activeColor = Theme.get("toolbar.button.selected.field")
147+
val activeTextColor = Theme.get("toolbar.button.pressed.glyph")
148+
134149
val color = when {
150+
active -> activeColor
135151
pressed -> pressedColor
136152
hover -> hoverColor
137153
else -> baseColor
138154
}.toColorInt()
139155

140156
val textColor = when{
157+
active -> activeTextColor
141158
pressed -> pressedTextColor
142159
hover -> hoverTextColor
143160
else -> baseTextColor

0 commit comments

Comments
 (0)