Runt
2025-08-30 d974ad35af0aa4585091303256dbe221fe04a1fb
libmvi/src/main/java/com/runt/open/mvi/views/PublicViews.kt
@@ -1,5 +1,6 @@
package com.runt.open.mvi.views
import android.util.Log
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
@@ -13,9 +14,14 @@
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Card
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@@ -23,7 +29,10 @@
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.Layout
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.window.Dialog
@@ -37,6 +46,32 @@
 * @purpose
 * @date 5/18/25
 */
/**
 * 超出父容器
 */
@Composable
fun UnboundedBox(
    modifier: Modifier = Modifier,
    content: @Composable () -> Unit
) {
    Layout(content, modifier) { measurables, parent ->
        // 给子树宽高用"无限"上限测量
        val loose = Constraints(
            minWidth = 0, minHeight = 0,
            maxWidth = Int.MAX_VALUE, maxHeight = Int.MAX_VALUE
        )
        val placeables = measurables.map { it.measure(loose) }
        // 自己仍按父约束的大小布局(不撑爆父)
        val w = parent.maxWidth
        val h = parent.maxHeight
        layout(w, h) {
            // 放在(0,0)。如需往外探出,可用负偏移:placeRelative(-50, 0)
            placeables.forEach { it.placeRelative(0, 0) }
        }
    }
}
@Composable
fun LoadingDialog( loadingState : LoadingState) {
@@ -66,10 +101,12 @@
fun MessageDialog(message : MessageState){
    if(message.isVisible){
        Dialog(onDismissRequest = {
            if(message.cancelDissmiss){
            //系统响应
            Log.i("PublicViews" , "MessageDialog: onDismiss")
            if(message.touchOutside){
                message.setDismiss.invoke()
                message.onDismissRequest.invoke()
            }
            message.onDismissRequest
        }) {
            Card(
                modifier = Modifier
@@ -80,7 +117,8 @@
            ) {
                Column(modifier = Modifier.wrapContentHeight()){
                    Text(text = message.title, fontSize = 16.sp,
                        modifier = Modifier.fillMaxWidth()
                        modifier = Modifier
                            .fillMaxWidth()
                            .padding(top = 20.dp , start = 20.dp)
                            .wrapContentSize(Alignment.Center),
                        textAlign = TextAlign.Center)
@@ -89,7 +127,7 @@
                        modifier = Modifier
                            .fillMaxWidth()
                            .wrapContentSize()
                            .padding(top = 30.dp , bottom = 20.dp, start = 14.dp, end = 15.dp)
                            .padding(top = 30.dp , bottom = 20.dp , start = 14.dp , end = 15.dp)
                            .wrapContentSize(Alignment.Center),
                        textAlign = TextAlign.Center,
                    )
@@ -99,9 +137,15 @@
                            Button(onClick = {
                                if(message.cancelDissmiss){
                                    message.setDismiss.invoke()
                                    message.onDismissRequest.invoke()
                                }
                                message.onDismissRequest
                            }) {
                                message.onCancelRequest.invoke()
                            },
                                colors = ButtonDefaults.buttonColors(
                                    containerColor = Color.Gray,      // 背景色
                                    contentColor = Color.White,              // 文字/图标颜色
                                    disabledContainerColor = Color.Gray      // 禁用时背景色
                                ),) {
                                Text(text = message.cancelText)
                            }
                        }
@@ -109,8 +153,9 @@
                        Button(onClick = {
                            if(message.confirmDissmiss){
                                message.setDismiss.invoke()
                                message.onDismissRequest.invoke()
                            }
                            message.onConfirmRequest
                            message.onConfirmRequest.invoke()
                        }) {
                            Text(text = message.confirmText)
                        }
@@ -128,8 +173,10 @@
            alignment = Alignment.TopCenter,
        ) {
            Surface(
                modifier = Modifier.fillMaxWidth()
                    .wrapContentHeight().padding(10.dp),
                modifier = Modifier
                    .fillMaxWidth()
                    .wrapContentHeight()
                    .padding(10.dp),
                shadowElevation = 2.dp,
                border = BorderStroke(1.dp, Color.Gray) ,
                shape = RoundedCornerShape(8.dp)
@@ -146,4 +193,28 @@
            }
        }
    }
}
@Composable
fun TitleBarView(title:String,onBackClick:()->Unit){
    Row(modifier = Modifier
        .wrapContentSize(Alignment.Center)
        .height(50.dp), verticalAlignment = Alignment.CenterVertically) {
        Spacer(modifier = Modifier.size(15.dp))
        IconButton(onClick = onBackClick, modifier = Modifier.size(30.dp,30.dp)) {
            Icon(Icons.Default.ArrowBack, contentDescription = null, tint = Color.Black)
        }
        Text(text = "${title}", modifier = Modifier
            .weight(1f)
            .fillMaxWidth()
            .wrapContentSize(Alignment.Center))
        Spacer(modifier = Modifier.size(30.dp))
        Spacer(modifier = Modifier.size(15.dp))
    }
}
@Preview
@Composable
fun previewLayout(){
    MessageDialog(message = MessageState(cancelText = "lll"))
}