176 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
	
		
			5.1 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 "kotato/kotato_lang.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 "window/window_peer_menu.h"
 | 
						|
#include "window/window_session_controller.h"
 | 
						|
#include "window/window_controller.h"
 | 
						|
#include "styles/style_settings.h"
 | 
						|
#include "styles/style_layers.h"
 | 
						|
 | 
						|
namespace Settings {
 | 
						|
namespace {
 | 
						|
 | 
						|
// format: { key, { name, description }}
 | 
						|
const std::map<QString, std::pair<QString, QString>> TranslationMap {
 | 
						|
	{ ChatHelpers::kOptionTabbedPanelShowOnClick, {
 | 
						|
		"ktg_experimental_tabbed_panel_by_click",
 | 
						|
		"ktg_experimental_tabbed_panel_by_click_description",
 | 
						|
	}},
 | 
						|
	{ Window::kOptionViewProfileInChatsListContextMenu, {
 | 
						|
		"ktg_experimental_view_profile_context_menu",
 | 
						|
		"ktg_experimental_view_profile_context_menu_description",
 | 
						|
	}},
 | 
						|
	{ Ui::GL::kOptionAllowLinuxNvidiaOpenGL, {
 | 
						|
		"ktg_experimental_linux_nvidia_opengl",
 | 
						|
		"ktg_experimental_linux_nvidia_opengl_description",
 | 
						|
	}},
 | 
						|
};
 | 
						|
 | 
						|
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 translation = TranslationMap.find(option.id());
 | 
						|
	const auto name = translation != TranslationMap.end()
 | 
						|
			? ktr(translation->second.first)
 | 
						|
			: 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::settingsButton : 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(Box<Ui::ConfirmBox>(
 | 
						|
				tr::lng_settings_need_restart(tr::now),
 | 
						|
				tr::lng_settings_restart_now(tr::now),
 | 
						|
				tr::lng_settings_restart_later(tr::now),
 | 
						|
				[] { Core::Restart(); }));
 | 
						|
		});
 | 
						|
	}
 | 
						|
	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::settingsButton.toggle.duration);
 | 
						|
		}
 | 
						|
	}, container->lifetime());
 | 
						|
 | 
						|
	const auto &description = (translation != TranslationMap.end()
 | 
						|
		&& !translation->second.second.isEmpty())
 | 
						|
			? ktr(translation->second.second)
 | 
						|
			: 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::settingsButton);
 | 
						|
		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(Ui::GL::kOptionAllowLinuxNvidiaOpenGL);
 | 
						|
}
 | 
						|
 | 
						|
} // namespace
 | 
						|
 | 
						|
Experimental::Experimental(
 | 
						|
	QWidget *parent,
 | 
						|
	not_null<Window::SessionController*> controller)
 | 
						|
: Section(parent) {
 | 
						|
	setupContent(controller);
 | 
						|
}
 | 
						|
 | 
						|
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
 |