From e3134f6a1a51666464b0211a4f9aba9938d45af6 Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Sat, 5 Dec 2015 23:20:06 -0800 Subject: [PATCH] Change window close sequence to prompt user from Qml side --- src/ui/MainWindow.cc | 24 ++++++++++-------------- src/ui/MainWindow.h | 5 +++++ src/ui/MainWindow.qml | 16 +++++++++++++++- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/ui/MainWindow.cc b/src/ui/MainWindow.cc index 950720026..82674848d 100644 --- a/src/ui/MainWindow.cc +++ b/src/ui/MainWindow.cc @@ -425,24 +425,20 @@ void MainWindow::showStatusBarCallback(bool checked) checked ? statusBar()->show() : statusBar()->hide(); } +void MainWindow::acceptWindowClose(void) +{ + qgcApp()->toolbox()->linkManager()->shutdown(); + // The above shutdown causes a flurry of activity as the vehicle components are removed. This in turn + // causes the Windows Version of Qt to crash if you allow the close event to be accepted. In order to prevent + // the crash, we ignore the close event and setup a delayed timer to close the window after things settle down. + QTimer::singleShot(1500, this, &MainWindow::_closeWindow); +} + void MainWindow::closeEvent(QCloseEvent *event) { // Disallow window close if there are active connections if (qgcApp()->toolbox()->multiVehicleManager()->vehicles()->count()) { - QGCMessageBox::StandardButton button = - QGCMessageBox::warning( - tr("QGroundControl close"), - tr("There are still active connections to vehicles. Do you want to disconnect these before closing?"), - QMessageBox::Yes | QMessageBox::Cancel, - QMessageBox::Cancel); - if (button == QMessageBox::Yes) { - qgcApp()->toolbox()->linkManager()->shutdown(); - // The above disconnect causes a flurry of activity as the vehicle components are removed. This in turn - // causes the Windows Version of Qt to crash if you allow the close event to be accepted. In order to prevent - // the crash, we ignore the close event and setup a delayed timer to close the window after things settle down. - QTimer::singleShot(1500, this, &MainWindow::_closeWindow); - } - + emit showWindowCloseMessage(); event->ignore(); return; } diff --git a/src/ui/MainWindow.h b/src/ui/MainWindow.h index f0ec66da3..6f76e9ce3 100644 --- a/src/ui/MainWindow.h +++ b/src/ui/MainWindow.h @@ -91,6 +91,9 @@ public: /// @brief Saves the last used connection void saveLastUsedConnection(const QString connection); + // Called from MainWindow.qml when the user accepts the window close dialog + Q_INVOKABLE void acceptWindowClose(void); + public slots: /** @brief Show the application settings */ void showSettings(); @@ -132,6 +135,7 @@ protected slots: * this incoherent. */ void handleActiveViewActionState(bool triggered); + signals: // Signals the Qml to show the specified view void showFlyView(void); @@ -139,6 +143,7 @@ signals: void showSetupView(void); void showToolbarMessage(const QString& message); + void showWindowCloseMessage(void); // These are used for unit testing void showSetupFirmware(void); diff --git a/src/ui/MainWindow.qml b/src/ui/MainWindow.qml index acdc07b62..23fceac9e 100644 --- a/src/ui/MainWindow.qml +++ b/src/ui/MainWindow.qml @@ -23,6 +23,7 @@ along with QGROUNDCONTROL. If not, see . import QtQuick 2.5 import QtQuick.Controls 1.2 +import QtQuick.Dialogs 1.2 import QtPositioning 5.2 import QGroundControl 1.0 @@ -95,6 +96,8 @@ Item { onShowToolbarMessage: toolBar.showToolbarMessage(message) + onShowWindowCloseMessage: windowCloseDialog.open() + // The following are use for unit testing only onShowSetupFirmware: setupViewLoader.item.showFirmwarePanel() @@ -173,13 +176,24 @@ Item { function showPopUp(dropItem, centerX) { if(currentPopUp) { currentPopUp.close() - } + } indicatorDropdown.centerX = centerX indicatorDropdown.sourceComponent = dropItem indicatorDropdown.visible = true currentPopUp = indicatorDropdown } + MessageDialog { + id: windowCloseDialog + title: "QGroundControl close" + text: "There are still active connections to vehicles. Do you want to disconnect these before closing?" + standardButtons: StandardButton.Yes | StandardButton.Cancel + modality: Qt.ApplicationModal + visible: false + + onYes: controller.acceptWindowClose() + } + //-- Left Settings Menu Loader { id: leftPanel -- 2.22.0