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;
}
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,
not_null<UserData*> user,
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) {
const auto editItemId = editItem->fullId();
_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);
}
const auto pinItem = (item->canPin() && item->isPinned())

View File

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

View File

@ -195,8 +195,9 @@ public:
not_null<HistoryItem*> item,
TextWithEntities quote = {},
int quoteOffset = 0);
void editMessage(FullMsgId itemId);
void editMessage(not_null<HistoryItem*> item);
void editMessage(
not_null<HistoryItem*> item,
const TextSelection &selection);
[[nodiscard]] FullReplyTo 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)) {
editMessage(item);
SelectTextInFieldWithMargins(_field, selection);
}
}

View File

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

View File

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

View File

@ -248,6 +248,8 @@ public:
[[nodiscard]] TextForMimeData getSelectedText() const;
[[nodiscard]] MessageIdsList getSelectedIds() const;
[[nodiscard]] SelectedItems getSelectedItems() const;
[[nodiscard]] const TextSelection &getSelectedTextRange(
not_null<HistoryItem*> item) const;
void cancelSelection();
void selectItem(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)) {
const auto media = item->media();
if (!media || media->webpage() || media->allowsEditCaption()) {
_composeControls->editMessage(fullId);
_composeControls->editMessage(
fullId,
_inner->getSelectedTextRange(item));
}
}
}, _inner->lifetime());

View File

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

View File

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