1
1
mirror of https://github.com/qvacua/vimr.git synced 2024-11-28 11:35:35 +03:00
vimr/VimR/Component.swift

194 lines
3.8 KiB
Swift
Raw Normal View History

2016-07-21 20:28:58 +03:00
/**
* Tae Won Ha - http://taewon.de - @hataewon
* See LICENSE
*/
2016-08-03 22:41:43 +03:00
import Cocoa
2016-07-21 20:28:58 +03:00
import RxSwift
2016-10-02 15:07:12 +03:00
protocol Flow: class {
2016-07-21 20:28:58 +03:00
var sink: Observable<Any> { get }
}
2016-09-27 19:02:05 +03:00
class PublishingFlow: Flow {
var sink: Observable<Any> {
return self.subject.asObservable()
}
let subject = PublishSubject<Any>()
init() {
}
deinit {
self.subject.onCompleted()
}
func publish(event: Any) {
self.subject.onNext(event)
}
}
class StandardFlow: PublishingFlow {
let source: Observable<Any>
let disposeBag = DisposeBag()
init(source: Observable<Any>) {
self.source = source
super.init()
self.subscription(source: source).addDisposableTo(self.disposeBag)
}
deinit {
self.subject.onCompleted()
}
func subscription(source: Observable<Any>) -> Disposable {
preconditionFailure("Please override")
}
}
2016-10-03 16:03:18 +03:00
class EmbeddableComponent: Flow {
var sink: Observable<Any> {
return self.subject.asObservable()
}
fileprivate let subject = PublishSubject<Any>()
fileprivate let source: Observable<Any>
fileprivate let disposeBag = DisposeBag()
init(source: Observable<Any>) {
self.source = source
}
deinit {
self.subject.onCompleted()
}
func set(subscription: ((Observable<Any>) -> Disposable)) {
subscription(source).addDisposableTo(self.disposeBag)
}
func publish(event: Any) {
self.subject.onNext(event)
}
}
class StandardComponent: NSObject, Flow {
var sink: Observable<Any> {
return self.subject.asObservable()
}
let subject = PublishSubject<Any>()
let source: Observable<Any>
let disposeBag = DisposeBag()
init(source: Observable<Any>) {
self.source = source
2016-09-27 19:02:05 +03:00
super.init()
self.addViews()
self.subscription(source: source).addDisposableTo(self.disposeBag)
}
deinit {
self.subject.onCompleted()
}
2016-09-27 19:02:05 +03:00
func addViews() {
preconditionFailure("Please override")
}
2016-09-25 18:50:33 +03:00
func subscription(source: Observable<Any>) -> Disposable {
preconditionFailure("Please override")
}
2016-09-25 18:50:33 +03:00
func publish(event: Any) {
self.subject.onNext(event)
}
2016-07-21 20:28:58 +03:00
}
class ViewComponent: NSView, Flow {
2016-09-27 19:02:05 +03:00
var view: NSView {
preconditionFailure("Please override")
}
var sink: Observable<Any> {
return self.subject.asObservable()
}
let subject = PublishSubject<Any>()
let source: Observable<Any>
let disposeBag = DisposeBag()
init(source: Observable<Any>) {
self.source = source
2016-09-27 19:02:05 +03:00
super.init(frame: CGRect.zero)
self.translatesAutoresizingMaskIntoConstraints = false
self.addViews()
self.subscription(source: source).addDisposableTo(self.disposeBag)
}
2016-09-27 19:02:05 +03:00
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
deinit {
self.subject.onCompleted()
}
func addViews() {
preconditionFailure("Please override")
}
2016-09-25 18:50:33 +03:00
func subscription(source: Observable<Any>) -> Disposable {
preconditionFailure("Please override")
}
2016-09-25 18:50:33 +03:00
func publish(event: Any) {
self.subject.onNext(event)
}
}
class WorkspaceToolComponent: WorkspaceTool, Flow {
2016-11-18 20:54:14 +03:00
let toolIdentifier: ToolIdentifier
let viewComponent: ViewComponent
var sink: Observable<Any> {
return self.viewComponent.sink
}
2016-11-18 20:54:14 +03:00
init(title: String, viewComponent: ViewComponent, toolIdentifier: ToolIdentifier, minimumDimension: CGFloat = 50) {
self.toolIdentifier = toolIdentifier
self.viewComponent = viewComponent
super.init(title: title, view: viewComponent, minimumDimension: minimumDimension)
}
}
class WindowComponent: StandardComponent {
let windowController: NSWindowController
var window: NSWindow {
return self.windowController.window!
}
init(source: Observable<Any>, nibName: String) {
self.windowController = NSWindowController(windowNibName: nibName)
super.init(source: source)
}
func show() {
self.windowController.showWindow(self)
}
}