diff --git a/src/AutoPilotPlugins/Common/RadioComponentController.cc b/src/AutoPilotPlugins/Common/RadioComponentController.cc index 2f88a48..b4e8cb3 100644 --- a/src/AutoPilotPlugins/Common/RadioComponentController.cc +++ b/src/AutoPilotPlugins/Common/RadioComponentController.cc @@ -26,8 +26,8 @@ /// @author Don Gagne diff --git a/src/FactSystem/ParameterLoader.cc b/src/FactSystem/ParameterLoader.cc index 0fbd59e..bbaa748 100644 --- a/src/FactSystem/ParameterLoader.cc +++ b/src/FactSystem/ParameterLoader.cc @@ -657,7 +657,6 @@ void ParameterLoader::_saveToEEPROM(void) QString ParameterLoader::readParametersFromStream(QTextStream& stream) { QString errors; - bool userWarned = false; while (!stream.atEnd()) { QString line = stream.readLine(); @@ -665,16 +664,8 @@ QString ParameterLoader::readParametersFromStream(QTextStream& stream) QStringList wpParams = line.split("\t"); int lineMavId = wpParams.at(0).toInt(); if (wpParams.size() == 5) { - if (!userWarned && (_vehicle->id() != lineMavId)) { - userWarned = true; - QString msg("The parameters in the stream have been saved from System Id %1, but the current vehicle has the System Id %2."); - QGCMessageBox::StandardButton button = QGCMessageBox::warning("Parameter Load", - msg.arg(lineMavId).arg(_vehicle->id()), - QGCMessageBox::Ok | QGCMessageBox::Cancel, - QGCMessageBox::Cancel); - if (button == QGCMessageBox::Cancel) { - return QString(); - } + if (_vehicle->id() != lineMavId) { + return QString("The parameters in the stream have been saved from System Id %1, but the current vehicle has the System Id %2.").arg(lineMavId).arg(_vehicle->id()); } int componentId = wpParams.at(1).toInt(); diff --git a/src/QGCApplication.cc b/src/QGCApplication.cc index beddbde..921a9f1 100644 --- a/src/QGCApplication.cc +++ b/src/QGCApplication.cc @@ -455,9 +455,7 @@ bool QGCApplication::_initForNormalAppBoot(void) /// settings. QString savedFilesLocation = settings.value(_savedFilesLocationKey).toString(); if (savedFilesLocation.isEmpty()) { - QGCMessageBox::warning( - tr("Bad save location"), - tr("The location to save files to is invalid, or cannot be written to. Please provide a new one.")); + showMessage("The location to save files to is invalid, or cannot be written to. Please provide a new one."); mainWindow->showSettings(); } @@ -705,10 +703,7 @@ void QGCApplication::_missingParamsDisplay(void) } _missingParams.clear(); - QGCMessageBox::critical( - "Missing Parameters", - QString("Parameters missing from firmware: %1.\n\n" - "You should quit QGroundControl immediately and update your firmware.").arg(params)); + showMessage(QString("Parameters missing from firmware: %1.\n\nYou should quit QGroundControl immediately and update your firmware.").arg(params)); } void QGCApplication::showMessage(const QString& message) @@ -717,6 +712,6 @@ void QGCApplication::showMessage(const QString& message) if (mainWindow) { mainWindow->showToolbarMessage(message); } else { - QGCMessageBox::information("", message); + qWarning() << "showMessage with no mainWindow" << message; } } diff --git a/src/QGCQuickWidget.cc b/src/QGCQuickWidget.cc index da30232..5a5b24c 100644 --- a/src/QGCQuickWidget.cc +++ b/src/QGCQuickWidget.cc @@ -60,7 +60,7 @@ bool QGCQuickWidget::setSource(const QUrl& qmlUrl) errorList += error.toString(); errorList += "\n"; } - QGCMessageBox::warning(tr("Qml Error"), tr("Source not ready: Status(%1)\nErrors:\n%2").arg(status()).arg(errorList)); + qgcApp()->showMessage(QString("Source not ready: Status(%1)\nErrors:\n%2").arg(status()).arg(errorList)); return false; } diff --git a/src/ui/MainWindow.cc b/src/ui/MainWindow.cc index 9507200..8267484 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 f0ec66d..6f76e9c 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 acdc07b..23fceac 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