Skip to content

Instantly share code, notes, and snippets.

@Miha-x64
Last active April 26, 2021 18:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Miha-x64/ff22595886d01faf5f32460c7ef540dc to your computer and use it in GitHub Desktop.
Save Miha-x64/ff22595886d01faf5f32460c7ef540dc to your computer and use it in GitHub Desktop.
RelativeLayout for Splitties Views DSL
@file:Suppress("NOTHING_TO_INLINE")
package net.aquadc.commonandroid.views
import android.content.Context
import android.view.View
import android.widget.RelativeLayout
import android.widget.RelativeLayout.TRUE
import androidx.annotation.IdRes
import splitties.views.dsl.core.wrapContent
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
@OptIn(ExperimentalContracts::class)
inline fun Context.relativeLayout(
@IdRes id: Int = View.NO_ID,
initView: RelativeLayout.() -> Unit = {}
): RelativeLayout {
contract { callsInPlace(initView, InvocationKind.EXACTLY_ONCE) }
return RelativeLayout(this).also { it.id = id }.apply(initView)
}
@OptIn(ExperimentalContracts::class)
inline fun View.relativeLayout(
@IdRes id: Int = View.NO_ID,
initView: RelativeLayout.() -> Unit = {}
): RelativeLayout {
contract { callsInPlace(initView, InvocationKind.EXACTLY_ONCE) }
return RelativeLayout(context).also { it.id = id }.apply(initView)
}
@OptIn(ExperimentalContracts::class)
inline fun RelativeLayout.lParams(
width: Int = wrapContent,
height: Int = wrapContent,
initParams: RelativeLayout.LayoutParams.() -> Unit = {}
): RelativeLayout.LayoutParams {
contract { callsInPlace(initParams, InvocationKind.EXACTLY_ONCE) }
return RelativeLayout.LayoutParams(width, height).apply(initParams)
}
inline fun RelativeLayout.LayoutParams.toLeftOf(id: Int): Unit = addRule(RelativeLayout.LEFT_OF, id)
inline fun RelativeLayout.LayoutParams.toRightOf(id: Int): Unit = addRule(RelativeLayout.RIGHT_OF, id)
inline fun RelativeLayout.LayoutParams.toStartOf(id: Int): Unit = addRule(RelativeLayout.START_OF, id)
inline fun RelativeLayout.LayoutParams.toEndOf(id: Int): Unit = addRule(RelativeLayout.END_OF, id)
inline fun RelativeLayout.LayoutParams.above(id: Int): Unit = addRule(RelativeLayout.ABOVE, id)
inline fun RelativeLayout.LayoutParams.below(id: Int): Unit = addRule(RelativeLayout.BELOW, id)
inline fun RelativeLayout.LayoutParams.matchBaselines(id: Int): Unit = addRule(RelativeLayout.ALIGN_BASELINE, id)
inline fun RelativeLayout.LayoutParams.matchLefts(id: Int): Unit = addRule(RelativeLayout.ALIGN_LEFT, id)
inline fun RelativeLayout.LayoutParams.matchTops(id: Int): Unit = addRule(RelativeLayout.ALIGN_TOP, id)
inline fun RelativeLayout.LayoutParams.matchStarts(id: Int): Unit = addRule(RelativeLayout.ALIGN_START, id)
inline fun RelativeLayout.LayoutParams.matchEnds(id: Int): Unit = addRule(RelativeLayout.ALIGN_END, id)
inline fun RelativeLayout.LayoutParams.matchRights(id: Int): Unit = addRule(RelativeLayout.ALIGN_RIGHT, id)
inline fun RelativeLayout.LayoutParams.matchBottoms(id: Int): Unit = addRule(RelativeLayout.ALIGN_BOTTOM, id)
inline fun RelativeLayout.LayoutParams.alignParentLeft(whether: Boolean = true): Unit =
addRule(RelativeLayout.ALIGN_PARENT_LEFT, if (whether) TRUE else 0)
inline fun RelativeLayout.LayoutParams.alignParentTop(whether: Boolean = true): Unit =
addRule(RelativeLayout.ALIGN_PARENT_TOP, if (whether) TRUE else 0)
inline fun RelativeLayout.LayoutParams.alignParentStart(whether: Boolean = true): Unit =
addRule(RelativeLayout.ALIGN_PARENT_START, if (whether) TRUE else 0)
inline fun RelativeLayout.LayoutParams.alignParentEnd(whether: Boolean = true): Unit =
addRule(RelativeLayout.ALIGN_PARENT_END, if (whether) TRUE else 0)
inline fun RelativeLayout.LayoutParams.alignParentRight(whether: Boolean = true): Unit =
addRule(RelativeLayout.ALIGN_PARENT_RIGHT, if (whether) TRUE else 0)
inline fun RelativeLayout.LayoutParams.alignParentBottom(whether: Boolean = true): Unit =
addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, if (whether) TRUE else 0)
inline fun RelativeLayout.LayoutParams.centerInParent(whether: Boolean = true): Unit =
addRule(RelativeLayout.CENTER_IN_PARENT, if (whether) TRUE else 0)
inline fun RelativeLayout.LayoutParams.centerHorizontal(whether: Boolean = true): Unit =
addRule(RelativeLayout.CENTER_HORIZONTAL, if (whether) TRUE else 0)
inline fun RelativeLayout.LayoutParams.centerVertical(whether: Boolean = true): Unit =
addRule(RelativeLayout.CENTER_VERTICAL, if (whether) TRUE else 0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment