mirror of
https://github.com/anyproto/anytype-kotlin.git
synced 2025-06-08 05:47:05 +09:00
DROID-3571 Primitives | Space types and properties, sections ui (#2319)
This commit is contained in:
parent
d0c3412e8c
commit
f69d922791
12 changed files with 425 additions and 86 deletions
|
@ -20,6 +20,7 @@ import androidx.compose.ui.unit.dp
|
|||
import com.anytypeio.anytype.core_ui.R
|
||||
import com.anytypeio.anytype.core_ui.common.DefaultPreviews
|
||||
import com.anytypeio.anytype.core_ui.views.BodyCalloutRegular
|
||||
import com.anytypeio.anytype.core_ui.views.ButtonPrimary
|
||||
import com.anytypeio.anytype.core_ui.views.ButtonSecondary
|
||||
import com.anytypeio.anytype.core_ui.views.ButtonSize
|
||||
import com.anytypeio.anytype.core_ui.views.HeadlineHeading
|
||||
|
@ -91,12 +92,12 @@ fun LocalInfoScreen(
|
|||
text = stringResource(description)
|
||||
)
|
||||
Spacer(modifier = Modifier.height(30.dp))
|
||||
ButtonSecondary(
|
||||
ButtonPrimary(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(horizontal = 20.dp),
|
||||
text = stringResource(R.string.object_type_fields_local_info_button),
|
||||
size = ButtonSize.LargeSecondary,
|
||||
size = ButtonSize.Large,
|
||||
onClick = {
|
||||
onDismiss()
|
||||
}
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
package com.anytypeio.anytype.feature_object_type.ui.space
|
||||
|
||||
import android.os.Build
|
||||
import androidx.compose.foundation.ExperimentalFoundationApi
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.combinedClickable
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Row
|
||||
|
@ -21,10 +22,14 @@ import androidx.compose.foundation.layout.windowInsetsPadding
|
|||
import androidx.compose.foundation.layout.wrapContentSize
|
||||
import androidx.compose.foundation.lazy.LazyColumn
|
||||
import androidx.compose.foundation.lazy.rememberLazyListState
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.material3.DropdownMenu
|
||||
import androidx.compose.material3.DropdownMenuItem
|
||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.mutableStateListOf
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Alignment.Companion.CenterVertically
|
||||
|
@ -34,14 +39,17 @@ import androidx.compose.ui.res.painterResource
|
|||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.text.style.TextOverflow
|
||||
import androidx.compose.ui.unit.DpOffset
|
||||
import androidx.compose.ui.unit.dp
|
||||
import com.anytypeio.anytype.core_ui.R
|
||||
import com.anytypeio.anytype.core_ui.common.DefaultPreviews
|
||||
import com.anytypeio.anytype.core_ui.extensions.swapList
|
||||
import com.anytypeio.anytype.core_ui.foundation.Divider
|
||||
import com.anytypeio.anytype.core_ui.foundation.noRippleThrottledClickable
|
||||
import com.anytypeio.anytype.core_ui.views.Caption1Medium
|
||||
import com.anytypeio.anytype.core_ui.views.PreviewTitle1Regular
|
||||
import com.anytypeio.anytype.core_ui.views.Title1
|
||||
import com.anytypeio.anytype.core_ui.views.UxSmallTextRegular
|
||||
import com.anytypeio.anytype.core_ui.widgets.ListWidgetObjectIcon
|
||||
import com.anytypeio.anytype.core_utils.insets.EDGE_TO_EDGE_MIN_SDK
|
||||
import com.anytypeio.anytype.presentation.objects.ObjectIcon
|
||||
|
@ -52,9 +60,10 @@ import com.anytypeio.anytype.presentation.types.UiSpaceTypesScreenState
|
|||
@Composable
|
||||
fun SpaceTypesListScreen(
|
||||
uiState: UiSpaceTypesScreenState,
|
||||
onTypeClicked: (UiSpaceTypeItem) -> Unit,
|
||||
onTypeClicked: (UiSpaceTypeItem.Type) -> Unit,
|
||||
onBackPressed: () -> Unit,
|
||||
onAddIconClicked: () -> Unit
|
||||
onAddIconClicked: () -> Unit,
|
||||
onMoveToBin: (UiSpaceTypeItem.Type) -> Unit
|
||||
) {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
|
@ -91,17 +100,24 @@ fun SpaceTypesListScreen(
|
|||
key = { index -> items[index].id },
|
||||
itemContent = {
|
||||
val item = items[it]
|
||||
Type(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.height(52.dp)
|
||||
.padding(start = 12.dp, end = 20.dp)
|
||||
.clickable {
|
||||
onTypeClicked(item)
|
||||
},
|
||||
item = item
|
||||
)
|
||||
Divider()
|
||||
when (item) {
|
||||
is UiSpaceTypeItem.Section -> {
|
||||
Section(item)
|
||||
}
|
||||
|
||||
is UiSpaceTypeItem.Type -> {
|
||||
Type(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.height(52.dp)
|
||||
.padding(start = 12.dp, end = 20.dp),
|
||||
item = item,
|
||||
onTypeClicked = onTypeClicked,
|
||||
onMoveToBin = onMoveToBin
|
||||
)
|
||||
Divider()
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
item {
|
||||
|
@ -115,13 +131,48 @@ fun SpaceTypesListScreen(
|
|||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun Section(section: UiSpaceTypeItem.Section) {
|
||||
val text = when (section) {
|
||||
is UiSpaceTypeItem.Section.MyTypes ->
|
||||
stringResource(R.string.space_types_screen_section_my_types)
|
||||
|
||||
is UiSpaceTypeItem.Section.System ->
|
||||
stringResource(R.string.space_types_screen_section_system_types)
|
||||
}
|
||||
Column {
|
||||
Box(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.height(52.dp)
|
||||
) {
|
||||
Text(
|
||||
modifier = Modifier
|
||||
.padding(bottom = 8.dp, start = 20.dp)
|
||||
.align(Alignment.BottomStart),
|
||||
text = text,
|
||||
style = Caption1Medium,
|
||||
color = colorResource(R.color.text_secondary),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalFoundationApi::class)
|
||||
@Composable
|
||||
private fun Type(
|
||||
modifier: Modifier,
|
||||
item: UiSpaceTypeItem
|
||||
item: UiSpaceTypeItem.Type,
|
||||
onTypeClicked: (UiSpaceTypeItem.Type) -> Unit,
|
||||
onMoveToBin: (UiSpaceTypeItem.Type) -> Unit
|
||||
) {
|
||||
val isMenuExpanded = remember { mutableStateOf(false) }
|
||||
Row(
|
||||
modifier = modifier.fillMaxWidth(),
|
||||
modifier = modifier.fillMaxWidth()
|
||||
.combinedClickable(
|
||||
onClick = { onTypeClicked(item) },
|
||||
onLongClick = { isMenuExpanded.value = true }
|
||||
),
|
||||
verticalAlignment = CenterVertically
|
||||
) {
|
||||
ListWidgetObjectIcon(
|
||||
|
@ -141,6 +192,51 @@ private fun Type(
|
|||
maxLines = 1,
|
||||
overflow = TextOverflow.Ellipsis
|
||||
)
|
||||
|
||||
if (item.isPossibleMoveToBin) {
|
||||
ItemDropDownMenu(
|
||||
item = item,
|
||||
showMenu = isMenuExpanded.value,
|
||||
onDismissRequest = { isMenuExpanded.value = false },
|
||||
onMoveToBin = {
|
||||
isMenuExpanded.value = false
|
||||
onMoveToBin(it)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun ItemDropDownMenu(
|
||||
item: UiSpaceTypeItem.Type,
|
||||
showMenu: Boolean,
|
||||
onDismissRequest: () -> Unit,
|
||||
onMoveToBin: (UiSpaceTypeItem.Type) -> Unit
|
||||
) {
|
||||
DropdownMenu(
|
||||
modifier = Modifier
|
||||
.width(244.dp),
|
||||
expanded = showMenu,
|
||||
offset = DpOffset(x = 0.dp, y = 0.dp),
|
||||
onDismissRequest = {
|
||||
onDismissRequest()
|
||||
},
|
||||
shape = RoundedCornerShape(10.dp),
|
||||
containerColor = colorResource(id = R.color.background_secondary),
|
||||
) {
|
||||
DropdownMenuItem(
|
||||
text = {
|
||||
Text(
|
||||
text = stringResource(R.string.space_properties_screen_menu_move_to_bin),
|
||||
style = UxSmallTextRegular,
|
||||
color = colorResource(id = R.color.text_primary)
|
||||
)
|
||||
},
|
||||
onClick = {
|
||||
onMoveToBin(item)
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -208,7 +304,8 @@ fun SpaceTypesListScreenPreview() {
|
|||
SpaceTypesListScreen(
|
||||
uiState = UiSpaceTypesScreenState(
|
||||
items = listOf(
|
||||
UiSpaceTypeItem(
|
||||
UiSpaceTypeItem.Section.MyTypes(),
|
||||
UiSpaceTypeItem.Type(
|
||||
id = "1",
|
||||
name = "Type 1",
|
||||
icon = ObjectIcon.TypeIcon.Default(
|
||||
|
@ -216,7 +313,8 @@ fun SpaceTypesListScreenPreview() {
|
|||
color = CustomIconColor.Teal
|
||||
)
|
||||
),
|
||||
UiSpaceTypeItem(
|
||||
UiSpaceTypeItem.Section.System(),
|
||||
UiSpaceTypeItem.Type(
|
||||
id = "2",
|
||||
name = "Type 2",
|
||||
icon = ObjectIcon.TypeIcon.Default(
|
||||
|
@ -228,6 +326,7 @@ fun SpaceTypesListScreenPreview() {
|
|||
),
|
||||
onBackPressed = {},
|
||||
onTypeClicked = {},
|
||||
onAddIconClicked = {}
|
||||
onAddIconClicked = {},
|
||||
onMoveToBin = {}
|
||||
)
|
||||
}
|
|
@ -351,9 +351,10 @@ class ObjectTypeViewModel(
|
|||
(uiTitleAndIconUpdateState.value as? UiTypeSetupTitleAndIconState.Visible.EditType)?.let {
|
||||
uiTitleAndIconUpdateState.value = it.copy(icon = newIcon)
|
||||
}
|
||||
if (objectPermissions.canDelete) {
|
||||
uiEditButtonState.value = UiEditButton.Visible
|
||||
}
|
||||
//turn off button, we give Move to Bin logic in Library now
|
||||
// if (objectPermissions.canDelete) {
|
||||
// uiEditButtonState.value = UiEditButton.Visible
|
||||
// }
|
||||
objType.recommendedLayout?.let { layout ->
|
||||
if (_objectTypePermissionsState.value?.canChangeRecommendedLayoutForThisType == true) {
|
||||
uiHorizontalButtonsState.value =
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue