Skip to content

Commit 07b859b

Browse files
committed
ErrorPlaceholder and DropdownList improvements
1 parent ab3eb59 commit 07b859b

File tree

7 files changed

+111
-54
lines changed

7 files changed

+111
-54
lines changed

tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/jewel/DropdownList.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import androidx.compose.runtime.rememberUpdatedState
99
import androidx.compose.runtime.setValue
1010
import androidx.compose.ui.Alignment
1111
import androidx.compose.ui.Modifier
12+
import androidx.compose.ui.unit.Dp
1213
import androidx.compose.ui.unit.dp
1314
import io.github.composegears.valkyrie.jewel.tooling.PreviewTheme
1415
import io.github.composegears.valkyrie.sdk.compose.foundation.layout.Spacer
@@ -28,6 +29,7 @@ fun <T : Any> DropdownList(
2829
transform: (T) -> String,
2930
onSelectItem: (T) -> Unit,
3031
modifier: Modifier = Modifier,
32+
maxPopupWidth: Dp = Dp.Unspecified,
3133
) {
3234
val updatedTransform by rememberUpdatedState(transform)
3335

@@ -43,6 +45,7 @@ fun <T : Any> DropdownList(
4345
items = items.map(transform),
4446
selectedIndex = items.indexOf(selected),
4547
onSelectedItemChange = { onSelectItem(items[it]) },
48+
maxPopupWidth = maxPopupWidth,
4649
modifier = modifier,
4750
itemKeys = { _, item -> item },
4851
listState = listState,

tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/jewel/banner/BannerHost.kt

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,11 @@ import androidx.compose.runtime.LaunchedEffect
1818
import androidx.compose.ui.Alignment
1919
import androidx.compose.ui.Modifier
2020
import androidx.compose.ui.unit.dp
21-
import com.intellij.codeInsight.template.emmet.generators.LoremGenerator
2221
import io.github.composegears.valkyrie.jewel.banner.BannerMessage.ErrorBanner
2322
import io.github.composegears.valkyrie.jewel.banner.BannerMessage.InfoBanner
2423
import io.github.composegears.valkyrie.jewel.banner.BannerMessage.WarningBanner
2524
import io.github.composegears.valkyrie.jewel.tooling.BannerPreviewTheme
26-
import kotlin.random.Random
25+
import io.github.composegears.valkyrie.jewel.tooling.randomLorem
2726
import kotlinx.coroutines.delay
2827
import org.jetbrains.compose.ui.tooling.preview.Preview
2928
import org.jetbrains.jewel.ui.component.DefaultButton
@@ -89,8 +88,6 @@ internal fun BannerDuration.toMillis(): Long {
8988
}
9089
}
9190

92-
private fun lorem() = LoremGenerator().generate(Random.nextInt(3, 25), true)
93-
9491
@Preview
9592
@Composable
9693
private fun BannerPreview() = BannerPreviewTheme {
@@ -103,23 +100,23 @@ private fun BannerPreview() = BannerPreviewTheme {
103100

104101
DefaultButton(
105102
onClick = {
106-
bannerManager.show(message = InfoBanner(text = lorem()))
103+
bannerManager.show(message = InfoBanner(text = randomLorem()))
107104
},
108105
content = {
109106
Text(text = "Success banner")
110107
},
111108
)
112109
DefaultButton(
113110
onClick = {
114-
bannerManager.show(message = WarningBanner(text = lorem()))
111+
bannerManager.show(message = WarningBanner(text = randomLorem()))
115112
},
116113
content = {
117114
Text(text = "Warning banner")
118115
},
119116
)
120117
DefaultButton(
121118
onClick = {
122-
bannerManager.show(message = ErrorBanner(text = lorem()))
119+
bannerManager.show(message = ErrorBanner(text = randomLorem()))
123120
},
124121
content = {
125122
Text(text = "Error banner")
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package io.github.composegears.valkyrie.jewel.tooling
2+
3+
import com.intellij.codeInsight.template.emmet.generators.LoremGenerator
4+
import kotlin.random.Random
5+
6+
fun randomLorem(): String = LoremGenerator().generate(Random.nextInt(3, 25), true)
7+
8+
fun lorem(words: Int): String = LoremGenerator().generate(words, true)
Lines changed: 91 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,130 @@
11
package io.github.composegears.valkyrie.jewel.ui.placeholder
22

3+
import androidx.compose.foundation.ContextMenuArea
34
import androidx.compose.foundation.background
45
import androidx.compose.foundation.layout.Arrangement
56
import androidx.compose.foundation.layout.Box
67
import androidx.compose.foundation.layout.Column
8+
import androidx.compose.foundation.layout.fillMaxWidth
79
import androidx.compose.foundation.layout.padding
10+
import androidx.compose.foundation.layout.widthIn
811
import androidx.compose.foundation.shape.RoundedCornerShape
912
import androidx.compose.runtime.Composable
13+
import androidx.compose.runtime.rememberCoroutineScope
1014
import androidx.compose.ui.Alignment
1115
import androidx.compose.ui.Modifier
1216
import androidx.compose.ui.draw.drawBehind
1317
import androidx.compose.ui.geometry.Offset
1418
import androidx.compose.ui.graphics.StrokeCap
19+
import androidx.compose.ui.platform.ClipEntry
20+
import androidx.compose.ui.platform.LocalClipboard
21+
import androidx.compose.ui.text.style.TextAlign
1522
import androidx.compose.ui.unit.dp
1623
import io.github.composegears.valkyrie.jewel.colors.primaryColor
1724
import io.github.composegears.valkyrie.jewel.tooling.PreviewTheme
25+
import io.github.composegears.valkyrie.jewel.tooling.debugBounds
26+
import io.github.composegears.valkyrie.jewel.tooling.lorem
1827
import io.github.composegears.valkyrie.sdk.compose.foundation.layout.Spacer
28+
import io.github.composegears.valkyrie.util.ValkyrieBundle.message
29+
import java.awt.datatransfer.StringSelection
30+
import kotlinx.coroutines.launch
1931
import org.jetbrains.compose.ui.tooling.preview.Preview
2032
import org.jetbrains.jewel.foundation.theme.JewelTheme
33+
import org.jetbrains.jewel.ui.component.ContextMenuItemOption
2134
import org.jetbrains.jewel.ui.component.InfoText
2235
import org.jetbrains.jewel.ui.component.Text
36+
import org.jetbrains.jewel.ui.icons.AllIconsKeys
2337

2438
@Composable
2539
fun ErrorPlaceholder(
2640
message: String,
2741
modifier: Modifier = Modifier,
2842
description: String? = null,
2943
) {
30-
Column(
31-
modifier = modifier.padding(16.dp),
32-
verticalArrangement = Arrangement.Center,
33-
) {
34-
Text(
35-
modifier = Modifier.align(Alignment.CenterHorizontally),
36-
text = message,
37-
maxLines = 1,
38-
)
39-
if (description != null) {
40-
Spacer(16.dp)
44+
val clipboard = LocalClipboard.current
45+
val scope = rememberCoroutineScope()
4146

42-
val primaryColor = JewelTheme.primaryColor
43-
Box(
44-
modifier = Modifier
45-
.background(
46-
color = JewelTheme.globalColors.borders.disabled,
47-
shape = RoundedCornerShape(
48-
topStart = 0.dp,
49-
topEnd = 4.dp,
50-
bottomEnd = 4.dp,
51-
bottomStart = 0.dp,
52-
),
53-
)
54-
.drawBehind {
55-
val inset = 2.dp.toPx()
56-
drawLine(
57-
color = primaryColor,
58-
start = Offset(0f, inset / 2f),
59-
end = Offset(0f, size.height - inset / 2f),
60-
strokeWidth = inset,
61-
cap = StrokeCap.Round,
62-
)
63-
},
47+
ContextMenuArea(
48+
items = {
49+
if (description != null) {
50+
listOf(
51+
ContextMenuItemOption(
52+
label = message("ui.placeholder.error.context.menu.copy"),
53+
action = {
54+
scope.launch {
55+
clipboard.setClipEntry(ClipEntry(StringSelection(description)))
56+
}
57+
},
58+
icon = AllIconsKeys.Actions.Copy,
59+
),
60+
)
61+
} else {
62+
emptyList()
63+
}
64+
},
65+
content = {
66+
Column(
67+
modifier = modifier
68+
.widthIn(max = 450.dp)
69+
.padding(16.dp),
70+
verticalArrangement = Arrangement.Center,
6471
) {
65-
InfoText(
66-
modifier = Modifier.padding(4.dp),
67-
text = description,
68-
maxLines = 5,
72+
Text(
73+
modifier = Modifier.fillMaxWidth(),
74+
text = message,
75+
textAlign = TextAlign.Center,
76+
maxLines = 1,
6977
)
78+
if (description != null) {
79+
Spacer(16.dp)
80+
81+
val primaryColor = JewelTheme.primaryColor
82+
Box(
83+
modifier = Modifier
84+
.background(
85+
color = JewelTheme.globalColors.borders.disabled,
86+
shape = RoundedCornerShape(
87+
topStart = 0.dp,
88+
topEnd = 4.dp,
89+
bottomEnd = 4.dp,
90+
bottomStart = 0.dp,
91+
),
92+
)
93+
.drawBehind {
94+
val inset = 2.dp.toPx()
95+
drawLine(
96+
color = primaryColor,
97+
start = Offset(0f, inset / 2f),
98+
end = Offset(0f, size.height - inset / 2f),
99+
strokeWidth = inset,
100+
cap = StrokeCap.Round,
101+
)
102+
},
103+
) {
104+
InfoText(
105+
modifier = Modifier.padding(8.dp),
106+
text = description,
107+
maxLines = 5,
108+
)
109+
}
110+
}
70111
}
71-
}
72-
}
112+
},
113+
)
73114
}
74115

75116
@Preview
76117
@Composable
77118
private fun ErrorPlaceholderPreview() = PreviewTheme(alignment = Alignment.Center) {
78-
ErrorPlaceholder(
79-
message = "Message",
80-
description = "Description Description Description",
81-
)
119+
Column {
120+
ErrorPlaceholder(
121+
modifier = Modifier.debugBounds(),
122+
message = lorem(3),
123+
)
124+
ErrorPlaceholder(
125+
modifier = Modifier.debugBounds(),
126+
message = lorem(3),
127+
description = lorem(30),
128+
)
129+
}
82130
}

tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/mode/iconpack/newpack/NewPackScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,13 @@ val NewPackScreen by navDestination<PendingPathData> {
6363
.onEach {
6464
when (it) {
6565
is NewPackEvent.OnSettingsUpdated -> {
66-
navController.parent?.replace(
66+
navController.replace(
6767
dest = IconPackConversionScreen,
6868
navArgs = pendingData,
6969
)
7070
}
7171
is NewPackEvent.PreviewIconPackObject -> {
72-
navController.parent?.navigate(
72+
navController.navigate(
7373
dest = CodePreviewScreen,
7474
navArgs = it.code,
7575
)

tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/webimport/material/ui/MaterialTopActions.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ fun MaterialTopActions(
4141
items = categories,
4242
transform = { it.name },
4343
onSelectItem = onSelectCategory,
44+
maxPopupWidth = 120.dp,
4445
)
4546
},
4647
)
@@ -57,6 +58,7 @@ private fun MaterialTopActionsPreview() = PreviewTheme {
5758
categories = listOf(
5859
Category("Action"),
5960
Category("Alert"),
61+
Category("Audio & Video"),
6062
),
6163
iconFontFamily = fontFamily,
6264
onToggleSidePanel = {},

tools/idea-plugin/src/main/resources/messages/Valkyrie.properties

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ web.import.font.customize.dp.suffix={0} dp
127127
imagevectortoxml.picker.title=ImageVector to XML
128128
imagevectortoxml.picker.description=Drop ImageVector Kotlin file (.kt)
129129
imagevectortoxml.conversion.title=ImageVector to XML
130-
imagevectortoxml.edit.name.label=Icon Name
130+
ui.placeholder.error.context.menu.copy=Copy error message
131131
component.toolbar.back.tooltip=Back
132132
component.toolbar.close.tooltip=Close
133133
component.toolbar.chessboard.tooltip=Show pixel grid
@@ -150,7 +150,6 @@ accessibility.chessboard=Show pixel grid
150150
accessibility.clear=Clear
151151
accessibility.close=Close
152152
accessibility.copy=Copy
153-
accessibility.delete=Delete
154153
accessibility.edit=Edit
155154
accessibility.fit.content=Fit content
156155
accessibility.help=Help

0 commit comments

Comments
 (0)