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() val children: List = _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 } }