Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
mareklangiewicz committed Nov 17, 2019
2 parents 0b3d69f + 367df66 commit eb1ae6d
Show file tree
Hide file tree
Showing 9 changed files with 155 additions and 61 deletions.
7 changes: 7 additions & 0 deletions .idea/dictionaries/marek.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion deps.kt
35 changes: 23 additions & 12 deletions sample/src/main/java/pl/mareklangiewicz/sandboxui/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,47 +5,58 @@ import android.graphics.Color
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import splitties.dimensions.dip
import pl.mareklangiewicz.views.dsl.flexbox.lParams
import splitties.toast.toast
import splitties.views.backgroundColor
import splitties.views.dsl.core.*
import splitties.views.padding
import kotlin.math.absoluteValue
import kotlin.random.Random

class MainActivity : AppCompatActivity() {

@SuppressLint("SetTextI18n")
override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

val view1 = verticalLayout {
for (i in 1..5)
add(textView { text = "Text 1 $i" }, lParams())
}

val view2 = verticalLayout {
for (i in 1..7) add(textView { text = "Text 2 $i" }, lParams())
addbox(textView { text = "nested"}) {
action("change nested text") { text = "nested ${randomHash()}"}
for (i in 1..7) add(textView { text = "Text 2 $i" }, lParams(matchParent))
val b = sandbox {
val v = + textView { text = randomHash()}
action("RND") { v.text = randomHash() }
}
add(b.root, lParams(matchParent))
}
val box1 = sandbox(view1) {
action("toast xxx") { toast("xxx") }
action("toast yyy") { toast("yyy") }
action("add random hash") { add(randomHashTextView(), lParams(matchParent)) }

val box1 = sandbox {
+ view1
option("toast xxx") { toast("xxx") }
option("toast yyy") { toast("yyy") }
option("add random hash") { view1.add(view1.randomHashTextView(), view1.lParams(view1.matchParent)) }
}
val box2 = sandbox(view2) {
frame.padding = dip(10)
action("change color") { backgroundColor = getRandomColor() }

val box2 = sandbox {
on { flexGrow = 1f } lay view2
on { flexGrow = 1f } lay sandbox { }.root
action("COL") { view2.backgroundColor = getRandomColor() }
}

val boxes = horizontalLayout {
add(box1.root, lParams(0, weight = 1f))
add(box2.root, lParams(0, weight = 1f))
}

setContentView(boxes)
}
}

private fun getRandomColor() = Color.rgb(Random.nextInt(255), Random.nextInt(255), Random.nextInt(255))

private fun randomHash() = Random.nextInt().hashCode().absoluteValue.toString(16)

private fun View.randomHashTextView() = textView { text = randomHash() }
8 changes: 4 additions & 4 deletions sandboxui/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,23 @@ plugins {
kotlin("android.extensions")
}
group = "com.github.langara.sandboxui"
version = "0.0.4"
version = "0.0.5"

android {
compileSdkVersion(Vers.androidCompileSdk)

defaultConfig {
minSdkVersion(21)
targetSdkVersion(Vers.androidTargetSdk)
versionCode = 400
versionName = "0.0.4"
versionCode = 500
versionName = "0.0.5"
}
}

dependencies {
implementation(Deps.kotlinStdlib7)
implementation(Deps.kotlinReflect)
implementation(Deps.splitties)
api(Deps.androidxFlexboxLayout)
}

apply(from = "https://raw.githubusercontent.com/sky-uk/gradle-maven-plugin/master/gradle-mavenizer.gradle")
87 changes: 43 additions & 44 deletions sandboxui/src/main/java/pl/mareklangiewicz/sandboxui/SandboxUi.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,87 +2,86 @@ package pl.mareklangiewicz.sandboxui

import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Color
import android.view.View
import android.widget.LinearLayout
import android.widget.PopupMenu
import androidx.core.view.isVisible
import com.google.android.flexbox.FlexboxLayout
import pl.mareklangiewicz.views.dsl.flexbox.flexboxLayout
import pl.mareklangiewicz.views.dsl.flexbox.lParams
import splitties.dimensions.dip
import splitties.resources.drawable
import splitties.views.*
import splitties.views.dsl.core.*
import splitties.views.onClick
import splitties.views.padding
import splitties.views.textColorResource

@SuppressLint("SetTextI18n")
class SandboxUi<Content: View>
(override val ctx: Context, val content: Content, atitle: String = content::class.simpleName ?: "") : Ui {
class SandboxUi(override val ctx: Context, atitle: String = "") : Ui {

val title = label(atitle)
val actions = horizontalLayout()
val dots = label("\u25cf\u25cf")
val info = label("")
val options = verticalLayout {
background = drawable(R.drawable.sandbox_options_background)
isVisible = false
add(info, lParams())
}

val header = horizontalLayout {
add(title, lParams(0, weight = 1f))
add(actions, lParams())
add(dots, lParams())
}

val inbox = flexboxLayout { background = drawable(R.drawable.sandbox_inbox_background) }

val frame = frameLayout {
background = drawable(R.drawable.sandbox_ui_back)
add(content, lParams(matchParent, matchParent))
add(inbox, lParams(matchParent, matchParent))
add(options, lParams(gravity = gravityTopEnd))
}

override val root = verticalLayout {
background = drawable(R.drawable.sandbox_ui_back)
background = drawable(R.drawable.sandbox_ui_background)
padding = dip(4)
add(header, lParams(matchParent))
add(frame, lParams(matchParent, matchParent))
}

private val actions = mutableListOf<Pair<String, Content.() -> Unit>>()

fun action(name: String, block: Content.() -> Unit) {
menu.menu.add(0, actions.size, actions.size, name)
actions += name to block
fun action(name: String, block: () -> Unit) = actions.apply {
add(label(name).apply { onClick(block) }, lParams())
}

private val menu = PopupMenu(ctx, dots).apply {
setOnMenuItemClickListener { actions[it.order].second.invoke(content); true }
fun option(name: String, block: () -> Unit) = options.apply {
add(label(name).apply { onClick(block) }, lParams())
}

init {
title.onClick { content.isVisible = !content.isVisible }
dots.onClick { menu.show() }
}
}
operator fun <V: View> V.unaryPlus() = apply { inbox.add(this, inbox.lParams()) }

fun <Content: View> Context.sandbox(
content: Content,
title: String = content::class.simpleName ?: "",
initBox: SandboxUi<Content>.() -> Unit = {}
) = SandboxUi(this, content, title).apply(initBox)
fun on(
width: Int = inbox.wrapContent,
height: Int = inbox.wrapContent,
initParams: FlexboxLayout.LayoutParams.() -> Unit = {}
) = inbox.lParams(width, height, initParams)

fun <Content: View> View.sandbox(
content: Content,
title: String = content::class.simpleName ?: "",
initBox: SandboxUi<Content>.() -> Unit = {}
) = context.sandbox(content, title, initBox)
infix fun FlexboxLayout.LayoutParams.lay(view: View) { inbox.add(view, this) }

fun <Content: View> Ui.sandbox(
content: Content,
title: String = content::class.simpleName ?: "",
initBox: SandboxUi<Content>.() -> Unit = {}
) = ctx.sandbox(content, title, initBox)

fun <Content: View> LinearLayout.addbox(
content: Content,
title: String = content::class.simpleName ?: "",
initBox: SandboxUi<Content>.() -> Unit = {}
) = sandbox(content, title, initBox).also { add(it.root, lParams(matchParent)) }
init {
title.onClick { inbox.isVisible = !inbox.isVisible; options.isVisible = options.isVisible && inbox.isVisible }
dots.onClick { options.isVisible = !options.isVisible; inbox.isVisible = inbox.isVisible || options.isVisible }
inbox.addOnLayoutChangeListener { v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom ->
info.text = "size: ${right-left}, ${bottom-top}"
}
}
}

fun Context.sandbox(title: String = "", initBox: SandboxUi.() -> Unit = {}) = SandboxUi(this, title).apply(initBox)
fun View.sandbox(title: String = "", initBox: SandboxUi.() -> Unit = {}) = context.sandbox(title, initBox)
fun Ui.sandbox(title: String = "", initBox: SandboxUi.() -> Unit = {}) = ctx.sandbox(title, initBox)

private fun Ui.label(text: String) = textView {
this.text = text
textSize = 12f
isSingleLine = true
padding = dip(2)
textColorResource = android.R.color.black
setTextColor(Color.BLACK)
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package pl.mareklangiewicz.views.dsl.flexbox

import android.content.Context
import android.view.View
import androidx.annotation.IdRes
import androidx.annotation.StyleRes
import com.google.android.flexbox.FlexboxLayout
import splitties.views.dsl.core.NO_THEME
import splitties.views.dsl.core.Ui
import splitties.views.dsl.core.view
import splitties.views.dsl.core.wrapContent
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract


// FlexboxLayout

inline fun Context.flexboxLayout(
@IdRes id: Int = View.NO_ID,
@StyleRes theme: Int = NO_THEME,
initView: FlexboxLayout.() -> Unit = {}
) = view(::FlexboxLayout, id, theme, initView)

inline fun View.flexboxLayout(
@IdRes id: Int = View.NO_ID,
@StyleRes theme: Int = NO_THEME,
initView: FlexboxLayout.() -> Unit = {}
) = context.flexboxLayout(id, theme, initView)

inline fun Ui.flexboxLayout(
@IdRes id: Int = View.NO_ID,
@StyleRes theme: Int = NO_THEME,
initView: FlexboxLayout.() -> Unit = {}
) = ctx.flexboxLayout(id, theme, initView)


inline fun FlexboxLayout.lParams(
width: Int = wrapContent,
height: Int = wrapContent,
initParams: FlexboxLayout.LayoutParams.() -> Unit = {}
) = FlexboxLayout.LayoutParams(width, height).apply(initParams)

17 changes: 17 additions & 0 deletions sandboxui/src/main/res/drawable/sandbox_inbox_background.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">

<padding
android:left="1dp"
android:right="1dp"
android:top="1dp"
android:bottom="1dp" />

<solid android:color="#FFFFFFFF" />

<stroke
android:width="1dp"
android:color="#FF404040" />

</shape>
17 changes: 17 additions & 0 deletions sandboxui/src/main/res/drawable/sandbox_options_background.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">

<padding
android:left="1dp"
android:right="1dp"
android:top="1dp"
android:bottom="1dp" />

<solid android:color="#804080FF" />

<stroke
android:width="1dp"
android:color="#80404040" />

</shape>

0 comments on commit eb1ae6d

Please sign in to comment.