Improved message edition with pre-selected text.

This commit is contained in:
23rd 2024-03-17 03:46:11 +03:00
parent ddaf78828a
commit 2638ee2926
12 changed files with 69 additions and 16 deletions

View file

@ -1037,3 +1037,28 @@ base::unique_qptr<Ui::RpWidget> PremiumRequiredSendRestriction(
}); });
return result; return result;
} }
void SelectTextInFieldWithMargins(
not_null<Ui::InputField*> field,
const TextSelection &selection) {
if (selection.empty()) {
return;
}
auto textCursor = field->textCursor();
// Try to set equal margins for top and bottom sides.
const auto charsCountInLine = field->width()
/ field->st().font->width('W');
const auto linesCount = (field->height() / field->st().font->height);
const auto selectedLines = (selection.to - selection.from)
/ charsCountInLine;
constexpr auto kMinDiff = ushort(3);
if ((linesCount - selectedLines) > kMinDiff) {
textCursor.setPosition(selection.from
- charsCountInLine * ((linesCount - 1) / 2));
field->setTextCursor(textCursor);
}
textCursor.setPosition(selection.from);
field->setTextCursor(textCursor);
textCursor.setPosition(selection.to, QTextCursor::KeepAnchor);
field->setTextCursor(textCursor);
}

View file

@ -154,3 +154,7 @@ private:
QWidget *parent, QWidget *parent,
not_null<UserData*> user, not_null<UserData*> user,
not_null<Window::SessionController*> controller); not_null<Window::SessionController*> controller);
void SelectTextInFieldWithMargins(
not_null<Ui::InputField*> field,
const TextSelection &selection);

View file

@ -2131,7 +2131,17 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
if (editItem) { if (editItem) {
const auto editItemId = editItem->fullId(); const auto editItemId = editItem->fullId();
_menu->addAction(tr::lng_context_edit_msg(tr::now), [=] { _menu->addAction(tr::lng_context_edit_msg(tr::now), [=] {
_widget->editMessage(editItemId); if (const auto item = session->data().message(editItemId)) {
auto it = _selected.find(item);
const auto selection = ((it != _selected.end())
&& (it->second != FullSelection))
? it->second
: TextSelection();
if (!selection.empty()) {
clearSelected(true);
}
_widget->editMessage(item, selection);
}
}, &st::menuIconEdit); }, &st::menuIconEdit);
} }
const auto pinItem = (item->canPin() && item->isPinned()) const auto pinItem = (item->canPin() && item->isPinned())

View file

@ -6606,7 +6606,7 @@ void HistoryWidget::keyPressEvent(QKeyEvent *e) {
&& _field->empty() && _field->empty()
&& !_editMsgId && !_editMsgId
&& !_replyTo) { && !_replyTo) {
editMessage(item); editMessage(item, {});
return; return;
} }
_scroll->keyPressEvent(e); _scroll->keyPressEvent(e);
@ -7570,13 +7570,9 @@ void HistoryWidget::setReplyFieldsFromProcessing() {
setInnerFocus(); setInnerFocus();
} }
void HistoryWidget::editMessage(FullMsgId itemId) { void HistoryWidget::editMessage(
if (const auto item = session().data().message(itemId)) { not_null<HistoryItem*> item,
editMessage(item); const TextSelection &selection) {
}
}
void HistoryWidget::editMessage(not_null<HistoryItem*> item) {
if (_chooseTheme) { if (_chooseTheme) {
toggleChooseChatTheme(_peer); toggleChooseChatTheme(_peer);
} else if (_voiceRecordBar->isActive()) { } else if (_voiceRecordBar->isActive()) {
@ -7625,6 +7621,7 @@ void HistoryWidget::editMessage(not_null<HistoryItem*> item) {
updateReplyToName(); updateReplyToName();
updateControlsGeometry(); updateControlsGeometry();
updateField(); updateField();
SelectTextInFieldWithMargins(_field, selection);
_saveDraftText = true; _saveDraftText = true;
_saveDraftStart = crl::now(); _saveDraftStart = crl::now();

View file

@ -195,8 +195,9 @@ public:
not_null<HistoryItem*> item, not_null<HistoryItem*> item,
TextWithEntities quote = {}, TextWithEntities quote = {},
int quoteOffset = 0); int quoteOffset = 0);
void editMessage(FullMsgId itemId); void editMessage(
void editMessage(not_null<HistoryItem*> item); not_null<HistoryItem*> item,
const TextSelection &selection);
[[nodiscard]] FullReplyTo replyTo() const; [[nodiscard]] FullReplyTo replyTo() const;
bool lastForceReplyReplied(const FullMsgId &replyTo) const; bool lastForceReplyReplied(const FullMsgId &replyTo) const;

View file

@ -2857,9 +2857,12 @@ void ComposeControls::updateHeight() {
} }
} }
void ComposeControls::editMessage(FullMsgId id) { void ComposeControls::editMessage(
FullMsgId id,
const TextSelection &selection) {
if (const auto item = session().data().message(id)) { if (const auto item = session().data().message(id)) {
editMessage(item); editMessage(item);
SelectTextInFieldWithMargins(_field, selection);
} }
} }

