mirror of
https://github.com/telegramdesktop/tdesktop
synced 2025-05-09 11:39:52 +00:00
It's used if there's a gtk notification daemon or application is running sandboxed without access to the freedesktop protocol. GNotification API is poor, but should feel native on environments using GNOME technologies.
173 lines
5.0 KiB
C++
173 lines
5.0 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_experimental.h"
|
|
|
|
#include "ui/boxes/confirm_box.h"
|
|
#include "ui/wrap/vertical_layout.h"
|
|
#include "ui/wrap/slide_wrap.h"
|
|
#include "ui/widgets/buttons.h"
|
|
#include "ui/widgets/labels.h"
|
|
#include "ui/gl/gl_detection.h"
|
|
#include "ui/chat/chat_style_radius.h"
|
|
#include "base/options.h"
|
|
#include "core/application.h"
|
|
#include "platform/platform_specific.h"
|
|
#include "chat_helpers/tabbed_panel.h"
|
|
#include "dialogs/dialogs_inner_widget.h"
|
|
#include "history/history_widget.h"
|
|
#include "lang/lang_keys.h"
|
|
#include "media/player/media_player_instance.h"
|
|
#include "webview/webview_embed.h"
|
|
#include "window/window_peer_menu.h"
|
|
#include "window/window_session_controller.h"
|
|
#include "window/window_controller.h"
|
|
#include "settings/settings_common.h"
|
|
#include "styles/style_settings.h"
|
|
#include "styles/style_layers.h"
|
|
|
|
namespace Settings {
|
|
namespace {
|
|
|
|
void AddOption(
|
|
not_null<Window::Controller*> window,
|
|
not_null<Ui::VerticalLayout*> container,
|
|
base::options::option<bool> &option,
|
|
rpl::producer<> resetClicks) {
|
|
auto &lifetime = container->lifetime();
|
|
const auto name = option.name().isEmpty() ? option.id() : option.name();
|
|
const auto toggles = lifetime.make_state<rpl::event_stream<bool>>();
|
|
std::move(
|
|
resetClicks
|
|
) | rpl::map_to(
|
|
option.defaultValue()
|
|
) | rpl::start_to_stream(*toggles, lifetime);
|
|
|
|
const auto button = AddButton(
|
|
container,
|
|
rpl::single(name),
|
|
(option.relevant()
|
|
? st::settingsButtonNoIcon
|
|
: st::settingsOptionDisabled)
|
|
)->toggleOn(toggles->events_starting_with(option.value()));
|
|
|
|
const auto restarter = (option.relevant() && option.restartRequired())
|
|
? button->lifetime().make_state<base::Timer>()
|
|
: nullptr;
|
|
if (restarter) {
|
|
restarter->setCallback([=] {
|
|
window->show(Ui::MakeConfirmBox({
|
|
.text = tr::lng_settings_need_restart(),
|
|
.confirmed = [] { Core::Restart(); },
|
|
.confirmText = tr::lng_settings_restart_now(),
|
|
.cancelText = tr::lng_settings_restart_later(),
|
|
}));
|
|
});
|
|
}
|
|
button->toggledChanges(
|
|
) | rpl::start_with_next([=, &option](bool toggled) {
|
|
if (!option.relevant() && toggled != option.defaultValue()) {
|
|
toggles->fire_copy(option.defaultValue());
|
|
window->showToast(
|
|
tr::lng_settings_experimental_irrelevant(tr::now));
|
|
return;
|
|
}
|
|
option.set(toggled);
|
|
if (restarter) {
|
|
restarter->callOnce(st::settingsButtonNoIcon.toggle.duration);
|
|
}
|
|
}, container->lifetime());
|
|
|
|
const auto &description = option.description();
|
|
if (!description.isEmpty()) {
|
|
AddSkip(container, st::settingsCheckboxesSkip);
|
|
AddDividerText(container, rpl::single(description));
|
|
AddSkip(container, st::settingsCheckboxesSkip);
|
|
}
|
|
}
|
|
|
|
void SetupExperimental(
|
|
not_null<Window::Controller*> window,
|
|
not_null<Ui::VerticalLayout*> container) {
|
|
AddSkip(container, st::settingsCheckboxesSkip);
|
|
|
|
container->add(
|
|
object_ptr<Ui::FlatLabel>(
|
|
container,
|
|
tr::lng_settings_experimental_about(),
|
|
st::boxLabel),
|
|
st::settingsDividerLabelPadding);
|
|
|
|
auto reset = (Button*)nullptr;
|
|
if (base::options::changed()) {
|
|
const auto wrap = container->add(
|
|
object_ptr<Ui::SlideWrap<Ui::VerticalLayout>>(
|
|
container,
|
|
object_ptr<Ui::VerticalLayout>(container)));
|
|
const auto inner = wrap->entity();
|
|
AddDivider(inner);
|
|
AddSkip(inner, st::settingsCheckboxesSkip);
|
|
reset = AddButton(
|
|
inner,
|
|
tr::lng_settings_experimental_restore(),
|
|
st::settingsButtonNoIcon);
|
|
reset->addClickHandler([=] {
|
|
base::options::reset();
|
|
wrap->hide(anim::type::normal);
|
|
});
|
|
AddSkip(inner, st::settingsCheckboxesSkip);
|
|
}
|
|
|
|
AddDivider(container);
|
|
AddSkip(container, st::settingsCheckboxesSkip);
|
|
|
|
const auto addToggle = [&](const char name[]) {
|
|
AddOption(
|
|
window,
|
|
container,
|
|
base::options::lookup<bool>(name),
|
|
(reset
|
|
? (reset->clicks() | rpl::to_empty)
|
|
: rpl::producer<>()));
|
|
};
|
|
|
|
addToggle(ChatHelpers::kOptionTabbedPanelShowOnClick);
|
|
addToggle(Window::kOptionViewProfileInChatsListContextMenu);
|
|
addToggle(Dialogs::kOptionCtrlClickChatNewWindow);
|
|
addToggle(Ui::GL::kOptionAllowLinuxNvidiaOpenGL);
|
|
addToggle(Ui::kOptionUseSmallMsgBubbleRadius);
|
|
addToggle(Media::Player::kOptionDisableAutoplayNext);
|
|
addToggle(Settings::kOptionMonoSettingsIcons);
|
|
addToggle(Webview::kOptionWebviewDebugEnabled);
|
|
addToggle(kOptionAutoScrollInactiveChat);
|
|
addToggle(Platform::kOptionGApplication);
|
|
}
|
|
|
|
} // namespace
|
|
|
|
Experimental::Experimental(
|
|
QWidget *parent,
|
|
not_null<Window::SessionController*> controller)
|
|
: Section(parent) {
|
|
setupContent(controller);
|
|
}
|
|
|
|
rpl::producer<QString> Experimental::title() {
|
|
return tr::lng_settings_experimental();
|
|
}
|
|
|
|
void Experimental::setupContent(
|
|
not_null<Window::SessionController*> controller) {
|
|
const auto content = Ui::CreateChild<Ui::VerticalLayout>(this);
|
|
|
|
SetupExperimental(&controller->window(), content);
|
|
|
|
Ui::ResizeFitChild(this, content);
|
|
}
|
|
|
|
} // namespace Settings
|