QGCSettingsWidget.cc 7.06 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"
Don Gagne's avatar
Don Gagne committed
37
#include "QGCFileDialog.h"
38

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

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

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

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

122
void SettingsDialog::_deleteSettingsToggled(bool checked)
123 124 125 126
{
    if (checked){
        QMessageBox::StandardButton answer = QMessageBox::question(this,
                                                                   tr("Delete Settings"),
127
                                                                   tr("All saved settings will be deleted the next time you start QGroundControl. Is this really what you want?"),
128 129 130
                                                                   QMessageBox::Yes | QMessageBox::No,
                                                                   QMessageBox::No);
        if (answer == QMessageBox::Yes) {
131
            qgcApp()->deleteAllSettingsNextBoot();
132
        } else {
133
            _ui->deleteSettings->setChecked(false);
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
    } 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)
{
Don Gagne's avatar
Don Gagne committed
167
    QString newLocation = QGCFileDialog::getExistingDirectory(this,
168 169 170 171
                                                            tr("Select the directory where you want to save files to."),
                                                            _ui->savedFilesLocation->text());
    if (!newLocation.isEmpty()) {
        _ui->savedFilesLocation->setText(newLocation);
172 173
    }
}