View file

@ -198,7 +198,7 @@ public:
void showFinished(); void showFinished();
void raisePanels(); void raisePanels();
void editMessage(FullMsgId id); void editMessage(FullMsgId id, const TextSelection &selection);
void cancelEditMessage(); void cancelEditMessage();
void maybeCancelEditMessage(); // Confirm if changed and cancel. void maybeCancelEditMessage(); // Confirm if changed and cancel.

View file

@ -2425,6 +2425,11 @@ SelectedItems ListWidget::getSelectedItems() const {
return collectSelectedItems(); return collectSelectedItems();
} }
const TextSelection &ListWidget::getSelectedTextRange(
not_null<HistoryItem*> item) const {
return _selectedTextRange;
}
int ListWidget::findItemIndexByY(int y) const { int ListWidget::findItemIndexByY(int y) const {
Expects(!_items.empty()); Expects(!_items.empty());

View file

@ -248,6 +248,8 @@ public:
[[nodiscard]] TextForMimeData getSelectedText() const; [[nodiscard]] TextForMimeData getSelectedText() const;
[[nodiscard]] MessageIdsList getSelectedIds() const; [[nodiscard]] MessageIdsList getSelectedIds() const;
[[nodiscard]] SelectedItems getSelectedItems() const; [[nodiscard]] SelectedItems getSelectedItems() const;
[[nodiscard]] const TextSelection &getSelectedTextRange(
not_null<HistoryItem*> item) const;
void cancelSelection(); void cancelSelection();
void selectItem(not_null<HistoryItem*> item); void selectItem(not_null<HistoryItem*> item);
void selectItemAsGroup(not_null<HistoryItem*> item); void selectItemAsGroup(not_null<HistoryItem*> item);

View file

@ -316,7 +316,9 @@ RepliesWidget::RepliesWidget(
if (const auto item = session().data().message(fullId)) { if (const auto item = session().data().message(fullId)) {
const auto media = item->media(); const auto media = item->media();
if (!media || media->webpage() || media->allowsEditCaption()) { if (!media || media->webpage() || media->allowsEditCaption()) {
_composeControls->editMessage(fullId); _composeControls->editMessage(
fullId,
_inner->getSelectedTextRange(item));
} }
} }
}, _inner->lifetime()); }, _inner->lifetime());

View file

@ -172,7 +172,9 @@ ScheduledWidget::ScheduledWidget(
if (const auto item = session().data().message(fullId)) { if (const auto item = session().data().message(fullId)) {
const auto media = item->media(); const auto media = item->media();
if (!media || media->webpage() || media->allowsEditCaption()) { if (!media || media->webpage() || media->allowsEditCaption()) {
_composeControls->editMessage(fullId); _composeControls->editMessage(
fullId,
_inner->getSelectedTextRange(item));
} }
} }
}, _inner->lifetime()); }, _inner->lifetime());

View file

@ -394,7 +394,9 @@ ShortcutMessages::ShortcutMessages(
if (const auto item = _session->data().message(fullId)) { if (const auto item = _session->data().message(fullId)) {
const auto media = item->media(); const auto media = item->media();
if (!media || media->webpage() || media->allowsEditCaption()) { if (!media || media->webpage() || media->allowsEditCaption()) {
_composeControls->editMessage(fullId); _composeControls->editMessage(
fullId,
_inner->getSelectedTextRange(item));
} }
} }
}, _inner->lifetime()); }, _inner->lifetime());