package nova.monadic_sfx.ui import javafx.{scene => jfxc} import monix.bio.Task import monix.execution.Cancelable import monix.execution.cancelables.CompositeCancelable import monix.reactive.subjects.ConcurrentSubject import nova.monadic_sfx.implicits._ import scalafx.beans.property.ObjectProperty import scalafx.scene.Node import scalafx.scene.Parent import scalafx.scene.control.TextField import scalafx.scene.text.Font import cats.effect.Resource final class FXComponent private ( val rootNode: Parent, val cancelable: Cancelable ) object FXComponent { def acquire(f: CompositeCancelable => Task[Parent]) = for { c <- Task(CompositeCancelable()) p <- f(c) } yield new FXComponent(p, c) def fxComponent2Node( component: FXComponent )(implicit c: CompositeCancelable): Node = { c += component.cancelable component.rootNode } def resource(f: CompositeCancelable => Task[Parent]) = Resource.make(acquire(f))(comp => Task(comp.cancelable.cancel())) } object TestFXComp { val testComp = FXComponent.resource { implicit c => Task.deferAction { implicit s => Task { val sub = ConcurrentSubject.publish[jfxc.text.Font] val f = ObjectProperty(Font("hmm")) sub.onNext(f()) new TextField { font <-- sub font <== f } } } } // val x = for { // comp <- testComp // res <- FXComponent.make { implicit c => // Task.deferAction { implicit s => // Task { // new BorderPane { // val sub = ConcurrentSubject.publish[jfxc.text.Font] // center = FXComponent.fxComponent2Node(comp) // bottom = new TextField { // font <-- sub // } // } // } // } // } // } yield res }