138 lines
3.3 KiB
C++
138 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,
|
|
int count,
|
|
ForwardOptions options,
|
|
Fn<void(ForwardOptions)> optionsChanged,
|
|
rpl::lifetime &lifetime) {
|
|
Expects(optionsChanged != nullptr);
|
|
|
|
const auto names = createView(
|
|
(count == 1
|
|
? tr::lng_forward_show_sender
|
|
: tr::lng_forward_show_senders)(),
|
|
!options.dropNames);
|
|
const auto captions = options.hasCaptions
|
|
? createView(
|
|
(count == 1
|
|
? tr::lng_forward_show_caption
|
|
: tr::lng_forward_show_captions)(),
|
|
!options.dropCaptions).get()
|
|
: nullptr;
|
|
|
|
const auto notify = [=] {
|
|
optionsChanged({
|
|
.dropNames = !names->checked(),
|
|
.hasCaptions = options.hasCaptions,
|
|
.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),
|
|
count,
|
|
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
|