92 lines
2.1 KiB
Kotlin
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
|
|
}
|
|
|
|
}
|