Skip to content

Commit 7e4b1de

Browse files
committed
feat: the initial framework for PropertyMapView is implemented, closes #704
1 parent 4c740dd commit 7e4b1de

File tree

9 files changed

+224
-184
lines changed

9 files changed

+224
-184
lines changed

fxgl-samples/src/main/java/sandbox/view/PropertyMapViewSample.java

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -9,72 +9,72 @@
99
import com.almasb.fxgl.app.GameApplication;
1010
import com.almasb.fxgl.app.GameSettings;
1111
import com.almasb.fxgl.core.collection.PropertyMap;
12-
import com.almasb.fxgl.ui.PropertyMapView;
12+
import com.almasb.fxgl.core.math.Vec2;
1313
import javafx.geometry.Point2D;
1414
import javafx.scene.Node;
1515
import javafx.scene.input.KeyCode;
16+
import javafx.scene.paint.Color;
1617

1718
import static com.almasb.fxgl.dsl.FXGL.*;
1819

1920
public class PropertyMapViewSample extends GameApplication {
21+
22+
private enum TestEnum {
23+
ONE,TWO,THREE
24+
}
2025

21-
PropertyMap map = new PropertyMap();
26+
private PropertyMap map = new PropertyMap();
2227

2328
@Override
24-
protected void initSettings(GameSettings settings) {
25-
settings.setWidth(800);
26-
settings.setHeight(600);
27-
settings.setTitle("PropertyMapViewSample");
28-
settings.setVersion("0.1");
29-
}
30-
29+
protected void initSettings(GameSettings settings) { }
30+
3131
@Override
32-
protected void initGame() {
33-
entityBuilder()
34-
.view("background.png")
35-
.buildAndAttach();
36-
map.setValue("Music Volume", 10);
37-
map.setValue("Camera Distance",120);
38-
map.setValue("Initial Health", 100.0);
39-
map.setValue("Initial Position", new Point2D(0, 0));
40-
map.setValue("Enum Test", TestEnum.ONE);
41-
map.setValue("Color Blind", false);
42-
map.setValue("Player Name", "Jamie");
43-
44-
Node display = new PropertyMapView(map);
45-
display.setLayoutX(getAppWidth() / 2);
46-
getGameScene().addUINode(display);
47-
32+
protected void initInput() {
4833
onKeyDown(KeyCode.G, "map", () -> {
4934
for (String key : map.keys()) {
50-
debug(key + " - " + map.getValue(key).toString());
35+
System.out.println(key + " - " + map.getValue(key).toString());
5136
}
5237
});
53-
onKeyDown(KeyCode.DIGIT1, "1", () -> {
38+
onKeyDown(KeyCode.DIGIT1, () -> {
5439
map.setValue("Enum Test", TestEnum.ONE);
5540
map.setValue("Color Blind", true);
5641
map.setValue("Initial Health", 1.0);
5742
map.setValue("Player Name", "Jamie");
43+
map.setValue("Main color", Color.ORANGE);
44+
map.setValue("Initial Position Point2D", new Point2D(5, 1));
45+
map.setValue("Initial Position Vec2", new Vec2(5, 1));
5846
});
59-
onKeyDown(KeyCode.DIGIT2, "2", () -> {
47+
onKeyDown(KeyCode.DIGIT2, () -> {
6048
map.setValue("Enum Test", TestEnum.TWO);
6149
map.setValue("Color Blind", false);
6250
map.setValue("Initial Health", 100.0);
6351
map.setValue("Player Name", "Dave");
64-
});
65-
onKeyDown(KeyCode.DIGIT3, "3", () -> {
66-
map.setValue("Enum Test", TestEnum.THREE);
67-
map.setValue("Color Blind", true);
68-
map.setValue("Initial Health", 123.45);
69-
map.setValue("Player Name", "Christ");
52+
map.setValue("Main color", Color.RED);
53+
map.setValue("Initial Position Point2D", new Point2D(-6, 2));
54+
map.setValue("Initial Position Vec2", new Vec2(-6, 2));
7055
});
7156
}
57+
58+
@Override
59+
protected void initGame() {
60+
getGameScene().setBackgroundColor(Color.DARKGRAY);
61+
62+
map.setValue("Music Volume", 10);
63+
map.setValue("Camera Distance", 120);
64+
map.setValue("Initial Health", 100.0);
65+
map.setValue("Initial Position Point2D", new Point2D(0, 0));
66+
map.setValue("Initial Position Vec2", new Vec2(0, 0));
67+
map.setValue("Enum Test", TestEnum.ONE);
68+
map.setValue("Color Blind", false);
69+
map.setValue("Player Name", "Jamie");
70+
map.setValue("Main color", Color.BLUE);
7271

73-
public static void main(String[] args) {
74-
launch(args);
72+
Node view = getUIFactoryService().newPropertyMapView(map);
73+
74+
addUINode(view, 100, 100);
7575
}
7676

77-
private enum TestEnum {
78-
ONE,TWO,THREE
77+
public static void main(String[] args) {
78+
launch(args);
7979
}
8080
}

fxgl-scene/src/main/java/com/almasb/fxgl/ui/PropertyMapView.java

Lines changed: 0 additions & 125 deletions
This file was deleted.

fxgl-scene/src/main/java/com/almasb/fxgl/ui/UIFactoryService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
package com.almasb.fxgl.ui;
88

99
import com.almasb.fxgl.core.EngineService;
10+
import com.almasb.fxgl.core.collection.PropertyMap;
1011
import javafx.beans.binding.StringBinding;
1112
import javafx.beans.binding.StringExpression;
1213
import javafx.collections.ObservableList;
@@ -67,4 +68,6 @@ public abstract class UIFactoryService extends EngineService {
6768
public abstract FXGLTextFlow newTextFlow();
6869

6970
public abstract Node newPropertyView(String propertyName, Object property);
71+
72+
public abstract Node newPropertyMapView(PropertyMap map);
7073
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/*
2+
* FXGL - JavaFX Game Library. The MIT License (MIT).
3+
* Copyright (c) AlmasB (almaslvl@gmail.com).
4+
* See LICENSE for details.
5+
*/
6+
7+
package com.almasb.fxgl.ui.property;
8+
9+
import javafx.beans.property.ObjectProperty;
10+
import javafx.geometry.Point2D;
11+
import javafx.scene.control.TextField;
12+
import javafx.scene.layout.HBox;
13+
14+
/**
15+
* // TODO: read-only version?
16+
*
17+
* @author Almas Baimagambetov (almaslvl@gmail.com)
18+
*/
19+
public class Point2DPropertyViewFactory implements PropertyViewFactory<Point2D, HBox> {
20+
21+
private boolean ignoreChangeView = false;
22+
private boolean ignoreChangeProperty = false;
23+
24+
@Override
25+
public HBox makeView(ObjectProperty<Point2D> value) {
26+
var fieldX = new TextField();
27+
var fieldY = new TextField();
28+
HBox view = new HBox(fieldX, fieldY);
29+
30+
value.addListener((obs, o, newValue) -> {
31+
if (ignoreChangeProperty)
32+
return;
33+
34+
onPropertyChanged(value, view);
35+
});
36+
37+
fieldX.textProperty().addListener((obs, o, x) -> {
38+
if (ignoreChangeView)
39+
return;
40+
41+
onViewChanged(value, view);
42+
});
43+
44+
fieldY.textProperty().addListener((obs, o, y) -> {
45+
if (ignoreChangeView)
46+
return;
47+
48+
onViewChanged(value, view);
49+
});
50+
51+
onPropertyChanged(value, view);
52+
53+
return view;
54+
}
55+
56+
@Override
57+
public void onPropertyChanged(ObjectProperty<Point2D> value, HBox view) {
58+
var fieldX = (TextField) view.getChildren().get(0);
59+
var fieldY = (TextField) view.getChildren().get(1);
60+
61+
ignoreChangeView = true;
62+
63+
fieldX.setText(Double.toString(value.getValue().getX()));
64+
fieldY.setText(Double.toString(value.getValue().getY()));
65+
66+
ignoreChangeView = false;
67+
}
68+
69+
@Override
70+
public void onViewChanged(ObjectProperty<Point2D> value, HBox view) {
71+
var fieldX = (TextField) view.getChildren().get(0);
72+
var fieldY = (TextField) view.getChildren().get(1);
73+
74+
ignoreChangeProperty = true;
75+
76+
var newPoint = new Point2D(
77+
Double.parseDouble(fieldX.getText()),
78+
Double.parseDouble(fieldY.getText())
79+
);
80+
81+
value.setValue(newPoint);
82+
83+
ignoreChangeProperty = false;
84+
}
85+
}

fxgl-scene/src/main/java/com/almasb/fxgl/ui/PropertyViewChangeListener.java renamed to fxgl-scene/src/main/java/com/almasb/fxgl/ui/property/PropertyViewFactory.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,32 @@
44
* See LICENSE for details.
55
*/
66

7-
package com.almasb.fxgl.ui;
7+
package com.almasb.fxgl.ui.property;
88

99
import javafx.beans.property.ObjectProperty;
1010
import javafx.scene.Node;
1111

1212
/**
1313
* @author Almas Baimagambetov (almaslvl@gmail.com)
1414
*/
15-
public interface PropertyViewChangeListener<T, V extends Node> {
15+
public interface PropertyViewFactory<T, V extends Node> {
1616

1717
default V makeViewInternal(ObjectProperty<?> v) {
1818
return makeView((ObjectProperty<T>) v);
1919
}
2020

21+
/**
22+
* @return the visual representation of the property [value]
23+
*/
2124
V makeView(ObjectProperty<T> value);
22-
25+
26+
/**
27+
* Called when the property has changed, so that the view can be updated.
28+
*/
2329
void onPropertyChanged(ObjectProperty<T> value, V view);
24-
30+
31+
/**
32+
* Called when the view has changed, so that the property can be updated.
33+
*/
2534
void onViewChanged(ObjectProperty<T> value, V view);
2635
}

fxgl-scene/src/main/java/com/almasb/fxgl/ui/property/Vec2PropertyViewChangeListener.java renamed to fxgl-scene/src/main/java/com/almasb/fxgl/ui/property/Vec2PropertyViewFactory.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,17 @@
88

99
import com.almasb.fxgl.core.collection.UpdatableObjectProperty;
1010
import com.almasb.fxgl.core.math.Vec2;
11-
import com.almasb.fxgl.ui.PropertyViewChangeListener;
1211
import javafx.beans.property.ObjectProperty;
1312
import javafx.scene.control.TextField;
1413
import javafx.scene.layout.HBox;
1514

1615
/**
16+
* // TODO: read-only version?
17+
* // TODO: empty String check when view is updated
18+
*
1719
* @author Almas Baimagambetov (almaslvl@gmail.com)
1820
*/
19-
public class Vec2PropertyViewChangeListener implements PropertyViewChangeListener<Vec2, HBox> {
21+
public class Vec2PropertyViewFactory implements PropertyViewFactory<Vec2, HBox> {
2022

2123
private boolean ignoreChangeView = false;
2224
private boolean ignoreChangeProperty = false;

0 commit comments

Comments
 (0)