Skip to content
Snippets Groups Projects
QGCSettingsWidget.cc 7.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • lm's avatar
    lm committed
    #include "QGCSettingsWidget.h"
    
    lm's avatar
    lm committed
    #include "ui_QGCSettingsWidget.h"
    
    
    #include "LinkManager.h"
    #include "MAVLinkProtocol.h"
    #include "MAVLinkSettingsWidget.h"
    
    #include "GAudioOutput.h"
    
    
    //, Qt::WindowFlags flags
    
    QGCSettingsWidget::QGCSettingsWidget(QWidget *parent, Qt::WindowFlags flags) :
        QDialog(parent, flags),
    
        ui(new Ui::QGCSettingsWidget),
        mainWindow((MainWindow*)parent)
    
    lm's avatar
    lm committed
    {
        ui->setupUi(this);
    
        // Center the window on the screen.
        QRect position = frameGeometry();
        position.moveCenter(QDesktopWidget().availableGeometry().center());
        move(position.topLeft());
    
    
        // Add all protocols
        QList<ProtocolInterface*> protocols = LinkManager::instance()->getProtocols();
    
        foreach (ProtocolInterface* protocol, protocols) {
    
            MAVLinkProtocol* mavlink = dynamic_cast<MAVLinkProtocol*>(protocol);
    
            if (mavlink) {
    
                MAVLinkSettingsWidget* msettings = new MAVLinkSettingsWidget(mavlink, this);
                ui->tabWidget->addTab(msettings, "MAVLink");
            }
        }
    
        this->window()->setWindowTitle(tr("QGroundControl Settings"));
    
    
        // Audio preferences
        ui->audioMuteCheckBox->setChecked(GAudioOutput::instance()->isMuted());
        connect(ui->audioMuteCheckBox, SIGNAL(toggled(bool)), GAudioOutput::instance(), SLOT(mute(bool)));
        connect(GAudioOutput::instance(), SIGNAL(mutedChanged(bool)), ui->audioMuteCheckBox, SLOT(setChecked(bool)));
    
    
        ui->reconnectCheckBox->setChecked(mainWindow->autoReconnectEnabled());
        connect(ui->reconnectCheckBox, SIGNAL(clicked(bool)), mainWindow, SLOT(enableAutoReconnect(bool)));
    
        // Low power mode
    
        ui->lowPowerCheckBox->setChecked(mainWindow->lowPowerModeEnabled());
        connect(ui->lowPowerCheckBox, SIGNAL(clicked(bool)), mainWindow, SLOT(enableLowPowerMode(bool)));
    
        // Dock widget title bars
    
        ui->titleBarCheckBox->setChecked(mainWindow->dockWidgetTitleBarsEnabled());
        connect(ui->titleBarCheckBox,SIGNAL(clicked(bool)),mainWindow,SLOT(enableDockWidgetTitleBars(bool)));
    
        // Custom mode
    
        ui->customModeComboBox->addItem(tr("Default: Generic MAVLink and serial links"), MainWindow::CUSTOM_MODE_NONE);
        ui->customModeComboBox->addItem(tr("Wifi: Generic MAVLink, wifi or serial links"), MainWindow::CUSTOM_MODE_WIFI);
        ui->customModeComboBox->addItem(tr("PX4: Optimized for PX4 Autopilot Users"), MainWindow::CUSTOM_MODE_PX4);
        ui->customModeComboBox->addItem(tr("APM: Optimized for ArduPilot Users"), MainWindow::CUSTOM_MODE_APM);
    
        ui->customModeComboBox->setCurrentIndex(ui->customModeComboBox->findData(mainWindow->getCustomMode()));
        connect(ui->customModeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(selectCustomMode(int)));
    
    
        // Intialize the style UI to the proper values obtained from the MainWindow.
        MainWindow::QGC_MAINWINDOW_STYLE style = mainWindow->getStyle();
    
        ui->styleChooser->setCurrentIndex(style);
    
        if (style == MainWindow::QGC_MAINWINDOW_STYLE_DARK)
        {
            ui->styleSheetFile->setText(mainWindow->getDarkStyleSheet());
        }
        else
        {
            ui->styleSheetFile->setText(mainWindow->getLightStyleSheet());
        }
    
        // And then connect all the signals for the UI for changing styles.
    
        connect(ui->styleChooser, SIGNAL(currentIndexChanged(int)), this, SLOT(styleChanged(int)));
        connect(ui->styleCustomButton, SIGNAL(clicked()), this, SLOT(selectStylesheet()));
        connect(ui->styleDefaultButton, SIGNAL(clicked()), this, SLOT(setDefaultStyle()));
    
        connect(ui->styleSheetFile, SIGNAL(editingFinished()), this, SLOT(lineEditFinished()));
    
        // Close / destroy
        connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(deleteLater()));
    
    lm's avatar
    lm committed
    }
    
    QGCSettingsWidget::~QGCSettingsWidget()
    {
        delete ui;
    }
    
    
    void QGCSettingsWidget::selectStylesheet()
    {
        // Let user select style sheet. The root directory for the file picker is the user's home directory if they haven't loaded a custom style.
    
        // Otherwise it defaults to the directory of that custom file.
        QString findDir;
        QString oldStylesheet(ui->styleSheetFile->text());
        QFile styleSheet(oldStylesheet);
        if (styleSheet.exists() && oldStylesheet[0] != ':')
    
            findDir = styleSheet.fileName();
        }
        else
        {
            findDir = QDir::homePath();
        }
    
        // Prompt the user to select a new style sheet. Do nothing if they cancel.
        QString newStyleFileName = QFileDialog::getOpenFileName(this, tr("Specify stylesheet"), findDir, tr("CSS Stylesheet (*.css);;"));
        if (newStyleFileName.isNull()) {
            return;
        }
    
        // Load the new style sheet if a valid one was selected, notifying the user
        // of an error if necessary.
        QFile newStyleFile(newStyleFileName);
        if (!newStyleFile.exists() || !updateStyle(newStyleFileName))
        {
            QMessageBox msgBox;
            msgBox.setIcon(QMessageBox::Information);
            msgBox.setText(tr("QGroundControl did not load a new style"));
            msgBox.setInformativeText(tr("Stylesheet file %1 was not readable").arg(newStyleFileName));
            msgBox.setStandardButtons(QMessageBox::Ok);
            msgBox.setDefaultButton(QMessageBox::Ok);
            msgBox.exec();
        }
        // And update the UI as needed.
        else
        {
    
            ui->styleSheetFile->setText(newStyleFileName);
    
    bool QGCSettingsWidget::updateStyle(QString style)
    
        switch (ui->styleChooser->currentIndex())
        {
        case 0:
    
            return mainWindow->loadStyle(MainWindow::QGC_MAINWINDOW_STYLE_DARK, style);
    
            return mainWindow->loadStyle(MainWindow::QGC_MAINWINDOW_STYLE_LIGHT, style);
    
    void QGCSettingsWidget::lineEditFinished()
    {
        QString newStyleFileName(ui->styleSheetFile->text());
        QFile newStyleFile(newStyleFileName);
        if (!newStyleFile.exists() || !updateStyle(newStyleFileName))
        {
            QMessageBox msgBox;
            msgBox.setIcon(QMessageBox::Information);
            msgBox.setText(tr("QGroundControl did not load a new style"));
            msgBox.setInformativeText(tr("Stylesheet file %1 was not readable").arg(newStyleFileName));
            msgBox.setStandardButtons(QMessageBox::Ok);
            msgBox.setDefaultButton(QMessageBox::Ok);
            msgBox.exec();
        }
    }
    
    
    void QGCSettingsWidget::styleChanged(int index)
    
            ui->styleSheetFile->setText(mainWindow->getLightStyleSheet());
            mainWindow->loadStyle(MainWindow::QGC_MAINWINDOW_STYLE_LIGHT, mainWindow->getLightStyleSheet());
    
            ui->styleSheetFile->setText(mainWindow->getDarkStyleSheet());
            mainWindow->loadStyle(MainWindow::QGC_MAINWINDOW_STYLE_DARK, mainWindow->getDarkStyleSheet());
    
        }
    }
    
    void QGCSettingsWidget::setDefaultStyle()
    {
        if (ui->styleChooser->currentIndex() == 1)
        {
    
            ui->styleSheetFile->setText(MainWindow::defaultLightStyle);
            mainWindow->loadStyle(MainWindow::QGC_MAINWINDOW_STYLE_LIGHT, MainWindow::defaultLightStyle);
    
            ui->styleSheetFile->setText(MainWindow::defaultDarkStyle);
            mainWindow->loadStyle(MainWindow::QGC_MAINWINDOW_STYLE_DARK, MainWindow::defaultDarkStyle);
    
    
    void QGCSettingsWidget::selectCustomMode(int mode)
    {
        MainWindow::instance()->setCustomMode(static_cast<enum MainWindow::CUSTOM_MODE>(ui->customModeComboBox->itemData(mode).toInt()));
        MainWindow::instance()->showInfoMessage(tr("Please restart QGroundControl"), tr("The optimization selection was changed. The application needs to be closed and restarted to put all optimizations into effect."));
    }