use of org.malai.javafx.interaction.library.DnD in project latexdraw by arnobl.
the class Pencil method bindDnDToDrawFreeHandShape.
/**
* Binds a DnD interaction to create shape.
*/
private void bindDnDToDrawFreeHandShape() {
nodeBinder(AddShape.class, new DnD(false, true)).on(canvas).map(i -> {
final IShape sh = createShapeInstance();
final IPoint pt = getAdaptedPoint(i.getSrcLocalPoint());
sh.getPoints().get(0).setPoint(pt.getX(), pt.getY());
return new AddShape(sh, canvas.getDrawing());
}).first((c, i) -> Platform.runLater(() -> canvas.requestFocus())).then((c, i) -> {
final IPoint last = c.getShape().get().getPtAt(-1);
final IPoint endPt = getAdaptedPoint(i.getEndLocalPt());
if (!MathUtils.INST.equalsDouble(last.getX(), endPt.getX(), 0.0001) && !MathUtils.INST.equalsDouble(last.getY(), endPt.getY(), 0.0001)) {
c.setShape(ShapeFactory.INST.createFreeHandFrom((IFreehand) c.getShape().get(), endPt));
}
canvas.setTempView(ViewFactory.INSTANCE.createView(c.getShape().orElse(null)).orElse(null));
}).endOrCancel((c, i) -> canvas.setTempView(null)).when(i -> i.getButton() == MouseButton.PRIMARY && currentChoice.get() == EditionChoice.FREE_HAND).strictStart().bind();
}
use of org.malai.javafx.interaction.library.DnD in project latexdraw by arnobl.
the class CanvasController method configureBindings.
@Override
protected void configureBindings() {
nodeBinder(MoveCamera.class, new DnD()).on(canvas).first((c, i) -> c.setScrollPane(canvas.getScrollPane())).then((c, i) -> {
final ScrollPane pane = canvas.getScrollPane();
c.setPx(pane.getHvalue() - (i.getEndLocalPt().getX() - i.getSrcLocalPoint().getX()) / canvas.getWidth());
c.setPy(pane.getVvalue() - (i.getEndLocalPt().getY() - i.getSrcLocalPoint().getY()) / canvas.getHeight());
}).when(i -> i.getButton() == MouseButton.MIDDLE).feedback(() -> canvas.setCursor(Cursor.MOVE)).exec().bind();
}
use of org.malai.javafx.interaction.library.DnD in project latexdraw by arnobl.
the class Border method configureMovePointBinding.
private void configureMovePointBinding() {
nodeBinder(MovePointShape.class, new DnD()).on(mvPtHandlers).first((c, i) -> i.getSrcObject().filter(o -> o instanceof MovePtHandler).map(o -> (MovePtHandler) o).ifPresent(handler -> {
final IGroup group = canvas.getDrawing().getSelection();
if (group.size() == 1 && group.getShapeAt(0) instanceof IModifiablePointsShape) {
c.setPoint(handler.getPoint());
c.setShape((IModifiablePointsShape) group.getShapeAt(0));
}
})).then((c, i) -> i.getSrcObject().ifPresent(node -> {
final Point3D startPt = node.localToParent(i.getSrcLocalPoint());
final Point3D endPt = node.localToParent(i.getEndLocalPt());
final IPoint ptToMove = ((MovePtHandler) node).getPoint();
final double x = ptToMove.getX() + endPt.getX() - startPt.getX();
final double y = ptToMove.getY() + endPt.getY() - startPt.getY();
c.setNewCoord(grid.getTransformedPointToGrid(new Point3D(x, y, 0d)));
})).exec().when(i -> i.getSrcLocalPoint() != null && i.getEndLocalPt() != null && i.getSrcObject().orElse(null) instanceof MovePtHandler).bind();
}
use of org.malai.javafx.interaction.library.DnD in project latexdraw by arnobl.
the class Border method configureBindings.
@Override
protected void configureBindings() {
addBinding(new DnD2Scale(this));
configureMovePointBinding();
nodeBinder(MoveCtrlPoint.class, new DnD()).on(ctrlPt1Handlers).on(ctrlPt2Handlers).first((c, i) -> {
final IGroup group = canvas.getDrawing().getSelection();
if (group.size() == 1 && group.getShapeAt(0) instanceof IControlPointShape) {
c.setPoint(i.getSrcObject().map(h -> ((CtrlPointHandler) h).getPoint()).orElse(null));
c.setShape((IControlPointShape) group.getShapeAt(0));
c.setIsFirstCtrlPt(ctrlPt1Handlers.contains(i.getSrcObject().orElse(null)));
}
}).then((c, i) -> {
final Point3D startPt = i.getSrcObject().map(n -> n.localToParent(i.getSrcLocalPoint())).orElse(new Point3D(0d, 0d, 0d));
final Point3D endPt = i.getSrcObject().map(n -> n.localToParent(i.getEndLocalPt())).orElse(new Point3D(0d, 0d, 0d));
final IPoint ptToMove = i.getSrcObject().map(n -> ((CtrlPointHandler) n).getPoint()).orElse(ShapeFactory.INST.createPoint());
final double x = ptToMove.getX() + endPt.getX() - startPt.getX();
final double y = ptToMove.getY() + endPt.getY() - startPt.getY();
c.setNewCoord(grid.getTransformedPointToGrid(new Point3D(x, y, 0d)));
}).exec().bind();
nodeBinder(RotateShapes.class, new DnD()).on(rotHandler).first((c, i) -> {
final IDrawing drawing = canvas.getDrawing();
c.setGravityCentre(drawing.getSelection().getGravityCentre());
c.getGc().translate(canvas.getOrigin().getX(), canvas.getOrigin().getY());
c.setShape(drawing.getSelection().duplicateDeep(false));
}).then((c, i) -> c.setRotationAngle(c.getGc().computeRotationAngle(ShapeFactory.INST.createPoint(canvas.sceneToLocal(i.getSrcScenePoint())), ShapeFactory.INST.createPoint(canvas.sceneToLocal(i.getEndScenePt()))))).exec().bind();
addBinding(new DnD2ArcAngle(this));
}
use of org.malai.javafx.interaction.library.DnD in project Malai by arnobl.
the class Pencil method configureBindings.
@Override
protected void configureBindings() {
// A DnD interaction with the left button of the mouse will produce an AddShape command while interacting on the canvas.
// A temporary view of the created shape is created and displayed by the canvas.
// This view is removed at the end of the interaction.
nodeBinder(new DnD(), i -> new AddShape(drawing, new MyRect(i.getSrcLocalPoint().getX(), i.getSrcLocalPoint().getY()))).on(canvas).first((i, c) -> canvas.setTmpShape(ViewFactory.INSTANCE.createViewShape(c.getShape()))).then((i, c) -> {
final MyRect sh = (MyRect) c.getShape();
sh.setWidth(i.getTgtLocalPoint().getX() - sh.getX());
sh.setHeight(i.getTgtLocalPoint().getY() - sh.getY());
}).when(i -> i.getButton() == MouseButton.PRIMARY).end((i, c) -> canvas.setTmpShape(null)).log(LogLevel.INTERACTION).strictStart().help(new AddRectHelpAnimation(learningPane, canvas)).bind();
// A DnD interaction with the right button of the mouse moves the targeted shape.
// To incrementally moves the shape, the DnD interaction has its parameter 'updateSrcOnUpdate' set to true:
// At each interaction updates, the source point and object take the latest target point and object.
// The DnD interaction can be stopped (aborted) by pressing the key 'ESC'. This cancels the ongoing command (that thus needs to be undoable).
nodeBinder(new DnD(true, true), // In the command these binding are @autoUnbind to be unbound on their command termination.
i -> {
final MyShape sh = i.getSrcObject().map(o -> (MyShape) o.getUserData()).get();
return new MoveShape(sh, Bindings.createDoubleBinding(() -> sh.getX() + (i.getTgtScenePoint().getX() - i.getSrcScenePoint().getX()), i.tgtScenePointProperty(), i.srcScenePointProperty()), Bindings.createDoubleBinding(() -> sh.getY() + (i.getTgtScenePoint().getY() - i.getSrcScenePoint().getY()), i.tgtScenePointProperty(), i.srcScenePointProperty()));
}).on(canvas.getShapesPane().getChildren()).when(i -> i.getButton() == MouseButton.SECONDARY).exec().first((i, c) -> {
// Required to grab the focus to get key events
Platform.runLater(() -> i.getSrcObject().get().requestFocus());
i.getSrcObject().get().setEffect(new DropShadow(20d, Color.BLACK));
}).endOrCancel((i, c) -> i.getSrcObject().get().setEffect(null)).strictStart().help(new MoveRectHelpAnimation(learningPane, canvas)).throttle(40L).bind();
// nodeBinder(new DnD(true, true), i -> new MoveShape(i.getSrcObject().map(o ->(MyShape) o.getUserData()).orElse(null))).
// // The binding dynamically registers elements of the given observable list.
// // When nodes are added to this list, these nodes register the binding.
// // When nodes are removed from this list, their binding is cancelled.
// // This permits to interact on nodes (here, shapes) that are dynamically added to/removed from the canvas.
// on(canvas.getShapesPane().getChildren()).
// then((i, c) -> c.setCoord(c.getShape().getX() + (i.getTgtScenePoint().getX() - i.getSrcScenePoint().getX()),
// c.getShape().getY() + (i.getTgtScenePoint().getY() - i.getSrcScenePoint().getY()))).
// when(i -> i.getButton() == MouseButton.SECONDARY).
// // exec(true): this allows to execute the command each time the interaction updates (and 'when' is true).
// exec(true).
// first((i, c) -> {
// // Required to grab the focus to get key events
// Platform.runLater(() -> i.getSrcObject().get().requestFocus());
// i.getSrcObject().get().setEffect(new DropShadow(20d, Color.BLACK));
// }).
// end((i, c) -> i.getSrcObject().get().setEffect(null)).
// strictStart().
// bind();
/*
* A DnD on the colour picker produces ChangeCol commands when the target of the DnD is a shape
* (the shape we want to change the colour). The interim feedback changes the cursor during the DnD to show the dragged colour.
* Note that the feedback callback is not optimised here as the colour does not change during the DnD. The cursor
* should be changed in 'first'
*/
nodeBinder(new DnD(), i -> new ChangeColour(lineCol.getValue(), null)).on(lineCol).then((i, c) -> i.getTgtObject().map(view -> (MyShape) view.getUserData()).ifPresent(sh -> c.setShape(sh))).when(i -> i.getTgtObject().orElse(null) instanceof Shape).feedback(() -> lineCol.getScene().setCursor(new ColorCursor(lineCol.getValue()))).endOrCancel((a, i) -> lineCol.getScene().setCursor(Cursor.DEFAULT)).bind();
/*
* A mouse pressure creates an anonymous command that simply shows a message in the console.
*/
anonCmdBinder(new Press(), () -> System.out.println("An example of the anonymous command.")).on(canvas).bind();
/*
* A widget binding that execute a command asynchronously.
* Widgets and properties are provided to the binding to:
* show/hide the cancel button, provide widgets with information regarding the progress of the command execution.
*/
buttonBinder(Save::new).on(save).async(cancel, progressbar.progressProperty(), textProgress.textProperty()).bind();
}
Aggregations