89 lines
3.2 KiB
Kotlin
89 lines
3.2 KiB
Kotlin
@file:OptIn(ExperimentalComposeUiApi::class)
|
|
|
|
package com.jetpackduba.gitnuro.ui.dialogs
|
|
|
|
import androidx.compose.foundation.background
|
|
import androidx.compose.foundation.border
|
|
import androidx.compose.foundation.focusable
|
|
import androidx.compose.foundation.layout.Box
|
|
import androidx.compose.foundation.layout.fillMaxSize
|
|
import androidx.compose.foundation.layout.padding
|
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
import androidx.compose.material.MaterialTheme
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.runtime.LaunchedEffect
|
|
import androidx.compose.runtime.remember
|
|
import androidx.compose.ui.Alignment
|
|
import androidx.compose.ui.ExperimentalComposeUiApi
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.draw.clip
|
|
import androidx.compose.ui.focus.FocusRequester
|
|
import androidx.compose.ui.focus.focusRequester
|
|
import androidx.compose.ui.graphics.Color
|
|
import androidx.compose.ui.input.key.KeyEventType
|
|
import androidx.compose.ui.input.key.onPreviewKeyEvent
|
|
import androidx.compose.ui.input.key.type
|
|
import androidx.compose.ui.unit.*
|
|
import androidx.compose.ui.window.Popup
|
|
import androidx.compose.ui.window.PopupPositionProvider
|
|
import com.jetpackduba.gitnuro.keybindings.KeybindingOption
|
|
import com.jetpackduba.gitnuro.keybindings.matchesBinding
|
|
import com.jetpackduba.gitnuro.theme.dialogOverlay
|
|
|
|
@Composable
|
|
fun MaterialDialog(
|
|
alignment: Alignment = Alignment.Center,
|
|
paddingHorizontal: Dp = 16.dp,
|
|
paddingVertical: Dp = 16.dp,
|
|
background: Color = MaterialTheme.colors.surface,
|
|
onCloseRequested: () -> Unit = {},
|
|
content: @Composable () -> Unit
|
|
) {
|
|
Popup(
|
|
focusable = true,
|
|
popupPositionProvider = object : PopupPositionProvider {
|
|
override fun calculatePosition(
|
|
anchorBounds: IntRect,
|
|
windowSize: IntSize,
|
|
layoutDirection: LayoutDirection,
|
|
popupContentSize: IntSize
|
|
): IntOffset = IntOffset.Zero
|
|
}
|
|
) {
|
|
|
|
val focusRequester = remember { FocusRequester() }
|
|
|
|
LaunchedEffect(Unit) {
|
|
focusRequester.requestFocus()
|
|
}
|
|
|
|
Box(
|
|
modifier = Modifier
|
|
.fillMaxSize()
|
|
.background(MaterialTheme.colors.dialogOverlay)
|
|
.focusRequester(focusRequester)
|
|
.focusable()
|
|
.onPreviewKeyEvent { keyEvent ->
|
|
if (keyEvent.matchesBinding(KeybindingOption.EXIT) && keyEvent.type == KeyEventType.KeyDown) {
|
|
onCloseRequested()
|
|
true
|
|
} else
|
|
false
|
|
},
|
|
contentAlignment = alignment,
|
|
) {
|
|
Box(
|
|
modifier = Modifier
|
|
.border(1.dp, MaterialTheme.colors.onBackground.copy(alpha = 0.1f), RoundedCornerShape(8.dp))
|
|
.clip(RoundedCornerShape(8.dp))
|
|
.background(background)
|
|
.padding(
|
|
horizontal = paddingHorizontal,
|
|
vertical = paddingVertical,
|
|
)
|
|
) {
|
|
content()
|
|
}
|
|
}
|
|
}
|
|
} |