Fix spoilers in todo lists.

This commit is contained in:
John Preston 2025-07-04 15:50:04 +04:00
parent e1420ba26c
commit 7ccf26310d
2 changed files with 30 additions and 3 deletions

View file

@ -17,6 +17,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "history/history_item_components.h"
#include "history/view/history_view_message.h"
#include "history/view/history_view_cursor_state.h"
#include "history/view/history_view_text_helper.h"
#include "calls/calls_instance.h"
#include "ui/chat/message_bubble.h"
#include "ui/chat/chat_style.h"
@ -61,6 +62,7 @@ struct TodoList::Task {
Task();
void fillData(
not_null<Element*> view,
not_null<TodoListData*> todolist,
const TodoListItem &original,
Ui::Text::MarkedContext context);
@ -83,6 +85,7 @@ TodoList::Task::Task()
}
void TodoList::Task::fillData(
not_null<Element*> view,
not_null<TodoListData*> todolist,
const TodoListItem &original,
Ui::Text::MarkedContext context) {
@ -97,6 +100,7 @@ void TodoList::Task::fillData(
original.text,
Ui::WebpageTextTitleOptions(),
context);
InitElementTextPart(view, text);
}
void TodoList::Task::setCompletedBy(PeerData *by) {
@ -269,6 +273,7 @@ void TodoList::updateTexts() {
.repaint = [=] { repaint(); },
.customEmojiLoopLimit = 2,
}));
InitElementTextPart(_parent, _title);
}
if (_flags != _todolist->flags() || _subtitle.isEmpty()) {
_flags = _todolist->flags();
@ -298,7 +303,7 @@ void TodoList::updateTasks(bool skipAnimations) {
auto &&tasks = ranges::views::zip(_tasks, _todolist->items);
for (auto &&[task, original] : tasks) {
const auto wasDate = task.completionDate;
task.fillData(_todolist, original, context);
task.fillData(_parent, _todolist, original, context);
if (!skipAnimations && (!wasDate != !task.completionDate)) {
startToggleAnimation(task);
animated = true;
@ -315,7 +320,7 @@ void TodoList::updateTasks(bool skipAnimations) {
) | ranges::views::transform([&](const TodoListItem &item) {
auto result = Task();
result.id = item.id;
result.fillData(_todolist, item, context);
result.fillData(_parent, _todolist, item, context);
return result;
}) | ranges::to_vector;
@ -431,7 +436,16 @@ void TodoList::draw(Painter &p, const PaintContext &context) const {
paintw -= padding.left() + padding.right();
p.setPen(stm->historyTextFg);
_title.drawLeft(p, padding.left(), tshift, paintw, width(), style::al_left, 0, -1, context.selection);
_title.draw(p, {
.position = { padding.left(), tshift },
.availableWidth = paintw,
.palette = &stm->textPalette,
.spoiler = Ui::Text::DefaultSpoilerCache(),
.now = context.now,
.pausedEmoji = context.paused || On(PowerSaving::kEmojiChat),
.pausedSpoiler = context.paused || On(PowerSaving::kChatSpoiler),
.selection = context.selection,
});
tshift += _title.countHeight(paintw) + st::historyPollSubtitleSkip;
p.setPen(stm->msgDateFg);
@ -788,6 +802,17 @@ bool TodoList::hasHeavyPart() const {
return false;
}
void TodoList::hideSpoilers() {
if (_title.hasSpoilers()) {
_title.setSpoilerRevealed(false, anim::type::instant);
}
for (auto &task : _tasks) {
if (task.text.hasSpoilers()) {
task.text.setSpoilerRevealed(false, anim::type::instant);
}
}
}
std::vector<Media::TodoTaskInfo> TodoList::takeTasksInfo() {
if (_tasks.empty()) {
return {};

View file

@ -64,6 +64,8 @@ public:
void unloadHeavyPart() override;
bool hasHeavyPart() const override;
void hideSpoilers() override;
std::vector<TodoTaskInfo> takeTasksInfo() override;
private: