uicore-ts
Version:
UICore is a library to build native-like user interfaces using pure Typescript. No HTML is needed at all. Components are described as TS classes and all user interactions are handled explicitly. This library is strongly inspired by the UIKit framework tha
256 lines (129 loc) • 5.62 kB
text/typescript
import { UIDialogView } from "./UIDialogView"
import { FIRST_OR_NIL, IS, NO, UIObject, YES } from "./UIObject"
import { UIRoute } from "./UIRoute"
import { UIView, UIViewBroadcastEvent } from "./UIView"
export class UIViewController extends UIObject {
parentViewController?: UIViewController
childViewControllers: UIViewController[] = []
static readonly routeComponentName: string
static readonly ParameterIdentifierName: any
constructor(public view: UIView) {
super()
this.view.viewController = this
}
get routeComponent() {
return UIRoute.currentRoute.componentWithViewController(this.class)
}
handleRouteRecursively(route: UIRoute) {
this.handleRoute(route)
this.childViewControllers.forEach(controller => {
controller.handleRouteRecursively(route)
})
}
async handleRoute(route: UIRoute) {
}
async viewWillAppear() {
}
async viewDidAppear() {
}
async viewWillDisappear() {
}
async viewDidDisappear() {
}
updateViewConstraints() {
}
updateViewStyles() {
}
layoutViewSubviews() {
}
_triggerLayoutViewSubviews() {
if (this.view.needsLayout) {
this.view.layoutSubviews()
this.viewDidLayoutSubviews()
}
}
viewWillLayoutSubviews() {
this.updateViewConstraints()
this.updateViewStyles()
}
viewDidLayoutSubviews() {
// this.childViewControllers.forEach(function (controller, index, controllers) {
// controller._layoutViewSubviews();
// })
}
viewDidReceiveBroadcastEvent(event: UIViewBroadcastEvent) {
}
get core() {
return this.view.core
}
hasChildViewController(viewController: UIViewController) {
// This is for performance reasons
if (!IS(viewController)) {
return NO
}
for (let i = 0; i < this.childViewControllers.length; i++) {
const childViewController = this.childViewControllers[i]
if (childViewController == viewController) {
return YES
}
}
return NO
}
addChildViewController(viewController: UIViewController) {
if (!this.hasChildViewController(viewController)) {
viewController.willMoveToParentViewController(this)
this.childViewControllers.push(viewController)
this.view.addSubview(viewController.view)
viewController.didMoveToParentViewController(this)
}
}
removeFromParentViewController() {
this.parentViewController?.removeChildViewController(this)
}
willMoveToParentViewController(parentViewController: UIViewController) {
}
didMoveToParentViewController(parentViewController: UIViewController) {
this.parentViewController = parentViewController
}
removeChildViewController(controller: UIViewController) {
controller = FIRST_OR_NIL(controller)
controller.viewWillDisappear()
if (IS(controller.parentViewController)) {
const index = this.parentViewController?.childViewControllers.indexOf(this) ?? -1
if (index > -1) {
this.parentViewController?.childViewControllers.splice(index, 1)
this.view.removeFromSuperview()
this.parentViewController = undefined
}
}
if (IS(controller.view)) {
controller.view.removeFromSuperview()
}
controller.viewDidDisappear()
}
addChildViewControllerInContainer(controller: UIViewController, containerView: UIView) {
controller = FIRST_OR_NIL(controller)
containerView = FIRST_OR_NIL(containerView)
controller.viewWillAppear()
this.addChildViewController(controller)
containerView.addSubview(controller.view)
controller.handleRouteRecursively(UIRoute.currentRoute)
controller.didMoveToParentViewController(this)
controller.viewDidAppear()
}
addChildViewControllerInDialogView(controller: UIViewController, dialogView: UIDialogView) {
controller = FIRST_OR_NIL(controller)
dialogView = FIRST_OR_NIL(dialogView)
controller.viewWillAppear()
this.addChildViewController(controller)
dialogView.view = controller.view
const originalDismissFunction = dialogView.dismiss.bind(dialogView)
dialogView.dismiss = animated => {
originalDismissFunction(animated)
this.removeChildViewController(controller)
}
controller.handleRouteRecursively(UIRoute.currentRoute)
controller.didMoveToParentViewController(this)
controller.viewDidAppear()
}
}