]> git.mxchange.org Git - flightgear.git/blob - src/GUI/PathsDialog.cxx
9282de1e07c275670af0c35d31cda34ae351f26e
[flightgear.git] / src / GUI / PathsDialog.cxx
1 #include "PathsDialog.hxx"
2 #include "ui_PathsDialog.h"
3
4 #include <QSettings>
5 #include <QFileDialog>
6 #include <QMessageBox>
7
8 #include "CatalogListModel.hxx"
9 #include "AddCatalogDialog.hxx"
10
11 #include <Main/options.hxx>
12 #include <Main/globals.hxx>
13 #include <Network/HTTPClient.hxx>
14
15 PathsDialog::PathsDialog(QWidget *parent, simgear::pkg::RootRef root) :
16     QDialog(parent),
17     m_ui(new Ui::PathsDialog),
18     m_packageRoot(root)
19 {
20     m_ui->setupUi(this);
21     
22     m_catalogsModel = new CatalogListModel(this, m_packageRoot);
23     m_ui->catalogsList->setModel(m_catalogsModel);
24
25     connect(m_ui->addCatalog, &QToolButton::clicked,
26             this, &PathsDialog::onAddCatalog);
27     connect(m_ui->addDefaultCatalogButton, &QPushButton::clicked,
28             this, &PathsDialog::onAddDefaultCatalog);
29     connect(m_ui->removeCatalog, &QToolButton::clicked,
30             this, &PathsDialog::onRemoveCatalog);
31             
32     connect(m_ui->addSceneryPath, &QToolButton::clicked,
33             this, &PathsDialog::onAddSceneryPath);
34     connect(m_ui->removeSceneryPath, &QToolButton::clicked,
35             this, &PathsDialog::onRemoveSceneryPath);
36
37     connect(m_ui->addAircraftPath, &QToolButton::clicked,
38             this, &PathsDialog::onAddAircraftPath);
39     connect(m_ui->removeAircraftPath, &QToolButton::clicked,
40             this, &PathsDialog::onRemoveAircraftPath);
41
42     connect(m_ui->changeDownloadDir, &QPushButton::clicked,
43             this, &PathsDialog::onChangeDownloadDir);
44
45     connect(m_ui->clearDownloadDir, &QPushButton::clicked,
46             this, &PathsDialog::onClearDownloadDir);
47
48     QSettings settings;
49             
50     QStringList sceneryPaths = settings.value("scenery-paths").toStringList();
51     m_ui->sceneryPathsList->addItems(sceneryPaths);
52
53     QStringList aircraftPaths = settings.value("aircraft-paths").toStringList();
54     m_ui->aircraftPathsList->addItems(aircraftPaths);
55
56     QVariant downloadDir = settings.value("download-dir");
57     if (downloadDir.isValid()) {
58         m_downloadDir = downloadDir.toString();
59     }
60
61     updateUi();
62 }
63
64 PathsDialog::~PathsDialog()
65 {
66     delete m_ui;
67 }
68
69 void PathsDialog::accept()
70 {
71     QSettings settings;
72     QStringList paths;
73     for (int i=0; i<m_ui->sceneryPathsList->count(); ++i) {
74         paths.append(m_ui->sceneryPathsList->item(i)->text());
75     }
76
77     settings.setValue("scenery-paths", paths);
78     paths.clear();
79
80     for (int i=0; i<m_ui->aircraftPathsList->count(); ++i) {
81         paths.append(m_ui->aircraftPathsList->item(i)->text());
82     }
83
84     settings.setValue("aircraft-paths", paths);
85
86     if (m_downloadDir.isEmpty()) {
87         settings.remove("download-dir");
88     } else {
89         settings.setValue("download-dir", m_downloadDir);
90     }
91     
92     QDialog::accept();
93 }
94
95 void PathsDialog::onAddSceneryPath()
96 {
97     QString path = QFileDialog::getExistingDirectory(this, tr("Choose scenery folder"));
98     if (!path.isEmpty()) {
99         m_ui->sceneryPathsList->addItem(path);
100     }
101 }
102
103 void PathsDialog::onRemoveSceneryPath()
104 {
105     if (m_ui->sceneryPathsList->currentItem()) {
106         delete m_ui->sceneryPathsList->currentItem();
107     }
108 }
109
110 void PathsDialog::onAddAircraftPath()
111 {
112     QString path = QFileDialog::getExistingDirectory(this, tr("Choose aircraft folder"));
113     if (!path.isEmpty()) {
114         m_ui->aircraftPathsList->addItem(path);
115     }
116 }
117
118 void PathsDialog::onRemoveAircraftPath()
119 {
120     if (m_ui->aircraftPathsList->currentItem()) {
121         delete m_ui->aircraftPathsList->currentItem();
122     }
123 }
124
125 void PathsDialog::onAddCatalog()
126 {
127     QScopedPointer<AddCatalogDialog> dlg(new AddCatalogDialog(this, m_packageRoot));
128     dlg->exec();
129     if (dlg->result() == QDialog::Accepted) {
130         m_catalogsModel->refresh();
131     }
132 }
133
134 void PathsDialog::onAddDefaultCatalog()
135 {
136     // check it's not a duplicate somehow
137     FGHTTPClient* http = static_cast<FGHTTPClient*>(globals->get_subsystem("http"));
138     if (http->isDefaultCatalogInstalled())
139         return;
140
141      QScopedPointer<AddCatalogDialog> dlg(new AddCatalogDialog(this, m_packageRoot));
142      QUrl url(QString::fromStdString(http->getDefaultCatalogUrl()));
143      dlg->setUrlAndDownload(url);
144      dlg->exec();
145      if (dlg->result() == QDialog::Accepted) {
146          m_catalogsModel->refresh();
147          updateUi();
148      }
149 }
150
151 void PathsDialog::onRemoveCatalog()
152 {
153     QModelIndex mi = m_ui->catalogsList->currentIndex();
154     FGHTTPClient* http = static_cast<FGHTTPClient*>(globals->get_subsystem("http"));
155
156     if (mi.isValid()) {
157         QString s = QStringLiteral("Remove aircraft hangar '%1'? All installed aircraft from this "
158                                    "hangar will be removed.");
159         QString pkgId = mi.data(CatalogIdRole).toString();
160
161         if (pkgId.toStdString() == http->getDefaultCatalogId()) {
162             s = QStringLiteral("Remove default aircraft hangar? "
163                                "This hangar contains all the default aircraft included with FlightGear. "
164                                "If you change your mind in the future, click the 'restore' button.");
165         } else {
166             s = s.arg(mi.data(Qt::DisplayRole).toString());
167         }
168
169         QMessageBox mb;
170         mb.setText(s);
171         mb.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
172         mb.setDefaultButton(QMessageBox::No);
173         mb.exec();
174         
175         if (mb.result() == QMessageBox::Yes) {
176             m_packageRoot->removeCatalogById(pkgId.toStdString());
177         }
178     }
179
180     updateUi();
181 }
182
183 void PathsDialog::onChangeDownloadDir()
184 {
185     QString path = QFileDialog::getExistingDirectory(this,
186                                                      tr("Choose downloads folder"),
187                                                      m_downloadDir);
188     if (!path.isEmpty()) {
189         m_downloadDir = path;
190         updateUi();
191     }
192 }
193
194 void PathsDialog::onClearDownloadDir()
195 {
196     // does this need an 'are you sure'?
197     m_downloadDir.clear();
198     updateUi();
199 }
200
201 void PathsDialog::updateUi()
202 {
203     QString s = m_downloadDir;
204     if (s.isEmpty()) {
205         s = QString::fromStdString(flightgear::defaultDownloadDir());
206         s.append(tr(" (default)"));
207         m_ui->clearDownloadDir->setEnabled(false);
208     } else {
209         m_ui->clearDownloadDir->setEnabled(true);
210     }
211
212     QString m = tr("Download location: %1").arg(s);
213     m_ui->downloadLocation->setText(m);
214
215     FGHTTPClient* http = static_cast<FGHTTPClient*>(globals->get_subsystem("http"));
216     m_ui->addDefaultCatalogButton->setEnabled(!http->isDefaultCatalogInstalled());
217 }