ASMR/src/main/kotlin/net/shadowfacts/cacao/viewcontroller/ViewController.kt

92 lines
2.1 KiB
Kotlin

package net.shadowfacts.cacao.viewcontroller
import net.shadowfacts.cacao.Window
import net.shadowfacts.cacao.util.properties.ObservableLazyProperty
import net.shadowfacts.cacao.view.View
import net.shadowfacts.kiwidsl.dsl
import java.util.*
/**
* @author shadowfacts
*/
abstract class ViewController {
lateinit var window: Window
val createConstraints
get() = window.solver::dsl
lateinit var view: View
protected set
var parent: ViewController? = null
set(value) {
willMoveTo(value)
field = value
didMoveTo(value)
}
private var _children = LinkedList<ViewController>()
val children: List<ViewController> = _children
abstract fun loadView()
open fun viewDidLoad() {}
open fun viewWillLayoutSubviews() {
children.forEach(ViewController::viewWillLayoutSubviews)
}
open fun viewDidLayoutSubviews() {
children.forEach(ViewController::viewDidLayoutSubviews)
}
open fun viewWillAppear() {
children.forEach(ViewController::viewWillAppear)
}
open fun viewDidAppear() {
children.forEach(ViewController::viewDidAppear)
}
open fun viewWillDisappear() {
children.forEach(ViewController::viewWillDisappear)
}
open fun viewDidDisappear() {
children.forEach(ViewController::viewDidDisappear)
}
open fun willMoveTo(parent: ViewController?) {}
open fun didMoveTo(parent: ViewController?) {}
fun embedChild(viewController: ViewController, container: View = this.view) {
viewController.parent = this
viewController.window = window
_children.add(viewController)
viewController.loadView()
container.addSubview(viewController.view)
createConstraints {
viewController.view.leftAnchor equalTo container.leftAnchor
viewController.view.rightAnchor equalTo container.rightAnchor
viewController.view.topAnchor equalTo container.topAnchor
viewController.view.bottomAnchor equalTo container.bottomAnchor
}
viewController.viewDidLoad()
}
fun removeChild(viewController: ViewController) {
viewController.parent = null
_children.remove(viewController)
}
fun removeFromParent() {
parent?.removeChild(this)
// todo: remove view from superview
}
}