diff --git a/.idea/kotlinScripting.xml b/.idea/kotlinScripting.xml new file mode 100644 index 0000000..a6fe551 --- /dev/null +++ b/.idea/kotlinScripting.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/sample/build.gradle b/sample/build.gradle deleted file mode 100644 index 45bb519..0000000 --- a/sample/build.gradle +++ /dev/null @@ -1,23 +0,0 @@ -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' - -android { - compileSdkVersion(Vers.androidCompileSdk) - defaultConfig { - applicationId "pl.mareklangiewicz.sandboxui" - minSdkVersion(Vers.androidMinSdk) - targetSdkVersion(Vers.androidTargetSdk) - versionCode 1 - versionName "1.0" - } - buildTypes { - release { - minifyEnabled false - } - } -} - -dependencies { - implementation("com.github.langara:SandboxUi:c0d533b39a") -} diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts new file mode 100644 index 0000000..d20fb93 --- /dev/null +++ b/sample/build.gradle.kts @@ -0,0 +1,20 @@ +plugins { + id("com.android.application") + kotlin("android") + kotlin("android.extensions") +} + +android { + compileSdkVersion(Vers.androidCompileSdk) + defaultConfig { + applicationId = "pl.mareklangiewicz.sandboxui" + minSdkVersion(21) + targetSdkVersion(Vers.androidTargetSdk) + versionCode = 1 + versionName = "1.0" + } +} + +dependencies { + implementation(project(":sandboxui")) +} diff --git a/sample/src/main/java/pl/mareklangiewicz/sandboxui/MainActivity.kt b/sample/src/main/java/pl/mareklangiewicz/sandboxui/MainActivity.kt index a536579..684b35e 100644 --- a/sample/src/main/java/pl/mareklangiewicz/sandboxui/MainActivity.kt +++ b/sample/src/main/java/pl/mareklangiewicz/sandboxui/MainActivity.kt @@ -2,11 +2,13 @@ package pl.mareklangiewicz.sandboxui import android.annotation.SuppressLint import android.graphics.Color -import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import android.view.View +import androidx.appcompat.app.AppCompatActivity import splitties.toast.toast import splitties.views.backgroundColor import splitties.views.dsl.core.* +import kotlin.math.absoluteValue import kotlin.random.Random class MainActivity : AppCompatActivity() { @@ -19,17 +21,18 @@ class MainActivity : AppCompatActivity() { add(textView { text = "Text 1 $i" }, lParams()) } val view2 = verticalLayout { - for (i in 1..7) - add(textView { text = "Text 2 $i" }, lParams()) + for (i in 1..7) add(textView { text = "Text 2 $i" }, lParams()) + addbox(textView { text = "nested"}) { + action("change nested text") { text = "nested ${randomHash()}"} + } } - val box1 = SandboxUi(this, view1).apply { - action("xxx") { toast("xxx") } - action("yyy") { toast("yyy") } + val box1 = sandbox(view1) { + action("toast xxx") { toast("xxx") } + action("toast yyy") { toast("yyy") } + action("add random hash") { add(randomHashTextView(), lParams(matchParent)) } } - val box2 = SandboxUi(this, view2).apply { - action("change color") { - view2.backgroundColor = getRandomColor() - } + val box2 = sandbox(view2) { + action("change color") { backgroundColor = getRandomColor() } } val boxes = horizontalLayout { add(box1.root, lParams(0, weight = 1f)) @@ -40,3 +43,6 @@ 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 7d97bd1..888c64d 100644 --- a/sandboxui/build.gradle.kts +++ b/sandboxui/build.gradle.kts @@ -4,16 +4,16 @@ plugins { kotlin("android.extensions") } group = "com.github.langara.sandboxui" -version = "0.0.1" +version = "0.0.2" android { compileSdkVersion(Vers.androidCompileSdk) defaultConfig { - minSdkVersion(Vers.androidMinSdk) + minSdkVersion(21) targetSdkVersion(Vers.androidTargetSdk) - versionCode = 100 - versionName = "0.0.1" + versionCode = 200 + versionName = "0.0.2" } } diff --git a/sandboxui/src/main/java/pl/mareklangiewicz/sandboxui/SandboxUi.kt b/sandboxui/src/main/java/pl/mareklangiewicz/sandboxui/SandboxUi.kt index 30cc1cf..150641b 100644 --- a/sandboxui/src/main/java/pl/mareklangiewicz/sandboxui/SandboxUi.kt +++ b/sandboxui/src/main/java/pl/mareklangiewicz/sandboxui/SandboxUi.kt @@ -3,19 +3,22 @@ package pl.mareklangiewicz.sandboxui import android.annotation.SuppressLint import android.content.Context import android.view.View +import android.widget.LinearLayout import android.widget.PopupMenu import androidx.core.view.isVisible import splitties.dimensions.dip -import splitties.resources.color import splitties.resources.drawable -import splitties.views.backgroundColor 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: View, name: String = content::class.simpleName ?: "") : Ui { +class SandboxUi( + override val ctx: Context, + val content: Content, + name: String = content::class.simpleName ?: "" +) : Ui { private val nameView = label(name) private val eyeView = label("\u2609") @@ -28,27 +31,26 @@ class SandboxUi(override val ctx: Context, val content: View, name: String = con } private val contentFrameView = frameLayout { - foreground = drawable(R.drawable.sandbox_ui_border) + background = drawable(R.drawable.sandbox_ui_back) add(content, lParams(matchParent, matchParent)) } override val root = verticalLayout { - backgroundColor = color(R.color.amber_500) - foreground = drawable(R.drawable.sandbox_ui_border) + background = drawable(R.drawable.sandbox_ui_back) padding = dip(4) add(headerView, lParams(matchParent)) add(contentFrameView, lParams(matchParent, matchParent)) } - private val actions = mutableListOf Unit>>() + private val actions = mutableListOf Unit>>() - fun action(name: String, block: () -> Unit) { + fun action(name: String, block: Content.() -> Unit) { menu.menu.add(0, actions.size, actions.size, name) actions += name to block } private val menu = PopupMenu(ctx, dotsView).apply { - setOnMenuItemClickListener { actions[it.order].second(); true } + setOnMenuItemClickListener { actions[it.order].second.invoke(content); true } } init { @@ -58,5 +60,34 @@ class SandboxUi(override val ctx: Context, val content: View, name: String = con } } -private fun Ui.label(text: String) = - textView { this.text = text; padding = dip(4); textColorResource = android.R.color.black } +fun Context.sandbox( + content: Content, + name: String = content::class.simpleName ?: "", + initBox: SandboxUi.() -> Unit = {} +) = SandboxUi(this, content, name).apply(initBox) + +fun View.sandbox( + content: Content, + name: String = content::class.simpleName ?: "", + initBox: SandboxUi.() -> Unit = {} +) = context.sandbox(content, name, initBox) + +fun Ui.sandbox( + content: Content, + name: String = content::class.simpleName ?: "", + initBox: SandboxUi.() -> Unit = {} +) = ctx.sandbox(content, name, initBox) + +fun LinearLayout.addbox( + content: Content, + name: String = content::class.simpleName ?: "", + initBox: SandboxUi.() -> Unit = {} +) = sandbox(content, name, initBox).also { add(it.root, lParams(matchParent)) } + + +private fun Ui.label(text: String) = textView { + this.text = text + isSingleLine = true + padding = dip(4) + textColorResource = android.R.color.black +} diff --git a/sandboxui/src/main/res/drawable/sandbox_ui_border.xml b/sandboxui/src/main/res/drawable/sandbox_ui_back.xml similarity index 56% rename from sandboxui/src/main/res/drawable/sandbox_ui_border.xml rename to sandboxui/src/main/res/drawable/sandbox_ui_back.xml index 09beca7..1b9e360 100644 --- a/sandboxui/src/main/res/drawable/sandbox_ui_border.xml +++ b/sandboxui/src/main/res/drawable/sandbox_ui_back.xml @@ -1,7 +1,17 @@ + + + + + +