Skip to content

Commit bd3a77e

Browse files
committed
Welcome Screen: Window Abstraction
1 parent b1910de commit bd3a77e

File tree

4 files changed

+163
-107
lines changed

4 files changed

+163
-107
lines changed
Lines changed: 15 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,37 @@
11
package processing.app.ui
22

33
import androidx.compose.foundation.layout.Box
4-
import androidx.compose.foundation.layout.padding
54
import androidx.compose.foundation.layout.sizeIn
65
import androidx.compose.runtime.Composable
76
import androidx.compose.ui.Modifier
8-
import androidx.compose.ui.awt.ComposePanel
97
import androidx.compose.ui.unit.dp
10-
import com.formdev.flatlaf.util.SystemInfo
118
import processing.app.Base
12-
import processing.app.contrib.ui.contributionsManager
13-
import processing.app.ui.theme.Locale
9+
import processing.app.ui.theme.PDEWindow
10+
import processing.app.ui.theme.pdeapplication
1411
import java.io.IOException
15-
import javax.swing.JFrame
1612
import javax.swing.SwingUtilities
1713

1814
class Welcome @Throws(IOException::class) constructor(base: Base) {
1915
init {
2016
SwingUtilities.invokeLater {
21-
22-
23-
JFrame(Locale()["menu.help.welcome"]).apply{
24-
val mac = SystemInfo.isMacFullWindowContentSupported
25-
26-
rootPane.putClientProperty("apple.awt.transparentTitleBar", mac)
27-
rootPane.putClientProperty("apple.awt.fullWindowContent", mac)
28-
29-
defaultCloseOperation = JFrame.DISPOSE_ON_CLOSE
30-
add(ComposePanel().apply {
31-
setContent {
32-
Box(modifier = Modifier.padding(top = if (mac) 22.dp else 0.dp)) {
33-
welcome()
34-
}
35-
}
36-
})
37-
38-
pack()
39-
40-
setLocationRelativeTo(null)
41-
42-
isVisible = true
43-
17+
PDEWindow("menu.help.welcome") {
18+
welcome()
4419
}
4520
}
4621
}
22+
companion object {
23+
@Composable
24+
fun welcome() {
25+
Box(modifier = Modifier.sizeIn(815.dp, 450.dp)){
4726

48-
@Composable
49-
fun welcome() {
50-
Box(modifier = Modifier.sizeIn(815.dp, 450.dp)){
27+
}
28+
}
5129

30+
@JvmStatic
31+
fun main(args: Array<String>) {
32+
pdeapplication("menu.help.welcome") {
33+
welcome()
34+
}
5235
}
5336
}
5437
}

app/src/processing/app/ui/WelcomeToBeta.kt

Lines changed: 4 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,7 @@ import androidx.compose.ui.window.WindowPosition
2929
import androidx.compose.ui.window.application
3030
import androidx.compose.ui.window.rememberWindowState
3131
import com.formdev.flatlaf.util.SystemInfo
32-
import processing.app.ui.theme.LocalLocale
33-
import processing.app.ui.theme.LocalTheme
34-
import processing.app.ui.theme.Locale
35-
import processing.app.ui.theme.ProcessingTheme
32+
import processing.app.ui.theme.*
3633
import java.awt.Cursor
3734
import java.awt.Dimension
3835
import java.awt.event.KeyAdapter
@@ -46,38 +43,12 @@ import javax.swing.SwingUtilities
4643
class WelcomeToBeta {
4744
companion object{
4845
val windowSize = Dimension(400, 200)
49-
val windowTitle = Locale()["beta.window.title"]
5046

5147
@JvmStatic
5248
fun showWelcomeToBeta() {
53-
val mac = SystemInfo.isMacFullWindowContentSupported
5449
SwingUtilities.invokeLater {
55-
JFrame(windowTitle).apply {
56-
val close = { dispose() }
57-
rootPane.putClientProperty("apple.awt.transparentTitleBar", mac)
58-
rootPane.putClientProperty("apple.awt.fullWindowContent", mac)
59-
defaultCloseOperation = JFrame.DISPOSE_ON_CLOSE
60-
contentPane.add(ComposePanel().apply {
61-
size = windowSize
62-
setContent {
63-
ProcessingTheme {
64-
Box(modifier = Modifier.padding(top = if (mac) 22.dp else 0.dp)) {
65-
welcomeToBeta(close)
66-
}
67-
}
68-
}
69-
})
70-
pack()
71-
background = java.awt.Color.white
72-
setLocationRelativeTo(null)
73-
addKeyListener(object : KeyAdapter() {
74-
override fun keyPressed(e: KeyEvent) {
75-
if (e.keyCode == KeyEvent.VK_ESCAPE) close()
76-
}
77-
})
78-
isResizable = false
79-
isVisible = true
80-
requestFocus()
50+
PDEWindow("beta.window.title") {
51+
welcomeToBeta()
8152
}
8253
}
8354
}
@@ -129,48 +100,6 @@ class WelcomeToBeta {
129100
}
130101
}
131102
}
132-
@OptIn(ExperimentalComposeUiApi::class)
133-
@Composable
134-
fun PDEButton(onClick: () -> Unit, content: @Composable BoxScope.() -> Unit) {
135-
val theme = LocalTheme.current
136-
137-
var hover by remember { mutableStateOf(false) }
138-
var clicked by remember { mutableStateOf(false) }
139-
val offset by animateFloatAsState(if (hover) -5f else 5f)
140-
val color by animateColorAsState(if(clicked) colors.primaryVariant else colors.primary)
141-
142-
Box(modifier = Modifier.padding(end = 5.dp, top = 5.dp)) {
143-
Box(
144-
modifier = Modifier
145-
.offset((-offset).dp, (offset).dp)
146-
.background(theme.getColor("toolbar.button.pressed.field"))
147-
.matchParentSize()
148-
)
149-
Box(
150-
modifier = Modifier
151-
.onPointerEvent(PointerEventType.Press) {
152-
clicked = true
153-
}
154-
.onPointerEvent(PointerEventType.Release) {
155-
clicked = false
156-
onClick()
157-
}
158-
.onPointerEvent(PointerEventType.Enter) {
159-
hover = true
160-
}
161-
.onPointerEvent(PointerEventType.Exit) {
162-
hover = false
163-
}
164-
.pointerHoverIcon(PointerIcon(Cursor(Cursor.HAND_CURSOR)))
165-
.background(color)
166-
.padding(10.dp)
167-
.sizeIn(minWidth = 100.dp),
168-
contentAlignment = Alignment.Center,
169-
content = content
170-
)
171-
}
172-
}
173-
174103

175104
@JvmStatic
176105
fun main(args: Array<String>) {
@@ -180,7 +109,7 @@ class WelcomeToBeta {
180109
position = WindowPosition(Alignment.Center)
181110
)
182111

183-
Window(onCloseRequest = ::exitApplication, state = windowState, title = windowTitle) {
112+
Window(onCloseRequest = ::exitApplication, state = windowState, title = Locale()["beta.window.title"]) {
184113
ProcessingTheme {
185114
Surface(color = colors.background) {
186115
welcomeToBeta {
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package processing.app.ui.theme
2+
3+
import androidx.compose.animation.animateColorAsState
4+
import androidx.compose.animation.core.animateFloatAsState
5+
import androidx.compose.foundation.background
6+
import androidx.compose.foundation.layout.*
7+
import androidx.compose.material.MaterialTheme.colors
8+
import androidx.compose.runtime.*
9+
import androidx.compose.ui.Alignment
10+
import androidx.compose.ui.ExperimentalComposeUiApi
11+
import androidx.compose.ui.Modifier
12+
import androidx.compose.ui.input.pointer.PointerEventType
13+
import androidx.compose.ui.input.pointer.PointerIcon
14+
import androidx.compose.ui.input.pointer.onPointerEvent
15+
import androidx.compose.ui.input.pointer.pointerHoverIcon
16+
import androidx.compose.ui.unit.dp
17+
import java.awt.Cursor
18+
19+
@OptIn(ExperimentalComposeUiApi::class)
20+
@Composable
21+
fun PDEButton(onClick: () -> Unit, content: @Composable BoxScope.() -> Unit) {
22+
val theme = LocalTheme.current
23+
24+
var hover by remember { mutableStateOf(false) }
25+
var clicked by remember { mutableStateOf(false) }
26+
val offset by animateFloatAsState(if (hover) -5f else 5f)
27+
val color by animateColorAsState(if(clicked) colors.primaryVariant else colors.primary)
28+
29+
Box(modifier = Modifier.padding(end = 5.dp, top = 5.dp)) {
30+
Box(
31+
modifier = Modifier
32+
.offset((-offset).dp, (offset).dp)
33+
.background(theme.getColor("toolbar.button.pressed.field"))
34+
.matchParentSize()
35+
)
36+
Box(
37+
modifier = Modifier
38+
.onPointerEvent(PointerEventType.Press) {
39+
clicked = true
40+
}
41+
.onPointerEvent(PointerEventType.Release) {
42+
clicked = false
43+
onClick()
44+
}
45+
.onPointerEvent(PointerEventType.Enter) {
46+
hover = true
47+
}
48+
.onPointerEvent(PointerEventType.Exit) {
49+
hover = false
50+
}
51+
.pointerHoverIcon(PointerIcon(Cursor(Cursor.HAND_CURSOR)))
52+
.background(color)
53+
.padding(10.dp)
54+
.sizeIn(minWidth = 100.dp),
55+
contentAlignment = Alignment.Center,
56+
content = content
57+
)
58+
}
59+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package processing.app.ui.theme
2+
3+
import androidx.compose.foundation.layout.Box
4+
import androidx.compose.foundation.layout.padding
5+
import androidx.compose.material.MaterialTheme.colors
6+
import androidx.compose.material.Surface
7+
import androidx.compose.runtime.Composable
8+
import androidx.compose.ui.Alignment
9+
import androidx.compose.ui.Modifier
10+
import androidx.compose.ui.awt.ComposePanel
11+
import androidx.compose.ui.unit.DpSize
12+
import androidx.compose.ui.unit.dp
13+
import androidx.compose.ui.window.Window
14+
import androidx.compose.ui.window.WindowPosition
15+
import androidx.compose.ui.window.application
16+
import androidx.compose.ui.window.rememberWindowState
17+
import com.formdev.flatlaf.util.SystemInfo
18+
import processing.app.ui.WelcomeToBeta.Companion.welcomeToBeta
19+
20+
import java.awt.event.KeyAdapter
21+
import java.awt.event.KeyEvent
22+
import javax.swing.JFrame
23+
24+
25+
class PDEWindow(titleKey: String = "", content: @Composable () -> Unit): JFrame(){
26+
init{
27+
val mac = SystemInfo.isMacFullWindowContentSupported
28+
29+
rootPane.apply{
30+
putClientProperty("apple.awt.transparentTitleBar", mac)
31+
putClientProperty("apple.awt.fullWindowContent", mac)
32+
}
33+
34+
defaultCloseOperation = DISPOSE_ON_CLOSE
35+
ComposePanel().apply {
36+
setContent {
37+
ProcessingTheme {
38+
val locale = LocalLocale.current
39+
this@PDEWindow.title = locale[titleKey]
40+
41+
Box(modifier = Modifier.padding(top = if (mac) 22.dp else 0.dp)) {
42+
content()
43+
}
44+
}
45+
}
46+
47+
this@PDEWindow.add(this)
48+
}
49+
pack()
50+
background = java.awt.Color.white
51+
setLocationRelativeTo(null)
52+
addKeyListener(object : KeyAdapter() {
53+
override fun keyPressed(e: KeyEvent) {
54+
if (e.keyCode == KeyEvent.VK_ESCAPE) this@PDEWindow.dispose()
55+
}
56+
})
57+
isResizable = false
58+
isVisible = true
59+
requestFocus()
60+
}
61+
}
62+
63+
fun pdeapplication(titleKey: String = "",content: @Composable () -> Unit){
64+
application {
65+
val windowState = rememberWindowState(
66+
size = DpSize.Unspecified,
67+
position = WindowPosition(Alignment.Center)
68+
)
69+
ProcessingTheme {
70+
val locale = LocalLocale.current
71+
val mac = SystemInfo.isMacFullWindowContentSupported
72+
Window(onCloseRequest = ::exitApplication, state = windowState, title = locale[titleKey]) {
73+
window.rootPane.apply {
74+
putClientProperty("apple.awt.fullWindowContent", mac)
75+
putClientProperty("apple.awt.transparentTitleBar", mac)
76+
}
77+
Surface(color = colors.background) {
78+
Box(modifier = Modifier.padding(top = if (mac) 22.dp else 0.dp)) {
79+
content()
80+
}
81+
}
82+
}
83+
}
84+
}
85+
}

0 commit comments

Comments
 (0)