QGCSettingsWidget.cc 7.03 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/*=====================================================================
 
 QGroundControl Open Source Ground Control Station
 
 (c) 2009 - 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
 
 This file is part of the QGROUNDCONTROL project
 
 QGROUNDCONTROL is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.
 
 QGROUNDCONTROL is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
 
 ======================================================================*/

24
#include <QSettings>
25
#include <QDesktopWidget>
26

lm's avatar
lm committed
27
#include "QGCSettingsWidget.h"
28
#include "MainWindow.h"
lm's avatar
lm committed
29 30
#include "ui_QGCSettingsWidget.h"

31
#include "JoystickWidget.h"
32 33 34
#include "LinkManager.h"
#include "MAVLinkProtocol.h"
#include "MAVLinkSettingsWidget.h"
35
#include "GAudioOutput.h"
36
#include "QGCCore.h"
37

38 39 40 41
SettingsDialog::SettingsDialog(JoystickInput *joystick, QWidget *parent, Qt::WindowFlags flags) :
QDialog(parent, flags),
_mainWindow(MainWindow::instance()),
_ui(new Ui::SettingsDialog)
lm's avatar
lm committed
42
{
43 44
    _ui->setupUi(this);
    
45 46
    // Center the window on the screen.
    QRect position = frameGeometry();
47
    position.moveCenter(QApplication::desktop()->availableGeometry().center());
48
    move(position.topLeft());
49
    
50
    // Add the joystick settings pane
51 52
    _ui->tabWidget->addTab(new JoystickWidget(joystick, this), "Controllers");
    
53 54
    // Add all protocols
    QList<ProtocolInterface*> protocols = LinkManager::instance()->getProtocols();
55
    foreach (ProtocolInterface* protocol, protocols) {
56
        MAVLinkProtocol* mavlink = dynamic_cast<MAVLinkProtocol*>(protocol);
57
        if (mavlink) {
58
            MAVLinkSettingsWidget* msettings = new MAVLinkSettingsWidget(mavlink, this);
59
            _ui->tabWidget->addTab(msettings, "MAVLink");
60 61
        }
    }
62
    
63
    this->window()->setWindowTitle(tr("QGroundControl Settings"));
64
    
65
    // Audio preferences
66 67 68 69
    _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)));
    
70
    // Reconnect
71 72 73
    _ui->reconnectCheckBox->setChecked(_mainWindow->autoReconnectEnabled());
    connect(_ui->reconnectCheckBox, SIGNAL(clicked(bool)), _mainWindow, SLOT(enableAutoReconnect(bool)));
    
74
    // Low power mode
75 76 77
    _ui->lowPowerCheckBox->setChecked(_mainWindow->lowPowerModeEnabled());
    connect(_ui->lowPowerCheckBox, SIGNAL(clicked(bool)), _mainWindow, SLOT(enableLowPowerMode(bool)));
    
78
    // Dock widget title bars
79 80 81 82
    _ui->titleBarCheckBox->setChecked(_mainWindow->dockWidgetTitleBarsEnabled());
    connect(_ui->titleBarCheckBox,SIGNAL(clicked(bool)),_mainWindow,SLOT(enableDockWidgetTitleBars(bool)));
    
    connect(_ui->deleteSettings, &QAbstractButton::toggled, this, &SettingsDialog::_deleteSettingsToggled);
83
    
84
    // Custom mode
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
    
    _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->setCurrentIndex(_ui->customModeComboBox->findData(_mainWindow->getCustomMode()));
    connect(_ui->customModeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(selectCustomMode(int)));
    
    // Application color style
    MainWindow::QGC_MAINWINDOW_STYLE style = _mainWindow->getStyle();
    _ui->styleChooser->setCurrentIndex(style);
    
    _ui->savedFilesLocation->setText(qgcApp()->savedFilesLocation());
    _ui->promptFlightDataSave->setChecked(qgcApp()->promptFlightDataSave());
    
    // Connect signals
    connect(_ui->styleChooser, SIGNAL(currentIndexChanged(int)), this, SLOT(styleChanged(int)));
    connect(_ui->browseSavedFilesLocation, &QPushButton::clicked, this, &SettingsDialog::_selectSavedFilesDirectory);
    connect(_ui->buttonBox, &QDialogButtonBox::accepted, this, &SettingsDialog::_validateBeforeClose);
lm's avatar
lm committed
104 105
}

106
SettingsDialog::~SettingsDialog()
lm's avatar
lm committed
107
{
108
    delete _ui;
lm's avatar
lm committed
109
}
110

111
void SettingsDialog::styleChanged(int index)
112
{
113
    _mainWindow->loadStyle((index == 1) ? MainWindow::QGC_MAINWINDOW_STYLE_LIGHT : MainWindow::QGC_MAINWINDOW_STYLE_DARK);
114
}
115

116
void SettingsDialog::selectCustomMode(int mode)
117
{
118
    _mainWindow->setCustomMode(static_cast<enum MainWindow::CUSTOM_MODE>(_ui->customModeComboBox->itemData(mode).toInt()));
119
}
120

121
void SettingsDialog::_deleteSettingsToggled(bool checked)
122 123 124 125
{
    if (checked){
        QMessageBox::StandardButton answer = QMessageBox::question(this,
                                                                   tr("Delete Settings"),
126
                                                                   tr("All saved settings will be deleted the next time you start QGroundControl. Is this really what you want?"),
127 128 129
                                                                   QMessageBox::Yes | QMessageBox::No,
                                                                   QMessageBox::No);
        if (answer == QMessageBox::Yes) {
130
            qgcApp()->deleteAllSettingsNextBoot();
131
        } else {
132
            _ui->deleteSettings->setChecked(false);
133
        }
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
    } else {
        qgcApp()->clearDeleteAllSettingsNextBoot();
    }
}

/// @brief Validates the settings before closing
void SettingsDialog::_validateBeforeClose(void)
{
    QGCApplication* app = qgcApp();
    
    // Validate the saved file location
    
    QString saveLocation = _ui->savedFilesLocation->text();
    if (!app->validatePossibleSavedFilesLocation(saveLocation)) {
        QMessageBox::warning(_mainWindow,
                             tr("Bad save location"),
                             tr("The location to save files to is invalid, or cannot be written to. Please provide a valid directory."));
        return;
    }
    
    // Locations is valid, save
    app->setSavedFilesLocation(saveLocation);
    
    qgcApp()->setPromptFlightDataSave(_ui->promptFlightDataSave->checkState() == Qt::Checked);
    
    // Close dialog
    accept();
}

/// @brief Displays a directory picker dialog to allow the user to select a saved file location
void SettingsDialog::_selectSavedFilesDirectory(void)
{
    QString newLocation = QFileDialog::getExistingDirectory(this,
                                                            tr("Select the directory where you want to save files to."),
                                                            _ui->savedFilesLocation->text());
    if (!newLocation.isEmpty()) {
        _ui->savedFilesLocation->setText(newLocation);
171 172
    }
}