1
0
Fork 0
mirror of https://github.com/anyproto/anytype-kotlin.git synced 2025-06-08 05:47:05 +09:00

DROID-2171 Set | Fix | Сorrect display of images in the gallery (#1324)

This commit is contained in:
Konstantin Ivanov 2024-06-26 11:11:27 +02:00 committed by Evgenii Kozlov
parent f1ae1856f0
commit 75efba253a
3 changed files with 94 additions and 57 deletions

View file

@ -79,7 +79,8 @@ suspend fun DVViewer.render(
details: Map<Id, Block.Fields>,
dataViewRelations: List<ObjectWrapper.Relation>,
store: ObjectStore,
objectOrderIds: List<Id> = emptyList()
objectOrderIds: List<Id> = emptyList(),
storeOfRelations: StoreOfRelations
): Viewer {
return when (type) {
DVViewerType.GRID -> {
@ -102,7 +103,8 @@ suspend fun DVViewer.render(
coverImageHashProvider = coverImageHashProvider,
urlBuilder = builder,
objectStore = store,
objectOrderIds = objectOrderIds
objectOrderIds = objectOrderIds,
storeOfRelations = storeOfRelations
),
title = name,
largeCards = cardSize == DVViewerCardSize.LARGE

View file

@ -6,7 +6,7 @@ import com.anytypeio.anytype.core_models.DVViewer
import com.anytypeio.anytype.core_models.DVViewerCardSize
import com.anytypeio.anytype.core_models.DVViewerRelation
import com.anytypeio.anytype.core_models.Id
import com.anytypeio.anytype.core_models.ObjectTypeIds.IMAGE
import com.anytypeio.anytype.core_models.ObjectType
import com.anytypeio.anytype.core_models.ObjectWrapper
import com.anytypeio.anytype.core_models.Relation
import com.anytypeio.anytype.core_models.Relations
@ -14,13 +14,14 @@ import com.anytypeio.anytype.core_models.Url
import com.anytypeio.anytype.core_utils.ext.typeOf
import com.anytypeio.anytype.domain.misc.UrlBuilder
import com.anytypeio.anytype.domain.objects.ObjectStore
import com.anytypeio.anytype.presentation.editor.cover.CoverColor
import com.anytypeio.anytype.domain.objects.StoreOfRelations
import com.anytypeio.anytype.presentation.editor.cover.CoverImageHashProvider
import com.anytypeio.anytype.presentation.editor.cover.CoverView
import com.anytypeio.anytype.presentation.objects.ObjectIcon
import com.anytypeio.anytype.presentation.objects.getProperName
import com.anytypeio.anytype.presentation.objects.values
import com.anytypeio.anytype.presentation.relations.BasicObjectCoverWrapper
import com.anytypeio.anytype.presentation.relations.CoverContainer
import com.anytypeio.anytype.presentation.relations.getCover
import com.anytypeio.anytype.presentation.sets.model.Viewer
@ -32,7 +33,8 @@ suspend fun DVViewer.buildGalleryViews(
coverImageHashProvider: CoverImageHashProvider,
urlBuilder: UrlBuilder,
objectStore: ObjectStore,
objectOrderIds: List<Id>
objectOrderIds: List<Id>,
storeOfRelations: StoreOfRelations
): List<Viewer.GalleryView.Item> {
val filteredRelations = viewerRelations.mapNotNull { setting ->
@ -55,17 +57,15 @@ suspend fun DVViewer.buildGalleryViews(
dvViewer = this,
coverImageHashProvider = coverImageHashProvider,
urlBuilder = urlBuilder,
details = details,
store = objectStore,
relations = relations,
filteredRelations = filteredRelations,
isLargeSize = cardSize == DVViewerCardSize.LARGE
isLargeSize = cardSize == DVViewerCardSize.LARGE,
storeOfRelations = storeOfRelations
)
} else {
obj.mapToDefaultItem(
hideIcon = hideIcon,
urlBuilder = urlBuilder,
details = details,
viewerRelations = viewerRelations,
store = objectStore,
filteredRelations = filteredRelations
@ -78,7 +78,6 @@ suspend fun DVViewer.buildGalleryViews(
private suspend fun ObjectWrapper.Basic.mapToDefaultItem(
hideIcon: Boolean,
urlBuilder: UrlBuilder,
details: Map<Id, Block.Fields>,
viewerRelations: List<DVViewerRelation>,
store: ObjectStore,
filteredRelations: List<ObjectWrapper.Relation>
@ -104,57 +103,24 @@ private suspend fun ObjectWrapper.Basic.mapToDefaultItem(
private suspend fun ObjectWrapper.Basic.mapToCoverItem(
dvViewer: DVViewer,
relations: List<ObjectWrapper.Relation>,
details: Map<Id, Block.Fields>,
coverImageHashProvider: CoverImageHashProvider,
urlBuilder: UrlBuilder,
store: ObjectStore,
filteredRelations: List<ObjectWrapper.Relation>,
isLargeSize: Boolean
isLargeSize: Boolean,
storeOfRelations: StoreOfRelations
): Viewer.GalleryView.Item {
val obj = this
var cover: CoverView? = null
var coverColor: CoverColor? = null
var coverImage: Url? = null
var coverGradient: String? = null
if (obj.coverType != CoverType.NONE) {
val coverContainer = BasicObjectCoverWrapper(obj)
.getCover(urlBuilder, coverImageHashProvider)
coverColor = coverContainer.coverColor
coverImage = coverContainer.coverImage
coverGradient = coverContainer.coverGradient
} else {
val previewRelation = relations.find { it.key == dvViewer.coverRelationKey }
if (previewRelation != null && previewRelation.format == Relation.Format.FILE) {
val ids: List<Id> = when (val value = obj.map[previewRelation.key]) {
is Id -> listOf(value)
is List<*> -> value.typeOf()
else -> emptyList()
}
val previewId = ids.find { id ->
val preview = details[id]
preview != null && preview.type.contains(IMAGE)
}
if (!previewId.isNullOrBlank()) {
coverImage = urlBuilder.image(previewId)
}
}
}
when {
coverImage != null -> {
cover = CoverView.Image(coverImage)
}
coverColor != null -> {
cover = CoverView.Color(coverColor)
}
coverGradient != null -> {
cover = CoverView.Gradient(coverGradient)
}
}
val coverContainer = getCoverContainer(
obj = obj,
dvViewer = dvViewer,
coverImageHashProvider = coverImageHashProvider,
urlBuilder = urlBuilder,
store = store,
storeOfRelations = storeOfRelations
)
val cover = createCoverView(coverContainer = coverContainer)
return Viewer.GalleryView.Item.Cover(
objectId = obj.id,
@ -175,4 +141,71 @@ private suspend fun ObjectWrapper.Basic.mapToCoverItem(
fitImage = dvViewer.coverFit,
isLargeSize = isLargeSize
)
}
}
private suspend fun getCoverContainer(
obj: ObjectWrapper.Basic,
dvViewer: DVViewer,
coverImageHashProvider: CoverImageHashProvider,
urlBuilder: UrlBuilder,
store: ObjectStore,
storeOfRelations: StoreOfRelations
): CoverContainer {
return if (obj.coverType != CoverType.NONE) {
BasicObjectCoverWrapper(obj).getCover(urlBuilder, coverImageHashProvider)
} else {
getCoverFromRelationOrLayout(obj, dvViewer, urlBuilder, store, storeOfRelations)
}
}
private suspend fun getCoverFromRelationOrLayout(
obj: ObjectWrapper.Basic,
dvViewer: DVViewer,
urlBuilder: UrlBuilder,
store: ObjectStore,
storeOfRelations: StoreOfRelations
): CoverContainer {
val coverRelationKey = dvViewer.coverRelationKey
var coverImage: Url? = null
if (coverRelationKey != null) {
val relation = storeOfRelations.getByKey(coverRelationKey)
coverImage = relation?.let {
getCoverImageFromRelation(it, obj, coverRelationKey, store, urlBuilder)
}
}
if (coverImage == null && obj.layout == ObjectType.Layout.IMAGE) {
coverImage = urlBuilder.image(obj.id)
}
return CoverContainer(coverImage = coverImage)
}
private suspend fun getCoverImageFromRelation(
relation: ObjectWrapper.Relation,
obj: ObjectWrapper.Basic,
coverRelationKey: String,
store: ObjectStore,
urlBuilder: UrlBuilder
): Url? {
if (relation.format == Relation.Format.FILE) {
val ids: List<Id> = when (val value = obj.map[coverRelationKey]) {
is Id -> listOf(value)
is List<*> -> value.typeOf()
else -> emptyList()
}
val previewId = ids.find { id ->
val preview = store.get(id)
preview != null && preview.layout == ObjectType.Layout.IMAGE
}
if (!previewId.isNullOrBlank()) {
return urlBuilder.image(previewId)
}
}
return null
}
private fun createCoverView(coverContainer: CoverContainer): CoverView? = when {
coverContainer.coverImage != null -> CoverView.Image(coverContainer.coverImage)
coverContainer.coverColor != null -> CoverView.Color(coverContainer.coverColor)
coverContainer.coverGradient != null -> CoverView.Gradient(coverContainer.coverGradient)
else -> null
}

View file

@ -735,7 +735,8 @@ class ObjectSetViewModel(
objects = dataViewState.objects,
dataViewRelations = relations,
details = objectState.details,
store = objectStore
store = objectStore,
storeOfRelations = storeOfRelations
)
when {
@ -787,7 +788,8 @@ class ObjectSetViewModel(
dataViewRelations = relations,
details = objectState.details,
store = objectStore,
objectOrderIds = objectOrderIds
objectOrderIds = objectOrderIds,
storeOfRelations = storeOfRelations
)
}
}