From 7f9664279717c65ca123dd9140d6f4a50a00a49e Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 29 Jun 2026 00:46:08 +0400 Subject: [PATCH] Clear the source field when content moves to rich editor --- .../SourceFiles/history/history_widget.cpp | 26 +++++++++++++++++ Telegram/SourceFiles/history/history_widget.h | 1 + .../history_view_compose_controls.cpp | 28 +++++++++++++++++++ .../controls/history_view_compose_controls.h | 1 + .../iv/editor/iv_editor_session.cpp | 9 +++++- .../SourceFiles/iv/editor/iv_editor_session.h | 4 ++- 6 files changed, 67 insertions(+), 2 deletions(-) diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 5faff79afb..e1a04faa0a 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -2243,6 +2243,27 @@ void HistoryWidget::saveThreadFieldDraft(std::unique_ptr draft) { applyDraft(Ui::InputField::HistoryAction::NewEntry); } +void HistoryWidget::migrateFieldToRichEditor() { + if (!_history) { + return; + } + if (editingMessage()) { + cancelEdit(); + } else { + clearFieldText(); + saveThreadFieldDraft(nullptr); + _history->clearCloudDraft(MsgId(), PeerId()); + if (const auto cloudDraft = _history->createCloudDraft( + MsgId(), + PeerId(), + nullptr)) { + session().api().saveDraftToCloud( + not_null{ _history }, + *cloudDraft); + } + } +} + void HistoryWidget::fileChosen(ChatHelpers::FileChosen &&data) { controller()->hideLayer(anim::type::normal); if (const auto info = data.document->sticker() @@ -3463,6 +3484,11 @@ void HistoryWidget::registerThreadFieldBridge() { if (const auto widget = weak.get()) { widget->saveThreadFieldDraft(std::move(draft)); } + }, + [weak] { + if (const auto widget = weak.get()) { + widget->migrateFieldToRichEditor(); + } }); Iv::Editor::FieldVisibleValue( &session(), diff --git a/Telegram/SourceFiles/history/history_widget.h b/Telegram/SourceFiles/history/history_widget.h index 5d5226ca9d..34021dfabc 100644 --- a/Telegram/SourceFiles/history/history_widget.h +++ b/Telegram/SourceFiles/history/history_widget.h @@ -702,6 +702,7 @@ private: [[nodiscard]] bool shouldShowRichDraftPreview() const; [[nodiscard]] std::unique_ptr readThreadFieldDraft() const; void saveThreadFieldDraft(std::unique_ptr draft); + void migrateFieldToRichEditor(); void setHistory(History *history); void setEditMsgId(MsgId msgId); diff --git a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp index 3ca02601af..fa9b976087 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp @@ -2163,6 +2163,31 @@ void ComposeControls::saveThreadFieldDraft(std::unique_ptr draft) { applyDraft(Ui::InputField::HistoryAction::NewEntry); } +void ComposeControls::migrateFieldToRichEditor() { + if (!_history) { + return; + } + if (isEditingMessage()) { + cancelEditMessage(); + } else { + clearFieldText(); + saveThreadFieldDraft(nullptr); + _history->clearCloudDraft(_topicRootId, _monoforumPeerId); + if (const auto thread = _history->threadFor( + _topicRootId, + _monoforumPeerId)) { + if (const auto cloudDraft = _history->createCloudDraft( + _topicRootId, + _monoforumPeerId, + nullptr)) { + session().api().saveDraftToCloud( + not_null{ thread }, + *cloudDraft); + } + } + } +} + void ComposeControls::clearFieldText( TextUpdateEvents events, FieldHistoryAction fieldHistoryAction) { @@ -2881,6 +2906,9 @@ void ComposeControls::registerThreadFieldBridge() { }, [this](std::unique_ptr draft) { saveThreadFieldDraft(std::move(draft)); + }, + [this] { + migrateFieldToRichEditor(); }); Iv::Editor::FieldVisibleValue( _session, diff --git a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.h b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.h index e0312650eb..eca5f6d58b 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.h +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.h @@ -448,6 +448,7 @@ private: [[nodiscard]] bool shouldShowRichDraftPreview() const; [[nodiscard]] std::unique_ptr readThreadFieldDraft() const; void saveThreadFieldDraft(std::unique_ptr draft); + void migrateFieldToRichEditor(); const style::ComposeControls &_st; ChatHelpers::ComposeFeatures _features; diff --git a/Telegram/SourceFiles/iv/editor/iv_editor_session.cpp b/Telegram/SourceFiles/iv/editor/iv_editor_session.cpp index 60d91bf214..e6f487968e 100644 --- a/Telegram/SourceFiles/iv/editor/iv_editor_session.cpp +++ b/Telegram/SourceFiles/iv/editor/iv_editor_session.cpp @@ -96,6 +96,7 @@ struct ComposeThreadEntry { rpl::variable fieldVisible = false; ThreadFieldDraftReader readDraft; ThreadFieldDraftSaver saveDraft; + ThreadFieldMigratedAway migratedAway; }; [[nodiscard]] ComposeThreadKey ComposeKey( @@ -566,6 +567,9 @@ public: }); if (!migrated.blocks.empty()) { *page = std::move(migrated); + if (entry->migratedAway) { + entry->migratedAway(); + } } } } @@ -3969,11 +3973,13 @@ void RegisterThreadFieldBridge( MsgId topicRootId, PeerId monoforumPeerId, ThreadFieldDraftReader readDraft, - ThreadFieldDraftSaver saveDraft) { + ThreadFieldDraftSaver saveDraft, + ThreadFieldMigratedAway migratedAway) { auto &entry = ComposeThreadEntryFor( ComposeKey(session, peerId, topicRootId, monoforumPeerId)); entry.readDraft = std::move(readDraft); entry.saveDraft = std::move(saveDraft); + entry.migratedAway = std::move(migratedAway); } void UnregisterThreadFieldBridge( @@ -3985,6 +3991,7 @@ void UnregisterThreadFieldBridge( ComposeKey(session, peerId, topicRootId, monoforumPeerId)); entry.readDraft = nullptr; entry.saveDraft = nullptr; + entry.migratedAway = nullptr; } void CloseAllWindows() { diff --git a/Telegram/SourceFiles/iv/editor/iv_editor_session.h b/Telegram/SourceFiles/iv/editor/iv_editor_session.h index 1917e1c289..0519ec2669 100644 --- a/Telegram/SourceFiles/iv/editor/iv_editor_session.h +++ b/Telegram/SourceFiles/iv/editor/iv_editor_session.h @@ -33,6 +33,7 @@ namespace Iv::Editor { using ThreadFieldDraftReader = Fn()>; using ThreadFieldDraftSaver = Fn)>; +using ThreadFieldMigratedAway = Fn; [[nodiscard]] bool CheckRichMessagesPremium( not_null controller); @@ -70,7 +71,8 @@ void RegisterThreadFieldBridge( MsgId topicRootId, PeerId monoforumPeerId, ThreadFieldDraftReader readDraft, - ThreadFieldDraftSaver saveDraft); + ThreadFieldDraftSaver saveDraft, + ThreadFieldMigratedAway migratedAway); void UnregisterThreadFieldBridge( not_null session, PeerId peerId,