All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.com.ivianuu.essentials.ui.popup.PopupMenu.kt Maven / Gradle / Ivy

/*
 * Copyright 2022 Manuel Wrage. Use of this source code is governed by the Apache 2.0 license.
 */

package com.ivianuu.essentials.ui.popup

import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.ivianuu.essentials.ui.navigation.Key
import com.ivianuu.essentials.ui.navigation.KeyUiScope
import com.ivianuu.essentials.ui.navigation.LocalKeyUiElements
import com.ivianuu.essentials.ui.navigation.Navigator
import com.ivianuu.essentials.ui.navigation.pop
import com.ivianuu.injekt.Provide
import com.ivianuu.injekt.common.Element
import kotlinx.coroutines.launch

object PopupMenu {
  data class Item(
    val onSelected: () -> Unit,
    val content: @Composable () -> Unit
  )
}

@Composable fun PopupMenu(items: List) {
  Popup {
    val component = LocalKeyUiElements.current()
    val scope = rememberCoroutineScope()

    LazyColumn {
      // todo use items(items) { } once fixed
      items.forEach { item ->
        item {
          PopupMenuItem(
            onSelected = {
              scope.launch { component.navigator.pop(component.key) }
              item.onSelected()
            },
            content = item.content
          )
        }
      }
    }
  }
}

@Provide @Element
data class PopupMenuComponent(val key: Key<*>, val navigator: Navigator)

@Composable private fun PopupMenuItem(
  onSelected: () -> Unit,
  content: @Composable () -> Unit,
) {
  Box(
    modifier = Modifier.widthIn(min = 200.dp)
      .height(48.dp)
      .clickable(onClick = onSelected),
    contentAlignment = Alignment.CenterStart
  ) {
    Box(
      modifier = Modifier.padding(start = 16.dp, end = 16.dp),
      contentAlignment = Alignment.CenterStart
    ) {
      content()
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy