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.
|
|
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" } ) } } } ) }
|