235 lines
6.6 KiB
C++
235 lines
6.6 KiB
C++
/*
|
|
This file is part of Telegram Desktop,
|
|
the official desktop application for the Telegram messaging service.
|
|
|
|
For license and copyright information please follow this link:
|
|
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|
*/
|
|
#include "settings/settings_notifications.h"
|
|
|
|
#include "settings/settings_common.h"
|
|
#include "ui/wrap/vertical_layout.h"
|
|
#include "ui/wrap/slide_wrap.h"
|
|
#include "ui/widgets/checkbox.h"
|
|
#include "ui/widgets/buttons.h"
|
|
#include "lang/lang_keys.h"
|
|
#include "storage/localstorage.h"
|
|
#include "window/notifications_manager.h"
|
|
#include "boxes/notifications_box.h"
|
|
#include "platform/platform_notifications_manager.h"
|
|
#include "mainwindow.h"
|
|
#include "auth_session.h"
|
|
#include "styles/style_settings.h"
|
|
|
|
namespace Settings {
|
|
namespace {
|
|
|
|
void SetupNotificationsContent(not_null<Ui::VerticalLayout*> container) {
|
|
const auto checkbox = [&](LangKey label, bool checked) {
|
|
return object_ptr<Ui::Checkbox>(
|
|
container,
|
|
lang(label),
|
|
checked,
|
|
st::settingsCheckbox);
|
|
};
|
|
const auto addCheckbox = [&](LangKey label, bool checked) {
|
|
return container->add(
|
|
checkbox(label, checked),
|
|
st::settingsCheckboxPadding);
|
|
};
|
|
const auto addSlidingCheckbox = [&](LangKey label, bool checked) {
|
|
return container->add(
|
|
object_ptr<Ui::SlideWrap<Ui::Checkbox>>(
|
|
container,
|
|
checkbox(label, checked),
|
|
st::settingsCheckboxPadding));
|
|
};
|
|
const auto desktop = addCheckbox(
|
|
lng_settings_desktop_notify,
|
|
Global::DesktopNotify());
|
|
const auto name = addSlidingCheckbox(
|
|
lng_settings_show_name,
|
|
(Global::NotifyView() <= dbinvShowName));
|
|
const auto preview = addSlidingCheckbox(
|
|
lng_settings_show_preview,
|
|
(Global::NotifyView() <= dbinvShowPreview));
|
|
const auto sound = addCheckbox(
|
|
lng_settings_sound_notify,
|
|
Global::SoundNotify());
|
|
const auto muted = addCheckbox(
|
|
lng_settings_include_muted,
|
|
Global::IncludeMuted());
|
|
|
|
const auto nativeNotificationsKey = [&] {
|
|
if (!Platform::Notifications::Supported()) {
|
|
return LangKey();
|
|
} else if (cPlatform() == dbipWindows) {
|
|
return lng_settings_use_windows;
|
|
} else if (cPlatform() == dbipLinux32
|
|
|| cPlatform() == dbipLinux64) {
|
|
return lng_settings_use_native_notifications;
|
|
}
|
|
return LangKey();
|
|
}();
|
|
const auto native = nativeNotificationsKey
|
|
? addCheckbox(nativeNotificationsKey, Global::NativeNotifications())
|
|
: nullptr;
|
|
const auto advanced = (cPlatform() != dbipMac)
|
|
? container->add(
|
|
object_ptr<Ui::SlideWrap<Ui::LinkButton>>(
|
|
container,
|
|
object_ptr<Ui::LinkButton>(
|
|
container,
|
|
lang(lng_settings_advanced_notifications),
|
|
st::settingsLink),
|
|
st::settingsAdvancedNotificationsPadding))
|
|
: nullptr;
|
|
|
|
if (!name->entity()->checked()) {
|
|
preview->hide(anim::type::instant);
|
|
}
|
|
if (!desktop->checked()) {
|
|
name->hide(anim::type::instant);
|
|
preview->hide(anim::type::instant);
|
|
}
|
|
if (native && advanced && Global::NativeNotifications()) {
|
|
advanced->hide(anim::type::instant);
|
|
}
|
|
|
|
using Change = Window::Notifications::ChangeType;
|
|
const auto changed = [](Change change) {
|
|
Local::writeUserSettings();
|
|
Auth().notifications().settingsChanged().notify(change);
|
|
};
|
|
base::ObservableViewer(
|
|
desktop->checkedChanged
|
|
) | rpl::filter([](bool checked) {
|
|
return (checked != Global::DesktopNotify());
|
|
}) | rpl::start_with_next([=](bool checked) {
|
|
Global::SetDesktopNotify(checked);
|
|
changed(Change::DesktopEnabled);
|
|
}, desktop->lifetime());
|
|
|
|
base::ObservableViewer(
|
|
name->entity()->checkedChanged
|
|
) | rpl::map([=](bool checked) {
|
|
if (!checked) {
|
|
return dbinvShowNothing;
|
|
} else if (!preview->entity()->checked()) {
|
|
return dbinvShowName;
|
|
}
|
|
return dbinvShowPreview;
|
|
}) | rpl::filter([=](DBINotifyView value) {
|
|
return (value != Global::NotifyView());
|
|
}) | rpl::start_with_next([=](DBINotifyView value) {
|
|
Global::SetNotifyView(value);
|
|
changed(Change::ViewParams);
|
|
}, name->lifetime());
|
|
|
|
base::ObservableViewer(
|
|
preview->entity()->checkedChanged
|
|
) | rpl::map([=](bool checked) {
|
|
if (checked) {
|
|
return dbinvShowPreview;
|
|
} else if (name->entity()->checked()) {
|
|
return dbinvShowName;
|
|
}
|
|
return dbinvShowNothing;
|
|
}) | rpl::filter([=](DBINotifyView value) {
|
|
return (value != Global::NotifyView());
|
|
}) | rpl::start_with_next([=](DBINotifyView value) {
|
|
Global::SetNotifyView(value);
|
|
changed(Change::ViewParams);
|
|
}, preview->lifetime());
|
|
|
|
base::ObservableViewer(
|
|
sound->checkedChanged
|
|
) | rpl::filter([](bool checked) {
|
|
return (checked != Global::SoundNotify());
|
|
}) | rpl::start_with_next([=](bool checked) {
|
|
Global::SetSoundNotify(checked);
|
|
changed(Change::SoundEnabled);
|
|
}, sound->lifetime());
|
|
|
|
base::ObservableViewer(
|
|
muted->checkedChanged
|
|
) | rpl::filter([](bool checked) {
|
|
return (checked != Global::IncludeMuted());
|
|
}) | rpl::start_with_next([=](bool checked) {
|
|
Global::SetIncludeMuted(checked);
|
|
changed(Change::IncludeMuted);
|
|
}, muted->lifetime());
|
|
|
|
base::ObservableViewer(
|
|
Auth().notifications().settingsChanged()
|
|
) | rpl::start_with_next([=](Change change) {
|
|
if (change == Change::DesktopEnabled) {
|
|
desktop->setChecked(Global::DesktopNotify());
|
|
name->toggle(Global::DesktopNotify(), anim::type::normal);
|
|
preview->toggle(
|
|
Global::DesktopNotify() && name->entity()->checked(),
|
|
anim::type::normal);
|
|
} else if (change == Change::ViewParams) {
|
|
preview->toggle(name->entity()->checked(), anim::type::normal);
|
|
} else if (change == Change::SoundEnabled) {
|
|
sound->setChecked(Global::SoundNotify());
|
|
}
|
|
}, desktop->lifetime());
|
|
|
|
if (native) {
|
|
base::ObservableViewer(
|
|
native->checkedChanged
|
|
) | rpl::filter([](bool checked) {
|
|
return (checked != Global::NativeNotifications());
|
|
}) | rpl::start_with_next([=](bool checked) {
|
|
Global::SetNativeNotifications(checked);
|
|
Local::writeUserSettings();
|
|
|
|
Auth().notifications().createManager();
|
|
|
|
if (advanced) {
|
|
advanced->toggle(
|
|
!Global::NativeNotifications(),
|
|
anim::type::normal);
|
|
}
|
|
}, native->lifetime());
|
|
}
|
|
if (advanced) {
|
|
advanced->entity()->addClickHandler([=] {
|
|
Ui::show(Box<NotificationsBox>());
|
|
});
|
|
}
|
|
}
|
|
|
|
void SetupNotifications(not_null<Ui::VerticalLayout*> container) {
|
|
AddDivider(container);
|
|
AddSkip(container);
|
|
|
|
auto wrap = object_ptr<Ui::VerticalLayout>(container);
|
|
SetupNotificationsContent(wrap.data());
|
|
|
|
container->add(object_ptr<Ui::OverrideMargins>(
|
|
container,
|
|
std::move(wrap)));
|
|
|
|
AddSkip(container);
|
|
}
|
|
|
|
} // namespace
|
|
|
|
Notifications::Notifications(QWidget *parent, not_null<UserData*> self)
|
|
: Section(parent)
|
|
, _self(self) {
|
|
setupContent();
|
|
}
|
|
|
|
void Notifications::setupContent() {
|
|
const auto content = Ui::CreateChild<Ui::VerticalLayout>(this);
|
|
|
|
SetupNotifications(content);
|
|
|
|
Ui::ResizeFitChild(this, content);
|
|
}
|
|
|
|
} // namespace Settings
|