Skip to content

Commit 0e8f624

Browse files
committed
Added option to copy&paste selected subgraph
Added edge width & opacity decay option Added dynamic background grid Added smoothed movement option to graph layout algorithm Added random layout in force-directed layout menu Changed camera movement to left mouse click on background & drag Added WalkingAgent class Added AlgorithmTaskManager class Removed AntDrawLayer class Minor changes and bugfixes
1 parent a6beaf5 commit 0e8f624

File tree

72 files changed

+988
-439
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+988
-439
lines changed

pom.xml

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@
157157
<dependency>
158158
<groupId>junit</groupId>
159159
<artifactId>junit</artifactId>
160-
<version>4.12</version>
160+
<version>4.13.1</version>
161161
<scope>compile</scope>
162162
</dependency>
163163

@@ -168,6 +168,12 @@
168168
<scope>test</scope>
169169
</dependency>
170170

171+
<dependency>
172+
<groupId>org.openjfx</groupId>
173+
<artifactId>javafx-swing</artifactId>
174+
<version>11-ea+24</version>
175+
</dependency>
176+
171177
</dependencies>
172178

173179
<build>
@@ -180,7 +186,7 @@
180186
<source>11</source>
181187
<target>11</target>
182188
<release>11</release>
183-
<mainClass>com.todense.application.Starter2</mainClass>
189+
<mainClass>com.todense.application.StarterInvoker</mainClass>
184190
</configuration>
185191
</plugin>
186192

@@ -191,7 +197,7 @@
191197
<configuration>
192198
<transformers>
193199
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
194-
<mainClass>com.todense.application.Starter2</mainClass>
200+
<mainClass>com.todense.application.StarterInvoker</mainClass>
195201
</transformer>
196202
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
197203
</transformers>

