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.
114 lines
3.3 KiB
114 lines
3.3 KiB
package wow.doge.mygame.implicits
|
|
|
|
import javafx.beans.value.ObservableValue
|
|
import javafx.beans.{value => jfxbv}
|
|
import javafx.scene.{input => jfxsi}
|
|
import javafx.{event => jfxe}
|
|
import monix.execution.Ack
|
|
import monix.execution.Cancelable
|
|
import monix.reactive.Observable
|
|
import monix.reactive.OverflowStrategy
|
|
import scalafx.beans.property.Property
|
|
import scalafx.scene.Scene
|
|
import scalafx.scene.control.ButtonBase
|
|
|
|
object JavaFXMonixObservables {
|
|
|
|
implicit final class SceneObservables(private val scene: Scene)
|
|
extends AnyVal {
|
|
def observableMousePressed(): Observable[jfxsi.MouseEvent] = {
|
|
import monix.execution.cancelables.SingleAssignCancelable
|
|
Observable.create(OverflowStrategy.Unbounded) { sub =>
|
|
val c = SingleAssignCancelable()
|
|
val l = new jfxe.EventHandler[jfxsi.MouseEvent] {
|
|
override def handle(event: jfxsi.MouseEvent): Unit = {
|
|
if (sub.onNext(event) == Ack.Stop) c.cancel()
|
|
}
|
|
}
|
|
|
|
scene.onMousePressed = l
|
|
c := Cancelable(() =>
|
|
scene.removeEventHandler(
|
|
jfxsi.MouseEvent.MOUSE_PRESSED,
|
|
l
|
|
)
|
|
)
|
|
c
|
|
}
|
|
}
|
|
def observableMouseDragged(): Observable[jfxsi.MouseEvent] = {
|
|
import monix.execution.cancelables.SingleAssignCancelable
|
|
Observable.create(OverflowStrategy.Unbounded) { sub =>
|
|
val c = SingleAssignCancelable()
|
|
val l = new jfxe.EventHandler[jfxsi.MouseEvent] {
|
|
override def handle(event: jfxsi.MouseEvent): Unit = {
|
|
if (sub.onNext(event) == Ack.Stop) c.cancel()
|
|
}
|
|
}
|
|
|
|
scene.onMouseDragged = l
|
|
c := Cancelable(() =>
|
|
scene.removeEventHandler(
|
|
jfxsi.MouseEvent.MOUSE_DRAGGED,
|
|
l
|
|
)
|
|
)
|
|
c
|
|
}
|
|
}
|
|
}
|
|
|
|
implicit final class BindObs[A, B](private val prop: Property[A, B])
|
|
extends AnyVal {
|
|
def <--[T](op: Observable[(ObservableValue[_ <: B], B, B)] => T) = {
|
|
op(prop.observableChange())
|
|
}
|
|
|
|
def observableChange(): Observable[(ObservableValue[_ <: B], B, B)] = {
|
|
import monix.execution.cancelables.SingleAssignCancelable
|
|
Observable.create(OverflowStrategy.Unbounded) { sub =>
|
|
val c = SingleAssignCancelable()
|
|
|
|
val listener = new jfxbv.ChangeListener[B] {
|
|
override def changed(
|
|
observable: ObservableValue[_ <: B],
|
|
oldValue: B,
|
|
newValue: B
|
|
): Unit = {
|
|
sub.onNext((observable, oldValue, newValue))
|
|
}
|
|
}
|
|
|
|
prop.addListener(listener)
|
|
|
|
c := Cancelable(() => prop.removeListener(listener))
|
|
c
|
|
}
|
|
}
|
|
}
|
|
|
|
implicit final class OnActionObservable(
|
|
private val button: ButtonBase
|
|
) extends AnyVal {
|
|
def observableAction(): Observable[jfxe.ActionEvent] = {
|
|
import monix.execution.cancelables.SingleAssignCancelable
|
|
Observable.create(OverflowStrategy.Unbounded) { sub =>
|
|
val c = SingleAssignCancelable()
|
|
val l = new jfxe.EventHandler[jfxe.ActionEvent] {
|
|
override def handle(event: jfxe.ActionEvent): Unit = {
|
|
if (sub.onNext(event) == Ack.Stop) c.cancel()
|
|
}
|
|
}
|
|
|
|
button.onAction = l
|
|
c := Cancelable(() =>
|
|
button.removeEventHandler(
|
|
jfxe.ActionEvent.ACTION,
|
|
l
|
|
)
|
|
)
|
|
c
|
|
}
|
|
}
|
|
}
|
|
}
|