Skip to content

Commit 0f08685

Browse files
committed
perf: PerfTooltipBox
1 parent 1eda35f commit 0f08685

16 files changed

Lines changed: 166 additions & 88 deletions

app/src/main/kotlin/li/songe/gkd/ui/AdvancedPage.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,7 @@ fun AdvancedPage() {
331331
.iconTextSize(textStyle = MaterialTheme.typography.titleSmall),
332332
imageVector = PerfIcon.Api,
333333
tint = MaterialTheme.colorScheme.primary,
334+
contentDescription = "Shizuku 状态",
334335
)
335336
}
336337
val shizukuGranted by shizukuGrantedState.stateFlow.collectAsState()
@@ -532,6 +533,7 @@ fun AdvancedPage() {
532533
PerfIcon(
533534
modifier = Modifier.size(20.dp),
534535
id = SafeR.ic_page_info,
536+
contentDescription = "截屏快照设置",
535537
)
536538
}
537539
},

app/src/main/kotlin/li/songe/gkd/ui/AppConfigPage.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -276,9 +276,8 @@ fun AppConfigPage(appId: String, focusLog: ActionLog? = null) {
276276
)
277277
)
278278
},
279-
content = {
280-
PerfIcon(imageVector = PerfIcon.Add)
281-
}
279+
imageVector = PerfIcon.Add,
280+
contentDescription = "添加规则"
282281
)
283282
},
284283
) { contentPadding ->

app/src/main/kotlin/li/songe/gkd/ui/BlockA11yAppListPage.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -269,9 +269,8 @@ fun BlockA11yAppListPage() {
269269
onClick = {
270270
editable = !editable
271271
},
272-
content = {
273-
PerfIcon(imageVector = PerfIcon.Edit)
274-
}
272+
imageVector = PerfIcon.Edit,
273+
contentDescription = "编辑白名单文本"
275274
)
276275
},
277276
) { contentPadding ->

app/src/main/kotlin/li/songe/gkd/ui/SubsAppGroupListPage.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -257,11 +257,8 @@ fun SubsAppGroupListPage(
257257
)
258258
)
259259
},
260-
content = {
261-
PerfIcon(
262-
imageVector = PerfIcon.Add,
263-
)
264-
}
260+
contentDescription = "添加规则",
261+
imageVector = PerfIcon.Add,
265262
)
266263
}
267264
}) { contentPadding ->

app/src/main/kotlin/li/songe/gkd/ui/SubsGlobalGroupExcludePage.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -272,9 +272,8 @@ fun SubsGlobalGroupExcludePage(subsItemId: Long, groupKey: Int) {
272272
onClick = {
273273
editable = !editable
274274
},
275-
content = {
276-
PerfIcon(imageVector = PerfIcon.Edit)
277-
}
275+
imageVector = PerfIcon.Edit,
276+
contentDescription = "编辑禁用名单"
278277
)
279278
}
280279
) { contentPadding ->

app/src/main/kotlin/li/songe/gkd/ui/SubsGlobalGroupListPage.kt

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -220,19 +220,20 @@ fun SubsGlobalGroupListPage(subsItemId: Long, focusGroupKey: Int? = null) {
220220
},
221221
floatingActionButton = {
222222
if (editable) {
223-
AnimationFloatingActionButton(visible = !isSelectedMode, onClick = {
224-
mainVm.navigatePage(
225-
UpsertRuleGroupPageDestination(
226-
subsId = subsItemId,
227-
groupKey = null,
228-
appId = null,
223+
AnimationFloatingActionButton(
224+
visible = !isSelectedMode,
225+
onClick = {
226+
mainVm.navigatePage(
227+
UpsertRuleGroupPageDestination(
228+
subsId = subsItemId,
229+
groupKey = null,
230+
appId = null,
231+
)
229232
)
230-
)
231-
}) {
232-
PerfIcon(
233-
imageVector = PerfIcon.Add,
234-
)
235-
}
233+
},
234+
imageVector = PerfIcon.Add,
235+
contentDescription = "添加规则"
236+
)
236237
}
237238
},
238239
) { paddingValues ->

app/src/main/kotlin/li/songe/gkd/ui/component/AnimatedIcon.kt

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import androidx.annotation.DrawableRes
44
import androidx.compose.animation.graphics.res.animatedVectorResource
55
import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter
66
import androidx.compose.animation.graphics.vector.AnimatedImageVector
7-
import androidx.compose.material3.*
7+
import androidx.compose.material3.Icon
8+
import androidx.compose.material3.LocalContentColor
89
import androidx.compose.runtime.Composable
910
import androidx.compose.ui.Modifier
1011
import androidx.compose.ui.graphics.Color
@@ -23,13 +24,8 @@ fun AnimatedIcon(
2324
animation,
2425
atEnd,
2526
)
26-
TooltipBox(
27-
tooltip = { PlainTooltip { Text(text = contentDescription.orEmpty()) } },
28-
state = rememberTooltipState(),
29-
enableUserInput = !contentDescription.isNullOrEmpty(),
30-
positionProvider = TooltipDefaults.rememberTooltipPositionProvider(
31-
TooltipAnchorPosition.Start
32-
)
27+
PerfTooltipBox(
28+
tooltipText = contentDescription,
3329
) {
3430
Icon(
3531
modifier = modifier,

app/src/main/kotlin/li/songe/gkd/ui/component/AnimationFloatingActionButton.kt

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import androidx.compose.runtime.remember
1313
import androidx.compose.runtime.setValue
1414
import androidx.compose.ui.Modifier
1515
import androidx.compose.ui.graphics.graphicsLayer
16+
import androidx.compose.ui.graphics.vector.ImageVector
1617
import androidx.compose.ui.platform.LocalDensity
1718
import androidx.compose.ui.semantics.contentDescription
1819
import androidx.compose.ui.semantics.onClick
@@ -24,12 +25,12 @@ private const val elevationDurationMillis = 50
2425

2526
@Composable
2627
fun AnimationFloatingActionButton(
27-
modifier: Modifier = Modifier,
28-
onClickLabel: String? = null,
29-
contentDescription: String? = null,
3028
visible: Boolean,
3129
onClick: () -> Unit,
32-
content: @Composable () -> Unit,
30+
imageVector: ImageVector,
31+
modifier: Modifier = Modifier,
32+
onClickLabel: String? = null,
33+
contentDescription: String? = getIconDefaultDesc(imageVector),
3334
) {
3435
val density = LocalDensity.current
3536
val maxTranslationX = remember(density.density) { density.run { 24.dp.toPx() } }
@@ -63,23 +64,27 @@ fun AnimationFloatingActionButton(
6364
}
6465
}
6566
if (innerVisible) {
66-
FloatingActionButton(
67-
modifier = modifier
68-
.graphicsLayer(
69-
alpha = percent.value,
70-
translationX = (1f - percent.value) * maxTranslationX
71-
)
72-
.semantics {
73-
if (contentDescription != null) {
74-
this.contentDescription = contentDescription
75-
}
76-
if (onClickLabel != null) {
77-
this.onClick(label = onClickLabel, action = null)
78-
}
67+
PerfTooltipBox(contentDescription) {
68+
FloatingActionButton(
69+
modifier = modifier
70+
.graphicsLayer(
71+
alpha = percent.value,
72+
translationX = (1f - percent.value) * maxTranslationX
73+
)
74+
.semantics {
75+
if (contentDescription != null) {
76+
this.contentDescription = contentDescription
77+
}
78+
if (onClickLabel != null) {
79+
this.onClick(label = onClickLabel, action = null)
80+
}
81+
},
82+
elevation = FloatingActionButtonDefaults.elevation(defaultElevation = (defaultElevation.value * 6f).dp),
83+
onClick = throttle(onClick),
84+
content = {
85+
PerfIcon(imageVector = imageVector, contentDescription = null)
7986
},
80-
elevation = FloatingActionButtonDefaults.elevation(defaultElevation = (defaultElevation.value * 6f).dp),
81-
onClick = throttle(onClick),
82-
content = content,
83-
)
87+
)
88+
}
8489
}
8590
}

app/src/main/kotlin/li/songe/gkd/ui/component/PerfIcon.kt

Lines changed: 56 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,56 @@ package li.songe.gkd.ui.component
22

33
import androidx.annotation.DrawableRes
44
import androidx.compose.material.icons.Icons
5-
import androidx.compose.material.icons.automirrored.filled.*
5+
import androidx.compose.material.icons.automirrored.filled.ArrowBack
6+
import androidx.compose.material.icons.automirrored.filled.ArrowForward
7+
import androidx.compose.material.icons.automirrored.filled.FormatListBulleted
8+
import androidx.compose.material.icons.automirrored.filled.KeyboardArrowRight
9+
import androidx.compose.material.icons.automirrored.filled.Sort
610
import androidx.compose.material.icons.automirrored.outlined.HelpOutline
711
import androidx.compose.material.icons.automirrored.outlined.OpenInNew
8-
import androidx.compose.material.icons.filled.*
9-
import androidx.compose.material.icons.outlined.*
10-
import androidx.compose.material3.*
12+
import androidx.compose.material.icons.filled.Android
13+
import androidx.compose.material.icons.filled.Apps
14+
import androidx.compose.material.icons.filled.Autorenew
15+
import androidx.compose.material.icons.filled.Block
16+
import androidx.compose.material.icons.filled.CenterFocusWeak
17+
import androidx.compose.material.icons.filled.Close
18+
import androidx.compose.material.icons.filled.History
19+
import androidx.compose.material.icons.filled.Memory
20+
import androidx.compose.material.icons.filled.MoreVert
21+
import androidx.compose.material.icons.filled.Share
22+
import androidx.compose.material.icons.filled.UnfoldMore
23+
import androidx.compose.material.icons.filled.WarningAmber
24+
import androidx.compose.material.icons.outlined.Add
25+
import androidx.compose.material.icons.outlined.Api
26+
import androidx.compose.material.icons.outlined.ArrowDownward
27+
import androidx.compose.material.icons.outlined.AutoMode
28+
import androidx.compose.material.icons.outlined.Check
29+
import androidx.compose.material.icons.outlined.ContentCopy
30+
import androidx.compose.material.icons.outlined.DarkMode
31+
import androidx.compose.material.icons.outlined.Delete
32+
import androidx.compose.material.icons.outlined.Eco
33+
import androidx.compose.material.icons.outlined.Edit
34+
import androidx.compose.material.icons.outlined.Equalizer
35+
import androidx.compose.material.icons.outlined.Home
36+
import androidx.compose.material.icons.outlined.Image
37+
import androidx.compose.material.icons.outlined.Info
38+
import androidx.compose.material.icons.outlined.Layers
39+
import androidx.compose.material.icons.outlined.LightMode
40+
import androidx.compose.material.icons.outlined.Lock
41+
import androidx.compose.material.icons.outlined.Notifications
42+
import androidx.compose.material.icons.outlined.RocketLaunch
43+
import androidx.compose.material.icons.outlined.Save
44+
import androidx.compose.material.icons.outlined.Settings
45+
import androidx.compose.material.icons.outlined.TextFields
46+
import androidx.compose.material.icons.outlined.Title
47+
import androidx.compose.material.icons.outlined.ToggleOff
48+
import androidx.compose.material.icons.outlined.ToggleOn
49+
import androidx.compose.material.icons.outlined.VerifiedUser
50+
import androidx.compose.material3.Icon
51+
import androidx.compose.material3.IconButton
52+
import androidx.compose.material3.IconButtonColors
53+
import androidx.compose.material3.IconButtonDefaults
54+
import androidx.compose.material3.LocalContentColor
1155
import androidx.compose.runtime.Composable
1256
import androidx.compose.ui.Modifier
1357
import androidx.compose.ui.graphics.Color
@@ -21,14 +65,9 @@ fun PerfIcon(
2165
imageVector: ImageVector,
2266
modifier: Modifier = Modifier,
2367
tint: Color = LocalContentColor.current,
24-
contentDescription: String? = getDefaultDesc(imageVector),
25-
) = TooltipBox(
26-
tooltip = { PlainTooltip { Text(text = contentDescription.orEmpty()) } },
27-
state = rememberTooltipState(),
28-
enableUserInput = !contentDescription.isNullOrEmpty(),
29-
positionProvider = TooltipDefaults.rememberTooltipPositionProvider(
30-
TooltipAnchorPosition.Start
31-
)
68+
contentDescription: String? = getIconDefaultDesc(imageVector),
69+
) = PerfTooltipBox(
70+
tooltipText = contentDescription,
3271
) {
3372
Icon(
3473
imageVector = imageVector,
@@ -45,7 +84,7 @@ fun PerfIconButton(
4584
modifier: Modifier = Modifier,
4685
enabled: Boolean = true,
4786
colors: IconButtonColors = IconButtonDefaults.iconButtonColors(),
48-
contentDescription: String? = getDefaultDesc(imageVector),
87+
contentDescription: String? = getIconDefaultDesc(imageVector),
4988
onClickLabel: String? = null,
5089
tint: Color = LocalContentColor.current,
5190
) = IconButton(
@@ -71,13 +110,8 @@ fun PerfIcon(
71110
modifier: Modifier = Modifier,
72111
tint: Color = LocalContentColor.current,
73112
contentDescription: String? = null,
74-
) = TooltipBox(
75-
tooltip = { PlainTooltip { Text(text = contentDescription.orEmpty()) } },
76-
state = rememberTooltipState(),
77-
enableUserInput = !contentDescription.isNullOrEmpty(),
78-
positionProvider = TooltipDefaults.rememberTooltipPositionProvider(
79-
TooltipAnchorPosition.Start
80-
)
113+
) = PerfTooltipBox(
114+
tooltipText = contentDescription,
81115
) {
82116
Icon(
83117
painter = painterResource(id),
@@ -112,7 +146,7 @@ fun PerfIconButton(
112146
)
113147
}
114148

115-
private fun getDefaultDesc(imageVector: ImageVector): String? = when (imageVector) {
149+
fun getIconDefaultDesc(imageVector: ImageVector): String? = when (imageVector) {
116150
PerfIcon.Add -> "添加"
117151
PerfIcon.Edit -> "编辑"
118152
PerfIcon.Save -> "保存"
@@ -128,6 +162,7 @@ private fun getDefaultDesc(imageVector: ImageVector): String? = when (imageVecto
128162
PerfIcon.Sort -> "排序筛选"
129163
PerfIcon.OpenInNew -> "新页面打开"
130164
PerfIcon.ContentCopy -> "复制文本"
165+
PerfIcon.MoreVert -> "更多操作"
131166
else -> null
132167
}
133168

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package li.songe.gkd.ui.component
2+
3+
import androidx.compose.material3.PlainTooltip
4+
import androidx.compose.material3.Text
5+
import androidx.compose.material3.TooltipAnchorPosition
6+
import androidx.compose.material3.TooltipBox
7+
import androidx.compose.material3.TooltipDefaults
8+
import androidx.compose.material3.rememberTooltipState
9+
import androidx.compose.runtime.Composable
10+
11+
@Composable
12+
fun PerfTooltipBox(tooltipText: String?, content: @Composable () -> Unit) {
13+
if (tooltipText.isNullOrEmpty()) {
14+
content()
15+
} else {
16+
TooltipBox(
17+
tooltip = { PlainTooltip { Text(text = tooltipText) } },
18+
state = rememberTooltipState(),
19+
positionProvider = TooltipDefaults.rememberTooltipPositionProvider(
20+
TooltipAnchorPosition.Start
21+
),
22+
content = content,
23+
)
24+
}
25+
}

0 commit comments

Comments
 (0)