src/main/java/com/todense/application/Starter.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public class Starter extends MvvmfxGuiceApplication {
1616

1717
@Override
1818
public void startMvvmfx(Stage stage) {
19+
1920
stage.setTitle("OmniGraph");
2021
final ViewTuple<MainView, MainViewModel> viewTuple = FluentViewLoader.fxmlView(MainView.class).load();
2122
final Parent root = viewTuple.getView();

src/main/java/com/todense/application/Starter2.java renamed to src/main/java/com/todense/application/StarterInvoker.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package com.todense.application;
22

3-
public class Starter2 {
3+
public class StarterInvoker {
44

5+
// This class exist because of some bug with maven javafx plugin
56
public static void main(String[] args) {
67
Starter.main(args);
78
}

src/main/java/com/todense/model/EdgeList.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ public Edge getEdge(Node n, Node m){
4848
String id = n.getID() < m.getID() ?
4949
n.getID()+"-"+m.getID() :
5050
m.getID()+"-"+n.getID();
51-
assert edgeMap.get(id) != null : "No edge with id: "+id;
5251
return edgeMap.get(id);
5352
}
5453

src/main/java/com/todense/model/graph/Graph.java

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import java.util.ArrayList;
88
import java.util.List;
9+
import java.util.function.BiConsumer;
910

1011
public class Graph {
1112

@@ -44,7 +45,6 @@ public Node addNode(Point2D pt, int id){
4445
return n;
4546
}
4647

47-
4848
public Edge addEdge(Node n, Node m){
4949
assert !edges.isEdgeBetween(n, m):
5050
"Edge "+edges.getEdge(n, m).toString()+" already exist!";
@@ -67,13 +67,47 @@ public void removeEdge(Edge e){
6767
edges.remove(e);
6868
}
6969

70-
public void removeAllEdges(){
71-
edges.clear();
72-
for (Node node : nodes) {
73-
node.getNeighbours().clear();
70+
public void removeEdges(List<Node> nodes){
71+
applyToAllPairOfNodes(nodes, (n, m) -> {
72+
if(edges.isEdgeBetween(n, m)){
73+
removeEdge(n, m);
74+
}
75+
});
76+
}
77+
78+
public void applyToAllPairOfNodes(List<Node> nodes, BiConsumer<Node, Node> consumer){
79+
for (int i = 0; i < nodes.size(); i++) {
80+
for (int j = i+1; j < nodes.size(); j++) {
81+
consumer.accept(nodes.get(i), nodes.get(j));
82+
}
83+
}
84+
}
85+
86+
public void applyToAllConnectedPairOfNodes(List<Node> nodes, BiConsumer<Node, Node> consumer){
87+
for (int i = 0; i < nodes.size(); i++) {
88+
for (int j = i+1; j < nodes.size(); j++) {
89+
Node n = nodes.get(i);
90+
Node m = nodes.get(j);
91+
Edge e = getEdge(n, m);
92+
if(e != null){
93+
consumer.accept(nodes.get(i), nodes.get(j));
94+
}
95+
}
7496
}
7597
}
7698

99+
public void applyToAllConnectedPairOfNodes(BiConsumer<Node, Node> consumer){
100+
applyToAllConnectedPairOfNodes(nodes, consumer);
101+
}
102+
103+
public void applyToAllPairOfNodes(BiConsumer<Node, Node> consumer){
104+
applyToAllPairOfNodes(nodes, consumer);
105+
}
106+
107+
public void removeEdges(){
108+
this.removeEdges(this.nodes);
109+
}
110+
77111
public void removeNode(Node n){
78112
//decrement indexes
79113
for (int i = n.getIndex() + 1; i < nodes.size(); i++) {

src/main/java/com/todense/util/Util.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,18 @@ public static boolean isDouble(String strNum) {
3636
}
3737

3838
//calculates rgb values of a color with given opacity over a background color
39-
public static Color getFaintColor(Color color, Color backgroundColor) {
40-
double opacity = 0.3;
39+
public static Color getFaintColor(Color color, Color backgroundColor, double opacity) {
4140
int r = (int) (backgroundColor.getRed() * 255 + (color.getRed() * 255 - backgroundColor.getRed() * 255) * opacity);
4241
int g = (int) (backgroundColor.getGreen() * 255 + (color.getGreen()* 255 - backgroundColor.getGreen()* 255) * opacity);
4342
int b = (int) (backgroundColor.getBlue() * 255 + (color.getBlue()* 255 - backgroundColor.getBlue()* 255) * opacity);
4443

4544
return Color.rgb(r, g, b);
4645
}
4746

47+
public static Color getFaintColor(Color color, Color backgroundColor) {
48+
return getFaintColor(color, backgroundColor, 0.3);
49+
}
50+
4851
public static void bindSliderAndTextField(Slider slider, TextField textField, String pattern){
4952
StringProperty sp = textField.textProperty();
5053
DoubleProperty dp = slider.valueProperty();

src/main/java/com/todense/view/AlgorithmView.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,12 @@ public void initialize(){
5757

5858
@FXML
5959
private void startAlgorithmAction() {
60-
viewModel.start();
60+
viewModel.startTask();
6161
}
6262

6363
@FXML
6464
private void stopAlgorithmAction() {
65-
viewModel.stop();
65+
viewModel.stopTask();
6666
}
6767

6868
}

src/main/java/com/todense/view/AntsView.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,12 +186,12 @@ private void scaleIncrementAction() {
186186

187187
@FXML
188188
private void startAction() {
189-
viewModel.startAlgorithm();
189+
viewModel.startTask();
190190
}
191191

192192
@FXML
193193
private void stopAction() {
194-
viewModel.stopAlgorithm();
194+
viewModel.stopTask();
195195
}
196196
}
197197

src/main/java/com/todense/view/CanvasView.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import javafx.scene.Cursor;
1111
import javafx.scene.canvas.Canvas;
1212
import javafx.scene.layout.Pane;
13+
import javafx.scene.shape.StrokeLineCap;
1314

1415
public class CanvasView implements FxmlView<CanvasViewModel> {
1516

@@ -49,10 +50,15 @@ public void initialize(){
4950
canvas.setOnScroll(viewModel.getMouseHandler()::onMouseScroll);
5051
canvas.setOnMouseExited(viewModel.getMouseHandler()::onMouseExited);
5152

53+
canvas.getGraphicsContext2D().setLineCap(StrokeLineCap.BUTT);
54+
5255
Platform.runLater(() -> {
5356
viewModel.setCanvasNode(canvas);
5457
viewModel.getPopOverManager().setContext(context);
5558
});
5659
}
5760

61+
62+
63+
5864
}

src/main/java/com/todense/view/GraphView.java

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,18 @@
1111
import javafx.scene.control.ChoiceBox;
1212
import javafx.scene.control.ColorPicker;
1313
import javafx.scene.control.Label;
14+
import javafx.scene.layout.VBox;
1415
import org.controlsfx.control.ToggleSwitch;
1516

1617
public class GraphView implements FxmlView<GraphViewModel> {
1718

18-
@FXML private Label nodeSizeLabel, edgeWidthLabel;
19-
@FXML private JFXSlider nodeSizeSlider, edgeWidthSlider;
19+
@FXML private Label nodeSizeLabel, edgeWidthLabel, edgeWidthDecayLabel, edgeOpacityDecayLabel;
20+
@FXML private JFXSlider nodeSizeSlider, edgeWidthSlider, edgeWidthDecaySlider, edgeOpacityDecaySlider;
2021
@FXML private ColorPicker nodeColorPicker, edgeColorPicker, labelColorPicker, weightColorPicker;
2122
@FXML private ChoiceBox<NodeLabelMode> nodeLabelChoiceBox;
2223
@FXML private ChoiceBox<EdgeWeightMode> edgeWeightChoiceBox;
23-
@FXML private ToggleSwitch nodeBorderToggleSwitch, edgeVisibilityToggleSwitch;
24+
@FXML private ToggleSwitch nodeBorderToggleSwitch, edgeVisibilityToggleSwitch, widthDecayToggleSwitch, opacityDecayToggleSwitch;
25+
@FXML private VBox edgeWidthDecayVBox, edgeWidthDecayStrengthVBox, edgeOpacityDecayVBox, edgeOpacityDecayStrengthVBox;
2426

2527
@InjectViewModel
2628
GraphViewModel viewModel;
@@ -35,8 +37,32 @@ public void initialize(){
3537
edgeWeightChoiceBox.valueProperty().bindBidirectional(viewModel.edgeWeightModeProperty());
3638
nodeSizeSlider.valueProperty().bindBidirectional(viewModel.nodeSizeProperty());
3739
edgeWidthSlider.valueProperty().bindBidirectional(viewModel.edgeWidthProperty());
40+
edgeWidthDecaySlider.valueProperty().bindBidirectional(viewModel.edgeWidthDecayProperty());
41+
edgeOpacityDecaySlider.valueProperty().bindBidirectional(viewModel.edgeOpacityDecayProperty());
3842
nodeBorderToggleSwitch.selectedProperty().bindBidirectional(viewModel.nodeBorderProperty());
3943
edgeVisibilityToggleSwitch.selectedProperty().bindBidirectional(viewModel.edgeVisibilityProperty());
44+
widthDecayToggleSwitch.selectedProperty().bindBidirectional(viewModel.edgeWidthDecayOnProperty());
45+
opacityDecayToggleSwitch.selectedProperty().bindBidirectional(viewModel.edgeOpacityDecayOnProperty());
46+
47+
widthDecayToggleSwitch.selectedProperty().addListener((obs, oldVal, newVal) -> {
48+
if(newVal){
49+
edgeWidthDecayVBox.getChildren().add(edgeWidthDecayStrengthVBox);
50+
}else{
51+
edgeWidthDecayVBox.getChildren().remove(edgeWidthDecayStrengthVBox);
52+
}
53+
});
54+
55+
opacityDecayToggleSwitch.selectedProperty().addListener((obs, oldVal, newVal) -> {
56+
if(newVal){
57+
edgeOpacityDecayVBox.getChildren().add(edgeOpacityDecayStrengthVBox);
58+
}else{
59+
edgeOpacityDecayVBox.getChildren().remove(edgeOpacityDecayStrengthVBox);
60+
}
61+
});
62+
63+
edgeWidthDecayVBox.getChildren().remove(edgeWidthDecayStrengthVBox);
64+
edgeOpacityDecayVBox.getChildren().remove(edgeOpacityDecayStrengthVBox);
65+
4066

4167
nodeSizeLabel.textProperty().bind(Bindings.createStringBinding(() ->
4268
String.format("%.1f", nodeSizeSlider.getValue()), nodeSizeSlider.valueProperty()));
@@ -45,6 +71,12 @@ public void initialize(){
4571
edgeWidthLabel.textProperty().bind(Bindings.createStringBinding(()->
4672
String.format("%.2f", edgeWidthSlider.getValue()), edgeWidthSlider.valueProperty()));
4773

74+
edgeWidthDecayLabel.textProperty().bind(Bindings.createStringBinding(()->
75+
String.format("%.4f", edgeWidthDecaySlider.getValue()), edgeWidthDecaySlider.valueProperty()));
76+
77+
edgeOpacityDecayLabel.textProperty().bind(Bindings.createStringBinding(()->
78+
String.format("%.4f", edgeOpacityDecaySlider.getValue()), edgeOpacityDecaySlider.valueProperty()));
79+
4880

4981
nodeLabelChoiceBox.getItems().addAll(NodeLabelMode.values());
5082
edgeWeightChoiceBox.getItems().addAll(EdgeWeightMode.values());

0 commit comments

Comments
 (0)