blob: b890d07af871860c7508bbc5f3648b0393b58bf7 [file] [log] [blame]
Edric Milaret627500d2015-03-27 16:41:40 -04001/***************************************************************************
Anthony Léonard2fde81d2017-04-17 10:06:55 -04002 * Copyright (C) 2015-2017 by Savoir-faire Linux *
Edric Milaret627500d2015-03-27 16:41:40 -04003 * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>*
Olivier SOLDANO47aa97f2017-04-04 10:40:00 -04004 * Author: Anthony Léonard <anthony.leonard@savoirfairelinux.com> *
5 * Author: Olivier Soldano <olivier.soldano@savoirfairelinux.com> *
Edric Milaret627500d2015-03-27 16:41:40 -04006 * *
7 * This program is free software; you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation; either version 3 of the License, or *
10 * (at your option) any later version. *
11 * *
12 * This program is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
16 * *
17 * You should have received a copy of the GNU General Public License *
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
19 **************************************************************************/
20
21#include "configurationwidget.h"
22#include "ui_configurationwidget.h"
23
Edric Milaret1eece872015-06-10 13:37:51 -040024#include <QMessageBox>
Edric Milaretfd5a1f22016-02-05 15:30:00 -050025#include <QDir>
26#include <QStandardPaths>
27#include <QFileDialog>
Nicolas Jager74fe46f2016-02-29 14:55:09 -050028#include <QPropertyAnimation>
Edric Milaretce0ea472016-04-12 10:16:56 -040029#include <QtConcurrent/QtConcurrent>
Edric Milaret1eece872015-06-10 13:37:51 -040030
Edric Milaret627500d2015-03-27 16:41:40 -040031#include "video/devicemodel.h"
32#include "video/channel.h"
33#include "video/resolution.h"
34#include "video/rate.h"
Edric Milaret4bba46d2015-04-29 16:33:38 -040035#include "video/previewmanager.h"
Edric Milaret627500d2015-03-27 16:41:40 -040036
Edric Milaret47c40eb2016-03-14 15:06:22 -040037#include "audio/settings.h"
38#include "audio/outputdevicemodel.h"
39#include "audio/inputdevicemodel.h"
40
Edric Milaretfd5a1f22016-02-05 15:30:00 -050041#include "media/recordingmodel.h"
42
Edric Milaret3e6aefe2015-06-05 16:07:26 -040043#include "accountserializationadapter.h"
Edric Milaretb25af972015-06-17 16:55:45 -040044#include "accountstatedelegate.h"
45#include "settingskey.h"
Edric Milaret79d3f682015-12-09 12:32:52 -050046#include "utils.h"
Edric Milaretce0ea472016-04-12 10:16:56 -040047#include "pathpassworddialog.h"
Edric Milaret25236d92016-03-28 09:40:58 -040048#include "photoboothdialog.h"
Edric Milaret57467842016-08-30 13:06:11 -040049#include "wizarddialog.h"
Edric Milaret3e6aefe2015-06-05 16:07:26 -040050
Edric Milaret627500d2015-03-27 16:41:40 -040051#include "accountmodel.h"
52#include "protocolmodel.h"
53#include "accountdetails.h"
Edric Milaret3aeae3a2015-06-01 17:31:54 -040054#include "callmodel.h"
Edric Milaret1eece872015-06-10 13:37:51 -040055#include "ringtonemodel.h"
56#include "categorizedhistorymodel.h"
Edric Milaret25236d92016-03-28 09:40:58 -040057#include "profilemodel.h"
58#include "profile.h"
59#include "person.h"
Edric Milaret627500d2015-03-27 16:41:40 -040060
Edric Milaret79d3f682015-12-09 12:32:52 -050061#include "winsparkle.h"
Edric Milaret627500d2015-03-27 16:41:40 -040062
Olivier SOLDANO9b7e80d2017-05-04 16:06:01 -040063#include "deleteaccountdialog.h"
64
Edric Milaret627500d2015-03-27 16:41:40 -040065ConfigurationWidget::ConfigurationWidget(QWidget *parent) :
Nicolas Jager74fe46f2016-02-29 14:55:09 -050066 NavWidget(parent),
Edric Milaret627500d2015-03-27 16:41:40 -040067 ui(new Ui::ConfigurationWidget),
Edric Milareta3e47282015-10-23 15:20:30 -040068 accountModel_(&AccountModel::instance()),
69 deviceModel_(&Video::DeviceModel::instance()),
Edric Milaret627500d2015-03-27 16:41:40 -040070 accountDetails_(new AccountDetails())
71{
72 ui->setupUi(this);
73
Nicolas Jager74fe46f2016-02-29 14:55:09 -050074 connect(ui->exitSettingsButton, &QPushButton::clicked, this, [=]() {
75 if (CallModel::instance().getActiveCalls().size() == 0
76 && Video::PreviewManager::instance().isPreviewing()) {
77 Video::PreviewManager::instance().stopPreview();
78 }
79 accountModel_->save();
80 accountDetails_->save();
81 });
82
Nicolas Jager74fe46f2016-02-29 14:55:09 -050083 connect(ui->exitSettingsButton, &QPushButton::clicked, this, [=]() {
84 emit NavigationRequested(ScreenEnum::CallScreen);
85 });
86
Edric Milaret627500d2015-03-27 16:41:40 -040087 ui->accountView->setModel(accountModel_);
Edric Milaret01f23842015-06-22 14:46:01 -040088 accountStateDelegate_ = new AccountStateDelegate();
89 ui->accountView->setItemDelegate(accountStateDelegate_);
Edric Milaret627500d2015-03-27 16:41:40 -040090
Olivier SOLDANO9b7e80d2017-05-04 16:06:01 -040091 // connect delete button to popup trigger
92 connect(ui->deleteAccountBtn, &QPushButton::clicked, [=](){
93 auto idx = ui->accountView->currentIndex();
94 DeleteAccountDialog dialog(idx);
95 dialog.exec();
96 });
97
Edric Milaret627500d2015-03-27 16:41:40 -040098 isLoading_ = true;
99 ui->deviceBox->setModel(deviceModel_);
Edric Milaret94b4aab2015-05-08 12:10:44 -0400100 connect(deviceModel_, SIGNAL(currentIndexChanged(int)),
101 this, SLOT(deviceIndexChanged(int)));
Edric Milaret627500d2015-03-27 16:41:40 -0400102
Olivier SOLDANO957911a2017-05-25 11:52:43 -0400103 if (ui->deviceBox->count() > 0){
104 ui->deviceBox->setCurrentIndex(0);
105 }
106
107 // accounts
Edric Milaretf8048cf2016-05-13 10:21:08 -0400108 AccountModel::instance().selectionModel()->clear();
Edric Milaretce0ea472016-04-12 10:16:56 -0400109 ui->accountView->setSelectionModel(AccountModel::instance().selectionModel());
Edric Milaret627500d2015-03-27 16:41:40 -0400110 connect(ui->accountView->selectionModel(),
Edric Milaret3aeae3a2015-06-01 17:31:54 -0400111 SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
112 this, SLOT(accountSelected(QItemSelection)));
Edric Milaret627500d2015-03-27 16:41:40 -0400113
114 ui->accountView->setCurrentIndex(accountModel_->index(0));
115 ui->accountDetailLayout->addWidget(accountDetails_);
Edric Milaret627500d2015-03-27 16:41:40 -0400116 ui->accountTypeBox->setModel(accountModel_->protocolModel());
Olivier SOLDANOadc81f02016-11-07 15:22:34 -0500117 ui->accountTypeBox->setCurrentIndex(ui->accountTypeBox->findText("RING"));
Edric Milaret4bba46d2015-04-29 16:33:38 -0400118 ui->startupBox->setChecked(Utils::CheckStartupLink());
Edric Milaret1eece872015-06-10 13:37:51 -0400119
Edric Milaretb25af972015-06-17 16:55:45 -0400120 ui->historyDaySettingsSpinBox->setValue(
Edric Milareta3e47282015-10-23 15:20:30 -0400121 CategorizedHistoryModel::instance().historyLimit());
Edric Milaretb25af972015-06-17 16:55:45 -0400122 ui->closeOrMinCheckBox->setChecked(settings_.value(
123 SettingsKey::closeOrMinimized).toBool());
Edric Milaret568a0e52016-09-02 16:26:58 -0400124 ui->notificationCheckBox->setChecked(settings_.value(
125 SettingsKey::enableNotifications).toBool());
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500126 connect(ui->stackedWidget, &QStackedWidget::currentChanged, [](int index) {
Edric Milaretfb5fc5c2015-09-24 14:32:49 -0400127 if (index == 1
Edric Milareta3e47282015-10-23 15:20:30 -0400128 && CallModel::instance().getActiveCalls().size() == 0) {
129 Video::PreviewManager::instance().startPreview();
Edric Milaretfb5fc5c2015-09-24 14:32:49 -0400130 } else {
Edric Milareta3e47282015-10-23 15:20:30 -0400131 if (CallModel::instance().getActiveCalls().size() == 0
132 && Video::PreviewManager::instance().isPreviewing()) {
133 Video::PreviewManager::instance().stopPreview();
Edric Milaretfb5fc5c2015-09-24 14:32:49 -0400134 }
135 }
136 });
Edric Milaret0b7fe5d2016-01-27 11:12:43 -0500137
138 ui->videoView->setIsFullPreview(true);
Edric Milaretfd5a1f22016-02-05 15:30:00 -0500139
140 auto recordPath = Media::RecordingModel::instance().recordPath();
141 if (recordPath.isEmpty()) {
142 recordPath = QDir::toNativeSeparators(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation));
143 Media::RecordingModel::instance().setRecordPath(recordPath);
144 }
145 ui->recordPath->setText(Media::RecordingModel::instance().recordPath());
146
147 ui->alwaysRecordCheckBox->setChecked(Media::RecordingModel::instance().isAlwaysRecording());
148 connect(ui->alwaysRecordCheckBox, &QCheckBox::clicked, [](bool checked){
149 Media::RecordingModel::instance().setAlwaysRecording(checked);
150 });
151
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500152 connect(ui->generalTabButton, &QPushButton::toggled, [=] (bool toggled) {
153 if (toggled) {
154 ui->stackedWidget->setCurrentWidget(ui->generalPage);
155 ui->videoTabButton->setChecked(false);
156 ui->accountTabButton->setChecked(false);
157 }
158 });
159
160 connect(ui->videoTabButton, &QPushButton::toggled, [=] (bool toggled) {
161 if (toggled) {
162 ui->stackedWidget->setCurrentWidget(ui->videoPage);
163 ui->accountTabButton->setChecked(false);
164 ui->generalTabButton->setChecked(false);
165 }
166 });
167
168 connect(ui->accountTabButton, &QPushButton::toggled, [=] (bool toggled) {
169 if (toggled) {
170 ui->stackedWidget->setCurrentWidget(ui->accountPage);
171 ui->videoTabButton->setChecked(false);
172 ui->generalTabButton->setChecked(false);
173 }
174 });
175
176 ui->generalTabButton->setChecked(true);
177
Olivier SOLDANO957911a2017-05-25 11:52:43 -0400178 // Audio settings
Edric Milaret47c40eb2016-03-14 15:06:22 -0400179 auto inputModel = Audio::Settings::instance().inputDeviceModel();
180 auto outputModel = Audio::Settings::instance().outputDeviceModel();
181
182 ui->outputComboBox->setModel(outputModel);
183 ui->inputComboBox->setModel(inputModel);
Olivier SOLDANO957911a2017-05-25 11:52:43 -0400184 if(ui->outputComboBox->count() > 0) {
185 ui->outputComboBox->setCurrentIndex(0);
186 }
187 if (ui->inputComboBox->count() > 0){
188 ui->inputComboBox->setCurrentIndex(0);
189 }
190
Edric Milaret47c40eb2016-03-14 15:06:22 -0400191 connect(ui->outputComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(outputIndexChanged(int)));
192 connect(ui->inputComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(inputIndexChanged(int)));
193
Olivier SOLDANO957911a2017-05-25 11:52:43 -0400194 // profile
Edric Milaret25236d92016-03-28 09:40:58 -0400195 auto profile = ProfileModel::instance().selectedProfile();
196 ui->avatarButton->setIcon(QPixmap::fromImage(Utils::getCirclePhoto(profile->person()->photo().value<QImage>(), ui->avatarButton->width())));
197 ui->profileNameEdit->setText(profile->person()->formattedName());
Olivier SOLDANO16c11f32016-10-28 11:57:48 -0400198
199 //temporary fix hiding imports buttons
200 ui->exportButton->hide();
201 ui->importButton->hide();
Olivier SOLDANO257e0682016-11-09 13:59:04 -0500202
203 ui->intervalUpdateCheckSpinBox->setEnabled(true);
Edric Milaret627500d2015-03-27 16:41:40 -0400204}
205
Edric Milaretef9b85b2016-02-05 11:47:10 -0500206void ConfigurationWidget::showPreview()
207{
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500208 if (ui->stackedWidget->currentIndex() == 1
Edric Milaretef9b85b2016-02-05 11:47:10 -0500209 && CallModel::instance().getActiveCalls().size() == 0) {
210 ui->previewUnavailable->hide();
211 ui->videoView->show();
212 Video::PreviewManager::instance().startPreview();
213 } else {
214 ui->previewUnavailable->show();
215 ui->videoView->hide();
216 }
217}
218
Edric Milaretfb5fc5c2015-09-24 14:32:49 -0400219void
Edric Milaretf8048cf2016-05-13 10:21:08 -0400220ConfigurationWidget::showEvent(QShowEvent *event)
221{
Edric Milaret79d3f682015-12-09 12:32:52 -0500222 if (win_sparkle_get_automatic_check_for_updates()) {
223 ui->autoUpdateCheckBox->setChecked(true);
224 }
225 ui->intervalUpdateCheckSpinBox->setValue(win_sparkle_get_update_check_interval() / 86400);
Edric Milaretfb5fc5c2015-09-24 14:32:49 -0400226 QWidget::showEvent(event);
Edric Milaretef9b85b2016-02-05 11:47:10 -0500227 showPreview();
Edric Milaretfb5fc5c2015-09-24 14:32:49 -0400228}
229
Edric Milaret627500d2015-03-27 16:41:40 -0400230ConfigurationWidget::~ConfigurationWidget()
231{
232 delete ui;
Edric Milaret01f23842015-06-22 14:46:01 -0400233 delete accountStateDelegate_;
Edric Milaret627500d2015-03-27 16:41:40 -0400234}
235
236void
Edric Milaretf8048cf2016-05-13 10:21:08 -0400237ConfigurationWidget::deviceIndexChanged(int index)
238{
Edric Milaret94b4aab2015-05-08 12:10:44 -0400239 ui->deviceBox->setCurrentIndex(index);
240}
241
242void
Edric Milaret627500d2015-03-27 16:41:40 -0400243ConfigurationWidget::on_deviceBox_currentIndexChanged(int index)
244{
245 if (index < 0)
246 return;
247
248 if (!isLoading_)
249 deviceModel_->setActive(index);
250
251 auto device = deviceModel_->activeDevice();
252
253 ui->sizeBox->clear();
254
255 isLoading_ = true;
256 if (device->channelList().size() > 0) {
257 for (auto resolution : device->channelList()[0]->validResolutions()) {
258 ui->sizeBox->addItem(resolution->name());
259 }
260 }
261 ui->sizeBox->setCurrentIndex(
262 device->channelList()[0]->activeResolution()->relativeIndex());
263 isLoading_ = false;
264}
265
266void
267ConfigurationWidget::on_sizeBox_currentIndexChanged(int index)
268{
269 auto device = deviceModel_->activeDevice();
270
Edric Milaret627500d2015-03-27 16:41:40 -0400271 if (index < 0)
272 return;
273 if (!isLoading_)
274 device->channelList()[0]->setActiveResolution(
275 device->channelList()[0]->validResolutions()[index]);
Edric Milaret627500d2015-03-27 16:41:40 -0400276}
277
278void
Edric Milaretf8048cf2016-05-13 10:21:08 -0400279ConfigurationWidget::accountSelected(QItemSelection itemSel)
280{
281 if (itemSel.size())
282 accountDetails_->show();
283 else
284 accountDetails_->hide();
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400285
Edric Milaretf8048cf2016-05-13 10:21:08 -0400286 if (accountConnection_)
287 disconnect(accountConnection_);
288
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400289 auto account = accountModel_->getAccountByModelIndex(
290 ui->accountView->currentIndex());
291 accountDetails_->setAccount(account);
Edric Milaretf8048cf2016-05-13 10:21:08 -0400292 if (account) {
Edric Milaretce0ea472016-04-12 10:16:56 -0400293 AccountSerializationAdapter adapter(account, accountDetails_);
Edric Milaretf8048cf2016-05-13 10:21:08 -0400294 accountConnection_= connect(account,
295 SIGNAL(propertyChanged(Account*,QString,QString,QString)),
296 this,
297 SLOT(accountPropertyChanged(Account*,QString,QString,QString)));
298 }
299}
300
301void
302ConfigurationWidget::accountPropertyChanged(Account* a,
303 const QString& name,
304 const QString& newVal,
305 const QString& oldVal)
306{
307 Q_UNUSED(name)
308 Q_UNUSED(newVal)
309 Q_UNUSED(oldVal)
310 accountDetails_->setAccount(a);
311 AccountSerializationAdapter adapter(a, accountDetails_);
Edric Milaret627500d2015-03-27 16:41:40 -0400312}
313
314void
Edric Milaret627500d2015-03-27 16:41:40 -0400315ConfigurationWidget::on_addAccountButton_clicked()
316{
Edric Milaret57467842016-08-30 13:06:11 -0400317 auto type = ui->accountTypeBox->model()->index(ui->accountTypeBox->currentIndex(), 0);
318 if (type.data() == "RING") {
319 WizardDialog dlg(WizardDialog::NEW_ACCOUNT);
320 dlg.exec();
321 } else {
322 auto account = accountModel_->add(tr("New Account"), type);
323 account->setRingtonePath(Utils::GetRingtonePath());
324 accountModel_->save();
325 }
Edric Milaret627500d2015-03-27 16:41:40 -0400326}
Edric Milaret4bba46d2015-04-29 16:33:38 -0400327
Edric Milaret3aeae3a2015-06-01 17:31:54 -0400328void
329ConfigurationWidget::on_startupBox_toggled(bool checked)
Edric Milaret4bba46d2015-04-29 16:33:38 -0400330{
331 if (checked)
332 Utils::CreateStartupLink();
333 else
334 Utils::DeleteStartupLink();
335}
Edric Milaret3aeae3a2015-06-01 17:31:54 -0400336
337void
Edric Milaret1eece872015-06-10 13:37:51 -0400338ConfigurationWidget::on_clearHistoryButton_clicked()
339{
340 QMessageBox confirmationDialog;
341
Edric Milaret53ac6e52015-09-14 13:37:06 -0400342 confirmationDialog.setText(tr("Are you sure you want to clear all your history?"));
Edric Milaret1eece872015-06-10 13:37:51 -0400343 confirmationDialog.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
344 auto ret = confirmationDialog.exec();
345
346 if (ret == QMessageBox::Ok)
Edric Milareta3e47282015-10-23 15:20:30 -0400347 CategorizedHistoryModel::instance().clearAllCollections();
Edric Milaret1eece872015-06-10 13:37:51 -0400348}
349
350void
351ConfigurationWidget::on_historyDaySettingsSpinBox_valueChanged(int limit)
352{
Edric Milareta3e47282015-10-23 15:20:30 -0400353 if (CategorizedHistoryModel::instance().historyLimit() != limit)
354 CategorizedHistoryModel::instance().setHistoryLimit(limit);
Edric Milaret1eece872015-06-10 13:37:51 -0400355}
Edric Milaretb25af972015-06-17 16:55:45 -0400356
357void
358ConfigurationWidget::on_closeOrMinCheckBox_toggled(bool checked)
359{
360 settings_.setValue(SettingsKey::closeOrMinimized, checked);
361}
Edric Milaret79d3f682015-12-09 12:32:52 -0500362
363void
364ConfigurationWidget::on_checkUpdateButton_clicked()
365{
Edric Milaret79d3f682015-12-09 12:32:52 -0500366 win_sparkle_check_update_with_ui();
Edric Milaret79d3f682015-12-09 12:32:52 -0500367}
368
369void
370ConfigurationWidget::on_autoUpdateCheckBox_toggled(bool checked)
371{
Edric Milaret79d3f682015-12-09 12:32:52 -0500372 win_sparkle_set_automatic_check_for_updates(checked);
Edric Milaret79d3f682015-12-09 12:32:52 -0500373}
374
375void
376ConfigurationWidget::on_intervalUpdateCheckSpinBox_valueChanged(int arg1)
377{
Edric Milaret79d3f682015-12-09 12:32:52 -0500378 win_sparkle_set_update_check_interval(arg1 * 86400);
Edric Milaret79d3f682015-12-09 12:32:52 -0500379}
Edric Milaretef9b85b2016-02-05 11:47:10 -0500380
381void
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500382ConfigurationWidget::on_stackedWidget_currentChanged(int index)
Edric Milaretef9b85b2016-02-05 11:47:10 -0500383{
384 Q_UNUSED(index)
385 showPreview();
386}
Edric Milaretfd5a1f22016-02-05 15:30:00 -0500387
388void
389ConfigurationWidget::on_recordPath_clicked()
390{
391 QString dir = QFileDialog::getExistingDirectory(this, tr("Choose Directory"),
392 Media::RecordingModel::instance().recordPath(),
393 QFileDialog::ShowDirsOnly
394 | QFileDialog::DontResolveSymlinks);
395 if (not dir.isEmpty()) {
396 Media::RecordingModel::instance().setRecordPath(dir);
397 ui->recordPath->setText(dir);
398 }
399}
Edric Milaret47c40eb2016-03-14 15:06:22 -0400400
401void
402ConfigurationWidget::outputIndexChanged(int index)
403{
404 auto outputModel = Audio::Settings::instance().outputDeviceModel();
405 outputModel->selectionModel()->setCurrentIndex(outputModel->index(index), QItemSelectionModel::ClearAndSelect);
406}
407
408void
409ConfigurationWidget::inputIndexChanged(int index)
410{
411 auto inputModel = Audio::Settings::instance().inputDeviceModel();
412 inputModel->selectionModel()->setCurrentIndex(inputModel->index(index), QItemSelectionModel::ClearAndSelect);
413}
Edric Milaretce0ea472016-04-12 10:16:56 -0400414
415void
416ConfigurationWidget::on_importButton_clicked()
417{
418 PathPasswordDialog dlg;
419 if (dlg.exec() == QDialog::Accepted)
420 if (AccountModel::instance().importAccounts(dlg.path_, dlg.password_) > 0)
421 errorDlg_.showMessage(tr("An error occured while importing account."));
422}
423
424void
425ConfigurationWidget::on_exportButton_clicked()
426{
427 PathPasswordDialog dlg;
428 dlg.exportMode = true;
429 if (dlg.exec() == QDialog::Accepted) {
430 auto func = [](QString path, QString password)
431 {
432 AccountModel::instance().exportAccounts(
433 {AccountModel::instance().selectedAccount()->id()},
434 path,
435 password);
436 };
437 QtConcurrent::run(func, dlg.path_, dlg.password_);
438 }
439}
Edric Milaret25236d92016-03-28 09:40:58 -0400440
441void
442ConfigurationWidget::on_avatarButton_clicked()
443{
444 PhotoBoothDialog dlg;
445 dlg.exec();
446 if (dlg.result() == QDialog::Accepted) {
Olivier SOLDANO30ac2c72017-08-04 09:14:47 -0400447 auto image = QImage(dlg.getOutputFileName());
Edric Milaret25236d92016-03-28 09:40:58 -0400448 auto avatar = image.scaled(100, 100, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);
449 ProfileModel::instance().selectedProfile()->person()->setPhoto(avatar);
450 ProfileModel::instance().selectedProfile()->save();
451 ui->avatarButton->setIcon(QPixmap::fromImage(Utils::getCirclePhoto(avatar, ui->avatarButton->width())));
452 }
453}
454
455void
456ConfigurationWidget::on_profileNameEdit_textEdited(const QString& name)
457{
458 ProfileModel::instance().selectedProfile()->person()->setFormattedName(name);
459 ProfileModel::instance().selectedProfile()->save();
460}
Edric Milaret568a0e52016-09-02 16:26:58 -0400461
462void
463ConfigurationWidget::on_notificationCheckBox_toggled(bool checked)
464{
465 settings_.setValue(SettingsKey::enableNotifications, checked);
466}