Skip to content

Commit 0737a70

Browse files
committed
Synchronize mouse inputs
1 parent c92d6ce commit 0737a70

File tree

4 files changed

+72
-51
lines changed

4 files changed

+72
-51
lines changed

sg2-app/src/cz/hartrik/sg2/app/FrameController.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,7 @@ public void initialize(java.net.URL url, java.util.ResourceBundle rb) {
162162

163163
initEngineStateMonitor();
164164

165-
new MouseControllerExt(fxCanvas, controls,
166-
this::getEngine, this::getWorld, this::getSyncTools,
165+
new MouseControllerExt(fxCanvas, controls, this::getWorld, this::getSyncTools,
167166
brushManager, canvas).init();
168167
}
169168

sg2-app/src/cz/hartrik/sg2/app/extension/canvas/MouseController.java

+26-15
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
import cz.hartrik.sg2.brush.Brush;
55
import cz.hartrik.sg2.brush.jfx.JFXControls;
6-
import cz.hartrik.sg2.engine.JFXEngine;
6+
import cz.hartrik.sg2.engine.EngineSyncTools;
77
import cz.hartrik.sg2.tool.Draggable;
88
import cz.hartrik.sg2.tool.Tool;
99
import cz.hartrik.sg2.world.BrushInserter;
@@ -23,7 +23,7 @@
2323
* době po zmáčknutí tlačítka myši a k deaktivaci po jeho puštění nebo pohybu
2424
* myši.
2525
*
26-
* @version 2016-07-01
26+
* @version 2017-08-12
2727
* @author Patrik Harag
2828
*/
2929
public class MouseController {
@@ -34,16 +34,16 @@ public class MouseController {
3434
protected final Canvas canvas;
3535
protected final JFXControls controls;
3636

37-
protected final Supplier<JFXEngine<?>> engineSupplier;
37+
protected final Supplier<EngineSyncTools<?>> syncTools;
3838
protected final Supplier<ElementArea> areaSupplier;
3939

4040
public MouseController(Canvas canvas, JFXControls controls,
41-
Supplier<JFXEngine<?>> engineSupplier,
42-
Supplier<ElementArea> areaSupplier) {
41+
Supplier<EngineSyncTools<?>> syncTools,
42+
Supplier<ElementArea> areaSupplier) {
4343

4444
this.canvas = canvas;
4545
this.controls = controls;
46-
this.engineSupplier = engineSupplier;
46+
this.syncTools = syncTools;
4747
this.areaSupplier = areaSupplier;
4848
}
4949

@@ -98,8 +98,11 @@ protected void onMouseReleased(MouseEvent event) {
9898
// další metody
9999

100100
private void startHoldTimer(MouseButton button) {
101-
timeline = new Timeline(new KeyFrame(MOUSE_HOLDING_PAUSE,
102-
(e) -> apply(lastX, lastY, button, false)));
101+
final int lastX = this.lastX;
102+
final int lastY = this.lastY;
103+
timeline = new Timeline(new KeyFrame(MOUSE_HOLDING_PAUSE, (e) -> {
104+
apply(lastX, lastY, button, false);
105+
}));
103106

104107
timeline.setDelay(MOUSE_HOLDING_DELAY);
105108
timeline.setCycleCount(Animation.INDEFINITE);
@@ -112,22 +115,30 @@ private void stopHoldTimer() {
112115
}
113116
}
114117

115-
protected boolean isSupported(MouseButton button) {
118+
private boolean isSupported(MouseButton button) {
116119
return button == MouseButton.PRIMARY || button == MouseButton.SECONDARY;
117120
}
118121

119-
protected void apply(int x, int y, MouseButton button, boolean drag) {
122+
protected void apply(final int x, final int y, MouseButton button, boolean drag) {
120123
final Tool tool = controls.getTool(button);
121124
final Brush brush = controls.getBrush(button);
122-
final BrushInserter<?> inserter = getInserter(brush);
125+
final int lastX = this.lastX;
126+
final int lastY = this.lastY;
123127

124128
if (drag && tool instanceof Draggable) {
125-
Draggable draggable = ((Draggable) tool);
126-
draggable.stroke(x, y, lastX, lastY, inserter);
129+
syncTools.get().synchronize(() -> {
130+
BrushInserter<?> inserter = getInserter(brush);
131+
((Draggable) tool).stroke(x, y, lastX, lastY, inserter);
132+
inserter.finalizeInsertion();
133+
});
134+
127135
} else {
128-
tool.apply(x, y, inserter);
136+
syncTools.get().synchronize(() -> {
137+
BrushInserter<?> inserter = getInserter(brush);
138+
tool.apply(x, y, inserter);
139+
inserter.finalizeInsertion();
140+
});
129141
}
130-
inserter.finalizeInsertion();
131142
}
132143

133144
protected BrushInserter<?> getInserter(Brush brush) {

sg2-app/src/cz/hartrik/sg2/app/extension/canvas/MouseControllerExt.java

+44-29
Original file line numberDiff line numberDiff line change
@@ -5,40 +5,40 @@
55
import cz.hartrik.sg2.brush.jfx.JFXControls;
66
import cz.hartrik.sg2.brush.manage.BrushManager;
77
import cz.hartrik.sg2.engine.EngineSyncTools;
8-
import cz.hartrik.sg2.engine.JFXEngine;
98
import cz.hartrik.sg2.tool.Draggable;
109
import cz.hartrik.sg2.tool.Fillable;
1110
import cz.hartrik.sg2.tool.Tool;
1211
import cz.hartrik.sg2.world.BrushInserter;
1312
import cz.hartrik.sg2.world.ElementArea;
1413
import cz.hartrik.sg2.world.element.Air;
1514
import java.util.function.Supplier;
15+
import java.util.logging.Logger;
1616
import javafx.scene.canvas.Canvas;
1717
import javafx.scene.input.MouseButton;
1818
import javafx.scene.input.MouseEvent;
1919

2020
/**
2121
* Kromě základního kreslení myší umožňuje ještě podržením shift, ctrl, alt...
2222
*
23-
* @version 2015-03-21
23+
* @version 2017-08-12
2424
* @author Patrik Harag
2525
*/
2626
public class MouseControllerExt extends MouseControllerPick {
2727

28-
protected final CanvasWithCursor fxCanvas;
28+
private static final Logger LOGGER = Logger.getLogger(MouseControllerExt.class.getName());
2929

30-
protected boolean shiftEvent;
31-
protected boolean ctrlEvent;
32-
protected boolean altEvent;
30+
private final CanvasWithCursor fxCanvas;
31+
32+
private boolean shiftEvent;
33+
private boolean ctrlEvent;
34+
private boolean altEvent;
3335

3436
public MouseControllerExt(Canvas canvas, JFXControls controls,
35-
Supplier<JFXEngine<?>> engineSupplier,
3637
Supplier<ElementArea> areaSupplier,
3738
Supplier<EngineSyncTools<?>> syncTools,
3839
BrushManager brushManager, CanvasWithCursor fxCanvas) {
3940

40-
super(canvas, controls, engineSupplier, areaSupplier, syncTools,
41-
brushManager);
41+
super(canvas, controls, areaSupplier, syncTools, brushManager);
4242

4343
this.fxCanvas = fxCanvas;
4444
}
@@ -68,14 +68,16 @@ protected void onMouseReleased(MouseEvent event) {
6868
apply((int) event.getX(), (int) event.getY(), event.getButton(), false);
6969
shiftEvent = false;
7070
ctrlEvent = false;
71+
7172
} else {
7273
super.onMouseReleased(event);
7374
}
7475
}
7576

7677
@Override
7778
protected void onMouseDragged(MouseEvent event) {
78-
if (!shiftEvent && !ctrlEvent) super.onMouseDragged(event);
79+
if (!shiftEvent && !ctrlEvent)
80+
super.onMouseDragged(event);
7981
}
8082

8183
// ostatní metody
@@ -90,21 +92,26 @@ else if (ctrlEvent)
9092
super.apply(x, y, button, drag);
9193
}
9294

93-
protected void shiftEvent(int x, int y, MouseButton button) {
94-
Draggable draggable = ((Draggable) controls.getTool(button));
95-
Brush brush = controls.getBrush(button);
96-
BrushInserter<?> inserter = getInserter(brush);
97-
98-
draggable.stroke(x, y, lastX, lastY, inserter);
95+
private void shiftEvent(int x, int y, MouseButton button) {
96+
final Tool tool = controls.getTool(button);
97+
final Brush brush = controls.getBrush(button);
98+
final int lastX = this.lastX;
99+
final int lastY = this.lastY;
100+
101+
if (tool instanceof Draggable) {
102+
syncTools.get().synchronize(() -> {
103+
BrushInserter<?> inserter = getInserter(brush);
104+
((Draggable) tool).stroke(x, y, lastX, lastY, inserter);
105+
inserter.finalizeInsertion();
106+
});
107+
} else {
108+
LOGGER.warning("Stroke is not supported");
109+
}
99110

100-
inserter.finalizeInsertion();
101111
setDefaultCursor();
102112
}
103113

104-
protected void ctrlEvent(int x, int y, MouseButton button) {
105-
Fillable fillable = ((Fillable) controls.getTool(button));
106-
Brush brush = controls.getBrush(button);
107-
BrushInserter<?> inserter = getInserter(brush);
114+
private void ctrlEvent(int x, int y, MouseButton button) {
108115

109116
final int startX = Math.min(x, lastX);
110117
final int startY = Math.min(y, lastY);
@@ -113,33 +120,41 @@ protected void ctrlEvent(int x, int y, MouseButton button) {
113120
final int height = Math.abs(y - lastY);
114121

115122
if (width != 0 && height != 0) {
116-
fillable.apply(startX, startY, width, height, inserter);
117-
inserter.finalizeInsertion();
123+
final Tool tool = controls.getTool(button);
124+
final Brush brush = controls.getBrush(button);
125+
126+
if (tool instanceof Fillable) {
127+
syncTools.get().synchronize(() -> {
128+
BrushInserter<?> inserter = getInserter(brush);
129+
((Fillable) tool).apply(startX, startY, width, height, inserter);
130+
inserter.finalizeInsertion();
131+
});
132+
} else {
133+
LOGGER.warning("Fill is not supported");
134+
}
118135
}
119136

120137
setDefaultCursor();
121138
}
122139

123-
protected void altEvent(int x, int y, MouseButton button) {}
124-
125-
protected void setDefaultCursor() {
140+
private void setDefaultCursor() {
126141
fxCanvas.removeCursor();
127142
Tool tool = controls.getTool(MouseButton.PRIMARY);
128143
if (tool instanceof Cursorable)
129144
fxCanvas.setCursor(((Cursorable) tool).createCursor(fxCanvas));
130145
}
131146

132-
protected boolean isSupportedForDrag(MouseButton button) {
147+
private boolean isSupportedForDrag(MouseButton button) {
133148
return (button == MouseButton.PRIMARY || button == MouseButton.SECONDARY)
134149
&& controls.getTool(button) instanceof Draggable;
135150
}
136151

137-
protected boolean isSupportedForFill(MouseButton button) {
152+
private boolean isSupportedForFill(MouseButton button) {
138153
return (button == MouseButton.PRIMARY || button == MouseButton.SECONDARY)
139154
&& controls.getTool(button) instanceof Fillable;
140155
}
141156

142-
protected void savePos(MouseEvent event) {
157+
private void savePos(MouseEvent event) {
143158
lastX = (int) event.getX();
144159
lastY = (int) event.getY();
145160
}

sg2-app/src/cz/hartrik/sg2/app/extension/canvas/MouseControllerPick.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import cz.hartrik.sg2.brush.jfx.JFXControls;
66
import cz.hartrik.sg2.brush.manage.BrushManager;
77
import cz.hartrik.sg2.engine.EngineSyncTools;
8-
import cz.hartrik.sg2.engine.JFXEngine;
98
import cz.hartrik.sg2.tool.Can;
109
import cz.hartrik.sg2.world.Element;
1110
import cz.hartrik.sg2.world.ElementArea;
@@ -22,17 +21,14 @@
2221
public class MouseControllerPick extends MouseController {
2322

2423
protected final BrushManager brushManager;
25-
protected final Supplier<EngineSyncTools<?>> syncTools;
2624
private final Can can1;
2725
private final Can can2;
2826

2927
public MouseControllerPick(Canvas canvas, JFXControls controls,
30-
Supplier<JFXEngine<?>> engineSupplier,
3128
Supplier<ElementArea> areaSupplier,
3229
Supplier<EngineSyncTools<?>> syncTools, BrushManager brushManager) {
3330

34-
super(canvas, controls, engineSupplier, areaSupplier);
35-
this.syncTools = syncTools;
31+
super(canvas, controls, syncTools, areaSupplier);
3632
this.brushManager = brushManager;
3733
this.can1 = new Can(controls::getPrimaryBrush, brushManager);
3834
this.can2 = new Can(controls::getSecondaryBrush, brushManager);

0 commit comments

Comments
 (0)