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 { ...@@ -189,8 +189,8 @@ public class CityDoctorController {
**/ **/
} }
public void decompressZipEntry(CityGmlZipEntry entry) { public void decompressZipEntry(CityGmlZipEntry entry, ProgressListener l) {
entry.loadEntry(currentConfig); entry.loadEntry(currentConfig, l);
} }
public CityGmlZipArchive getZipArchive() { public CityGmlZipArchive getZipArchive() {
......
...@@ -13,6 +13,7 @@ import javafx.scene.Scene; ...@@ -13,6 +13,7 @@ import javafx.scene.Scene;
import javafx.scene.control.Button; import javafx.scene.control.Button;
import javafx.scene.control.Label; import javafx.scene.control.Label;
import javafx.scene.control.ListView; import javafx.scene.control.ListView;
import javafx.scene.control.ProgressBar;
import javafx.scene.control.TextField; import javafx.scene.control.TextField;
import javafx.scene.control.TitledPane; import javafx.scene.control.TitledPane;
import javafx.scene.control.Tooltip; import javafx.scene.control.Tooltip;
...@@ -87,6 +88,10 @@ public class ZipEntryPicker { ...@@ -87,6 +88,10 @@ public class ZipEntryPicker {
@FXML @FXML
private ListView<ZipEntryNode> entryList; private ListView<ZipEntryNode> entryList;
@FXML
private ProgressBar progress;
@FXML
private ProgressBar subProgress;
private CityDoctorController controller; private CityDoctorController controller;
...@@ -110,14 +115,16 @@ public class ZipEntryPicker { ...@@ -110,14 +115,16 @@ public class ZipEntryPicker {
stage.close(); stage.close();
} }
}); });
}
public void initialize() {
subProgress.setVisible(false);
entryList.getSelectionModel().selectedItemProperty().addListener((obs, oldI, newI) -> { entryList.getSelectionModel().selectedItemProperty().addListener((obs, oldI, newI) -> {
if (newI != null) { if (newI != null) {
showMetadata(newI.getEntry()); showMetadata(newI.getEntry());
} }
}); });
} entryList.setCellFactory(param -> new ZipEntryListCell());
public void initialize() {
setupButtons(); setupButtons();
applyLocalization(); applyLocalization();
populateZipEntryList(); populateZipEntryList();
...@@ -142,23 +149,52 @@ public class ZipEntryPicker { ...@@ -142,23 +149,52 @@ public class ZipEntryPicker {
} }
decompressBtn.setOnAction(e -> { decompressBtn.setOnAction(e -> {
CityGmlZipEntry entry = entryList.getSelectionModel().getSelectedItem().getEntry(); disableTaskButtons();
controller.decompressZipEntry(entry); Thread t = new Thread(() -> {
populateZipEntryList(entryList.getSelectionModel().getSelectedIndex()); 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 -> { loadBtn.setOnAction(e -> {
disableTaskButtons();
CityGmlZipEntry entry = entryList.getSelectionModel().getSelectedItem().getEntry(); CityGmlZipEntry entry = entryList.getSelectionModel().getSelectedItem().getEntry();
}); });
decompressAllBtn.setOnAction(e -> { decompressAllBtn.setOnAction(e -> {
for (ZipEntryNode node : entryList.getItems()) { disableTaskButtons();
controller.decompressZipEntry(node.getEntry()); subProgress.setVisible(true);
} subProgress.setProgress(0);
populateZipEntryList(entryList.getSelectionModel().getSelectedIndex()); Thread t = new Thread(() -> {
decompressAllBtn.setDisable(true); 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()); cancelBtn.setOnAction(e -> stage.close());
...@@ -190,7 +226,6 @@ public class ZipEntryPicker { ...@@ -190,7 +226,6 @@ public class ZipEntryPicker {
private void populateZipEntryList(int selectionIndex) { private void populateZipEntryList(int selectionIndex) {
entryList.getItems().clear(); entryList.getItems().clear();
entryList.setCellFactory(param -> new ZipEntryListCell());
for (CityGmlZipEntry entry : archive.getEntries()) { for (CityGmlZipEntry entry : archive.getEntries()) {
entryList.getItems().add(new ZipEntryNode(entry)); entryList.getItems().add(new ZipEntryNode(entry));
} }
...@@ -245,6 +280,12 @@ public class ZipEntryPicker { ...@@ -245,6 +280,12 @@ public class ZipEntryPicker {
} }
} }
private void disableTaskButtons() {
decompressBtn.setDisable(true);
loadBtn.setDisable(true);
decompressAllBtn.setDisable(true);
}
private String getErrorText(ZipEntryErrorType error) { private String getErrorText(ZipEntryErrorType error) {
switch (error) { switch (error) {
case EXCESSIVE_FILESIZE -> { case EXCESSIVE_FILESIZE -> {
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
<?import javafx.scene.control.TitledPane?> <?import javafx.scene.control.TitledPane?>
<?import javafx.scene.image.ImageView?> <?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.HBox?> <?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?> <?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?> <?import javafx.scene.text.Font?>
...@@ -140,12 +141,18 @@ ...@@ -140,12 +141,18 @@
</HBox> </HBox>
<HBox spacing="5.0"> <HBox spacing="5.0">
<children> <children>
<ProgressBar fx:id="progress" maxWidth="1.7976931348623157E308" minHeight="40.0" prefHeight="40.0" <StackPane HBox.hgrow="ALWAYS">
progress="0.0" HBox.hgrow="ALWAYS"> <children>
<padding> <ProgressBar fx:id="progress" maxWidth="1.7976931348623157E308" minHeight="40.0"
<Insets bottom="5.0" right="5.0" top="5.0"/> prefHeight="40.0" progress="0.0">
</padding> <padding>
</ProgressBar> <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"> <Button fx:id="cancelBtn" alignment="CENTER" mnemonicParsing="false" text="Cancel">
<font> <font>
<Font size="14.0"/> <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