Browse Source

Added proper todo buttons reactively connected

master
Rohan Sircar 3 years ago
parent
commit
f95f50574e
  1. 55
      src/main/scala/nova/monadic_sfx/ui/components/todo/TodoListView.scala

55
src/main/scala/nova/monadic_sfx/ui/components/todo/TodoListView.scala

@ -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 org.gerweck.scalafx.util._
import scalafx.beans.property.ObjectProperty
import nova.monadic_sfx.implicits.MenuItem
import monix.execution.cancelables.CompositeCancelable
import monix.{eval => me}
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
}
)
} }
} }
) )

Loading…
Cancel
Save