Support custom emoji in folder menus.

This commit is contained in:
John Preston 2024-12-31 16:29:10 +04:00
parent 06341efe0d
commit de34c75788
4 changed files with 43 additions and 13 deletions

View file

@ -287,19 +287,24 @@ void FillChooseFilterMenu(
};
const auto contains = filter.contains(history);
const auto title = filter.title();
auto item = base::make_unique_q<FilterAction>(
menu.get(),
menu->st().menu,
st::foldersMenu,
Ui::Menu::CreateAction(
menu.get(), // todo filter emoji
Ui::Text::FixAmpersandInAction(filter.title().text.text),
menu.get(),
Ui::Text::FixAmpersandInAction(title.text.text),
std::move(callback)),
contains ? &st::mediaPlayerMenuCheck : nullptr,
contains ? &st::mediaPlayerMenuCheck : nullptr);
const auto context = Core::MarkedTextContext{
.session = &history->session(),
.customEmojiRepaint = [raw = item.get()] { raw->update(); },
.customEmojiLoopLimit = title.isStatic ? -1 : 0,
};
item->setMarkedText(title.text, QString(), context);
item->setIcon(Icon(showColors ? filter : filter.withColorIndex({})));
const auto &p = st::menuWithIcons.itemPadding;
item->setMinWidth(item->minWidth() + p.left() - p.right() - p.top());
const auto action = menu->addAction(std::move(item));
action->setEnabled(contains
? validator.canRemove(id)

View file

@ -781,3 +781,7 @@ dialogsPopularAppsPadding: margins(10px, 8px, 10px, 12px);
dialogsPopularAppsAbout: FlatLabel(boxDividerLabel) {
minWidth: 128px;
}
foldersMenu: Menu(menuWithIcons) {
itemPadding: margins(54px, 8px, 44px, 8px);
}

View file

@ -21,6 +21,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "lang/lang_keys.h"
#include "main/main_session.h"
#include "settings/settings_folders.h"
#include "ui/widgets/menu/menu_action.h"
#include "ui/power_saving.h"
#include "ui/ui_utility.h"
#include "ui/widgets/chat_filters_tabs_slider_reorder.h"
@ -150,18 +151,38 @@ void ShowFiltersListMenu(
const auto premiumFrom = (reorderAll ? 0 : 1) + maxLimit;
for (auto i = 0; i < list.size(); ++i) {
const auto &filter = list[i];
auto title = filter.title();
auto text = title.text.empty()
const auto title = list[i].title();
const auto text = title.text.empty()
? tr::lng_filters_all_short(tr::now)
: title.text.text; // todo filter emoji
const auto action = state->menu->addAction(std::move(text), [=] {
: title.text.text;
const auto callback = [=] {
if (i != active) {
changeActive(i);
}
}, (i == active) ? &st::mediaPlayerMenuCheck : nullptr);
};
const auto icon = (i == active)
? &st::mediaPlayerMenuCheck
: nullptr;
const auto action = Ui::Menu::CreateAction(
state->menu.get(),
text,
callback);
auto item = base::make_unique_q<Ui::Menu::Action>(
state->menu.get(),
state->menu->st().menu,
action,
icon,
icon);
action->setEnabled(i < premiumFrom);
if (!title.text.empty()) {
const auto context = Core::MarkedTextContext{
.session = session,
.customEmojiRepaint = [raw = item.get()] { raw->update(); },
.customEmojiLoopLimit = title.isStatic ? -1 : 0,
};
item->setMarkedText(title.text, QString(), context);
}
state->menu->addAction(std::move(item));
}
session->data().chatsFilters().changed() | rpl::start_with_next([=] {
state->menu->hideMenu();

@ -1 +1 @@
Subproject commit 8cb06a75d981d7a1a2f2a5df420ef20ff4c0b097
Subproject commit da44ac82a99ec05d7091eaaf6ae96a63bbae3714