2016-08-19 19:26:31 +02:00
|
|
|
/*
|
|
|
|
This file is part of Telegram Desktop,
|
2018-01-03 13:23:14 +03:00
|
|
|
the official desktop application for the Telegram messaging service.
|
2016-08-19 19:26:31 +02:00
|
|
|
|
2018-01-03 13:23:14 +03:00
|
|
|
For license and copyright information please follow this link:
|
|
|
|
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
2016-08-19 19:26:31 +02:00
|
|
|
*/
|
|
|
|
#include "settings/settings_scale_widget.h"
|
|
|
|
|
2016-12-02 22:16:35 +03:00
|
|
|
#include "styles/style_boxes.h"
|
2016-08-19 19:26:31 +02:00
|
|
|
#include "styles/style_settings.h"
|
2016-11-11 16:46:04 +03:00
|
|
|
#include "ui/widgets/checkbox.h"
|
2017-04-13 11:27:10 +03:00
|
|
|
#include "lang/lang_keys.h"
|
2017-03-04 13:23:56 +03:00
|
|
|
#include "storage/localstorage.h"
|
2016-08-22 19:16:21 +02:00
|
|
|
#include "mainwindow.h"
|
2017-04-06 17:38:10 +03:00
|
|
|
#include "boxes/confirm_box.h"
|
2016-08-22 19:16:21 +02:00
|
|
|
#include "application.h"
|
2016-11-22 12:48:13 +03:00
|
|
|
#include "ui/widgets/discrete_sliders.h"
|
2016-08-19 19:26:31 +02:00
|
|
|
|
|
|
|
namespace Settings {
|
2016-08-22 19:16:21 +02:00
|
|
|
namespace {
|
|
|
|
|
|
|
|
QString scaleLabel(DBIScale scale) {
|
|
|
|
switch (scale) {
|
|
|
|
case dbisOne: return qsl("100%");
|
|
|
|
case dbisOneAndQuarter: return qsl("125%");
|
|
|
|
case dbisOneAndHalf: return qsl("150%");
|
|
|
|
case dbisTwo: return qsl("200%");
|
|
|
|
}
|
|
|
|
return QString();
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
2016-08-19 19:26:31 +02:00
|
|
|
ScaleWidget::ScaleWidget(QWidget *parent, UserData *self) : BlockWidget(parent, self, lang(lng_settings_section_scale)) {
|
2016-08-22 19:16:21 +02:00
|
|
|
createControls();
|
2016-08-19 19:26:31 +02:00
|
|
|
}
|
|
|
|
|
2016-08-22 19:16:21 +02:00
|
|
|
void ScaleWidget::createControls() {
|
|
|
|
style::margins margin(0, 0, 0, st::settingsSmallSkip);
|
|
|
|
|
2017-09-13 19:57:44 +03:00
|
|
|
createChildRow(_auto, margin, lng_settings_scale_auto(lt_cur, scaleLabel(cScreenScale())), [this](bool) { onAutoChanged(); }, (cConfigScale() == dbisAuto));
|
|
|
|
createChildRow(_scale, style::margins(0, 0, 0, 0));
|
2016-08-22 19:16:21 +02:00
|
|
|
|
|
|
|
_scale->addSection(scaleLabel(dbisOne));
|
|
|
|
_scale->addSection(scaleLabel(dbisOneAndQuarter));
|
|
|
|
_scale->addSection(scaleLabel(dbisOneAndHalf));
|
|
|
|
_scale->addSection(scaleLabel(dbisTwo));
|
|
|
|
_scale->setActiveSectionFast(cEvalScale(cConfigScale()) - 1);
|
2017-12-22 11:05:20 +04:00
|
|
|
_scale->sectionActivated(
|
|
|
|
) | rpl::start_with_next(
|
|
|
|
[this] { scaleChanged(); },
|
|
|
|
lifetime());
|
2016-08-19 19:26:31 +02:00
|
|
|
}
|
|
|
|
|
2016-11-22 12:48:13 +03:00
|
|
|
void ScaleWidget::onAutoChanged() {
|
2016-08-22 19:16:21 +02:00
|
|
|
auto newScale = _auto->checked() ? dbisAuto : cEvalScale(cConfigScale());
|
|
|
|
if (newScale == cScreenScale()) {
|
|
|
|
if (newScale != cScale()) {
|
|
|
|
newScale = cScale();
|
|
|
|
} else {
|
|
|
|
switch (newScale) {
|
|
|
|
case dbisOne: newScale = dbisOneAndQuarter; break;
|
|
|
|
case dbisOneAndQuarter: newScale = dbisOne; break;
|
|
|
|
case dbisOneAndHalf: newScale = dbisOneAndQuarter; break;
|
|
|
|
case dbisTwo: newScale = dbisOneAndHalf; break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
setScale(newScale);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScaleWidget::setScale(DBIScale newScale) {
|
2016-11-22 12:48:13 +03:00
|
|
|
if (_inSetScale) return;
|
|
|
|
_inSetScale = true;
|
2017-08-13 19:16:48 +03:00
|
|
|
auto guard = gsl::finally([this] { _inSetScale = false; });
|
2016-11-22 12:48:13 +03:00
|
|
|
|
|
|
|
if (newScale == cScreenScale()) newScale = dbisAuto;
|
2016-08-22 19:16:21 +02:00
|
|
|
if (newScale == dbisAuto && !_auto->checked()) {
|
|
|
|
_auto->setChecked(true);
|
|
|
|
} else if (newScale != dbisAuto && _auto->checked()) {
|
|
|
|
_auto->setChecked(false);
|
|
|
|
}
|
2016-11-10 21:10:31 +03:00
|
|
|
_newScale = newScale;
|
2016-08-22 19:16:21 +02:00
|
|
|
if (newScale == dbisAuto) newScale = cScreenScale();
|
|
|
|
if (_scale->activeSection() != newScale - 1) {
|
|
|
|
_scale->setActiveSection(newScale - 1);
|
|
|
|
}
|
2016-11-07 19:08:24 +03:00
|
|
|
|
|
|
|
if (cEvalScale(newScale) != cEvalScale(cRealScale())) {
|
2018-06-04 18:35:11 +03:00
|
|
|
Ui::show(Box<ConfirmBox>(lang(lng_settings_need_restart), lang(lng_settings_restart_now), crl::guard(this, [this] {
|
2016-12-13 20:07:56 +03:00
|
|
|
cSetConfigScale(_newScale);
|
|
|
|
Local::writeSettings();
|
|
|
|
App::restart();
|
2018-06-04 18:35:11 +03:00
|
|
|
}), crl::guard(this, [this] {
|
2016-12-13 20:07:56 +03:00
|
|
|
App::CallDelayed(st::boxDuration, this, [this] {
|
|
|
|
setScale(cRealScale());
|
|
|
|
});
|
|
|
|
})));
|
2016-11-07 19:08:24 +03:00
|
|
|
} else {
|
|
|
|
cSetConfigScale(newScale);
|
|
|
|
Local::writeSettings();
|
2016-08-22 19:16:21 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-10-06 19:41:09 +03:00
|
|
|
void ScaleWidget::scaleChanged() {
|
2016-08-22 19:16:21 +02:00
|
|
|
auto newScale = dbisAuto;
|
|
|
|
switch (_scale->activeSection()) {
|
|
|
|
case 0: newScale = dbisOne; break;
|
|
|
|
case 1: newScale = dbisOneAndQuarter; break;
|
|
|
|
case 2: newScale = dbisOneAndHalf; break;
|
|
|
|
case 3: newScale = dbisTwo; break;
|
|
|
|
}
|
|
|
|
setScale(newScale);
|
|
|
|
}
|
2016-08-19 19:26:31 +02:00
|
|
|
|
|
|
|
} // namespace Settings
|