Skip to content

Commit 2d5acdc

Browse files
committed
update label positions when root pane is resized
1 parent b6eec9e commit 2d5acdc

3 files changed

Lines changed: 29 additions & 26 deletions

File tree

src/main/java/edu/umich/soar/svsviewer/SVSViewerEvent.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ public class SVSViewerEvent extends Event {
1515
/** Common supertype for all server event types. */
1616
public static final EventType<SVSViewerEvent> ANY = new EventType<>(Event.ANY, "SVS_VIEWER");
1717

18-
public static final EventType<SVSViewerEvent> SCENE_RERENDERED =
19-
new EventType<>(SVSViewerEvent.ANY, "SCENE_RERENDERED");
18+
public static final EventType<SVSViewerEvent> SCENE_RERENDER_REQUESTED =
19+
new EventType<>(SVSViewerEvent.ANY, "SCENE_RERENDER_REQUESTED");
2020

2121
/**
2222
* @see Event#Event(Object, EventTarget, EventType)

src/main/java/edu/umich/soar/svsviewer/SceneController.java

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,23 @@
88
import java.awt.image.BufferedImage;
99
import java.io.File;
1010
import java.io.IOException;
11-
import java.util.prefs.Preferences;
1211
import java.util.List;
1312
import java.util.function.Consumer;
14-
import javafx.beans.binding.Bindings;
1513

1614
import javafx.animation.PauseTransition;
1715
import javafx.application.Platform;
18-
import javafx.beans.property.BooleanProperty;
1916
import javafx.beans.property.DoubleProperty;
20-
import javafx.beans.property.SimpleBooleanProperty;
2117
import javafx.beans.property.SimpleDoubleProperty;
18+
import javafx.beans.value.ObservableValue;
2219
import javafx.embed.swing.SwingFXUtils;
2320
import javafx.event.Event;
2421
import javafx.fxml.FXML;
2522
import javafx.geometry.Pos;
2623
import javafx.scene.*;
2724
import javafx.scene.control.*;
28-
import javafx.scene.control.Alert.AlertType;
2925
import javafx.scene.image.WritableImage;
3026
import javafx.scene.layout.*;
3127
import javafx.scene.paint.Color;
32-
import javafx.scene.shape.DrawMode;
3328
import javafx.scene.text.Font;
3429
import javafx.scene.text.Text;
3530
import javafx.scene.text.TextAlignment;
@@ -80,6 +75,8 @@ public void initialize() {
8075
viewerScene.heightProperty().bind(rootPane.heightProperty());
8176
viewerScene.widthProperty().bind(rootPane.widthProperty());
8277

78+
rerenderSceneOnChange(viewerScene.boundsInParentProperty());
79+
8380
// TODO: This just makes our THOR-Soar setup look nice immediately because we use Z as
8481
// "up" in 3D space (towards the ceiling)
8582
rootGroup.getTransforms().add(new Rotate(180, Rotate.X_AXIS));
@@ -92,13 +89,7 @@ public void initialize() {
9289
viewerScene.setCamera(camera);
9390

9491
for (Transform t : List.of(cameraYaw, cameraPitch, cameraRoll, cameraTranslation)) {
95-
t.setOnTransformChanged(
96-
value ->
97-
Platform.runLater(
98-
() ->
99-
Event.fireEvent(
100-
viewerScene,
101-
new SVSViewerEvent(viewerScene, SVSViewerEvent.SCENE_RERENDERED))));
92+
t.setOnTransformChanged(value -> requestSceneRerender());
10293
}
10394

10495
// Handle keyboard events
@@ -180,20 +171,13 @@ public void initialize() {
180171
viewerScene.setFocusTraversable(true);
181172

182173
initMouseControls(shapeGroup, viewerScene);
183-
rootGroup
184-
.boundsInParentProperty()
185-
.addListener(
186-
(observable, oldValue, newValue) ->
187-
Platform.runLater(
188-
() ->
189-
Event.fireEvent(
190-
viewerScene,
191-
new SVSViewerEvent(viewerScene, SVSViewerEvent.SCENE_RERENDERED))));
174+
175+
rerenderSceneOnChange(rootGroup.boundsInParentProperty());
192176

193177
this.geometryManager =
194178
new GeometryManager(preferences, rootPane, shapeGroup, this::showMessage);
195179
viewerScene.addEventFilter(
196-
SVSViewerEvent.SCENE_RERENDERED, e -> geometryManager.updateLabelPositions());
180+
SVSViewerEvent.SCENE_RERENDER_REQUESTED, e -> geometryManager.updateLabelPositions());
197181

198182
Consumer<String> inputProcessor =
199183
(String line) -> {
@@ -235,6 +219,18 @@ public void initialize() {
235219
initMessageStack(messageStack);
236220
}
237221

222+
private void rerenderSceneOnChange(ObservableValue<?> observable) {
223+
observable.addListener((obs, oldValue, newValue) -> requestSceneRerender());
224+
}
225+
226+
private void requestSceneRerender() {
227+
Platform.runLater(
228+
() ->
229+
Event.fireEvent(
230+
viewerScene,
231+
new SVSViewerEvent(viewerScene, SVSViewerEvent.SCENE_RERENDER_REQUESTED)));
232+
}
233+
238234
private void initMessageStack(VBox messageStack) {
239235
messageStack.setLayoutX(10);
240236
// under the menu bar. TODO: should use logic to ensure that, rather than hardcoding a value

src/main/java/edu/umich/soar/svsviewer/command/UpdateGeometryCommand.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import java.util.HashMap;
1111
import java.util.List;
1212
import java.util.Map;
13+
14+
import javafx.application.Platform;
1315
import javafx.event.Event;
1416
import javafx.geometry.Point3D;
1517
import javafx.scene.Node;
@@ -139,8 +141,13 @@ public void interpret(GeometryManager geoManager, SceneController sceneControlle
139141
}
140142
}
141143
for (SVSScene scene : rerenderedScenes.values()) {
144+
// TODO: technically only need to update label for the geometries that were changed
142145
Node sceneRoot = scene.root();
143-
Event.fireEvent(sceneRoot, new SVSViewerEvent(sceneRoot, SVSViewerEvent.SCENE_RERENDERED));
146+
Platform.runLater(
147+
() ->
148+
Event.fireEvent(
149+
sceneRoot,
150+
new SVSViewerEvent(sceneRoot, SVSViewerEvent.SCENE_RERENDER_REQUESTED)));
144151
}
145152
}
146153

0 commit comments

Comments
 (0)