Skip to content

Commit

Permalink
feat: 更新“重新选择签名”的页面样式及提示
Browse files Browse the repository at this point in the history
  • Loading branch information
jixiaoyong committed Jan 12, 2024
1 parent 6c19a7e commit 00cb33f
Show file tree
Hide file tree
Showing 2 changed files with 132 additions and 48 deletions.
95 changes: 47 additions & 48 deletions src/main/kotlin/io/github/jixiaoyong/pages/signInfos/SignInfos.kt
@@ -1,12 +1,13 @@
package io.github.jixiaoyong.pages.signInfos

import androidx.compose.desktop.ui.tooling.preview.Preview
import androidx.compose.foundation.*
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.interaction.collectIsHoveredAsState
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Delete
Expand All @@ -25,16 +26,14 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.style.LineBreak
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.round
import androidx.compose.ui.window.Popup
import androidx.compose.ui.unit.sp
import io.github.jixiaoyong.utils.FileChooseUtil
import io.github.jixiaoyong.utils.SettingsTool
import io.github.jixiaoyong.utils.StorageKeys
import io.github.jixiaoyong.utils.gson
import io.github.jixiaoyong.widgets.ButtonWidget
import io.github.jixiaoyong.widgets.HoverableTooltip
import kotlinx.coroutines.launch

