136 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
	
		
			3.3 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 "ui/chat/forward_options_box.h"
 | 
						|
 | 
						|
#include "ui/widgets/checkbox.h"
 | 
						|
#include "ui/widgets/labels.h"
 | 
						|
#include "lang/lang_keys.h"
 | 
						|
#include "styles/style_layers.h"
 | 
						|
#include "styles/style_boxes.h"
 | 
						|
 | 
						|
namespace Ui {
 | 
						|
 | 
						|
void FillForwardOptions(
 | 
						|
		Fn<not_null<AbstractCheckView*>(
 | 
						|
			rpl::producer<QString> &&,
 | 
						|
			bool)> createView,
 | 
						|
		ForwardOptions options,
 | 
						|
		Fn<void(ForwardOptions)> optionsChanged,
 | 
						|
		rpl::lifetime &lifetime) {
 | 
						|
	Expects(optionsChanged != nullptr);
 | 
						|
 | 
						|
	const auto names = createView(
 | 
						|
		(options.sendersCount == 1
 | 
						|
			? tr::lng_forward_show_sender
 | 
						|
			: tr::lng_forward_show_senders)(),
 | 
						|
		!options.dropNames);
 | 
						|
	const auto captions = options.captionsCount
 | 
						|
		? createView(
 | 
						|
			(options.captionsCount == 1
 | 
						|
				? tr::lng_forward_show_caption
 | 
						|
				: tr::lng_forward_show_captions)(),
 | 
						|
			!options.dropCaptions).get()
 | 
						|
		: nullptr;
 | 
						|
 | 
						|
	const auto notify = [=] {
 | 
						|
		optionsChanged({
 | 
						|
			.sendersCount = options.sendersCount,
 | 
						|
			.captionsCount = options.captionsCount,
 | 
						|
			.dropNames = !names->checked(),
 | 
						|
			.dropCaptions = (captions && !captions->checked()),
 | 
						|
		});
 | 
						|
	};
 | 
						|
	names->checkedChanges(
 | 
						|
	) | rpl::start_with_next([=](bool showNames) {
 | 
						|
		if (showNames && captions && !captions->checked()) {
 | 
						|
			captions->setChecked(true, anim::type::normal);
 | 
						|
		} else {
 | 
						|
			notify();
 | 
						|
		}
 | 
						|
	}, lifetime);
 | 
						|
	if (captions) {
 | 
						|
		captions->checkedChanges(
 | 
						|
		) | rpl::start_with_next([=](bool showCaptions) {
 | 
						|
			if (!showCaptions && names->checked()) {
 | 
						|
				names->setChecked(false, anim::type::normal);
 | 
						|
			} else {
 | 
						|
				notify();
 | 
						|
			}
 | 
						|
		}, lifetime);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
void ForwardOptionsBox(
 | 
						|
		not_null<GenericBox*> box,
 | 
						|
		int count,
 | 
						|
		ForwardOptions options,
 | 
						|
		Fn<void(ForwardOptions)> optionsChanged,
 | 
						|
		Fn<void()> changeRecipient) {
 | 
						|
	Expects(optionsChanged != nullptr);
 | 
						|
	Expects(changeRecipient != nullptr);
 | 
						|
 | 
						|
	box->setTitle((count == 1)
 | 
						|
		? tr::lng_forward_title()
 | 
						|
		: tr::lng_forward_many_title(
 | 
						|
			lt_count,
 | 
						|
			rpl::single(count) | tr::to_count()));
 | 
						|
	box->addButton(tr::lng_box_done(), [=] {
 | 
						|
		box->closeBox();
 | 
						|
	});
 | 
						|
 | 
						|
	box->events(
 | 
						|
	) | rpl::start_with_next([=](not_null<QEvent*> e) {
 | 
						|
		if (e->type() == QEvent::KeyPress) {
 | 
						|
			const auto k = static_cast<QKeyEvent*>(e.get());
 | 
						|
			if (k->key() == Qt::Key_Enter || k->key() == Qt::Key_Return) {
 | 
						|
				box->closeBox();
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}, box->lifetime());
 | 
						|
 | 
						|
	box->addRow(
 | 
						|
		object_ptr<Ui::FlatLabel>(
 | 
						|
			box.get(),
 | 
						|
			(count == 1
 | 
						|
				? tr::lng_forward_about()
 | 
						|
				: tr::lng_forward_many_about()),
 | 
						|
			st::boxLabel),
 | 
						|
		st::boxRowPadding);
 | 
						|
	const auto checkboxPadding = style::margins(
 | 
						|
		st::boxRowPadding.left(),
 | 
						|
		st::boxRowPadding.left(),
 | 
						|
		st::boxRowPadding.right(),
 | 
						|
		st::boxRowPadding.bottom());
 | 
						|
 | 
						|
	auto createView = [&](rpl::producer<QString> &&text, bool checked) {
 | 
						|
		return box->addRow(
 | 
						|
			object_ptr<Ui::Checkbox>(
 | 
						|
				box.get(),
 | 
						|
				std::move(text),
 | 
						|
				checked,
 | 
						|
				st::defaultBoxCheckbox),
 | 
						|
			checkboxPadding)->checkView();
 | 
						|
	};
 | 
						|
	FillForwardOptions(
 | 
						|
		std::move(createView),
 | 
						|
		options,
 | 
						|
		std::move(optionsChanged),
 | 
						|
		box->lifetime());
 | 
						|
 | 
						|
	box->addRow(
 | 
						|
		object_ptr<Ui::LinkButton>(
 | 
						|
			box.get(),
 | 
						|
			tr::lng_forward_change_recipient(tr::now)),
 | 
						|
		checkboxPadding
 | 
						|
	)->setClickedCallback([=] {
 | 
						|
		box->closeBox();
 | 
						|
		changeRecipient();
 | 
						|
	});
 | 
						|
}
 | 
						|
 | 
						|
} // namespace Ui
 |