diff --git a/.idea/dictionaries/marek.xml b/.idea/dictionaries/marek.xml
new file mode 100644
index 0000000..1cf1b74
--- /dev/null
+++ b/.idea/dictionaries/marek.xml
@@ -0,0 +1,7 @@
+
+
+
+ flexbox
+
+
+
\ No newline at end of file
diff --git a/deps.kt b/deps.kt
index 904fb67..8beed2f 160000
--- a/deps.kt
+++ b/deps.kt
@@ -1 +1 @@
-Subproject commit 904fb6711400ee422e847dcec16d4d562977ba8b
+Subproject commit 8beed2ff337d44d26f52737afb2f00272fd8b3c7
diff --git a/sample/src/main/java/pl/mareklangiewicz/sandboxui/MainActivity.kt b/sample/src/main/java/pl/mareklangiewicz/sandboxui/MainActivity.kt
index 49e1f0f..0e6ca77 100644
--- a/sample/src/main/java/pl/mareklangiewicz/sandboxui/MainActivity.kt
+++ b/sample/src/main/java/pl/mareklangiewicz/sandboxui/MainActivity.kt
@@ -5,11 +5,10 @@ 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
@@ -17,30 +16,41 @@ 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)
}
}
@@ -48,4 +58,5 @@ class MainActivity : AppCompatActivity() {
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() }
diff --git a/sandboxui/build.gradle.kts b/sandboxui/build.gradle.kts
index 3f97c0b..cf022ba 100644
--- a/sandboxui/build.gradle.kts
+++ b/sandboxui/build.gradle.kts
@@ -4,7 +4,7 @@ plugins {
kotlin("android.extensions")
}
group = "com.github.langara.sandboxui"
-version = "0.0.4"
+version = "0.0.5"
android {
compileSdkVersion(Vers.androidCompileSdk)
@@ -12,15 +12,15 @@ android {
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")
diff --git a/sandboxui/src/main/java/pl/mareklangiewicz/sandboxui/SandboxUi.kt b/sandboxui/src/main/java/pl/mareklangiewicz/sandboxui/SandboxUi.kt
index a95bf48..bb46658 100644
--- a/sandboxui/src/main/java/pl/mareklangiewicz/sandboxui/SandboxUi.kt
+++ b/sandboxui/src/main/java/pl/mareklangiewicz/sandboxui/SandboxUi.kt
@@ -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
- (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 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.unaryPlus() = apply { inbox.add(this, inbox.lParams()) }
-fun Context.sandbox(
- content: Content,
- title: String = content::class.simpleName ?: "",
- initBox: SandboxUi.() -> 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 View.sandbox(
- content: Content,
- title: String = content::class.simpleName ?: "",
- initBox: SandboxUi.() -> Unit = {}
-) = context.sandbox(content, title, initBox)
+ infix fun FlexboxLayout.LayoutParams.lay(view: View) { inbox.add(view, this) }
-fun Ui.sandbox(
- content: Content,
- title: String = content::class.simpleName ?: "",
- initBox: SandboxUi.() -> Unit = {}
-) = ctx.sandbox(content, title, initBox)
-
-fun LinearLayout.addbox(
- content: Content,
- title: String = content::class.simpleName ?: "",
- initBox: SandboxUi.() -> 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)
}
+
diff --git a/sandboxui/src/main/java/pl/mareklangiewicz/views/dsl/flexbox/FlexboxLayout.kt b/sandboxui/src/main/java/pl/mareklangiewicz/views/dsl/flexbox/FlexboxLayout.kt
new file mode 100644
index 0000000..bc2cf80
--- /dev/null
+++ b/sandboxui/src/main/java/pl/mareklangiewicz/views/dsl/flexbox/FlexboxLayout.kt
@@ -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)
+
diff --git a/sandboxui/src/main/res/drawable/sandbox_inbox_background.xml b/sandboxui/src/main/res/drawable/sandbox_inbox_background.xml
new file mode 100644
index 0000000..e8b7597
--- /dev/null
+++ b/sandboxui/src/main/res/drawable/sandbox_inbox_background.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/sandboxui/src/main/res/drawable/sandbox_options_background.xml b/sandboxui/src/main/res/drawable/sandbox_options_background.xml
new file mode 100644
index 0000000..f2c7798
--- /dev/null
+++ b/sandboxui/src/main/res/drawable/sandbox_options_background.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/sandboxui/src/main/res/drawable/sandbox_ui_back.xml b/sandboxui/src/main/res/drawable/sandbox_ui_background.xml
similarity index 100%
rename from sandboxui/src/main/res/drawable/sandbox_ui_back.xml
rename to sandboxui/src/main/res/drawable/sandbox_ui_background.xml