Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Zoomer: add a user definable predicate for panning #631

Merged
merged 3 commits into from
Oct 10, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 50 additions & 21 deletions chartfx-chart/src/main/java/io/fair_acc/chartfx/plugins/Zoomer.java
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,9 @@
private static final String ICON_ZOOM_V = "fa-arrows-v:" + FONT_SIZE;

/**
* Default pan mouse filter passing on left mouse button with {@link MouseEvent#isControlDown() control key down}.
* Default pan mouse filter passing on middle mouse button {@link MouseEventsHelper#isOnlyMiddleButtonDown()}.
*/
@Deprecated
public static final Predicate<MouseEvent> DEFAULT_MOUSE_FILTER = MouseEventsHelper::isOnlyMiddleButtonDown;
private double panShiftX;
private double panShiftY;
Expand All @@ -94,26 +95,6 @@
private final BooleanProperty autoZoomEnable = new SimpleBooleanProperty(this, "enableAutoZoom", false);
private final IntegerProperty autoZoomThreshold = new SimpleIntegerProperty(this, "autoZoomThreshold",
DEFAULT_AUTO_ZOOM_THRESHOLD);
private final EventHandler<MouseEvent> panStartHandler = event -> {
if (isPannerEnabled() && DEFAULT_MOUSE_FILTER.test(event)) {
panStarted(event);
event.consume();
}
};

private final EventHandler<MouseEvent> panDragHandler = event -> {
if (panOngoing()) {
panDragged(event);
event.consume();
}
};

private final EventHandler<MouseEvent> panEndHandler = event -> {
if (panOngoing()) {
panEnded();
event.consume();
}
};

/**
* Default zoom-in mouse filter passing on left mouse button (only).
Expand All @@ -125,6 +106,11 @@
*/
public final Predicate<MouseEvent> defaultZoomOutMouseFilter = event -> MouseEventsHelper.isOnlySecondaryButtonDown(event) && MouseEventsHelper.modifierKeysUp(event) && isMouseEventWithinCanvas(event);

/**
* Default pan mouse filter passing on middle mouse button (only).
*/
public final Predicate<MouseEvent> defaultPanMouseFilter = event -> MouseEventsHelper.isOnlyMiddleButtonDown(event) && MouseEventsHelper.modifierKeysUp(event) && isMouseEventWithinCanvas(event);

/**
* Default zoom-origin mouse filter passing on right mouse button with {@link MouseEvent#isControlDown() control key
* down}.
Expand All @@ -138,6 +124,7 @@

private Predicate<MouseEvent> zoomInMouseFilter = defaultZoomInMouseFilter;
private Predicate<MouseEvent> zoomOutMouseFilter = defaultZoomOutMouseFilter;
private Predicate<MouseEvent> panMouseFilter = defaultPanMouseFilter;
private Predicate<MouseEvent> zoomOriginMouseFilter = defaultZoomOriginFilter;
private Predicate<ScrollEvent> zoomScrollFilter = defaultScrollFilter;

Expand Down Expand Up @@ -226,6 +213,27 @@
}
};

private final EventHandler<MouseEvent> panStartHandler = event -> {
if (isPannerEnabled() && (panMouseFilter == null || panMouseFilter.test(event))) {
panStarted(event);
event.consume();

Check warning on line 219 in chartfx-chart/src/main/java/io/fair_acc/chartfx/plugins/Zoomer.java

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L218 - L219 were not covered by tests
}
};

Check warning on line 221 in chartfx-chart/src/main/java/io/fair_acc/chartfx/plugins/Zoomer.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L221 was not covered by tests

private final EventHandler<MouseEvent> panDragHandler = event -> {
if (panOngoing()) {
panDragged(event);
event.consume();

Check warning on line 226 in chartfx-chart/src/main/java/io/fair_acc/chartfx/plugins/Zoomer.java

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L225 - L226 were not covered by tests
}
};

Check warning on line 228 in chartfx-chart/src/main/java/io/fair_acc/chartfx/plugins/Zoomer.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L228 was not covered by tests

private final EventHandler<MouseEvent> panEndHandler = event -> {
if (panOngoing()) {
panEnded();
event.consume();

Check warning on line 233 in chartfx-chart/src/main/java/io/fair_acc/chartfx/plugins/Zoomer.java

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L232 - L233 were not covered by tests
}
};

Check warning on line 235 in chartfx-chart/src/main/java/io/fair_acc/chartfx/plugins/Zoomer.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L235 was not covered by tests

private final EventHandler<MouseEvent> zoomOriginHandler = event -> {
if (getZoomOriginMouseFilter() == null || getZoomOriginMouseFilter().test(event)) {
final boolean zoomOutPerformed = zoomOrigin();
Expand Down Expand Up @@ -462,6 +470,16 @@
return zoomOutMouseFilter;
}

/**
* Returns pan mouse filter.
*
* @return pan mouse filter
* @see #setPanMouseFilter(Predicate)
*/
public Predicate<MouseEvent> getPanMouseFilter() {
return panMouseFilter;

Check warning on line 480 in chartfx-chart/src/main/java/io/fair_acc/chartfx/plugins/Zoomer.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L480 was not covered by tests
}

/**
* Returns zoom-scroll filter.
*
Expand Down Expand Up @@ -649,6 +667,17 @@
this.zoomOutMouseFilter = zoomOutMouseFilter;
}

/**
* Sets filter on {@link MouseEvent#MOUSE_CLICKED MOUSE_CLICKED} events that should start pan operation.
*
* @param panMouseFilter the filter to accept pan mouse event. If {@code null} then any MOUSE_CLICKED event
* will start pan operation. By default it's set to {@link #defaultPanMouseFilter}.
* @see #getPanMouseFilter()
*/
public void setPanMouseFilter(final Predicate<MouseEvent> panMouseFilter) {
this.panMouseFilter = panMouseFilter;
}

Check warning on line 679 in chartfx-chart/src/main/java/io/fair_acc/chartfx/plugins/Zoomer.java

View check run for this annotation

Codecov / codecov/patch

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

Added lines #L678 - L679 were not covered by tests

/**
* Sets filter on {@link MouseEvent#MOUSE_CLICKED MOUSE_CLICKED} events that should trigger zoom-origin operation.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import io.fair_acc.chartfx.XYChart;
import io.fair_acc.chartfx.axes.Axis;
import io.fair_acc.chartfx.axes.AxisMode;
import io.fair_acc.chartfx.plugins.MouseEventsHelper;
import io.fair_acc.chartfx.plugins.Zoomer;
import io.fair_acc.chartfx.plugins.Zoomer.ZoomState;
import io.fair_acc.dataset.DataSet;
Expand Down Expand Up @@ -68,13 +69,20 @@ public Node getChartPanel(final Stage primaryStage) {
registerZoomerChangeListener(zoomer3, chart3.getTitle());
chart3.getPlugins().add(zoomer3);

// chart with x-only zoom
// chart with y-only zoom
final Chart chart4 = getTestChart("y-only zoom", testDataSet);
Zoomer zoomer4 = new Zoomer(AxisMode.Y);
registerZoomerChangeListener(zoomer4, chart4.getTitle());
chart4.getPlugins().add(zoomer4);

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

root.getChildren().addAll(chart1, chart2, chart3, chart4, chart5, label);

return root;
}
Expand Down
Loading