Added proper todo buttons reactively connected

This commit is contained in:
Rohan Sircar 2020-12-17 12:20:42 +05:30
parent f95ecc2cb3
commit f95f50574e

View File

@ -1,22 +1,27 @@
package nova.monadic_sfx.ui.components.todo package nova.monadic_sfx.ui.components.todo
import monix.bio.Task import monix.bio.Task
import monix.execution.cancelables.CompositeCancelable
import nova.monadic_sfx.implicits.FontIcon import nova.monadic_sfx.implicits.FontIcon
import nova.monadic_sfx.implicits.IconLiteral import nova.monadic_sfx.implicits.IconLiteral
import nova.monadic_sfx.implicits.JFXButton
import nova.monadic_sfx.implicits.JFXListView import nova.monadic_sfx.implicits.JFXListView
import nova.monadic_sfx.implicits.JFXTextField
import nova.monadic_sfx.implicits.JavaFXMonixObservables._ import nova.monadic_sfx.implicits.JavaFXMonixObservables._
import nova.monadic_sfx.implicits.MenuItem
import nova.monadic_sfx.util.reactive._
import org.gerweck.scalafx.util._
import scalafx.Includes._ import scalafx.Includes._
import scalafx.beans.property.ObjectProperty
import scalafx.beans.property.StringProperty import scalafx.beans.property.StringProperty
import scalafx.geometry.Insets
import scalafx.scene.Node
import scalafx.scene.control.ContextMenu import scalafx.scene.control.ContextMenu
import scalafx.scene.control.ListCell import scalafx.scene.control.ListCell
import scalafx.scene.control.SelectionMode import scalafx.scene.control.SelectionMode
import scalafx.scene.layout.HBox import scalafx.scene.layout.HBox
import scalafx.scene.text.Text import scalafx.scene.text.Text
import nova.monadic_sfx.util.reactive._ import monix.{eval => me}
import org.gerweck.scalafx.util._
import scalafx.beans.property.ObjectProperty
import nova.monadic_sfx.implicits.MenuItem
import monix.execution.cancelables.CompositeCancelable
object TodoListView { object TodoListView {
def apply( def apply(
@ -24,13 +29,22 @@ object TodoListView {
TodoListStore.Command, TodoListStore.Command,
(TodoListStore.Command, TodoListStore.State) (TodoListStore.Command, TodoListStore.State)
] ]
): Task[JFXListView[Todo]] = ): Task[Node] =
Task.deferAction(implicit s => Task.deferAction(implicit s =>
Task { Task {
val cc = CompositeCancelable() val cc = CompositeCancelable()
val todos = val todos =
store.map { case (_, state) => state.todos } store.map { case (_, state) => state.todos }
// Todo(-1, "").some
val _selectedItems = ObjectProperty(Seq.empty[Todo])
new HBox {
padding = Insets(5)
val _content = StringProperty("")
children = Seq(
new JFXTextField {
text ==> _content
},
new JFXListView[Todo] { new JFXListView[Todo] {
def selectedItems = selectionModel().selectedItems.view def selectedItems = selectionModel().selectedItems.view
@ -56,7 +70,7 @@ object TodoListView {
item.asOption.map( item.asOption.map(
_.fold("")(todo => s"${todo.id} - ${todo.content}") _.fold("")(todo => s"${todo.id} - ${todo.content}")
) --> _text ) ==> _text
graphic <== item.asOption.flatMap( graphic <== item.asOption.flatMap(
_.fold(emptyCell)(_ => _graphic) _.fold(emptyCell)(_ => _graphic)
@ -65,16 +79,17 @@ object TodoListView {
} }
selectionModel().selectionMode = SelectionMode.Multiple selectionModel().selectionMode = SelectionMode.Multiple
selectionModel().selectedItems.observableSeqValue ==> _selectedItems
contextMenu = new ContextMenu { contextMenu = new ContextMenu {
items ++= Seq( items ++= Seq(
new MenuItem { new MenuItem {
text = "Add" text = "Add"
obsAction.useLazy(TodoListStore.Add("blah3")) --> store // obsAction.useLazyEval(TodoListStore.Add("blah3")) --> store
}, },
new MenuItem { new MenuItem {
text = "Delete" text = "Delete"
obsAction.useIterable(_ => obsAction.useIterableEval(_ =>
selectedItems selectedItems
.map(todo => TodoListStore.Delete(todo.id)) .map(todo => TodoListStore.Delete(todo.id))
.toList .toList
@ -85,6 +100,28 @@ object TodoListView {
} }
) )
} }
},
new JFXButton {
text = "Add"
disable <== _selectedItems.map(_.length > 0)
obsAction
.useLazyEval(me.Task(TodoListStore.Add(_content()))) --> store
},
new JFXButton {
text = "Edit"
disable <== _selectedItems.map(_.length > 1)
obsAction.useLazyEval(
me.Task(
TodoListStore.Edit(
_selectedItems
.map(_.headOption.map(_.id).getOrElse(-1))
.value,
_content()
)
)
) --> store
}
)
} }
} }
) )