mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
Improved message edition with pre-selected text.
This commit is contained in:
parent
ddaf78828a
commit
2638ee2926
12 changed files with 69 additions and 16 deletions
|
@ -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);
|
||||||
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -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());
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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());
|
||||||
|
|
Loading…
Add table
Reference in a new issue