/**
Expand Down Expand Up @@ -68,10 +67,16 @@ fun PageSignInfo(window: ComposeWindow, settings: SettingsTool, newSignInfo: Mut
.verticalScroll(rememberScrollState())
) {

var selectedSignInfoLayoutOffset by remember { mutableStateOf(Offset.Zero) }

Row(
modifier = Modifier.padding(vertical = 10.dp)
.background(MaterialTheme.colors.surface, shape = RoundedCornerShape(15.dp))
.padding(horizontal = 15.dp, vertical = 10.dp).fillMaxWidth(),
.padding(horizontal = 15.dp, vertical = 10.dp)
.fillMaxWidth()
.onGloballyPositioned {
selectedSignInfoLayoutOffset = it.positionInParent() + Offset(0f, it.size.height.toFloat())
},
verticalAlignment = Alignment.CenterVertically
) {
Text(
Expand All @@ -87,7 +92,7 @@ fun PageSignInfo(window: ComposeWindow, settings: SettingsTool, newSignInfo: Mut
modifier = Modifier.weight(1f)
)
ButtonWidget(onClick = {
dropdownMenu.status = DropdownMenuState.Status.Open(Offset(50.0f, 50.0f))
dropdownMenu.status = DropdownMenuState.Status.Open(selectedSignInfoLayoutOffset.copy(x = 0f))
}, title = "重新选择签名")
}

Expand All @@ -97,22 +102,35 @@ fun PageSignInfo(window: ComposeWindow, settings: SettingsTool, newSignInfo: Mut
DropdownMenuItem(onClick = {
onSignInfoChanged(settings, it)
dropdownMenu.status = DropdownMenuState.Status.Closed
}) {
Row(verticalAlignment = Alignment.CenterVertically) {
Text(text = it.keyNickName)
Spacer(modifier = Modifier.weight(1f).widthIn(100.dp))
IconButton(onClick = {
val tempList = signInfoList.toMutableList()
tempList.remove(it)
settings.save(
StorageKeys.SIGN_INFO_LIST,
gson.toJson(tempList)
)
if (it == selectedSignInfo) {
onSignInfoChanged(settings, null)
}, modifier = Modifier.widthIn(450.dp, 600.dp)) {
Row(verticalAlignment = Alignment.CenterVertically,) {
Text(
text = it.keyNickName, modifier = Modifier.weight(2f), maxLines = 1,
)
Text(
text = it.keyStorePath,
fontSize = 10.sp,
modifier = Modifier.weight(6f).padding(horizontal = 5.dp)
)
HoverableTooltip(
description = "删除此工具存储的签名信息,不会删除apk签名文件"
) { modifier ->
IconButton(
modifier = modifier,
onClick = {
val tempList = signInfoList.toMutableList()
tempList.remove(it)
settings.save(
StorageKeys.SIGN_INFO_LIST,
gson.toJson(tempList)
)
if (it == selectedSignInfo) {
onSignInfoChanged(settings, null)
}
},
) {
Icon(Icons.Default.Delete, "")
}
}) {
Icon(Icons.Default.Delete, "")
}
IconButton(onClick = {
newSignInfo.value = it
Expand Down Expand Up @@ -231,11 +249,6 @@ private fun SignInfoItem(
description: String? = null,
onChange: (String) -> Unit
) {
val interactionSource = remember { MutableInteractionSource() }
val isHovered = interactionSource.collectIsHoveredAsState().value
var iconOffset by remember { mutableStateOf(Offset.Zero) }
var iconSize by remember { mutableStateOf(IntSize.Zero) }
val isShowDescription = description.isNullOrBlank().not()

Row(
modifier = modifier.padding(horizontal = 10.dp, vertical = 5.dp).fillMaxWidth(),
Expand All @@ -244,26 +257,12 @@ private fun SignInfoItem(

Row(modifier = Modifier.weight(0.25f)) {
Text(name)
if (isShowDescription) Icon(
Icons.Default.Info,
contentDescription = "description information",
modifier = Modifier.hoverable(interactionSource).onGloballyPositioned {
iconOffset = it.positionInParent()
iconSize = it.size
}
)
if (isShowDescription && isHovered) Popup(
offset = iconOffset.round() + IntOffset(
iconSize.width,
0
if (!description.isNullOrBlank()) HoverableTooltip(description = description) { modifier ->
Icon(
Icons.Default.Info,
contentDescription = "description information",
modifier = modifier
)
) {
Row(
modifier = Modifier.background(
color = MaterialTheme.colors.onSurface.copy(alpha = 0.5f),
shape = RoundedCornerShape(5.dp)
).padding(horizontal = 5.dp, vertical = 5.dp),
) { Text(description ?: "", style = TextStyle(color = Color.White.copy(alpha = 0.5f))) }
}
}
Row(modifier = Modifier.weight(0.75f), verticalAlignment = Alignment.CenterVertically) {
Expand Down
85 changes: 85 additions & 0 deletions src/main/kotlin/io/github/jixiaoyong/widgets/HoverableToolTip.kt
@@ -0,0 +1,85 @@
package io.github.jixiaoyong.widgets

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.pointer.PointerEventType
import androidx.compose.ui.input.pointer.onPointerEvent
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.layout.positionInParent
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.round
import androidx.compose.ui.window.Popup

/**
* @author : jixiaoyong
* @description :根据鼠标是否悬停在某个组件上来显示或隐藏 Tooltip。
*
* @email : jixiaoyong1995@gmail.com
* @date : 12/1/2024
*/
@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun HoverableTooltip(tooltip: @Composable () -> Unit, content: @Composable (modifier: Modifier) -> Unit) {
var isHovered by remember { mutableStateOf(false) }
var iconOffset by remember { mutableStateOf(Offset.Zero) }
var iconSize by remember { mutableStateOf(IntSize.Zero) }
Box(
Modifier.onPointerEvent(
PointerEventType.Move
) {
}
.onPointerEvent(PointerEventType.Enter) {
isHovered = true
}
.onPointerEvent(PointerEventType.Exit) {
isHovered = false
}
) {
content(Modifier.onGloballyPositioned {
iconOffset = it.positionInParent()
iconSize = it.size
})

if (isHovered) Popup(
offset = iconOffset.round() + IntOffset(
iconSize.width,
0
)
) {
tooltip()
}
}
}


@Composable
fun HoverableTooltip(description: String?, content: @Composable (modifier: Modifier) -> Unit) {
if (description.isNullOrBlank()) {
content(Modifier)
} else {
HoverableTooltip(
tooltip = {
Row(
modifier = Modifier.background(
color = MaterialTheme.colors.onSurface.copy(alpha = 0.5f),
shape = RoundedCornerShape(5.dp)
).padding(horizontal = 5.dp, vertical = 5.dp),
) { Text(description, style = TextStyle(color = Color.White.copy(alpha = 0.5f))) }
},
content = content
)
}
}

0 comments on commit 00cb33f

Please sign in to comment.