Suggest filter name by content type.

This commit is contained in:
John Preston 2020-03-20 18:20:57 +04:00
parent 2dbaee4fe1
commit b1606821c0
3 changed files with 86 additions and 6 deletions

View File

@ -2265,6 +2265,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_filters_exclude_muted" = "Muted";
"lng_filters_exclude_read" = "Read";
"lng_filters_exclude_archived" = "Archived";
"lng_filters_name_people" = "People";
"lng_filters_name_unread" = "Unread";
"lng_filters_name_unmuted" = "Unmuted";
"lng_filters_add" = "Done";
"lng_filters_limit" = "Sorry, you have reached folders limit.";
"lng_filters_empty" = "Please choose at least one chat for this folder.";

View File

@ -93,9 +93,16 @@ private:
};
struct NameEditing {
not_null<Ui::InputField*> field;
bool custom = false;
bool settingDefault = false;
};
not_null<FilterChatsPreview*> SetupChatsPreview(
not_null<Ui::VerticalLayout*> content,
not_null<rpl::variable<Data::ChatFilter>*> data,
Fn<void(const Data::ChatFilter&)> updateDefaultTitle,
Flags flags,
ExceptionPeersGetter peers) {
const auto rules = data->current();
@ -107,7 +114,7 @@ not_null<FilterChatsPreview*> SetupChatsPreview(
preview->flagRemoved(
) | rpl::start_with_next([=](Flag flag) {
const auto rules = data->current();
*data = Data::ChatFilter(
auto computed = Data::ChatFilter(
rules.id(),
rules.title(),
rules.iconEmoji(),
@ -115,6 +122,8 @@ not_null<FilterChatsPreview*> SetupChatsPreview(
rules.always(),
rules.pinned(),
rules.never());
updateDefaultTitle(computed);
*data = std::move(computed);
}, preview->lifetime());
preview->peerRemoved(
@ -126,7 +135,7 @@ not_null<FilterChatsPreview*> SetupChatsPreview(
always.remove(history);
pinned.erase(ranges::remove(pinned, history), end(pinned));
never.remove(history);
*data = Data::ChatFilter(
auto computed = Data::ChatFilter(
rules.id(),
rules.title(),
rules.iconEmoji(),
@ -134,6 +143,8 @@ not_null<FilterChatsPreview*> SetupChatsPreview(
std::move(always),
std::move(pinned),
std::move(never));
updateDefaultTitle(computed);
*data = std::move(computed);
}, preview->lifetime());
return preview;
@ -269,6 +280,7 @@ void EditExceptions(
not_null<QObject*> context,
Flags options,
not_null<rpl::variable<Data::ChatFilter>*> data,
Fn<void(const Data::ChatFilter&)> updateDefaultTitle,
Fn<void()> refresh) {
const auto include = (options & Flag::Contacts) != Flags(0);
const auto rules = data->current();
@ -304,7 +316,7 @@ void EditExceptions(
const auto contains = changed.contains(history);
return include ? !contains : contains;
}), end(pinned));
*data = Data::ChatFilter(
auto computed = Data::ChatFilter(
rules.id(),
rules.title(),
rules.iconEmoji(),
@ -313,6 +325,8 @@ void EditExceptions(
include ? std::move(changed) : std::move(removeFrom),
std::move(pinned),
include ? std::move(removeFrom) : std::move(changed));
updateDefaultTitle(computed);
*data = computed;
refresh();
box->closeBox();
}));
@ -413,6 +427,28 @@ void EditExceptions(
installFilterForGeometry(box);
}
[[nodiscard]] QString DefaultTitle(const Data::ChatFilter &filter) {
using Icon = Ui::FilterIcon;
const auto icon = Ui::ComputeDefaultFilterIcon(filter);
switch (icon) {
case Icon::Private:
return (filter.flags() & Data::ChatFilter::Flag::NonContacts)
? tr::lng_filters_name_people(tr::now)
: tr::lng_filters_include_contacts(tr::now);
case Icon::Groups:
return tr::lng_filters_include_groups(tr::now);
case Icon::Channels:
return tr::lng_filters_include_channels(tr::now);
case Icon::Bots:
return tr::lng_filters_include_bots(tr::now);
case Icon::Unread:
return tr::lng_filters_name_unread(tr::now);
case Icon::Unmuted:
return tr::lng_filters_name_unmuted(tr::now);
}
return QString();
}
} // namespace
void EditFilterBox(
@ -433,10 +469,30 @@ void EditFilterBox(
box,
st::windowFilterNameInput,
tr::lng_filters_new_name(),
data->current().title()),
filter.title()),
st::markdownLinkFieldPadding);
name->setMaxLength(kMaxFilterTitleLength);
const auto nameEditing = box->lifetime().make_state<NameEditing>(
NameEditing{ name });
nameEditing->custom = !creating;
QObject::connect(name, &Ui::InputField::changed, [=] {
if (!nameEditing->settingDefault) {
nameEditing->custom = true;
}
});
const auto updateDefaultTitle = [=](const Data::ChatFilter &filter) {
if (nameEditing->custom) {
return;
}
const auto title = DefaultTitle(filter);
if (nameEditing->field->getLastText() != title) {
nameEditing->settingDefault = true;
nameEditing->field->setText(title);
nameEditing->settingDefault = false;
}
};
const auto outer = box->getDelegate()->outerContainer();
CreateIconSelector(
outer,
@ -466,6 +522,7 @@ void EditFilterBox(
const auto include = SetupChatsPreview(
content,
data,
updateDefaultTitle,
kTypes,
&Data::ChatFilter::always);
@ -483,6 +540,7 @@ void EditFilterBox(
const auto exclude = SetupChatsPreview(
content,
data,
updateDefaultTitle,
kExcludeTypes,
&Data::ChatFilter::never);
@ -508,10 +566,22 @@ void EditFilterBox(
data->current().never());
};
includeAdd->setClickedCallback([=] {
EditExceptions(window, box, kTypes, data, refreshPreviews);
EditExceptions(
window,
box,
kTypes,
data,
updateDefaultTitle,
refreshPreviews);
});
excludeAdd->setClickedCallback([=] {
EditExceptions(window, box, kExcludeTypes, data, refreshPreviews);
EditExceptions(
window,
box,
kExcludeTypes,
data,
updateDefaultTitle,
refreshPreviews);
});
const auto save = [=] {

View File

@ -14,6 +14,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/wrap/vertical_layout.h"
#include "base/object_ptr.h"
#include "styles/style_window.h"
#include "styles/style_boxes.h"
namespace {
@ -359,6 +360,9 @@ object_ptr<Ui::RpWidget> EditFilterChatsListController::prepareTypesList() {
container->add(CreateSectionSubtitle(
container,
tr::lng_filters_edit_types()));
container->add(object_ptr<Ui::FixedHeightWidget>(
container,
st::membersMarginTop));
const auto delegate = container->lifetime().make_state<TypeDelegate>();
const auto controller = container->lifetime().make_state<TypeController>(
&session(),
@ -381,6 +385,9 @@ object_ptr<Ui::RpWidget> EditFilterChatsListController::prepareTypesList() {
}
}
}
container->add(object_ptr<Ui::FixedHeightWidget>(
container,
st::membersMarginBottom));
container->add(CreateSectionSubtitle(
container,
tr::lng_filters_edit_chats()));