SettingsDialog.cc 8.17 KB
Newer Older
1
/*=====================================================================
2

3
 QGroundControl Open Source Ground Control Station
4

5
 (c) 2009 - 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
6

7
 This file is part of the QGROUNDCONTROL project
8

9 10 11 12
 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.
13

14 15 16 17
 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.
18

19 20
 You should have received a copy of the GNU General Public License
 along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
21

22 23
 ======================================================================*/

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

Don Gagne's avatar
Don Gagne committed
27
#include "SettingsDialog.h"
28
#include "MainWindow.h"
Don Gagne's avatar
Don Gagne committed
29
#include "ui_SettingsDialog.h"
lm's avatar
lm committed
30

31 32 33
#include "LinkManager.h"
#include "MAVLinkProtocol.h"
#include "MAVLinkSettingsWidget.h"
34
#include "QGCLinkConfiguration.h"
35
#include "GAudioOutput.h"
Don Gagne's avatar
Don Gagne committed
36
#include "QGCApplication.h"
Don Gagne's avatar
Don Gagne committed
37
#include "QGCFileDialog.h"
Don Gagne's avatar
Don Gagne committed
38
#include "QGCMessageBox.h"
39
#include "MainToolBar.h"
40
#include "FlightMapSettings.h"
41

dogmaphobic's avatar
dogmaphobic committed
42
SettingsDialog::SettingsDialog(QWidget *parent, int showTab, Qt::WindowFlags flags) :
43 44 45
QDialog(parent, flags),
_mainWindow(MainWindow::instance()),
_ui(new Ui::SettingsDialog)
lm's avatar
lm committed
46
{
47
    _ui->setupUi(this);
48

49 50
    // Center the window on the screen.
    QRect position = frameGeometry();
51
    position.moveCenter(QApplication::desktop()->availableGeometry().center());
52
    move(position.topLeft());
53 54 55 56 57 58 59 60 61

    QGCLinkConfiguration*  pLinkConf     = new QGCLinkConfiguration(this);
    MAVLinkSettingsWidget* pMavsettings  = new MAVLinkSettingsWidget(MAVLinkProtocol::instance(), this);

    // Add the link settings pane
    _ui->tabWidget->addTab(pLinkConf,     "Comm Links");
    // Add the MAVLink settings pane
    _ui->tabWidget->addTab(pMavsettings,  "MAVLink");

62
    this->window()->setWindowTitle(tr("QGroundControl Settings"));
63

64 65 66 67 68 69 70
    // Tool Bar Preferences
    QSettings settings;
    settings.beginGroup(TOOL_BAR_SETTINGS_GROUP);
    _ui->showBattery->setChecked(settings.value( TOOL_BAR_SHOW_BATTERY,  true).toBool());
    _ui->showGPS->setChecked(settings.value(     TOOL_BAR_SHOW_GPS,      true).toBool());
    _ui->showMav->setChecked(settings.value(     TOOL_BAR_SHOW_MAV,      true).toBool());
    _ui->showMessages->setChecked(settings.value(TOOL_BAR_SHOW_MESSAGES, true).toBool());
71
    _ui->showRSSI->setChecked(settings.value(   TOOL_BAR_SHOW_RSSI,      true).toBool());
72
    settings.endGroup();
73
    // Audio preferences
74 75 76
    _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)));
77

78
    // Reconnect
79 80
    _ui->reconnectCheckBox->setChecked(_mainWindow->autoReconnectEnabled());
    connect(_ui->reconnectCheckBox, SIGNAL(clicked(bool)), _mainWindow, SLOT(enableAutoReconnect(bool)));
81

82
    // Low power mode
83 84
    _ui->lowPowerCheckBox->setChecked(_mainWindow->lowPowerModeEnabled());
    connect(_ui->lowPowerCheckBox, SIGNAL(clicked(bool)), _mainWindow, SLOT(enableLowPowerMode(bool)));
85

86
    connect(_ui->deleteSettings, &QAbstractButton::toggled, this, &SettingsDialog::_deleteSettingsToggled);
87

88
    // Application color style
89
    _ui->styleChooser->setCurrentIndex(qgcApp()->styleIsDark() ? 0 : 1);
90

91 92
    _ui->savedFilesLocation->setText(qgcApp()->savedFilesLocation());
    _ui->promptFlightDataSave->setChecked(qgcApp()->promptFlightDataSave());
93

94 95 96 97
    // 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);
