Allow editing of collapsed quotes.

This commit is contained in:
John Preston 2024-06-12 21:22:06 +04:00
parent 5e8c3fb146
commit ec40292cbf
6 changed files with 37 additions and 16 deletions

View file

@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "base/event_filter.h" #include "base/event_filter.h"
#include "chat_helpers/tabbed_panel.h" #include "chat_helpers/tabbed_panel.h"
#include "chat_helpers/tabbed_selector.h" #include "chat_helpers/tabbed_selector.h"
#include "core/ui_integration.h"
#include "data/data_channel.h" #include "data/data_channel.h"
#include "data/data_chat.h" #include "data/data_chat.h"
#include "data/data_document.h" #include "data/data_document.h"
@ -351,8 +352,8 @@ object_ptr<Ui::RpWidget> AddReactionsSelector(
const auto customEmojiPaused = [controller = args.controller] { const auto customEmojiPaused = [controller = args.controller] {
return controller->isGifPausedAtLeastFor(PauseReason::Layer); return controller->isGifPausedAtLeastFor(PauseReason::Layer);
}; };
raw->setCustomEmojiFactory([=](QStringView data, Fn<void()> update) auto factory = [=](QStringView data, Fn<void()> update)
-> std::unique_ptr<Ui::Text::CustomEmoji> { -> std::unique_ptr<Ui::Text::CustomEmoji> {
const auto id = Data::ParseCustomEmojiData(data); const auto id = Data::ParseCustomEmojiData(data);
auto result = owner->customEmojiManager().create( auto result = owner->customEmojiManager().create(
data, data,
@ -364,7 +365,13 @@ object_ptr<Ui::RpWidget> AddReactionsSelector(
} }
using namespace Ui::Text; using namespace Ui::Text;
return std::make_unique<FirstFrameEmoji>(std::move(result)); return std::make_unique<FirstFrameEmoji>(std::move(result));
}, std::move(customEmojiPaused)); };
raw->setCustomTextContext([=](Fn<void()> repaint) {
return std::any(Core::MarkedTextContext{
.session = session,
.customEmojiRepaint = std::move(repaint),
});
}, customEmojiPaused, customEmojiPaused, std::move(factory));
const auto callback = args.callback; const auto callback = args.callback;
const auto isCustom = [=](DocumentId id) { const auto isCustom = [=](DocumentId id) {

View file

@ -20,6 +20,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "core/shortcuts.h" #include "core/shortcuts.h"
#include "core/application.h" #include "core/application.h"
#include "core/core_settings.h" #include "core/core_settings.h"
#include "core/ui_integration.h"
#include "ui/text/text_utilities.h" #include "ui/text/text_utilities.h"
#include "ui/toast/toast.h" #include "ui/toast/toast.h"
#include "ui/wrap/vertical_layout.h" #include "ui/wrap/vertical_layout.h"
@ -322,15 +323,24 @@ TextWithTags PrepareEditText(not_null<HistoryItem*> item) {
bool EditTextChanged( bool EditTextChanged(
not_null<HistoryItem*> item, not_null<HistoryItem*> item,
const TextWithTags &updated) { TextWithTags updated) {
const auto original = PrepareEditText(item); const auto original = PrepareEditText(item);
auto originalWithEntities = TextWithEntities{
std::move(original.text),
TextUtilities::ConvertTextTagsToEntities(original.tags)
};
auto updatedWithEntities = TextWithEntities{
std::move(updated.text),
TextUtilities::ConvertTextTagsToEntities(updated.tags)
};
TextUtilities::PrepareForSending(originalWithEntities, 0);
TextUtilities::PrepareForSending(updatedWithEntities, 0);
// Tags can be different for the same entities, because for // Tags can be different for the same entities, because for
// animated emoji each tag contains a different random number. // animated emoji each tag contains a different random number.
// So we compare entities instead of tags. // So we compare entities instead of tags.
return (original.text != updated.text) return originalWithEntities != updatedWithEntities;
|| (TextUtilities::ConvertTextTagsToEntities(original.tags)
!= TextUtilities::ConvertTextTagsToEntities(updated.tags));
} }
Fn<bool( Fn<bool(
@ -384,12 +394,16 @@ void InitMessageFieldHandlers(
const style::InputField *fieldStyle) { const style::InputField *fieldStyle) {
field->setTagMimeProcessor( field->setTagMimeProcessor(
FieldTagMimeProcessor(session, allowPremiumEmoji)); FieldTagMimeProcessor(session, allowPremiumEmoji));
const auto paused = [customEmojiPaused] { field->setCustomTextContext([=](Fn<void()> repaint) {
return std::any(Core::MarkedTextContext{
.session = session,
.customEmojiRepaint = std::move(repaint),
});
}, [customEmojiPaused] {
return On(PowerSaving::kEmojiChat) || customEmojiPaused(); return On(PowerSaving::kEmojiChat) || customEmojiPaused();
}; }, [customEmojiPaused] {
field->setCustomEmojiFactory( return On(PowerSaving::kChatSpoiler) || customEmojiPaused();
session->data().customEmojiManager().factory(), });
std::move(customEmojiPaused));
field->setInstantReplaces(Ui::InstantReplaces::Default()); field->setInstantReplaces(Ui::InstantReplaces::Default());
field->setInstantReplacesEnabled( field->setInstantReplacesEnabled(
Core::App().settings().replaceEmojiValue()); Core::App().settings().replaceEmojiValue());

View file

@ -42,7 +42,7 @@ class Show;
[[nodiscard]] TextWithTags PrepareEditText(not_null<HistoryItem*> item); [[nodiscard]] TextWithTags PrepareEditText(not_null<HistoryItem*> item);
[[nodiscard]] bool EditTextChanged( [[nodiscard]] bool EditTextChanged(
not_null<HistoryItem*> item, not_null<HistoryItem*> item,
const TextWithTags &updated); TextWithTags updated);
Fn<bool( Fn<bool(
Ui::InputField::EditLinkSelection selection, Ui::InputField::EditLinkSelection selection,

View file

@ -271,7 +271,7 @@ bool UiIntegration::copyPreOnClick(const QVariant &context) {
} }
std::unique_ptr<Ui::Text::CustomEmoji> UiIntegration::createCustomEmoji( std::unique_ptr<Ui::Text::CustomEmoji> UiIntegration::createCustomEmoji(
const QString &data, QStringView data,
const std::any &context) { const std::any &context) {
const auto my = std::any_cast<MarkedTextContext>(&context); const auto my = std::any_cast<MarkedTextContext>(&context);
if (!my || !my->session) { if (!my || !my->session) {

View file

@ -58,7 +58,7 @@ public:
const Ui::Emoji::One *defaultEmojiVariant( const Ui::Emoji::One *defaultEmojiVariant(
const Ui::Emoji::One *emoji) override; const Ui::Emoji::One *emoji) override;
std::unique_ptr<Ui::Text::CustomEmoji> createCustomEmoji( std::unique_ptr<Ui::Text::CustomEmoji> createCustomEmoji(
const QString &data, QStringView data,
const std::any &context) override; const std::any &context) override;
Fn<void()> createSpoilerRepaint(const std::any &context) override; Fn<void()> createSpoilerRepaint(const std::any &context) override;
bool allowClickHandlerActivation( bool allowClickHandlerActivation(

@ -1 +1 @@
Subproject commit 20caa93a8d2b5b279f36eb19d9200be071420ba3 Subproject commit 29bce3f8ff693e0386617dfd550a225d0ff11c5d