Skip to content

Commit

Permalink
fix(gui): switch servers without resetting the traffic line chart
Browse files Browse the repository at this point in the history
  • Loading branch information
Zmax0 committed Jul 29, 2024
1 parent 02bea47 commit 22cb869
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 59 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,29 +6,18 @@
import com.jfoenix.controls.JFXTabPane;
import com.jfoenix.controls.JFXTextField;
import com.jfoenix.validation.RequiredFieldValidator;
import com.urbanspork.client.Client;
import com.urbanspork.client.gui.Resource;
import com.urbanspork.client.gui.console.widget.ConsoleButton;
import com.urbanspork.client.gui.console.widget.ConsoleColumnConstraints;
import com.urbanspork.client.gui.console.widget.ConsoleLabel;
import com.urbanspork.client.gui.console.widget.ConsoleLiteButton;
import com.urbanspork.client.gui.console.widget.ConsolePasswordTextField;
import com.urbanspork.client.gui.console.widget.ConsoleRowConstraints;
import com.urbanspork.client.gui.console.widget.ConsoleTextField;
import com.urbanspork.client.gui.console.widget.CurrentConfigCipherChoiceBox;
import com.urbanspork.client.gui.console.widget.CurrentConfigPasswordToggleButton;
import com.urbanspork.client.gui.console.widget.CurrentConfigProtocolChoiceBox;
import com.urbanspork.client.gui.console.widget.NumericTextField;
import com.urbanspork.client.gui.console.widget.ServerConfigListView;
import com.urbanspork.client.gui.console.widget.*;
import com.urbanspork.client.gui.i18n.I18N;
import com.urbanspork.client.gui.traffic.TrafficCounterLineChart;
import com.urbanspork.client.gui.traffic.TrafficCounterLineChartBuilder;
import com.urbanspork.client.gui.tray.Tray;
import com.urbanspork.common.codec.CipherKind;
import com.urbanspork.common.config.ClientConfig;
import com.urbanspork.common.config.ConfigHandler;
import com.urbanspork.common.config.ServerConfig;
import com.urbanspork.common.config.shadowsocks.ShareableServerConfig;
import com.urbanspork.common.protocol.Protocol;
import io.netty.handler.traffic.TrafficCounter;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.binding.Bindings;
Expand All @@ -41,16 +30,7 @@
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.DialogPane;
import javafx.scene.control.MultipleSelectionModel;
import javafx.scene.control.Tab;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.control.TextInputDialog;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
Expand All @@ -74,7 +54,7 @@ public class Console extends Application {

Tray tray;
Proxy proxy;
final ObjectProperty<Client.Instance> instance = new SimpleObjectProperty<>();
final ObjectProperty<TrafficCounter> trafficCounter = new SimpleObjectProperty<>();

private Stage primaryStage;
private JFXTabPane root;
Expand Down Expand Up @@ -369,26 +349,13 @@ private Tab newSingleNodeTab(Node node, String tabTitle) {
private Tab initTrafficTab() {
StackPane stackPane = new StackPane();
stackPane.setAlignment(Pos.TOP_CENTER);
instance.addListener((observable, oldValue, newValue) -> {
if (Platform.isFxApplicationThread()) {
initTrafficLineChart(newValue, stackPane);
} else {
Platform.runLater(() -> initTrafficLineChart(newValue, stackPane));
}
}
);
stackPane.getChildren().add(new TrafficCounterLineChartBuilder(trafficCounter).build());
Tab tab = new Tab(I18N.getString(I18N.CONSOLE_TAB2_TEXT));
tab.setContent(stackPane);
tab.setClosable(false);
return tab;
}

private static void initTrafficLineChart(Client.Instance newValue, StackPane stackPane) {
ObservableList<Node> children = stackPane.getChildren();
children.clear();
children.add(new TrafficCounterLineChart(newValue).init());
}

private void addGridPane0Children(GridPane gridPane0) {
// ---------- Grid Children ----------
gridPane0.add(wrap(moveUpServerConfigButton), 1, 13);
Expand Down Expand Up @@ -632,6 +599,6 @@ private void saveConfig() {
}

public void launchProxy() {
proxy.launch().ifPresent(instance::set);
proxy.launch().ifPresent(instance -> trafficCounter.set(instance.traffic()));
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package com.urbanspork.client.gui.traffic;

import com.urbanspork.client.Client;
import com.urbanspork.client.gui.spine.CatmullRom;
import io.netty.handler.traffic.TrafficCounter;
import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.beans.property.ObjectProperty;
import javafx.collections.ObservableList;
import javafx.geometry.Point2D;
import javafx.scene.chart.LineChart;
Expand All @@ -16,19 +16,19 @@
import javafx.scene.shape.PathElement;
import javafx.util.Duration;

public class TrafficCounterLineChart {
public class TrafficCounterLineChartBuilder {
private static final int WINDOW = 60;

private final XYChart.Series<Number, Number> write = new XYChart.Series<>();
private final XYChart.Series<Number, Number> read = new XYChart.Series<>();
private final Timeline timeline = new Timeline();
private final Client.Instance instance;

public TrafficCounterLineChart(Client.Instance instance) {
this.instance = instance;
public TrafficCounterLineChartBuilder(ObjectProperty<TrafficCounter> counter) {
counter.addListener((observable, oldValue, newValue) -> refresh(newValue));
timeline.setCycleCount(Animation.INDEFINITE);
}

public LineChart<Number, Number> init() {
public LineChart<Number, Number> build() {
NumberAxis xAxis = new NumberAxis(0, WINDOW, WINDOW);
NumberAxis yAxis = new NumberAxis();
yAxis.setTickLabelsVisible(false);
Expand Down Expand Up @@ -90,22 +90,23 @@ private void curve(ObservableList<PathElement> elements) {
}
data.add(write);
data.add(read);
timeline.setCycleCount(Animation.INDEFINITE);
timeline.getKeyFrames().add(new KeyFrame(Duration.millis(instance.traffic().checkInterval()), event -> refresh()));
timeline.playFromStart();
return lineChart;
}

private void refresh() {
ObservableList<XYChart.Data<Number, Number>> writeData = write.getData();
ObservableList<XYChart.Data<Number, Number>> readData = read.getData();
TrafficCounter counter = instance.traffic();
long writeBytes = counter.lastWrittenBytes() / 1024;
long readBytes = counter.lastReadBytes() / 1024;
write.setName(writeBytes + " KB/s");
read.setName(readBytes + " KB/s");
scroll(writeData, writeBytes);
scroll(readData, readBytes);
private void refresh(TrafficCounter counter) {
ObservableList<KeyFrame> keyFrames = timeline.getKeyFrames();
keyFrames.clear();
keyFrames.add(new KeyFrame(Duration.millis(counter.checkInterval()), event -> {
ObservableList<XYChart.Data<Number, Number>> writeData = write.getData();
ObservableList<XYChart.Data<Number, Number>> readData = read.getData();
long writeBytes = counter.lastWrittenBytes() / 1024;
long readBytes = counter.lastReadBytes() / 1024;
write.setName(writeBytes + " KB/s");
read.setName(readBytes + " KB/s");
scroll(writeData, writeBytes);
scroll(readData, readBytes);
}));
timeline.playFromStart();
}

private void scroll(ObservableList<XYChart.Data<Number, Number>> dataList, Number y) {
Expand Down

0 comments on commit 22cb869

Please sign in to comment.