Skip to content

Commit 51d58a4

Browse files
committed
library: SearchBar: Add default icons on both sides of InputField
1 parent c40222b commit 51d58a4

File tree

3 files changed

+110
-39
lines changed

3 files changed

+110
-39
lines changed

example/src/commonMain/kotlin/MainPage.kt

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import androidx.compose.foundation.layout.height
1313
import androidx.compose.foundation.layout.navigationBars
1414
import androidx.compose.foundation.layout.only
1515
import androidx.compose.foundation.layout.padding
16-
import androidx.compose.foundation.layout.size
1716
import androidx.compose.foundation.layout.windowInsetsPadding
1817
import androidx.compose.foundation.lazy.LazyColumn
1918
import androidx.compose.runtime.Composable
@@ -22,20 +21,16 @@ import androidx.compose.runtime.mutableStateOf
2221
import androidx.compose.runtime.remember
2322
import androidx.compose.runtime.setValue
2423
import androidx.compose.ui.Modifier
25-
import androidx.compose.ui.draw.alpha
2624
import androidx.compose.ui.input.nestedscroll.nestedScroll
2725
import androidx.compose.ui.unit.dp
2826
import component.OtherComponent
2927
import component.TextComponent
3028
import top.yukonga.miuix.kmp.basic.BasicComponent
31-
import top.yukonga.miuix.kmp.basic.Icon
3229
import top.yukonga.miuix.kmp.basic.InputField
3330
import top.yukonga.miuix.kmp.basic.ScrollBehavior
3431
import top.yukonga.miuix.kmp.basic.SearchBar
3532
import top.yukonga.miuix.kmp.basic.SmallTitle
3633
import top.yukonga.miuix.kmp.basic.Text
37-
import top.yukonga.miuix.kmp.icon.MiuixIcons
38-
import top.yukonga.miuix.kmp.icon.icons.useful.Search
3934
import top.yukonga.miuix.kmp.theme.MiuixTheme
4035
import top.yukonga.miuix.kmp.utils.overScrollVertical
4136

