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.
91 lines
2.7 KiB
91 lines
2.7 KiB
package nova.monadic_sfx.ui.components.todo
|
|
|
|
import monix.bio.Task
|
|
import nova.monadic_sfx.implicits.FontIcon
|
|
import nova.monadic_sfx.implicits.IconLiteral
|
|
import nova.monadic_sfx.implicits.JFXListView
|
|
import nova.monadic_sfx.implicits.JavaFXMonixObservables._
|
|
import scalafx.Includes._
|
|
import scalafx.beans.property.StringProperty
|
|
import scalafx.scene.control.ContextMenu
|
|
import scalafx.scene.control.ListCell
|
|
import scalafx.scene.control.SelectionMode
|
|
import scalafx.scene.layout.HBox
|
|
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
|
|
|
|
object TodoListView {
|
|
def apply(
|
|
store: MonixProSubject[
|
|
TodoListStore.Command,
|
|
(TodoListStore.Command, TodoListStore.State)
|
|
]
|
|
): Task[JFXListView[Todo]] =
|
|
Task.deferAction(implicit s =>
|
|
Task {
|
|
val cc = CompositeCancelable()
|
|
val todos =
|
|
store.map { case (_, state) => state.todos }
|
|
|
|
new JFXListView[Todo] {
|
|
def selectedItems = selectionModel().selectedItems.view
|
|
|
|
cc += items <-- todos
|
|
|
|
val emptyCell = ObjectProperty(new HBox)
|
|
cellFactory = _ =>
|
|
new ListCell[Todo] {
|
|
val _text = StringProperty("")
|
|
val _graphic = ObjectProperty(
|
|
new HBox {
|
|
children = Seq(
|
|
new FontIcon {
|
|
iconSize = 10
|
|
iconLiteral = IconLiteral.Gmi10k
|
|
},
|
|
new Text {
|
|
text <== _text
|
|
}
|
|
)
|
|
}
|
|
)
|
|
|
|
item.asOption.map(
|
|
_.fold("")(todo => s"${todo.id} - ${todo.content}")
|
|
) --> _text
|
|
|
|
graphic <== item.asOption.flatMap(
|
|
_.fold(emptyCell)(_ => _graphic)
|
|
)
|
|
|
|
}
|
|
|
|
selectionModel().selectionMode = SelectionMode.Multiple
|
|
|
|
contextMenu = new ContextMenu {
|
|
items ++= Seq(
|
|
new MenuItem {
|
|
text = "Add"
|
|
obsAction.useLazy(TodoListStore.Add("blah3")) --> store
|
|
},
|
|
new MenuItem {
|
|
text = "Delete"
|
|
obsAction.useIterable(_ =>
|
|
selectedItems
|
|
.map(todo => TodoListStore.Delete(todo.id))
|
|
.toList
|
|
) --> store
|
|
},
|
|
new MenuItem {
|
|
text = "Edit"
|
|
}
|
|
)
|
|
}
|
|
}
|
|
}
|
|
)
|
|
}
|