/* 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 "base/options.h" #include "core/application.h" #include "chat_helpers/tabbed_panel.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, not_null container, base::options::option &option, rpl::producer<> resetClicks) { auto &lifetime = container->lifetime(); const auto name = option.name().isEmpty() ? option.id() : option.name(); const auto toggles = lifetime.make_state>(); 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() : 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, not_null container) { AddSkip(container, st::settingsCheckboxesSkip); container->add( object_ptr( 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>( container, object_ptr(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(name), (reset ? (reset->clicks() | rpl::to_empty) : rpl::producer<>())); }; addToggle(ChatHelpers::kOptionTabbedPanelShowOnClick); addToggle(Window::kOptionViewProfileInChatsListContextMenu); addToggle(Ui::GL::kOptionAllowLinuxNvidiaOpenGL); addToggle(Media::Player::kOptionDisableAutoplayNext); addToggle(Settings::kOptionMonoSettingsIcons); addToggle(Webview::kOptionWebviewDebugEnabled); } } // namespace Experimental::Experimental( QWidget *parent, not_null controller) : Section(parent) { setupContent(controller); } rpl::producer Experimental::title() { return tr::lng_settings_experimental(); } void Experimental::setupContent( not_null controller) { const auto content = Ui::CreateChild(this); SetupExperimental(&controller->window(), content); Ui::ResizeFitChild(this, content); } } // namespace Settings