2
0
mirror of https://github.com/kotatogram/kotatogram-desktop synced 2025-09-01 15:15:13 +00:00

Allow using any interface scale between 100%-300%.

This commit is contained in:
John Preston
2018-10-15 14:44:48 +03:00
parent 149639a53d
commit 19a9a990b6
30 changed files with 207 additions and 242 deletions

View File

@@ -112,7 +112,7 @@ void SetupInterfaceScale(
container,
rpl::event_stream<bool>());
const auto switched = (cConfigScale() == dbisAuto)
const auto switched = (cConfigScale() == kInterfaceScaleAuto)
|| (cConfigScale() == cScreenScale());
const auto button = AddButton(
container,
@@ -125,22 +125,33 @@ void SetupInterfaceScale(
object_ptr<Ui::SettingsSlider>(container, st::settingsSlider),
icon ? st::settingsScalePadding : st::settingsBigScalePadding);
static const auto ScaleValues = { 100, 125, 150, 200, 300 };
const auto sectionFromScale = [](int scale) {
auto result = 0;
for (const auto value : ScaleValues) {
if (scale <= value) {
break;
}
++result;
}
return (result == ScaleValues.size()) ? (result - 1) : result;
};
const auto inSetScale = Ui::AttachAsChild(container, false);
const auto setScale = std::make_shared<Fn<void(DBIScale)>>();
*setScale = [=](DBIScale scale) {
const auto setScale = std::make_shared<Fn<void(int)>>();
*setScale = [=](int scale) {
if (*inSetScale) return;
*inSetScale = true;
const auto guard = gsl::finally([=] { *inSetScale = false; });
if (scale == cScreenScale()) {
scale = dbisAuto;
scale = kInterfaceScaleAuto;
}
toggled->fire(scale == dbisAuto);
toggled->fire(scale == kInterfaceScaleAuto);
const auto applying = scale;
if (scale == dbisAuto) {
if (scale == kInterfaceScaleAuto) {
scale = cScreenScale();
}
slider->setActiveSection(scale - 1);
slider->setActiveSection(sectionFromScale(scale));
if (cEvalScale(scale) != cEvalScale(cRealScale())) {
const auto confirmed = crl::guard(button, [=] {
@@ -166,46 +177,31 @@ void SetupInterfaceScale(
};
button->toggledValue(
) | rpl::start_with_next([=](bool checked) {
auto scale = checked ? dbisAuto : cEvalScale(cConfigScale());
auto scale = checked ? kInterfaceScaleAuto : cEvalScale(cConfigScale());
if (scale == cScreenScale()) {
if (scale != cScale()) {
scale = cScale();
} else {
switch (scale) {
case dbisOne: scale = dbisOneAndQuarter; break;
case dbisOneAndQuarter: scale = dbisOne; break;
case dbisOneAndHalf: scale = dbisOneAndQuarter; break;
case dbisTwo: scale = dbisOneAndHalf; break;
scale -= 25;
if (scale < 100) {
scale = 125;
}
}
}
(*setScale)(scale);
}, button->lifetime());
const auto label = [](DBIScale scale) {
switch (scale) {
case dbisOne: return qsl("100%");
case dbisOneAndQuarter: return qsl("125%");
case dbisOneAndHalf: return qsl("150%");
case dbisTwo: return qsl("200%");
}
Unexpected("Value in scale label.");
const auto label = [](int scale) {
return QString::number(scale) + '%';
};
const auto scaleByIndex = [](int index) {
switch (index) {
case 0: return dbisOne;
case 1: return dbisOneAndQuarter;
case 2: return dbisOneAndHalf;
case 3: return dbisTwo;
}
Unexpected("Index in scaleByIndex.");
return *(ScaleValues.begin() + index);
};
slider->addSection(label(dbisOne));
slider->addSection(label(dbisOneAndQuarter));
slider->addSection(label(dbisOneAndHalf));
slider->addSection(label(dbisTwo));
slider->setActiveSectionFast(cEvalScale(cConfigScale()) - 1);
for (const auto value : ScaleValues) {
slider->addSection(label(value));
}
slider->setActiveSectionFast(sectionFromScale(cConfigScale()));
slider->sectionActivated(
) | rpl::start_with_next([=](int section) {
(*setScale)(scaleByIndex(section));