From 7912b3b727ad85b524fc452d9e619a5d4d082b5b Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Sat, 23 May 2020 13:49:50 +0200 Subject: [PATCH] Check for running downloads on shutdown Check for running downloads and ask the user to exit anyway to prevent half downloaded files. --- .../java/ctbrec/ui/CamrecApplication.java | 73 +++++++++++++------ .../java/ctbrec/ui/tabs/RecordingsTab.java | 18 +++-- 2 files changed, 61 insertions(+), 30 deletions(-) diff --git a/client/src/main/java/ctbrec/ui/CamrecApplication.java b/client/src/main/java/ctbrec/ui/CamrecApplication.java index 82c8d66f..dc7ed021 100644 --- a/client/src/main/java/ctbrec/ui/CamrecApplication.java +++ b/client/src/main/java/ctbrec/ui/CamrecApplication.java @@ -49,6 +49,7 @@ import ctbrec.sites.mfc.MyFreeCams; import ctbrec.sites.showup.Showup; import ctbrec.sites.streamate.Streamate; import ctbrec.sites.stripchat.Stripchat; +import ctbrec.ui.controls.Dialogs; import ctbrec.ui.news.NewsTab; import ctbrec.ui.settings.SettingsTab; import ctbrec.ui.tabs.DonateTabFx; @@ -69,6 +70,7 @@ import javafx.scene.control.TabPane; import javafx.scene.image.Image; import javafx.scene.paint.Color; import javafx.stage.Stage; +import javafx.stage.WindowEvent; import okhttp3.Request; import okhttp3.Response; @@ -86,6 +88,8 @@ public class CamrecApplication extends Application { public static HttpClient httpClient; public static String title; private Stage primaryStage; + private RecordedModelsTab modelsTab; + private RecordingsTab recordingsTab; @Override public void start(Stage primaryStage) throws Exception { @@ -108,6 +112,23 @@ public class CamrecApplication extends Application { createHttpClient(); hostServices = getHostServices(); createRecorder(); + startOnlineMonitor(); + createGui(primaryStage); + checkForUpdates(); + startHelpServer(); + } + + private void startHelpServer() { + new Thread(() -> { + try { + DocServer.start(); + } catch (Exception e) { + LOG.error("Couldn't start documentation server", e); + } + }).start(); + } + + private void startOnlineMonitor() { onlineMonitor = new OnlineMonitor(recorder); onlineMonitor.start(); for (Site site : sites) { @@ -120,16 +141,6 @@ public class CamrecApplication extends Application { } } } - createGui(primaryStage); - checkForUpdates(); - - new Thread(() -> { - try { - DocServer.start(); - } catch (Exception e) { - LOG.error("Couldn't start documentation server", e); - } - }).start(); } private void logEnvironment() { @@ -158,9 +169,9 @@ public class CamrecApplication extends Application { } } - RecordedModelsTab modelsTab = new RecordedModelsTab("Recording", recorder, sites); + modelsTab = new RecordedModelsTab("Recording", recorder, sites); rootPane.getTabs().add(modelsTab); - RecordingsTab recordingsTab = new RecordingsTab("Recordings", recorder, config, sites); + recordingsTab = new RecordingsTab("Recordings", recorder, config, sites); rootPane.getTabs().add(recordingsTab); settingsTab = new SettingsTab(sites, recorder); rootPane.getTabs().add(settingsTab); @@ -191,8 +202,32 @@ public class CamrecApplication extends Application { primaryStage.xProperty().addListener((observable, oldVal, newVal) -> Config.getInstance().getSettings().windowX = newVal.intValue()); primaryStage.yProperty().addListener((observable, oldVal, newVal) -> Config.getInstance().getSettings().windowY = newVal.intValue()); primaryStage.show(); - primaryStage.setOnCloseRequest(e -> { + primaryStage.setOnCloseRequest(createShutdownHandler()); + + // register changelistener to activate / deactivate tabs, when the user switches between them + rootPane.getSelectionModel().selectedItemProperty().addListener((ChangeListener) (ov, from, to) -> { + if (from instanceof TabSelectionListener) { + ((TabSelectionListener) from).deselected(); + } + if (to instanceof TabSelectionListener) { + ((TabSelectionListener) to).selected(); + } + }); + } + + private javafx.event.EventHandler createShutdownHandler() { + return e -> { e.consume(); + + // check for active downloads + if (recordingsTab.isDownloadRunning()) { + boolean exitAnyway = Dialogs.showConfirmDialog("Shutdown", "Do you want to exit anyway?", "There are downloads running", + primaryStage.getScene()); + if (!exitAnyway) { + return; + } + } + Alert shutdownInfo = new AutosizeAlert(Alert.AlertType.INFORMATION, primaryStage.getScene()); shutdownInfo.setTitle("Shutdown"); shutdownInfo.setContentText("Shutting down. Please wait while recordings are finished..."); @@ -237,17 +272,7 @@ public class CamrecApplication extends Application { } } }.start(); - }); - - // register changelistener to activate / deactivate tabs, when the user switches between them - rootPane.getSelectionModel().selectedItemProperty().addListener((ChangeListener) (ov, from, to) -> { - if (from instanceof TabSelectionListener) { - ((TabSelectionListener) from).deselected(); - } - if (to instanceof TabSelectionListener) { - ((TabSelectionListener) to).selected(); - } - }); + }; } private void registerAlertSystem() { diff --git a/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java b/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java index 8abd341b..3d0f9105 100644 --- a/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java +++ b/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java @@ -180,6 +180,12 @@ public class RecordingsTab extends Tab implements TabSelectionListener { restoreState(); } + public boolean isDownloadRunning() { + return observableRecordings.stream() + .map(Recording::getStatus) + .anyMatch(s -> s == DOWNLOADING); + } + private TableCell createSizeCell() { TableCell cell = new TableCell() { @Override @@ -193,7 +199,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener { if(Objects.equals(System.getenv("CTBREC_DEV"), "1")) { int row = this.getTableRow().getIndex(); JavaFxRecording rec = tableViewProperty().get().getItems().get(row); - if(!rec.valueChanged() && rec.getStatus() == State.RECORDING) { + if(!rec.valueChanged() && rec.getStatus() == RECORDING) { setStyle("-fx-alignment: CENTER-RIGHT; -fx-background-color: red"); } } @@ -372,7 +378,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener { JavaFxRecording first = recordings.get(0); MenuItem openInPlayer = new MenuItem("Open in Player"); openInPlayer.setOnAction(e -> play(recordings.get(0))); - if(first.getStatus() == State.FINISHED || Config.getInstance().getSettings().localRecording) { + if(first.getStatus() == FINISHED || Config.getInstance().getSettings().localRecording) { contextMenu.getItems().add(openInPlayer); } @@ -392,7 +398,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener { MenuItem deleteRecording = new MenuItem("Delete"); deleteRecording.setOnAction(e -> delete(recordings)); - if(first.getStatus() == State.FINISHED || first.getStatus() == State.WAITING || first.getStatus() == State.FAILED || recordings.size() > 1) { + if(first.getStatus() == FINISHED || first.getStatus() == WAITING || first.getStatus() == FAILED || recordings.size() > 1) { contextMenu.getItems().add(deleteRecording); deleteRecording.setDisable(recordings.stream().allMatch(Recording::isPinned)); } @@ -405,7 +411,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener { MenuItem downloadRecording = new MenuItem("Download"); downloadRecording.setOnAction(e -> download(first)); - if (!Config.getInstance().getSettings().localRecording && first.getStatus() == State.FINISHED) { + if (!Config.getInstance().getSettings().localRecording && first.getStatus() == FINISHED) { contextMenu.getItems().add(downloadRecording); } @@ -549,7 +555,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener { if(target != null) { config.getSettings().lastDownloadDir = target.getParent(); startDownloadThread(target, recording); - recording.setStatus(State.DOWNLOADING); + recording.setStatus(DOWNLOADING); recording.setProgress(0); } } @@ -670,7 +676,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener { List exceptions = new ArrayList<>(); for (Iterator iterator = recordings.iterator(); iterator.hasNext();) { JavaFxRecording r = iterator.next(); - if (r.getStatus() != FINISHED && r.getStatus() != FAILED && r.getStatus() != State.WAITING) { + if (r.getStatus() != FINISHED && r.getStatus() != FAILED && r.getStatus() != WAITING) { continue; } try {