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 node: Parent, private val cancelable: Cancelable ) { // def toNode(implicit c: CompositeCancelable): Node = { // c += cancelable // rootNode // } } object FXComponent { private def acquire(f: CompositeCancelable => Task[Parent]) = for { c <- Task(CompositeCancelable()) p <- f(c) } yield new FXComponent(p, c) def apply(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 }