98 99 100 101 102 103 104 105 106 107 108 109
    
    // Flight Map settings
    
    FlightMapSettings* fmSettings = FlightMapSettings::instance();
    _ui->bingMapRadio->setChecked(fmSettings->mapProvider() == "Bing");
    _ui->googleMapRadio->setChecked(fmSettings->mapProvider() == "Google");
    _ui->openMapRadio->setChecked(fmSettings->mapProvider() == "Open");

    connect(_ui->bingMapRadio,      &QRadioButton::clicked, this, &SettingsDialog::_bingMapRadioClicked);
    connect(_ui->googleMapRadio,    &QRadioButton::clicked, this, &SettingsDialog::_googleMapRadioClicked);
    connect(_ui->openMapRadio,      &QRadioButton::clicked, this, &SettingsDialog::_openMapRadioClicked);
    
110 111 112 113 114 115 116 117
    switch (showTab) {
        case ShowCommLinks:
            _ui->tabWidget->setCurrentWidget(pLinkConf);
            break;
        case ShowMavlink:
            _ui->tabWidget->setCurrentWidget(pMavsettings);
            break;
    }
lm's avatar
lm committed
118 119
}

120
SettingsDialog::~SettingsDialog()
lm's avatar
lm committed
121
{
122
    delete _ui;
lm's avatar
lm committed
123
}
124

125
void SettingsDialog::styleChanged(int index)
126
{
127
    qgcApp()->setStyle(index == 0);
128
}
129

130
void SettingsDialog::_deleteSettingsToggled(bool checked)
131 132
{
    if (checked){
133 134 135 136 137
        QGCMessageBox::StandardButton answer =
            QGCMessageBox::question(tr("Delete Settings"),
                tr("All saved settings will be deleted the next time you start QGroundControl. Is this really what you want?"),
                QMessageBox::Yes | QMessageBox::No,
                QMessageBox::No);
138
        if (answer == QMessageBox::Yes) {
139
            qgcApp()->deleteAllSettingsNextBoot();
140
        } else {
141
            _ui->deleteSettings->setChecked(false);
142
        }
143 144 145 146 147 148 149 150 151 152 153 154
    } 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)) {
155 156 157
        QGCMessageBox::warning(
            tr("Invalid Save Location"),
            tr("The location to save files is invalid, or cannot be written to. Please provide a valid directory."));
158 159 160 161 162 163 164 165 166 167 168 169
        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)
{
170 171 172 173
    QString newLocation = QGCFileDialog::getExistingDirectory(
        this,
        tr("Select the directory where you want to save files to."),
        _ui->savedFilesLocation->text());
174 175
    if (!newLocation.isEmpty()) {
        _ui->savedFilesLocation->setText(newLocation);
176
    }
177 178 179 180 181 182 183 184 185

    // TODO:
    // Once a directory is selected, we need to display the various subdirectories used underneath:
    // * Flight data logs
    // * Parameters
}

void SettingsDialog::on_showGPS_clicked(bool checked)
{
186
    _mainWindow->getMainToolBar()->viewStateChanged(TOOL_BAR_SHOW_GPS, checked);
187 188 189 190
}

void SettingsDialog::on_showBattery_clicked(bool checked)
{
191
    _mainWindow->getMainToolBar()->viewStateChanged(TOOL_BAR_SHOW_BATTERY, checked);
192 193 194 195
}

void SettingsDialog::on_showMessages_clicked(bool checked)
{
196
    _mainWindow->getMainToolBar()->viewStateChanged(TOOL_BAR_SHOW_MESSAGES, checked);
197 198 199 200
}

void SettingsDialog::on_showMav_clicked(bool checked)
{
201
    _mainWindow->getMainToolBar()->viewStateChanged(TOOL_BAR_SHOW_MAV, checked);
202
}
203 204 205 206 207

void SettingsDialog::on_showRSSI_clicked(bool checked)
{
    _mainWindow->getMainToolBar()->viewStateChanged(TOOL_BAR_SHOW_RSSI, checked);
}
208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228

void SettingsDialog::_bingMapRadioClicked(bool checked)
{
    if (checked) {
        FlightMapSettings::instance()->setMapProvider("Bing");
    }
}

void SettingsDialog::_googleMapRadioClicked(bool checked)
{
    if (checked) {
        FlightMapSettings::instance()->setMapProvider("Google");
    }
}

void SettingsDialog::_openMapRadioClicked(bool checked)
{
    if (checked) {
        FlightMapSettings::instance()->setMapProvider("Open");
    }
}