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