This is an automated email from the ASF dual-hosted git repository. desruisseaux pushed a commit to branch geoapi-4.0 in repository https://gitbox.apache.org/repos/asf/sis.git
commit 20be7e050ed43aea5c5dd6d5d5da6f0da86c2d44 Author: Martin Desruisseaux <[email protected]> AuthorDate: Tue May 24 18:47:36 2022 +0200 Build new `GridExtent` from slider positions. --- .../apache/sis/gui/coverage/GridSliceSelector.java | 66 ++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/GridSliceSelector.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/GridSliceSelector.java index 8137bf0c81..0868d3f495 100644 --- a/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/GridSliceSelector.java +++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/GridSliceSelector.java @@ -36,6 +36,7 @@ import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.beans.property.ObjectProperty; import javafx.beans.property.ReadOnlyProperty; +import javafx.beans.property.ReadOnlyObjectWrapper; import javafx.beans.property.SimpleObjectProperty; import org.opengis.geometry.Envelope; import org.opengis.util.FactoryException; @@ -98,6 +99,13 @@ public class GridSliceSelector extends Widget { */ public final ObjectProperty<GridGeometry> gridGeometry; + /** + * The currently selected grid extent. + * + * @see #selectedExtentProperty() + */ + private final ReadOnlyObjectWrapper<GridExtent> selectedExtent; + /** * The locale to use for axis labels, or {@code null} for a default locale. */ @@ -142,6 +150,7 @@ public class GridSliceSelector extends Widget { view.setVgap(9); view.setHgap(12); view.setPadding(PADDING); + selectedExtent = new ReadOnlyObjectWrapper<>(this, "selectedExtent"); gridGeometry = new SimpleObjectProperty<>(this, "gridGeometry"); gridGeometry.addListener((p,o,n) -> setGridGeometry(n)); } @@ -166,6 +175,7 @@ public class GridSliceSelector extends Widget { int childrenCount = 0; int row = -BIDIMENSIONAL - 1; final GridExtent extent = gg.getExtent(); + GridExtent selected = extent; final int dimension = extent.getDimension(); for (int dim=0; dim < dimension; dim++) { final long min = extent.getLow (dim); @@ -196,6 +206,7 @@ public class GridSliceSelector extends Widget { converter = new Converter(); slider.setLabelFormatter(converter); slider.widthProperty().addListener(converter); + slider.valueChangingProperty().addListener(new Listener(dim)); } /* * Configure the slider for the current grid axis. @@ -215,6 +226,7 @@ public class GridSliceSelector extends Widget { slider.setMin(min); slider.setMax(max); slider.setValue(min); + selected = selected.setRange(dim, min, min); // Initially selected slice. converter.configure(gg, gridToCRS, dim, min, max, envelope, resolution); converter.setTickSpacing(slider, slider.getWidth()); /* @@ -232,8 +244,12 @@ public class GridSliceSelector extends Widget { } } children.remove(childrenCount, children.size()); + selectedExtent.set(selected); } + + + /** * Handle conversion of grid indices to "real world" coordinates or dates. */ @@ -451,6 +467,56 @@ public class GridSliceSelector extends Widget { } } + + + + /** + * Listener notified when the position of a slider changed. We take the change only after + * the user finished to drag the slider in order to avoid causing to many load requests. + */ + private final class Listener implements ChangeListener<Boolean> { + /** + * Index of the grid axis where the position changed. + */ + private final int dimension; + + /** + * Creates a new listener for the grid axis on the specified dimension. + * + * @param dimension index of the grid axis where the position can change. + */ + Listener(final int dimension) { + this.dimension = dimension; + } + + /** + * Invoked when the slider changed its position. + */ + @Override + public void changed(final ObservableValue<? extends Boolean> property, final Boolean oldValue, final Boolean newValue) { + if (!newValue) { + final GridExtent extent = selectedExtent.get(); + if (extent != null) { + final Slider slider = (Slider) ((ReadOnlyProperty) property).getBean(); + final long p = Math.round(slider.getValue()); + if (p != extent.getLow(dimension)) { + selectedExtent.set(extent.setRange(dimension, p, p)); + } + } + } + } + } + + /** + * Returns the property for the currently selected grid extent. + * This value varies after the user finished to drag the slider. + * + * @return the currently selected grid extent as a read-only property. + */ + public final ReadOnlyProperty<GridExtent> selectedExtentProperty() { + return selectedExtent.getReadOnlyProperty(); + } + /** * Returns the encapsulated JavaFX component to add in a scene graph for making the selectors visible. * The {@code Region} subclass is implementation dependent and may change in any future SIS version.
