Commit 5443cf78 authored by Riegel's avatar Riegel
Browse files

Feat: Add ProgressBar to ZipEntryPicker

2 merge requests!28Version 3.17.0 Release,!26Add ZIP-archive support
Showing with 68 additions and 20 deletions
+68 -20
......@@ -189,8 +189,8 @@ public class CityDoctorController {
**/
}
public void decompressZipEntry(CityGmlZipEntry entry) {
entry.loadEntry(currentConfig);
public void decompressZipEntry(CityGmlZipEntry entry, ProgressListener l) {
entry.loadEntry(currentConfig, l);
}
public CityGmlZipArchive getZipArchive() {
......
......@@ -13,6 +13,7 @@ import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.ProgressBar;
import javafx.scene.control.TextField;
import javafx.scene.control.TitledPane;
import javafx.scene.control.Tooltip;
......@@ -87,6 +88,10 @@ public class ZipEntryPicker {
@FXML
private ListView<ZipEntryNode> entryList;
@FXML
private ProgressBar progress;
@FXML
private ProgressBar subProgress;
private CityDoctorController controller;
......@@ -110,14 +115,16 @@ public class ZipEntryPicker {
stage.close();
}
});
}
public void initialize() {
subProgress.setVisible(false);
entryList.getSelectionModel().selectedItemProperty().addListener((obs, oldI, newI) -> {
if (newI != null) {
showMetadata(newI.getEntry());
}
});
}
public void initialize() {
entryList.setCellFactory(param -> new ZipEntryListCell());
setupButtons();
applyLocalization();
populateZipEntryList();
......@@ -142,23 +149,52 @@ public class ZipEntryPicker {
}
decompressBtn.setOnAction(e -> {
CityGmlZipEntry entry = entryList.getSelectionModel().getSelectedItem().getEntry();
controller.decompressZipEntry(entry);
populateZipEntryList(entryList.getSelectionModel().getSelectedIndex());
disableTaskButtons();
Thread t = new Thread(() -> {
CityGmlZipEntry entry = entryList.getSelectionModel().getSelectedItem().getEntry();
controller.decompressZipEntry(entry, progressValue ->
Platform.runLater(() -> progress.setProgress(progressValue))
);
Platform.runLater(() -> {
if (!decompressAllBtn.isDisable() &&
entryList.getItems().stream().allMatch(zipEntryNode -> zipEntryNode.getEntry().isDecompressed())) {
decompressAllBtn.setDisable(true);
}
populateZipEntryList(entryList.getSelectionModel().getSelectedIndex());
});
});
t.start();
});
loadBtn.setOnAction(e -> {
disableTaskButtons();
CityGmlZipEntry entry = entryList.getSelectionModel().getSelectedItem().getEntry();
});
decompressAllBtn.setOnAction(e -> {
for (ZipEntryNode node : entryList.getItems()) {
controller.decompressZipEntry(node.getEntry());
}
populateZipEntryList(entryList.getSelectionModel().getSelectedIndex());
decompressAllBtn.setDisable(true);
disableTaskButtons();
subProgress.setVisible(true);
subProgress.setProgress(0);
Thread t = new Thread(() -> {
progress.setProgress(0);
int count = 0;
int total = entryList.getItems().size();
for (ZipEntryNode node : entryList.getItems()) {
controller.decompressZipEntry(node.getEntry(), progressValue ->
Platform.runLater(() -> subProgress.setProgress(progressValue))
);
count++;
double progressValue = count * 1.0 / total;
Platform.runLater(() -> progress.setProgress(progressValue));
}
Platform.runLater(() -> {
subProgress.setVisible(false);
populateZipEntryList(entryList.getSelectionModel().getSelectedIndex());
});
});
t.start();
});
cancelBtn.setOnAction(e -> stage.close());
......@@ -190,7 +226,6 @@ public class ZipEntryPicker {
private void populateZipEntryList(int selectionIndex) {
entryList.getItems().clear();
entryList.setCellFactory(param -> new ZipEntryListCell());
for (CityGmlZipEntry entry : archive.getEntries()) {
entryList.getItems().add(new ZipEntryNode(entry));
}
......@@ -245,6 +280,12 @@ public class ZipEntryPicker {
}
}
private void disableTaskButtons() {
decompressBtn.setDisable(true);
loadBtn.setDisable(true);
decompressAllBtn.setDisable(true);
}
private String getErrorText(ZipEntryErrorType error) {
switch (error) {
case EXCESSIVE_FILESIZE -> {
......
......@@ -10,6 +10,7 @@
<?import javafx.scene.control.TitledPane?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
......@@ -140,12 +141,18 @@
</HBox>
<HBox spacing="5.0">
<children>
<ProgressBar fx:id="progress" maxWidth="1.7976931348623157E308" minHeight="40.0" prefHeight="40.0"
progress="0.0" HBox.hgrow="ALWAYS">
<padding>
<Insets bottom="5.0" right="5.0" top="5.0"/>
</padding>
</ProgressBar>
<StackPane HBox.hgrow="ALWAYS">
<children>
<ProgressBar fx:id="progress" maxWidth="1.7976931348623157E308" minHeight="40.0"
prefHeight="40.0" progress="0.0">
<padding>
<Insets bottom="5.0" right="5.0" top="5.0"/>
</padding>
</ProgressBar>
<ProgressBar fx:id="subProgress" prefHeight="11.0" prefWidth="520.0" progress="0.0"
StackPane.alignment="CENTER_LEFT"/>
</children>
</StackPane>
<Button fx:id="cancelBtn" alignment="CENTER" mnemonicParsing="false" text="Cancel">
<font>
<Font size="14.0"/>
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment