package nova.monadic_sfx import com.softwaremill.macwire._ import io.odin.Logger import monix.bio.Task import nova.monadic_sfx.executors.Schedulers import nova.monadic_sfx.implicits.JFXButton import nova.monadic_sfx.implicits.JavaFXMonixObservables._ import nova.monadic_sfx.ui.MyFxApp import nova.monadic_sfx.ui.components.router.BrainNotWorking import nova.monadic_sfx.ui.components.router.FXRouter import nova.monadic_sfx.ui.components.todo.TodoListStore import nova.monadic_sfx.ui.components.todo.TodoListView import org.gerweck.scalafx.util._ import scalafx.Includes._ import scalafx.application.JFXApp.PrimaryStage import scalafx.beans.property.ObjectProperty import scalafx.beans.property.StringProperty import scalafx.collections.ObservableBuffer import scalafx.geometry.Insets import scalafx.scene.Scene import scalafx.scene.control.TableColumn import scalafx.scene.control.TableView import scalafx.scene.layout.HBox import scalafx.scene.paint.Color import scalafx.scene.shape.Rectangle class MainApp( // spawnProtocol: ActorSystem[SpawnProtocol.Command], schedulers: Schedulers, startTime: Long )(implicit logger: Logger[Task]) { lazy val addTodoButton = new JFXButton { text = "Add" } lazy val addTodoObs = addTodoButton.observableAction // lazy val todoListView = TodoListView.defaultListView lazy val _scene = new Scene { root = new HBox { padding = Insets(20) content = new Rectangle { width = 400 height = 200 fill = Color.DeepSkyBlue } children ++= Seq( // new JFXButton { // text = "DummyButton" // }, // new JFXButton { // text = "DummyButton2" // }, // addTodoButton, // Test.ttv // todoListView ) } } private lazy val stage = new PrimaryStage { title = "Simple ScalaFX App" scene = _scene width = 1000 height = 400 } // implicit val l = logger // implicit val sp = spawnProtocol val program = for { (fxApp, fxAppFib) <- wire[MyFxApp].init(stage) // _ <- Task(fxApp.stage = stage) // .executeOn(schedulers.fx) // .delayExecution(2000.millis) // todoComponent <- createTodoComponent // _ <- toIO( // addTodoObs // .mapEval(_ => // toTask(todoComponent.send(TodoListComponent.Add(Todo(1, "blah")))) // ) // .completedL // .executeOn(schedulers.fx) // .startAndForget // ) _ <- createTodoComponent.executeOn(schedulers.fx) router <- Task(BrainNotWorking.router) routerStore <- router.store(BrainNotWorking.Page.Home, logger) routerNode <- for { node <- Task .deferAction(implicit s => Task(new HBox { children <-- router .render(BrainNotWorking.resolver)(routerStore) .map(_.delegate) }) ) .executeOn(schedulers.fx) _ <- Task.deferFuture( routerStore.onNext(FXRouter.Replace(BrainNotWorking.Page.UserHome(1))) ) } yield node // _ <- // BrainNotWorking // .routerTask(logger) // .flatMap(node => Task(_scene.getChildren += node)) // .executeOn(schedulers.fx) _ <- Task(_scene.getChildren += routerNode).executeOn(schedulers.fx) _ <- logger.info( s"Application started in ${(System.currentTimeMillis() - startTime) / 1000f} seconds" ) _ <- fxAppFib.join } yield () // def createTodoComponent: Task[TodoListComponent] = { // for { // channel <- // ConcurrentChannel // .of[Task, TodoListComponent.Complete, TodoListComponent.Command] // scheduler = schedulers.fx // lv <- TodoListView.defaultListView2.executeOn(scheduler) // // todoLV = new TodoListView(lv) // todoComponent <- wire[TodoListComponent.Props].create // // TODO make this a "message pass" instead of mutating directly // _ <- Task(_scene.getChildren += lv).executeOn(scheduler) // // _ <- toIO( // // delObs // // .doOnNext(_ => toTask(logger.debug("Pressed delete"))) // // .doOnNext(todo => // // toTask( // // for { // // _ <- logger.debug(s"Got todo $todo") // // _ <- todoComponent.send(TodoListComponent.Delete(todo.id)) // // // _ <- Task.sequence( // // // lst.map(todo => // // // todoComponent.send(TodoListComponent.Delete(todo.id)) // // // ) // // // ) // // } yield () // // ) // // ) // // .completedL // // ).startAndForget // // _ <- toIO( // // editObs // // .doOnNext(_ => toTask(logger.debug("Pressed edit"))) // // .completedL // // ).startAndForget // } yield todoComponent // } def createTodoComponent: Task[Unit] = for { store <- TodoListStore(logger) rootNode <- TodoListView(store) _ <- Task(_scene.getChildren += rootNode) } yield () } class TestModel(_name: String, _age: Int) { val name = StringProperty(_name).readOnly val age = ObjectProperty(_age).readOnly } object Test { val items = ObservableBuffer( new TestModel("hmm", 1), new TestModel("hmm2", 2) ) val ttv = new TableView[TestModel](items) { columns ++= Seq( new TableColumn[TestModel, String] { text = "Name" cellValueFactory = { _.value.name } }, new TableColumn[TestModel, Int] { text = "Age" cellValueFactory = { _.value.age } } ) } }