blob: 8006156c2e7de63a27a2b108c6c00f3c8daa8191 [file] [log] [blame]
Edric Milaret627500d2015-03-27 16:41:40 -04001/***************************************************************************
Edric Milaretbab169d2016-01-07 15:13:33 -05002 * Copyright (C) 2015-2016 by Savoir-faire Linux *
Edric Milaret627500d2015-03-27 16:41:40 -04003 * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>*
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 3 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
17 **************************************************************************/
18
19#include "configurationwidget.h"
20#include "ui_configurationwidget.h"
21
Edric Milaret1eece872015-06-10 13:37:51 -040022#include <QMessageBox>
Edric Milaretfd5a1f22016-02-05 15:30:00 -050023#include <QDir>
24#include <QStandardPaths>
25#include <QFileDialog>
Nicolas Jager74fe46f2016-02-29 14:55:09 -050026#include <QPropertyAnimation>
Edric Milaret1eece872015-06-10 13:37:51 -040027
Edric Milaret627500d2015-03-27 16:41:40 -040028#include "video/devicemodel.h"
29#include "video/channel.h"
30#include "video/resolution.h"
31#include "video/rate.h"
Edric Milaret4bba46d2015-04-29 16:33:38 -040032#include "video/previewmanager.h"
Edric Milaret627500d2015-03-27 16:41:40 -040033
Edric Milaret47c40eb2016-03-14 15:06:22 -040034#include "audio/settings.h"
35#include "audio/outputdevicemodel.h"
36#include "audio/inputdevicemodel.h"
37
Edric Milaretfd5a1f22016-02-05 15:30:00 -050038#include "media/recordingmodel.h"
39
Edric Milaret3e6aefe2015-06-05 16:07:26 -040040#include "accountserializationadapter.h"
Edric Milaretb25af972015-06-17 16:55:45 -040041#include "accountstatedelegate.h"
42#include "settingskey.h"
Edric Milaret79d3f682015-12-09 12:32:52 -050043#include "utils.h"
Edric Milaret3e6aefe2015-06-05 16:07:26 -040044
Edric Milaret627500d2015-03-27 16:41:40 -040045#include "accountmodel.h"
46#include "protocolmodel.h"
47#include "accountdetails.h"
Edric Milaret3aeae3a2015-06-01 17:31:54 -040048#include "callmodel.h"
Edric Milaret1eece872015-06-10 13:37:51 -040049#include "ringtonemodel.h"
50#include "categorizedhistorymodel.h"
Edric Milaret627500d2015-03-27 16:41:40 -040051
Edric Milaret79d3f682015-12-09 12:32:52 -050052#ifdef ENABLE_AUTOUPDATE
53#include "winsparkle.h"
54#endif
Edric Milaret627500d2015-03-27 16:41:40 -040055
56ConfigurationWidget::ConfigurationWidget(QWidget *parent) :
Nicolas Jager74fe46f2016-02-29 14:55:09 -050057 NavWidget(parent),
Edric Milaret627500d2015-03-27 16:41:40 -040058 ui(new Ui::ConfigurationWidget),
Edric Milareta3e47282015-10-23 15:20:30 -040059 accountModel_(&AccountModel::instance()),
60 deviceModel_(&Video::DeviceModel::instance()),
Edric Milaret627500d2015-03-27 16:41:40 -040061 accountDetails_(new AccountDetails())
62{
63 ui->setupUi(this);
64
Nicolas Jager74fe46f2016-02-29 14:55:09 -050065 connect(ui->exitSettingsButton, &QPushButton::clicked, this, [=]() {
66 if (CallModel::instance().getActiveCalls().size() == 0
67 && Video::PreviewManager::instance().isPreviewing()) {
68 Video::PreviewManager::instance().stopPreview();
69 }
70 accountModel_->save();
71 accountDetails_->save();
72 });
73
74 connect(accountDetails_->getDeleteAccountButton(), &QPushButton::clicked, this, [=]() {
75 auto account = accountModel_->getAccountByModelIndex(
76 ui->accountView->currentIndex());
77 if (account != accountModel_->ip2ip())
78 accountModel_->remove(account);
79 });
80
81 connect(ui->exitSettingsButton, &QPushButton::clicked, this, [=]() {
82 emit NavigationRequested(ScreenEnum::CallScreen);
83 });
84
Edric Milaret627500d2015-03-27 16:41:40 -040085 ui->accountView->setModel(accountModel_);
Edric Milaret01f23842015-06-22 14:46:01 -040086 accountStateDelegate_ = new AccountStateDelegate();
87 ui->accountView->setItemDelegate(accountStateDelegate_);
Edric Milaret627500d2015-03-27 16:41:40 -040088
Edric Milaret627500d2015-03-27 16:41:40 -040089 isLoading_ = true;
90 ui->deviceBox->setModel(deviceModel_);
Edric Milaret94b4aab2015-05-08 12:10:44 -040091 connect(deviceModel_, SIGNAL(currentIndexChanged(int)),
92 this, SLOT(deviceIndexChanged(int)));
Edric Milaret627500d2015-03-27 16:41:40 -040093
94 connect(ui->accountView->selectionModel(),
Edric Milaret3aeae3a2015-06-01 17:31:54 -040095 SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
96 this, SLOT(accountSelected(QItemSelection)));
Edric Milaret627500d2015-03-27 16:41:40 -040097
98 ui->accountView->setCurrentIndex(accountModel_->index(0));
99 ui->accountDetailLayout->addWidget(accountDetails_);
Edric Milaret627500d2015-03-27 16:41:40 -0400100 ui->accountTypeBox->setModel(accountModel_->protocolModel());
Edric Milaret4bba46d2015-04-29 16:33:38 -0400101 ui->startupBox->setChecked(Utils::CheckStartupLink());
Edric Milaret1eece872015-06-10 13:37:51 -0400102
Edric Milaretb25af972015-06-17 16:55:45 -0400103 ui->historyDaySettingsSpinBox->setValue(
Edric Milareta3e47282015-10-23 15:20:30 -0400104 CategorizedHistoryModel::instance().historyLimit());
Edric Milaretb25af972015-06-17 16:55:45 -0400105 ui->closeOrMinCheckBox->setChecked(settings_.value(
106 SettingsKey::closeOrMinimized).toBool());
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500107 connect(ui->stackedWidget, &QStackedWidget::currentChanged, [](int index) {
Edric Milaretfb5fc5c2015-09-24 14:32:49 -0400108 if (index == 1
Edric Milareta3e47282015-10-23 15:20:30 -0400109 && CallModel::instance().getActiveCalls().size() == 0) {
110 Video::PreviewManager::instance().startPreview();
Edric Milaretfb5fc5c2015-09-24 14:32:49 -0400111 } else {
Edric Milareta3e47282015-10-23 15:20:30 -0400112 if (CallModel::instance().getActiveCalls().size() == 0
113 && Video::PreviewManager::instance().isPreviewing()) {
114 Video::PreviewManager::instance().stopPreview();
Edric Milaretfb5fc5c2015-09-24 14:32:49 -0400115 }
116 }
117 });
Edric Milaret0b7fe5d2016-01-27 11:12:43 -0500118
119 ui->videoView->setIsFullPreview(true);
Edric Milaretfd5a1f22016-02-05 15:30:00 -0500120
121 auto recordPath = Media::RecordingModel::instance().recordPath();
122 if (recordPath.isEmpty()) {
123 recordPath = QDir::toNativeSeparators(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation));
124 Media::RecordingModel::instance().setRecordPath(recordPath);
125 }
126 ui->recordPath->setText(Media::RecordingModel::instance().recordPath());
127
128 ui->alwaysRecordCheckBox->setChecked(Media::RecordingModel::instance().isAlwaysRecording());
129 connect(ui->alwaysRecordCheckBox, &QCheckBox::clicked, [](bool checked){
130 Media::RecordingModel::instance().setAlwaysRecording(checked);
131 });
132
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500133 connect(ui->generalTabButton, &QPushButton::toggled, [=] (bool toggled) {
134 if (toggled) {
135 ui->stackedWidget->setCurrentWidget(ui->generalPage);
136 ui->videoTabButton->setChecked(false);
137 ui->accountTabButton->setChecked(false);
138 }
139 });
140
141 connect(ui->videoTabButton, &QPushButton::toggled, [=] (bool toggled) {
142 if (toggled) {
143 ui->stackedWidget->setCurrentWidget(ui->videoPage);
144 ui->accountTabButton->setChecked(false);
145 ui->generalTabButton->setChecked(false);
146 }
147 });
148
149 connect(ui->accountTabButton, &QPushButton::toggled, [=] (bool toggled) {
150 if (toggled) {
151 ui->stackedWidget->setCurrentWidget(ui->accountPage);
152 ui->videoTabButton->setChecked(false);
153 ui->generalTabButton->setChecked(false);
154 }
155 });
156
157 ui->generalTabButton->setChecked(true);
158
Edric Milaret47c40eb2016-03-14 15:06:22 -0400159 auto inputModel = Audio::Settings::instance().inputDeviceModel();
160 auto outputModel = Audio::Settings::instance().outputDeviceModel();
161
162 ui->outputComboBox->setModel(outputModel);
163 ui->inputComboBox->setModel(inputModel);
164 ui->outputComboBox->setCurrentIndex(outputModel->selectionModel()->currentIndex().row());
165 ui->inputComboBox->setCurrentIndex(inputModel->selectionModel()->currentIndex().row());
166 connect(ui->outputComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(outputIndexChanged(int)));
167 connect(ui->inputComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(inputIndexChanged(int)));
168
169
Edric Milaret79d3f682015-12-09 12:32:52 -0500170#ifndef ENABLE_AUTOUPDATE
171 ui->checkUpdateButton->hide();
172 ui->intervalUpdateCheckSpinBox->hide();
173 ui->updateDayLabel->hide();
174 ui->autoUpdateCheckBox->hide();
175#endif
Edric Milaret627500d2015-03-27 16:41:40 -0400176}
177
Edric Milaretef9b85b2016-02-05 11:47:10 -0500178void ConfigurationWidget::showPreview()
179{
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500180 if (ui->stackedWidget->currentIndex() == 1
Edric Milaretef9b85b2016-02-05 11:47:10 -0500181 && CallModel::instance().getActiveCalls().size() == 0) {
182 ui->previewUnavailable->hide();
183 ui->videoView->show();
184 Video::PreviewManager::instance().startPreview();
185 } else {
186 ui->previewUnavailable->show();
187 ui->videoView->hide();
188 }
189}
190
Edric Milaretfb5fc5c2015-09-24 14:32:49 -0400191void
192ConfigurationWidget::showEvent(QShowEvent *event) {
Edric Milaret79d3f682015-12-09 12:32:52 -0500193
194#ifdef ENABLE_AUTOUPDATE
195 if (win_sparkle_get_automatic_check_for_updates()) {
196 ui->autoUpdateCheckBox->setChecked(true);
197 }
198 ui->intervalUpdateCheckSpinBox->setValue(win_sparkle_get_update_check_interval() / 86400);
199#endif
Edric Milaretfb5fc5c2015-09-24 14:32:49 -0400200 QWidget::showEvent(event);
Edric Milaretef9b85b2016-02-05 11:47:10 -0500201 showPreview();
Edric Milaretfb5fc5c2015-09-24 14:32:49 -0400202}
203
Edric Milaret627500d2015-03-27 16:41:40 -0400204ConfigurationWidget::~ConfigurationWidget()
205{
206 delete ui;
Edric Milaret01f23842015-06-22 14:46:01 -0400207 delete accountStateDelegate_;
Edric Milaret627500d2015-03-27 16:41:40 -0400208}
209
210void
Edric Milaret94b4aab2015-05-08 12:10:44 -0400211ConfigurationWidget::deviceIndexChanged(int index) {
212 ui->deviceBox->setCurrentIndex(index);
213}
214
215void
Edric Milaret627500d2015-03-27 16:41:40 -0400216ConfigurationWidget::on_deviceBox_currentIndexChanged(int index)
217{
218 if (index < 0)
219 return;
220
221 if (!isLoading_)
222 deviceModel_->setActive(index);
223
224 auto device = deviceModel_->activeDevice();
225
226 ui->sizeBox->clear();
227
228 isLoading_ = true;
229 if (device->channelList().size() > 0) {
230 for (auto resolution : device->channelList()[0]->validResolutions()) {
231 ui->sizeBox->addItem(resolution->name());
232 }
233 }
234 ui->sizeBox->setCurrentIndex(
235 device->channelList()[0]->activeResolution()->relativeIndex());
236 isLoading_ = false;
237}
238
239void
240ConfigurationWidget::on_sizeBox_currentIndexChanged(int index)
241{
242 auto device = deviceModel_->activeDevice();
243
Edric Milaret627500d2015-03-27 16:41:40 -0400244 if (index < 0)
245 return;
246 if (!isLoading_)
247 device->channelList()[0]->setActiveResolution(
248 device->channelList()[0]->validResolutions()[index]);
Edric Milaret627500d2015-03-27 16:41:40 -0400249}
250
251void
252ConfigurationWidget::accountSelected(QItemSelection itemSel) {
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400253
Edric Milaret627500d2015-03-27 16:41:40 -0400254 Q_UNUSED(itemSel)
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400255 auto account = accountModel_->getAccountByModelIndex(
256 ui->accountView->currentIndex());
257 accountDetails_->setAccount(account);
258 AccountSerializationAdapter adapter(account, accountDetails_);
Edric Milaret627500d2015-03-27 16:41:40 -0400259}
260
261void
Edric Milaret627500d2015-03-27 16:41:40 -0400262ConfigurationWidget::on_addAccountButton_clicked()
263{
Edric Milaret53ac6e52015-09-14 13:37:06 -0400264 auto account = accountModel_->add(tr("New Account"),
Edric Milaret3aeae3a2015-06-01 17:31:54 -0400265 ui->accountTypeBox->model()->index(
266 ui->accountTypeBox->currentIndex(), 0));
Edric Milaret031c3052015-04-29 18:14:18 -0400267 account->setRingtonePath(Utils::GetRingtonePath());
Edric Milaret627500d2015-03-27 16:41:40 -0400268 accountModel_->save();
269}
Edric Milaret4bba46d2015-04-29 16:33:38 -0400270
Edric Milaret3aeae3a2015-06-01 17:31:54 -0400271void
272ConfigurationWidget::on_startupBox_toggled(bool checked)
Edric Milaret4bba46d2015-04-29 16:33:38 -0400273{
274 if (checked)
275 Utils::CreateStartupLink();
276 else
277 Utils::DeleteStartupLink();
278}
Edric Milaret3aeae3a2015-06-01 17:31:54 -0400279
280void
Edric Milaret1eece872015-06-10 13:37:51 -0400281ConfigurationWidget::on_clearHistoryButton_clicked()
282{
283 QMessageBox confirmationDialog;
284
Edric Milaret53ac6e52015-09-14 13:37:06 -0400285 confirmationDialog.setText(tr("Are you sure you want to clear all your history?"));
Edric Milaret1eece872015-06-10 13:37:51 -0400286 confirmationDialog.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
287 auto ret = confirmationDialog.exec();
288
289 if (ret == QMessageBox::Ok)
Edric Milareta3e47282015-10-23 15:20:30 -0400290 CategorizedHistoryModel::instance().clearAllCollections();
Edric Milaret1eece872015-06-10 13:37:51 -0400291}
292
293void
294ConfigurationWidget::on_historyDaySettingsSpinBox_valueChanged(int limit)
295{
Edric Milareta3e47282015-10-23 15:20:30 -0400296 if (CategorizedHistoryModel::instance().historyLimit() != limit)
297 CategorizedHistoryModel::instance().setHistoryLimit(limit);
Edric Milaret1eece872015-06-10 13:37:51 -0400298}
Edric Milaretb25af972015-06-17 16:55:45 -0400299
300void
301ConfigurationWidget::on_closeOrMinCheckBox_toggled(bool checked)
302{
303 settings_.setValue(SettingsKey::closeOrMinimized, checked);
304}
Edric Milaret79d3f682015-12-09 12:32:52 -0500305
306void
307ConfigurationWidget::on_checkUpdateButton_clicked()
308{
309#ifdef ENABLE_AUTOUPDATE
310 win_sparkle_check_update_with_ui();
311#endif
312}
313
314void
315ConfigurationWidget::on_autoUpdateCheckBox_toggled(bool checked)
316{
317#ifdef ENABLE_AUTOUPDATE
318 win_sparkle_set_automatic_check_for_updates(checked);
319#endif
320}
321
322void
323ConfigurationWidget::on_intervalUpdateCheckSpinBox_valueChanged(int arg1)
324{
325#ifdef ENABLE_AUTOUPDATE
326 win_sparkle_set_update_check_interval(arg1 * 86400);
327#endif
328}
Edric Milaretef9b85b2016-02-05 11:47:10 -0500329
330void
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500331ConfigurationWidget::on_stackedWidget_currentChanged(int index)
Edric Milaretef9b85b2016-02-05 11:47:10 -0500332{
333 Q_UNUSED(index)
334 showPreview();
335}
Edric Milaretfd5a1f22016-02-05 15:30:00 -0500336
337void
338ConfigurationWidget::on_recordPath_clicked()
339{
340 QString dir = QFileDialog::getExistingDirectory(this, tr("Choose Directory"),
341 Media::RecordingModel::instance().recordPath(),
342 QFileDialog::ShowDirsOnly
343 | QFileDialog::DontResolveSymlinks);
344 if (not dir.isEmpty()) {
345 Media::RecordingModel::instance().setRecordPath(dir);
346 ui->recordPath->setText(dir);
347 }
348}
Edric Milaret47c40eb2016-03-14 15:06:22 -0400349
350void
351ConfigurationWidget::outputIndexChanged(int index)
352{
353 auto outputModel = Audio::Settings::instance().outputDeviceModel();
354 outputModel->selectionModel()->setCurrentIndex(outputModel->index(index), QItemSelectionModel::ClearAndSelect);
355}
356
357void
358ConfigurationWidget::inputIndexChanged(int index)
359{
360 auto inputModel = Audio::Settings::instance().inputDeviceModel();
361 inputModel->selectionModel()->setCurrentIndex(inputModel->index(index), QItemSelectionModel::ClearAndSelect);
362}