diff --git a/lib/src/main/java/ds/bindingtools/ViewBindings.kt b/lib/src/main/java/ds/bindingtools/ViewBindings.kt index 48e6368..2dc7440 100644 --- a/lib/src/main/java/ds/bindingtools/ViewBindings.kt +++ b/lib/src/main/java/ds/bindingtools/ViewBindings.kt @@ -3,7 +3,6 @@ */ package ds.bindingtools -import android.arch.lifecycle.LifecycleObserver import android.widget.CompoundButton import android.widget.TextView import java.util.* @@ -69,6 +68,38 @@ inline fun Bindable.bind(prop: KProperty0, view: TextVie inline fun Bindable.bind(prop: KProperty0, view: CompoundButton) = bind(prop, view::setChecked, view::isChecked) +/** + * Binds [setter]/[getter] pair to the [prop] + */ +fun Bindable.bind(prop: KProperty0, setter: (T) -> Unit, getter: (() -> T)? = null) { + val owner: Bindable = prop.parent as Bindable + println("bind ${prop.name}") + val binding = getBinding(owner, prop) ?: BindingData(prop.name) + binding.setters += setter + if (getter != null) + if (binding.getter == null) + binding.getter = getter + else + error("Only one getter per property allowed") + + setter(prop.get()) // initialize view + bindings[owner]!!.put(prop.name, binding) +} + +/** + * Binds any property to any property + */ +fun Bindable.bind(prop: KProperty0, mutableProp: KMutableProperty0) = + bind(prop, { mutableProp.set(it) }, { mutableProp.get() }) + +fun Bindable.unbind(prop: KProperty) { + bindings[this]?.remove(prop.name) +} + +fun Bindable.unbindAll() { + bindings.remove(this) +} + fun Bindable.debugBindings() { bindings[this]?.forEach { e -> println("for ${e.value.field}: id=${e.key} getter=${e.value.getter} setters=${e.value.setters.size}") @@ -82,37 +113,4 @@ private class BindingData(val field: String) { val setters = mutableListOf<(T) -> Unit>() } -interface Bindable : LifecycleObserver { - - /** - * Binds [setter]/[getter] pair to the [prop] - */ - fun bind(prop: KProperty0, setter: (T) -> Unit, getter: (() -> T)? = null) { - val owner: Bindable = prop.parent as Bindable - println("bind ${prop.name}") - val binding = getBinding(owner, prop) ?: BindingData(prop.name) - binding.setters += setter - if (getter != null) - if (binding.getter == null) - binding.getter = getter - else - error("Only one getter per property allowed") - - setter(prop.get()) // initialize view - bindings[owner]!!.put(prop.name, binding) - } - - /** - * Binds any property to any property - */ - fun bind(prop: KProperty0, mutableProp: KMutableProperty0) = - bind(prop, { mutableProp.set(it) }, { mutableProp.get() }) - - fun unbind(prop: KProperty) { - bindings[this]?.remove(prop.name) - } - - fun unbindAll() { - bindings.remove(this) - } -} +interface Bindable \ No newline at end of file