@@ -101,18 +96,7 @@ fun MainPage(
10196
onSearch = { expanded = false },
10297
expanded = expanded,
10398
onExpandedChange = { expanded = it },
104-
label = "Search",
105-
leadingIcon = {
106-
Icon(
107-
modifier = Modifier
108-
.padding(start = 12.dp, end = 8.dp)
109-
.size(20.dp)
110-
.alpha(0.4f),
111-
imageVector = MiuixIcons.Useful.Search,
112-
tint = MiuixTheme.colorScheme.onSurfaceContainer,
113-
contentDescription = "Search"
114-
)
115-
},
99+
label = "Search"
116100
)
117101
},
118102
outsideRightAction = {
@@ -189,15 +173,7 @@ fun MainPage(
189173
onSearch = { expanded = false },
190174
expanded = expanded,
191175
onExpandedChange = { expanded = it },
192-
label = "Search",
193-
leadingIcon = {
194-
Icon(
195-
modifier = Modifier.padding(horizontal = 16.dp),
196-
imageVector = MiuixIcons.Useful.Search,
197-
tint = MiuixTheme.colorScheme.onSurfaceContainer,
198-
contentDescription = "Search"
199-
)
200-
},
176+
label = "Search"
201177
)
202178
},
203179
outsideRightAction = {

miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/basic/SearchBar.kt

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package top.yukonga.miuix.kmp.basic
22

33
import androidx.compose.animation.AnimatedVisibility
4+
import androidx.compose.animation.fadeIn
5+
import androidx.compose.animation.fadeOut
46
import androidx.compose.foundation.background
7+
import androidx.compose.foundation.clickable
58
import androidx.compose.foundation.interaction.Interaction
69
import androidx.compose.foundation.interaction.MutableInteractionSource
710
import androidx.compose.foundation.interaction.collectIsFocusedAsState
@@ -11,6 +14,7 @@ import androidx.compose.foundation.layout.ColumnScope
1114
import androidx.compose.foundation.layout.Row
1215
import androidx.compose.foundation.layout.fillMaxWidth
1316
import androidx.compose.foundation.layout.padding
17+
import androidx.compose.foundation.shape.CircleShape
1418
import androidx.compose.foundation.text.BasicTextField
1519
import androidx.compose.foundation.text.KeyboardActions
1620
import androidx.compose.foundation.text.KeyboardOptions
@@ -20,6 +24,7 @@ import androidx.compose.runtime.derivedStateOf
2024
import androidx.compose.runtime.remember
2125
import androidx.compose.ui.Alignment
2226
import androidx.compose.ui.Modifier
27+
import androidx.compose.ui.draw.clip
2328
import androidx.compose.ui.focus.FocusRequester
2429
import androidx.compose.ui.focus.focusRequester
2530
import androidx.compose.ui.focus.onFocusChanged
@@ -32,6 +37,9 @@ import androidx.compose.ui.unit.DpSize
3237
import androidx.compose.ui.unit.dp
3338
import androidx.compose.ui.zIndex
3439
import kotlinx.coroutines.delay
40+
import top.yukonga.miuix.kmp.icon.MiuixIcons
41+
import top.yukonga.miuix.kmp.icon.icons.basic.SearchCleanup
42+
import top.yukonga.miuix.kmp.icon.icons.useful.Search
3543
import top.yukonga.miuix.kmp.theme.MiuixTheme
3644
import top.yukonga.miuix.kmp.utils.BackHandler
3745
import top.yukonga.miuix.kmp.utils.SmoothRoundedCornerShape
@@ -130,11 +138,34 @@ fun InputField(
130138
@Suppress("NAME_SHADOWING")
131139
val interactionSource = interactionSource ?: remember { MutableInteractionSource() }
132140

133-
val paddingModifier = remember(insideMargin, leadingIcon, trailingIcon) {
134-
if (leadingIcon == null && trailingIcon == null) Modifier.padding(horizontal = insideMargin.width, vertical = insideMargin.height)
135-
else if (leadingIcon == null) Modifier.padding(start = insideMargin.width).padding(vertical = insideMargin.height)
136-
else if (trailingIcon == null) Modifier.padding(end = insideMargin.width).padding(vertical = insideMargin.height)
137-
else Modifier.padding(vertical = insideMargin.height)
141+
@Suppress("NAME_SHADOWING")
142+
val leadingIcon = leadingIcon ?: {
143+
Icon(
144+
modifier = Modifier.padding(start = 16.dp, end = 8.dp),
145+
imageVector = MiuixIcons.Useful.Search,
146+
tint = MiuixTheme.colorScheme.onSurfaceContainer,
147+
contentDescription = "Search"
148+
)
149+
}
150+
151+
@Suppress("NAME_SHADOWING")
152+
val trailingIcon = trailingIcon ?: {
153+
AnimatedVisibility(
154+
visible = query.isNotEmpty(),
155+
enter = fadeIn(),
156+
exit = fadeOut(),
157+
) {
158+
Box(
159+
modifier = Modifier.padding(start = 8.dp, end = 16.dp),
160+
) {
161+
Icon(
162+
modifier = Modifier.clip(CircleShape).clickable { onQueryChange("") },
163+
imageVector = MiuixIcons.Basic.SearchCleanup,
164+
tint = MiuixTheme.colorScheme.onSurfaceContainer,
165+
contentDescription = "Search Cleanup"
166+
)
167+
}
168+
}
138169
}
139170

140171
val focused = interactionSource.collectIsFocusedAsState().value
@@ -174,25 +205,20 @@ fun InputField(
174205
modifier = Modifier.fillMaxWidth(),
175206
verticalAlignment = Alignment.CenterVertically
176207
) {
177-
if (leadingIcon != null) {
178-
leadingIcon()
179-
}
208+
leadingIcon()
180209
Box(
181210
modifier = Modifier
182211
.weight(1f)
183-
.then(paddingModifier),
212+
.padding(vertical = insideMargin.height),
184213
contentAlignment = Alignment.CenterStart
185214
) {
186215
Text(
187216
text = if (!(query.isNotEmpty() || expanded)) label else "",
188217
color = MiuixTheme.colorScheme.onSurfaceContainerHigh
189218
)
190-
191219
innerTextField()
192220
}
193-
if (trailingIcon != null) {
194-
trailingIcon()
195-
}
221+
trailingIcon()
196222
}
197223
}
198224
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package top.yukonga.miuix.kmp.icon.icons.basic
2+
3+
import androidx.compose.ui.graphics.Color
4+
import androidx.compose.ui.graphics.PathFillType
5+
import androidx.compose.ui.graphics.SolidColor
6+
import androidx.compose.ui.graphics.vector.ImageVector
7+
import androidx.compose.ui.graphics.vector.path
8+
import androidx.compose.ui.unit.dp
9+
import top.yukonga.miuix.kmp.icon.MiuixIcons
10+
11+
val MiuixIcons.Basic.SearchCleanup: ImageVector
12+
get() {
13+
if (_searchCleanup != null) return _searchCleanup!!
14+
_searchCleanup = ImageVector.Builder("SearchCleanup", 18.199984f.dp, 18.199984f.dp, 68f, 68f).apply {
15+
path(
16+
fill = SolidColor(Color.White),
17+
fillAlpha = 0.06f,
18+
pathFillType = PathFillType.NonZero
19+
) {
20+
moveTo(34f, 66f)
21+
curveTo(51.6731f, 66f, 66f, 51.6731f, 66f, 34f)
22+
curveTo(66f, 16.3269f, 51.6731f, 2f, 34f, 2f)
23+
curveTo(16.3269f, 2f, 2f, 16.3269f, 2f, 34f)
24+
curveTo(2f, 51.6731f, 16.3269f, 66f, 34f, 66f)
25+
close()
26+
}
27+
path(
28+
fill = SolidColor(Color.Transparent),
29+
stroke = SolidColor(Color.Black),
30+
strokeAlpha = 0.1f,
31+
strokeLineWidth = 0.0f,
32+
pathFillType = PathFillType.NonZero
33+
) {
34+
moveTo(34f, 67f)
35+
curveTo(52.2254f, 67f, 67f, 52.2254f, 67f, 34f)
36+
curveTo(67f, 15.7746f, 52.2254f, 1f, 34f, 1f)
37+
curveTo(15.7746f, 1f, 1f, 15.7746f, 1f, 34f)
38+
curveTo(1f, 52.2254f, 15.7746f, 67f, 34f, 67f)
39+
close()
40+
}
41+
path(
42+
fill = SolidColor(Color.White),
43+
fillAlpha = 0.3f,
44+
pathFillType = PathFillType.EvenOdd
45+
) {
46+
moveTo(44.6066f, 27.8492f)
47+
curveTo(45.7782f, 26.6777f, 45.7782f, 24.7782f, 44.6066f, 23.6066f)
48+
curveTo(43.435f, 22.435f, 41.5355f, 22.435f, 40.364f, 23.6066f)
49+
lineTo(34f, 29.9706f)
50+
lineTo(27.636f, 23.6066f)
51+
curveTo(26.4645f, 22.435f, 24.565f, 22.435f, 23.3934f, 23.6066f)
52+
curveTo(22.2218f, 24.7782f, 22.2218f, 26.6777f, 23.3934f, 27.8492f)
53+
lineTo(29.7574f, 34.2132f)
54+
lineTo(23.3934f, 40.5772f)
55+
curveTo(22.2218f, 41.7487f, 22.2218f, 43.6482f, 23.3934f, 44.8198f)
56+
curveTo(24.565f, 45.9914f, 26.4645f, 45.9914f, 27.636f, 44.8198f)
57+
lineTo(34f, 38.4558f)
58+
lineTo(40.364f, 44.8198f)
59+
curveTo(41.5355f, 45.9914f, 43.435f, 45.9914f, 44.6066f, 44.8198f)
60+
curveTo(45.7782f, 43.6482f, 45.7782f, 41.7487f, 44.6066f, 40.5772f)
61+
lineTo(38.2426f, 34.2132f)
62+
lineTo(44.6066f, 27.8492f)
63+
close()
64+
}
65+
}.build()
66+
return _searchCleanup!!
67+
}
68+
69+
private var _searchCleanup: ImageVector? = null

0 commit comments

Comments
 (0)