Add display to show space left on device
This commit is contained in:
parent
8fdb24bad1
commit
5708d7f259
|
@ -8,6 +8,7 @@ import java.io.IOException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.security.InvalidKeyException;
|
import java.security.InvalidKeyException;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.text.DecimalFormat;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
import java.time.ZonedDateTime;
|
import java.time.ZonedDateTime;
|
||||||
|
@ -47,13 +48,16 @@ import javafx.scene.Cursor;
|
||||||
import javafx.scene.control.Alert.AlertType;
|
import javafx.scene.control.Alert.AlertType;
|
||||||
import javafx.scene.control.ButtonType;
|
import javafx.scene.control.ButtonType;
|
||||||
import javafx.scene.control.ContextMenu;
|
import javafx.scene.control.ContextMenu;
|
||||||
|
import javafx.scene.control.Label;
|
||||||
import javafx.scene.control.MenuItem;
|
import javafx.scene.control.MenuItem;
|
||||||
|
import javafx.scene.control.ProgressBar;
|
||||||
import javafx.scene.control.ScrollPane;
|
import javafx.scene.control.ScrollPane;
|
||||||
import javafx.scene.control.Tab;
|
import javafx.scene.control.Tab;
|
||||||
import javafx.scene.control.TableCell;
|
import javafx.scene.control.TableCell;
|
||||||
import javafx.scene.control.TableColumn;
|
import javafx.scene.control.TableColumn;
|
||||||
import javafx.scene.control.TableColumn.SortType;
|
import javafx.scene.control.TableColumn.SortType;
|
||||||
import javafx.scene.control.TableView;
|
import javafx.scene.control.TableView;
|
||||||
|
import javafx.scene.control.Tooltip;
|
||||||
import javafx.scene.control.cell.PropertyValueFactory;
|
import javafx.scene.control.cell.PropertyValueFactory;
|
||||||
import javafx.scene.input.ContextMenuEvent;
|
import javafx.scene.input.ContextMenuEvent;
|
||||||
import javafx.scene.input.KeyCode;
|
import javafx.scene.input.KeyCode;
|
||||||
|
@ -62,6 +66,9 @@ import javafx.scene.input.MouseButton;
|
||||||
import javafx.scene.input.MouseEvent;
|
import javafx.scene.input.MouseEvent;
|
||||||
import javafx.scene.layout.BorderPane;
|
import javafx.scene.layout.BorderPane;
|
||||||
import javafx.scene.layout.FlowPane;
|
import javafx.scene.layout.FlowPane;
|
||||||
|
import javafx.scene.layout.HBox;
|
||||||
|
import javafx.scene.layout.StackPane;
|
||||||
|
import javafx.scene.text.Font;
|
||||||
import javafx.stage.FileChooser;
|
import javafx.stage.FileChooser;
|
||||||
import javafx.util.Callback;
|
import javafx.util.Callback;
|
||||||
import javafx.util.Duration;
|
import javafx.util.Duration;
|
||||||
|
@ -74,12 +81,16 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
|
||||||
private Recorder recorder;
|
private Recorder recorder;
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
private List<Site> sites;
|
private List<Site> sites;
|
||||||
|
private long spaceTotal = -1;
|
||||||
|
private long spaceFree = -1;
|
||||||
|
|
||||||
FlowPane grid = new FlowPane();
|
FlowPane grid = new FlowPane();
|
||||||
ScrollPane scrollPane = new ScrollPane();
|
ScrollPane scrollPane = new ScrollPane();
|
||||||
TableView<JavaFxRecording> table = new TableView<JavaFxRecording>();
|
TableView<JavaFxRecording> table = new TableView<JavaFxRecording>();
|
||||||
ObservableList<JavaFxRecording> observableRecordings = FXCollections.observableArrayList();
|
ObservableList<JavaFxRecording> observableRecordings = FXCollections.observableArrayList();
|
||||||
ContextMenu popup;
|
ContextMenu popup;
|
||||||
|
ProgressBar spaceLeft;
|
||||||
|
Label spaceLabel;
|
||||||
|
|
||||||
public RecordingsTab(String title, Recorder recorder, Config config, List<Site> sites) {
|
public RecordingsTab(String title, Recorder recorder, Config config, List<Site> sites) {
|
||||||
super(title);
|
super(title);
|
||||||
|
@ -179,8 +190,21 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
|
||||||
});
|
});
|
||||||
scrollPane.setContent(table);
|
scrollPane.setContent(table);
|
||||||
|
|
||||||
|
HBox spaceBox = new HBox(5);
|
||||||
|
Label l = new Label("Space left on device");
|
||||||
|
HBox.setMargin(l, new Insets(2, 0, 0, 0));
|
||||||
|
spaceBox.getChildren().add(l);
|
||||||
|
spaceLeft = new ProgressBar(0);
|
||||||
|
spaceLeft.setPrefSize(200, 22);
|
||||||
|
spaceLabel = new Label();
|
||||||
|
spaceLabel.setFont(Font.font(11));
|
||||||
|
StackPane stack = new StackPane(spaceLeft, spaceLabel);
|
||||||
|
spaceBox.getChildren().add(stack);
|
||||||
|
BorderPane.setMargin(spaceBox, new Insets(5));
|
||||||
|
|
||||||
BorderPane root = new BorderPane();
|
BorderPane root = new BorderPane();
|
||||||
root.setPadding(new Insets(5));
|
root.setPadding(new Insets(5));
|
||||||
|
root.setTop(spaceBox);
|
||||||
root.setCenter(scrollPane);
|
root.setCenter(scrollPane);
|
||||||
setContent(root);
|
setContent(root);
|
||||||
|
|
||||||
|
@ -191,30 +215,8 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
|
||||||
updateService = createUpdateService();
|
updateService = createUpdateService();
|
||||||
updateService.setPeriod(new Duration(TimeUnit.SECONDS.toMillis(2)));
|
updateService.setPeriod(new Duration(TimeUnit.SECONDS.toMillis(2)));
|
||||||
updateService.setOnSucceeded((event) -> {
|
updateService.setOnSucceeded((event) -> {
|
||||||
List<JavaFxRecording> recordings = updateService.getValue();
|
updateRecordingsTable();
|
||||||
if (recordings == null) {
|
updateFreeSpaceDisplay();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Iterator<JavaFxRecording> iterator = observableRecordings.iterator(); iterator.hasNext();) {
|
|
||||||
JavaFxRecording old = iterator.next();
|
|
||||||
if (!recordings.contains(old)) {
|
|
||||||
// remove deleted recordings
|
|
||||||
iterator.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (JavaFxRecording recording : recordings) {
|
|
||||||
if (!observableRecordings.contains(recording)) {
|
|
||||||
// add new recordings
|
|
||||||
observableRecordings.add(recording);
|
|
||||||
} else {
|
|
||||||
// update existing ones
|
|
||||||
int index = observableRecordings.indexOf(recording);
|
|
||||||
JavaFxRecording old = observableRecordings.get(index);
|
|
||||||
old.update(recording);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
table.sort();
|
|
||||||
});
|
});
|
||||||
updateService.setOnFailed((event) -> {
|
updateService.setOnFailed((event) -> {
|
||||||
LOG.info("Couldn't get list of recordings from recorder", event.getSource().getException());
|
LOG.info("Couldn't get list of recordings from recorder", event.getSource().getException());
|
||||||
|
@ -226,6 +228,46 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateFreeSpaceDisplay() {
|
||||||
|
if(spaceTotal != -1 && spaceFree != -1) {
|
||||||
|
double free = ((double)spaceFree) / spaceTotal;
|
||||||
|
spaceLeft.setProgress(free);
|
||||||
|
double totalGiB = ((double) spaceTotal) / 1024 / 1024 / 1024;
|
||||||
|
double freeGiB = ((double) spaceFree) / 1024 / 1024 / 1024;
|
||||||
|
DecimalFormat df = new DecimalFormat("0.00");
|
||||||
|
String tt = df.format(freeGiB) + " / " + df.format(totalGiB) + " GiB";
|
||||||
|
spaceLeft.setTooltip(new Tooltip(tt));
|
||||||
|
spaceLabel.setText(tt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateRecordingsTable() {
|
||||||
|
List<JavaFxRecording> recordings = updateService.getValue();
|
||||||
|
if (recordings == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Iterator<JavaFxRecording> iterator = observableRecordings.iterator(); iterator.hasNext();) {
|
||||||
|
JavaFxRecording old = iterator.next();
|
||||||
|
if (!recordings.contains(old)) {
|
||||||
|
// remove deleted recordings
|
||||||
|
iterator.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (JavaFxRecording recording : recordings) {
|
||||||
|
if (!observableRecordings.contains(recording)) {
|
||||||
|
// add new recordings
|
||||||
|
observableRecordings.add(recording);
|
||||||
|
} else {
|
||||||
|
// update existing ones
|
||||||
|
int index = observableRecordings.indexOf(recording);
|
||||||
|
JavaFxRecording old = observableRecordings.get(index);
|
||||||
|
old.update(recording);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
table.sort();
|
||||||
|
}
|
||||||
|
|
||||||
private ScheduledService<List<JavaFxRecording>> createUpdateService() {
|
private ScheduledService<List<JavaFxRecording>> createUpdateService() {
|
||||||
ScheduledService<List<JavaFxRecording>> updateService = new ScheduledService<List<JavaFxRecording>>() {
|
ScheduledService<List<JavaFxRecording>> updateService = new ScheduledService<List<JavaFxRecording>>() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -233,12 +275,23 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
|
||||||
return new Task<List<JavaFxRecording>>() {
|
return new Task<List<JavaFxRecording>>() {
|
||||||
@Override
|
@Override
|
||||||
public List<JavaFxRecording> call() throws IOException, InvalidKeyException, NoSuchAlgorithmException, IllegalStateException {
|
public List<JavaFxRecording> call() throws IOException, InvalidKeyException, NoSuchAlgorithmException, IllegalStateException {
|
||||||
|
updateSpace();
|
||||||
|
|
||||||
List<JavaFxRecording> recordings = new ArrayList<>();
|
List<JavaFxRecording> recordings = new ArrayList<>();
|
||||||
for (Recording rec : recorder.getRecordings()) {
|
for (Recording rec : recorder.getRecordings()) {
|
||||||
recordings.add(new JavaFxRecording(rec));
|
recordings.add(new JavaFxRecording(rec));
|
||||||
}
|
}
|
||||||
return recordings;
|
return recordings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateSpace() {
|
||||||
|
try {
|
||||||
|
spaceTotal = recorder.getTotalSpaceBytes();
|
||||||
|
spaceFree = recorder.getFreeSpaceBytes();
|
||||||
|
} catch (IOException e) {
|
||||||
|
LOG.error("Couldn't update free space", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue