From 726eac2c6fd3e6b0a02024253f48d9d40229d9fa Mon Sep 17 00:00:00 2001 From: ivanovsky-v Date: Mon, 22 May 2023 16:12:23 +0300 Subject: [PATCH] [Schema] add new types for content-aligment: space-between, space-around, space-evenly --- .../core/view2/divs/BaseDivViewExtensions.kt | 35 +++++++++++++++++++ .../div/core/view2/divs/DivContainerBinder.kt | 12 ++++--- schema/div-container.json | 4 +-- schema/div-content-alignment-horizontal.json | 11 ++++++ schema/div-content-alignment-vertical.json | 12 +++++++ 5 files changed, 67 insertions(+), 7 deletions(-) create mode 100644 schema/div-content-alignment-horizontal.json create mode 100644 schema/div-content-alignment-vertical.json diff --git a/client/android/div/src/main/java/com/yandex/div/core/view2/divs/BaseDivViewExtensions.kt b/client/android/div/src/main/java/com/yandex/div/core/view2/divs/BaseDivViewExtensions.kt index 6dfac4656..27871f771 100644 --- a/client/android/div/src/main/java/com/yandex/div/core/view2/divs/BaseDivViewExtensions.kt +++ b/client/android/div/src/main/java/com/yandex/div/core/view2/divs/BaseDivViewExtensions.kt @@ -51,6 +51,8 @@ import com.yandex.div2.DivBase import com.yandex.div2.DivBlendMode import com.yandex.div2.DivBorder import com.yandex.div2.DivContainer +import com.yandex.div2.DivContentAlignmentHorizontal +import com.yandex.div2.DivContentAlignmentVertical import com.yandex.div2.DivDefaultIndicatorItemPlacement import com.yandex.div2.DivDimension import com.yandex.div2.DivDrawable @@ -349,6 +351,24 @@ internal fun evaluateGravity(horizontal: DivAlignmentHorizontal?, vertical: DivA return horizontalGravity or verticalGravity } +internal fun evaluateGravity(horizontal: DivContentAlignmentHorizontal?, vertical: DivContentAlignmentVertical?): Int { + val horizontalGravity = when (horizontal) { + DivContentAlignmentHorizontal.LEFT -> Gravity.LEFT + DivContentAlignmentHorizontal.CENTER -> Gravity.CENTER_HORIZONTAL + DivContentAlignmentHorizontal.RIGHT -> Gravity.RIGHT + else -> Gravity.LEFT // TODO(grechka62): support additional variants + } + + val verticalGravity = when (vertical) { + DivContentAlignmentVertical.TOP -> Gravity.TOP + DivContentAlignmentVertical.CENTER -> Gravity.CENTER_VERTICAL + DivContentAlignmentVertical.BOTTOM -> Gravity.BOTTOM + else -> Gravity.TOP // TODO(grechka62): support additional variants + } + + return horizontalGravity or verticalGravity +} + private fun View.applyBaselineAlignment(baselineAligned: Boolean) { val lp = layoutParams as? DivLayoutParams ?: return if (lp.isBaselineAligned != baselineAligned) { @@ -826,3 +846,18 @@ internal fun View.observeAspectRatio(resolver: ExpressionResolver, aspect: DivAs } ) } + +internal fun DivContentAlignmentHorizontal.toAlignmentHorizontal(): DivAlignmentHorizontal = when (this) { + DivContentAlignmentHorizontal.LEFT -> DivAlignmentHorizontal.LEFT + DivContentAlignmentHorizontal.CENTER -> DivAlignmentHorizontal.CENTER + DivContentAlignmentHorizontal.RIGHT -> DivAlignmentHorizontal.RIGHT + else -> DivAlignmentHorizontal.LEFT +} + +internal fun DivContentAlignmentVertical.toAlignmentVertical(): DivAlignmentVertical = when (this) { + DivContentAlignmentVertical.TOP -> DivAlignmentVertical.TOP + DivContentAlignmentVertical.CENTER -> DivAlignmentVertical.CENTER + DivContentAlignmentVertical.BOTTOM -> DivAlignmentVertical.BOTTOM + DivContentAlignmentVertical.BASELINE -> DivAlignmentVertical.BASELINE + else -> DivAlignmentVertical.TOP +} diff --git a/client/android/div/src/main/java/com/yandex/div/core/view2/divs/DivContainerBinder.kt b/client/android/div/src/main/java/com/yandex/div/core/view2/divs/DivContainerBinder.kt index edb7dead4..ed1f4f4f7 100644 --- a/client/android/div/src/main/java/com/yandex/div/core/view2/divs/DivContainerBinder.kt +++ b/client/android/div/src/main/java/com/yandex/div/core/view2/divs/DivContainerBinder.kt @@ -35,6 +35,8 @@ import com.yandex.div2.DivContainer import com.yandex.div2.DivMatchParentSize import com.yandex.div2.DivSize import com.yandex.div2.DivWrapContentSize +import com.yandex.div2.DivAlignmentHorizontal +import com.yandex.div2.DivAlignmentVertical import javax.inject.Inject import javax.inject.Provider @@ -305,19 +307,19 @@ internal class DivContainerBinder @Inject constructor( val applyAlignments = { _: Any -> val childAlignmentHorizontal = childDivValue.alignmentHorizontal val alignmentHorizontal = when { - childAlignmentHorizontal != null -> childAlignmentHorizontal + childAlignmentHorizontal != null -> childAlignmentHorizontal.evaluate(resolver) div.isWrapContainer(resolver) -> null - else -> div.contentAlignmentHorizontal + else -> div.contentAlignmentHorizontal.evaluate(resolver).toAlignmentHorizontal() } val childAlignmentVertical = childDivValue.alignmentVertical val alignmentVertical = when { - childAlignmentVertical != null -> childAlignmentVertical + childAlignmentVertical != null -> childAlignmentVertical.evaluate(resolver) div.isWrapContainer(resolver) -> null - else -> div.contentAlignmentVertical + else -> div.contentAlignmentVertical.evaluate(resolver).toAlignmentVertical() } - childView.applyAlignment(alignmentHorizontal?.evaluate(resolver), alignmentVertical?.evaluate(resolver)) + childView.applyAlignment(alignmentHorizontal, alignmentVertical) } expressionSubscriber.addSubscription( diff --git a/schema/div-container.json b/schema/div-container.json index 6274d52df..ea9253999 100644 --- a/schema/div-container.json +++ b/schema/div-container.json @@ -79,12 +79,12 @@ ] }, "content_alignment_vertical": { - "$ref": "div-alignment-vertical.json", + "$ref": "div-content-alignment-vertical.json", "default_value": "top", "$description": "translations.json#/div_container_content_alignment_vertical" }, "content_alignment_horizontal": { - "$ref": "div-alignment-horizontal.json", + "$ref": "div-content-alignment-horizontal.json", "default_value": "left", "$description": "translations.json#/div_container_content_alignment_horizontal" }, diff --git a/schema/div-content-alignment-horizontal.json b/schema/div-content-alignment-horizontal.json new file mode 100644 index 000000000..4abfd2985 --- /dev/null +++ b/schema/div-content-alignment-horizontal.json @@ -0,0 +1,11 @@ +{ + "type": "string", + "enum": [ + "left", + "center", + "right", + "space-between", + "space-around", + "space-evenly" + ] +} diff --git a/schema/div-content-alignment-vertical.json b/schema/div-content-alignment-vertical.json new file mode 100644 index 000000000..62bc3d6a7 --- /dev/null +++ b/schema/div-content-alignment-vertical.json @@ -0,0 +1,12 @@ +{ + "type": "string", + "enum": [ + "top", + "center", + "bottom", + "baseline", + "space-between", + "space-around", + "space-evenly" + ] +}