You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
189 lines
5.5 KiB
189 lines
5.5 KiB
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 }
|
|
}
|
|
)
|
|
}
|
|
}
|