Swiftgram/submodules/Display/Source/PortalSourceView.swift
2022-01-04 22:08:12 +04:00

82 lines
2.4 KiB
Swift

import UIKit
open class PortalSourceView: UIView {
private final class PortalReference {
weak var portalView: PortalView?
init(portalView: PortalView) {
self.portalView = portalView
}
}
private var portalReferences: [PortalReference] = []
private weak var globalPortalView: GlobalPortalView?
public final var needsGlobalPortal: Bool = false {
didSet {
if self.needsGlobalPortal != oldValue {
if self.needsGlobalPortal {
self.alpha = 0.0
if let windowHost = self.windowHost {
windowHost.addGlobalPortalHostView(sourceView: self)
}
} else {
self.alpha = 1.0
if let globalPortalView = self.globalPortalView {
self.globalPortalView = nil
globalPortalView.triggerWasRemoved()
}
}
}
}
}
deinit {
if let globalPortalView = self.globalPortalView {
globalPortalView.triggerWasRemoved()
}
}
public func addPortal(view: PortalView) {
self.portalReferences.append(PortalReference(portalView: view))
if self.window != nil {
view.reloadPortal(sourceView: self)
}
}
func setGlobalPortal(view: GlobalPortalView?) {
if let globalPortalView = self.globalPortalView {
self.globalPortalView = nil
globalPortalView.triggerWasRemoved()
}
if let view = view {
self.globalPortalView = view
if self.window != nil {
view.reloadPortal(sourceView: self)
}
}
}
override open func didMoveToWindow() {
super.didMoveToWindow()
if self.window != nil {
for portalReference in self.portalReferences {
if let portalView = portalReference.portalView {
portalView.reloadPortal(sourceView: self)
}
}
if self.needsGlobalPortal, self.globalPortalView == nil, let windowHost = self.windowHost {
windowHost.addGlobalPortalHostView(sourceView: self)
}
}
}
}