Fixed edit of long media caption with emoji.

This commit is contained in:
23rd 2024-02-27 04:19:15 +03:00 committed by John Preston
parent d252427e34
commit a77c547a62
6 changed files with 49 additions and 45 deletions

View file

@ -1953,6 +1953,7 @@ bool HistoryWidget::applyDraft(FieldHistoryAction fieldHistoryAction) {
updateControlsVisibility(); updateControlsVisibility();
updateControlsGeometry(); updateControlsGeometry();
refreshTopBarActiveChat(); refreshTopBarActiveChat();
checkCharsLimitation();
if (_editMsgId) { if (_editMsgId) {
updateReplyEditTexts(); updateReplyEditTexts();
if (!_replyEditMsg) { if (!_replyEditMsg) {
@ -3869,17 +3870,12 @@ void HistoryWidget::saveEditMsg() {
return; return;
} }
const auto webPageDraft = _preview->draft(); const auto webPageDraft = _preview->draft();
auto left = prepareTextForEditMsg(); const auto sending = prepareTextForEditMsg();
auto sending = TextWithEntities();
const auto originalLeftSize = left.text.size();
const auto hasMediaWithCaption = item const auto hasMediaWithCaption = item
&& item->media() && item->media()
&& item->media()->allowsEditCaption(); && item->media()->allowsEditCaption();
const auto maxCaptionSize = !hasMediaWithCaption if (sending.text.isEmpty()
? MaxMessageSize
: Data::PremiumLimits(&session()).captionLengthCurrent();
if (!TextUtilities::CutPart(sending, left, maxCaptionSize)
&& (webPageDraft.removed && (webPageDraft.removed
|| webPageDraft.url.isEmpty() || webPageDraft.url.isEmpty()
|| !webPageDraft.manual) || !webPageDraft.manual)
@ -3888,11 +3884,16 @@ void HistoryWidget::saveEditMsg() {
controller()->show( controller()->show(
Box<DeleteMessagesBox>(item, suggestModerateActions)); Box<DeleteMessagesBox>(item, suggestModerateActions));
return; return;
} else if (!left.text.isEmpty()) { } else {
const auto remove = originalLeftSize - maxCaptionSize; const auto maxCaptionSize = !hasMediaWithCaption
controller()->showToast( ? MaxMessageSize
tr::lng_edit_limit_reached(tr::now, lt_count, remove)); : Data::PremiumLimits(&session()).captionLengthCurrent();
return; const auto remove = Ui::FieldCharacterCount(_field) - maxCaptionSize;
if (remove > 0) {
controller()->showToast(
tr::lng_edit_limit_reached(tr::now, lt_count, remove));
return;
}
} }
const auto weak = Ui::MakeWeak(this); const auto weak = Ui::MakeWeak(this);
@ -7319,9 +7320,8 @@ void HistoryWidget::checkCharsLimitation() {
_charsLimitation = nullptr; _charsLimitation = nullptr;
return; return;
} }
const auto limits = Data::PremiumLimits(&session()); const auto remove = Ui::FieldCharacterCount(_field)
const auto left = prepareTextForEditMsg(); - Data::PremiumLimits(&session()).captionLengthCurrent();
const auto remove = left.text.size() - limits.captionLengthCurrent();
if (remove > 0) { if (remove > 0) {
if (!_charsLimitation) { if (!_charsLimitation) {
_charsLimitation = base::make_unique_q<CharactersLimitLabel>( _charsLimitation = base::make_unique_q<CharactersLimitLabel>(

View file

@ -3150,6 +3150,10 @@ not_null<Ui::RpWidget*> ComposeControls::likeAnimationTarget() const {
return _like; return _like;
} }
int ComposeControls::fieldCharacterCount() const {
return Ui::FieldCharacterCount(_field);
}
bool ComposeControls::preventsClose(Fn<void()> &&continueCallback) const { bool ComposeControls::preventsClose(Fn<void()> &&continueCallback) const {
if (_voiceRecordBar->isActive()) { if (_voiceRecordBar->isActive()) {
_voiceRecordBar->showDiscardBox(std::move(continueCallback)); _voiceRecordBar->showDiscardBox(std::move(continueCallback));
@ -3323,9 +3327,8 @@ void ComposeControls::checkCharsLimitation() {
_charsLimitation = nullptr; _charsLimitation = nullptr;
return; return;
} }
const auto limits = Data::PremiumLimits(&session()); const auto remove = Ui::FieldCharacterCount(_field)
const auto left = prepareTextForEditMsg(); - Data::PremiumLimits(&session()).captionLengthCurrent();
const auto remove = left.text.size() - limits.captionLengthCurrent();
if (remove > 0) { if (remove > 0) {
if (!_charsLimitation) { if (!_charsLimitation) {
using namespace Controls; using namespace Controls;

View file

@ -228,6 +228,7 @@ public:
[[nodiscard]] rpl::producer<bool> hasSendTextValue() const; [[nodiscard]] rpl::producer<bool> hasSendTextValue() const;
[[nodiscard]] rpl::producer<bool> fieldMenuShownValue() const; [[nodiscard]] rpl::producer<bool> fieldMenuShownValue() const;
[[nodiscard]] not_null<Ui::RpWidget*> likeAnimationTarget() const; [[nodiscard]] not_null<Ui::RpWidget*> likeAnimationTarget() const;
[[nodiscard]] int fieldCharacterCount() const;
[[nodiscard]] TextWithEntities prepareTextForEditMsg() const; [[nodiscard]] TextWithEntities prepareTextForEditMsg() const;

View file

@ -1170,29 +1170,29 @@ void RepliesWidget::edit(
return; return;
} }
const auto webpage = _composeControls->webPageDraft(); const auto webpage = _composeControls->webPageDraft();
auto sending = TextWithEntities(); const auto sending = _composeControls->prepareTextForEditMsg();
auto left = _composeControls->prepareTextForEditMsg();
const auto originalLeftSize = left.text.size();
const auto hasMediaWithCaption = item const auto hasMediaWithCaption = item
&& item->media() && item->media()
&& item->media()->allowsEditCaption(); && item->media()->allowsEditCaption();
const auto maxCaptionSize = !hasMediaWithCaption if (sending.text.isEmpty() && !hasMediaWithCaption) {
? MaxMessageSize
: Data::PremiumLimits(&session()).captionLengthCurrent();
if (!TextUtilities::CutPart(sending, left, maxCaptionSize)
&& !hasMediaWithCaption) {
if (item) { if (item) {
controller()->show(Box<DeleteMessagesBox>(item, false)); controller()->show(Box<DeleteMessagesBox>(item, false));
} else { } else {
doSetInnerFocus(); doSetInnerFocus();
} }
return; return;
} else if (!left.text.isEmpty()) { } else {
const auto remove = originalLeftSize - maxCaptionSize; const auto maxCaptionSize = !hasMediaWithCaption
controller()->showToast( ? MaxMessageSize
tr::lng_edit_limit_reached(tr::now, lt_count, remove)); : Data::PremiumLimits(&session()).captionLengthCurrent();
return; const auto remove = _composeControls->fieldCharacterCount()
- maxCaptionSize;
if (remove > 0) {
controller()->showToast(
tr::lng_edit_limit_reached(tr::now, lt_count, remove));
return;
}
} }
lifetime().add([=] { lifetime().add([=] {

View file

@ -635,29 +635,29 @@ void ScheduledWidget::edit(
return; return;
} }
const auto webpage = _composeControls->webPageDraft(); const auto webpage = _composeControls->webPageDraft();
auto sending = TextWithEntities(); const auto sending = _composeControls->prepareTextForEditMsg();
auto left = _composeControls->prepareTextForEditMsg();
const auto originalLeftSize = left.text.size();
const auto hasMediaWithCaption = item const auto hasMediaWithCaption = item
&& item->media() && item->media()
&& item->media()->allowsEditCaption(); && item->media()->allowsEditCaption();
const auto maxCaptionSize = !hasMediaWithCaption if (sending.text.isEmpty() && !hasMediaWithCaption) {
? MaxMessageSize
: Data::PremiumLimits(&session()).captionLengthCurrent();
if (!TextUtilities::CutPart(sending, left, maxCaptionSize)
&& !hasMediaWithCaption) {
if (item) { if (item) {
controller()->show(Box<DeleteMessagesBox>(item, false)); controller()->show(Box<DeleteMessagesBox>(item, false));
} else { } else {
_composeControls->focus(); _composeControls->focus();
} }
return; return;
} else if (!left.text.isEmpty()) { } else {
const auto remove = originalLeftSize - maxCaptionSize; const auto maxCaptionSize = !hasMediaWithCaption
controller()->showToast( ? MaxMessageSize
tr::lng_edit_limit_reached(tr::now, lt_count, remove)); : Data::PremiumLimits(&session()).captionLengthCurrent();
return; const auto remove = _composeControls->fieldCharacterCount()
- maxCaptionSize;
if (remove > 0) {
controller()->showToast(
tr::lng_edit_limit_reached(tr::now, lt_count, remove));
return;
}
} }
lifetime().add([=] { lifetime().add([=] {

@ -1 +1 @@
Subproject commit d4247511355a666903e9a57d821b1eb58884aade Subproject commit 333587d95edefcae1ebaf8838d3f499639fc2de8