Skip to content

Commit ed86318

Browse files
ichaus-weMarkus Weber
andauthored
Zoomer: add a user definable predicate for panning (#631)
* Zoomer: add a user definable predicate for panning * ZoomerSample: add a chart with a user-defined panning predicate --------- Co-authored-by: Markus Weber <we@ichaus.de>
1 parent 7164e6b commit ed86318

File tree

2 files changed

+60
-23
lines changed

2 files changed

+60
-23
lines changed

chartfx-chart/src/main/java/io/fair_acc/chartfx/plugins/Zoomer.java

Lines changed: 50 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,9 @@ public class Zoomer extends ChartPlugin {
8484
private static final String ICON_ZOOM_V = "fa-arrows-v:" + FONT_SIZE;
8585

8686
/**
87-
* Default pan mouse filter passing on left mouse button with {@link MouseEvent#isControlDown() control key down}.
87+
* Default pan mouse filter passing on middle mouse button {@link MouseEventsHelper#isOnlyMiddleButtonDown()}.
8888
*/
89+
@Deprecated
8990
public static final Predicate<MouseEvent> DEFAULT_MOUSE_FILTER = MouseEventsHelper::isOnlyMiddleButtonDown;
9091
private double panShiftX;
9192
private double panShiftY;
@@ -94,26 +95,6 @@ public class Zoomer extends ChartPlugin {
9495
private final BooleanProperty autoZoomEnable = new SimpleBooleanProperty(this, "enableAutoZoom", false);
9596
private final IntegerProperty autoZoomThreshold = new SimpleIntegerProperty(this, "autoZoomThreshold",
9697
DEFAULT_AUTO_ZOOM_THRESHOLD);
97-
private final EventHandler<MouseEvent> panStartHandler = event -> {
98-
if (isPannerEnabled() && DEFAULT_MOUSE_FILTER.test(event)) {
99-
panStarted(event);
100-
event.consume();
101-
}
102-
};
103-
104-
private final EventHandler<MouseEvent> panDragHandler = event -> {
105-
if (panOngoing()) {
106-
panDragged(event);
107-
event.consume();
108-
}
109-
};
110-
111-
private final EventHandler<MouseEvent> panEndHandler = event -> {
112-
if (panOngoing()) {
113-
panEnded();
114-
event.consume();
115-
}
116-
};
11798

11899
/**
119100
* Default zoom-in mouse filter passing on left mouse button (only).
@@ -125,6 +106,11 @@ public class Zoomer extends ChartPlugin {
125106
*/
126107
public final Predicate<MouseEvent> defaultZoomOutMouseFilter = event -> MouseEventsHelper.isOnlySecondaryButtonDown(event) && MouseEventsHelper.modifierKeysUp(event) && isMouseEventWithinCanvas(event);
127108

109+
/**
110+
* Default pan mouse filter passing on middle mouse button (only).
111+
*/
112+
public final Predicate<MouseEvent> defaultPanMouseFilter = event -> MouseEventsHelper.isOnlyMiddleButtonDown(event) && MouseEventsHelper.modifierKeysUp(event) && isMouseEventWithinCanvas(event);
113+
128114
/**
129115
* Default zoom-origin mouse filter passing on right mouse button with {@link MouseEvent#isControlDown() control key
130116
* down}.
@@ -138,6 +124,7 @@ public class Zoomer extends ChartPlugin {
138124

139125
private Predicate<MouseEvent> zoomInMouseFilter = defaultZoomInMouseFilter;
140126
private Predicate<MouseEvent> zoomOutMouseFilter = defaultZoomOutMouseFilter;
127+
private Predicate<MouseEvent> panMouseFilter = defaultPanMouseFilter;
141128
private Predicate<MouseEvent> zoomOriginMouseFilter = defaultZoomOriginFilter;
142129
private Predicate<ScrollEvent> zoomScrollFilter = defaultScrollFilter;
143130

@@ -226,6 +213,27 @@ protected void invalidated() {
226213
}
227214
};
228215

216+
private final EventHandler<MouseEvent> panStartHandler = event -> {
217+
if (isPannerEnabled() && (panMouseFilter == null || panMouseFilter.test(event))) {
218+
panStarted(event);
219+
event.consume();
220+
}
221+
};
222+
223+
private final EventHandler<MouseEvent> panDragHandler = event -> {
224+
if (panOngoing()) {
225+
panDragged(event);
226+
event.consume();
227+
}
228+
};
229+
230+
private final EventHandler<MouseEvent> panEndHandler = event -> {
231+
if (panOngoing()) {
232+
panEnded();
233+
event.consume();
234+
}
235+
};
236+
229237
private final EventHandler<MouseEvent> zoomOriginHandler = event -> {
230238
if (getZoomOriginMouseFilter() == null || getZoomOriginMouseFilter().test(event)) {
231239
final boolean zoomOutPerformed = zoomOrigin();
@@ -462,6 +470,16 @@ public Predicate<MouseEvent> getZoomOutMouseFilter() {
462470
return zoomOutMouseFilter;
463471
}
464472

473+
/**
474+
* Returns pan mouse filter.
475+
*
476+
* @return pan mouse filter
477+
* @see #setPanMouseFilter(Predicate)
478+
*/
479+
public Predicate<MouseEvent> getPanMouseFilter() {
480+
return panMouseFilter;
481+
}
482+
465483
/**
466484
* Returns zoom-scroll filter.
467485
*
@@ -649,6 +667,17 @@ public void setZoomOutMouseFilter(final Predicate<MouseEvent> zoomOutMouseFilter
649667
this.zoomOutMouseFilter = zoomOutMouseFilter;
650668
}
651669

670+
/**
671+
* Sets filter on {@link MouseEvent#MOUSE_CLICKED MOUSE_CLICKED} events that should start pan operation.
672+
*
673+
* @param panMouseFilter the filter to accept pan mouse event. If {@code null} then any MOUSE_CLICKED event
674+
* will start pan operation. By default it's set to {@link #defaultPanMouseFilter}.
675+
* @see #getPanMouseFilter()
676+
*/
677+
public void setPanMouseFilter(final Predicate<MouseEvent> panMouseFilter) {
678+
this.panMouseFilter = panMouseFilter;
679+
}
680+
652681
/**
653682
* Sets filter on {@link MouseEvent#MOUSE_CLICKED MOUSE_CLICKED} events that should trigger zoom-origin operation.
654683
*

chartfx-samples/src/main/java/io/fair_acc/sample/chart/ZoomerSample.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import io.fair_acc.chartfx.XYChart;
2121
import io.fair_acc.chartfx.axes.Axis;
2222
import io.fair_acc.chartfx.axes.AxisMode;
23+
import io.fair_acc.chartfx.plugins.MouseEventsHelper;
2324
import io.fair_acc.chartfx.plugins.Zoomer;
2425
import io.fair_acc.chartfx.plugins.Zoomer.ZoomState;
2526
import io.fair_acc.dataset.DataSet;
@@ -68,13 +69,20 @@ public Node getChartPanel(final Stage primaryStage) {
6869
registerZoomerChangeListener(zoomer3, chart3.getTitle());
6970
chart3.getPlugins().add(zoomer3);
7071

71-
// chart with x-only zoom
72+
// chart with y-only zoom
7273
final Chart chart4 = getTestChart("y-only zoom", testDataSet);
7374
Zoomer zoomer4 = new Zoomer(AxisMode.Y);
7475
registerZoomerChangeListener(zoomer4, chart4.getTitle());
7576
chart4.getPlugins().add(zoomer4);
7677

77-
root.getChildren().addAll(chart1, chart2, chart3, chart4, label);
78+
// chart with control + LMB pan
79+
final Chart chart5 = getTestChart("control + primary (left) button to pan", testDataSet);
80+
Zoomer zoomer5 = new Zoomer();
81+
zoomer5.setPanMouseFilter(event -> MouseEventsHelper.isOnlyPrimaryButtonDown(event) && MouseEventsHelper.isOnlyCtrlModifierDown(event));
82+
registerZoomerChangeListener(zoomer5, chart5.getTitle());
83+
chart5.getPlugins().add(zoomer5);
84+
85+
root.getChildren().addAll(chart1, chart2, chart3, chart4, chart5, label);
7886

7987
return root;
8088
}

0 commit comments

Comments
 (0)