Event log context menu + improved text selection.

This commit is contained in:
John Preston 2017-06-24 13:11:29 +03:00
parent 624f33c5e2
commit 816ee794e8
13 changed files with 345 additions and 85 deletions

View File

@ -27,8 +27,11 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
#include "history/history_admin_log_section.h"
#include "chat_helpers/message_field.h"
#include "mainwindow.h"
#include "mainwidget.h"
#include "window/window_controller.h"
#include "auth_session.h"
#include "ui/widgets/popup_menu.h"
#include "core/file_utilities.h"
#include "lang/lang_keys.h"
namespace AdminLog {
@ -590,14 +593,266 @@ void InnerWidget::keyPressEvent(QKeyEvent *e) {
}
}
void InnerWidget::mouseDoubleClickEvent(QMouseEvent *e) {
mouseActionStart(e->globalPos(), e->button());
if (((_mouseAction == MouseAction::Selecting && _selectedItem != nullptr) || (_mouseAction == MouseAction::None)) && _mouseSelectType == TextSelectType::Letters && _mouseActionItem) {
HistoryStateRequest request;
request.flags |= Text::StateRequest::Flag::LookupSymbol;
auto dragState = _mouseActionItem->getState(_dragStartPosition, request);
if (dragState.cursor == HistoryInTextCursorState) {
_mouseTextSymbol = dragState.symbol;
_mouseSelectType = TextSelectType::Words;
if (_mouseAction == MouseAction::None) {
_mouseAction = MouseAction::Selecting;
auto selection = TextSelection { dragState.symbol, dragState.symbol };
repaintItem(std::exchange(_selectedItem, _mouseActionItem));
_selectedText = selection;
}
mouseMoveEvent(e);
_trippleClickPoint = e->globalPos();
_trippleClickTimer.callOnce(QApplication::doubleClickInterval());
}
}
}
void InnerWidget::contextMenuEvent(QContextMenuEvent *e) {
showContextMenu(e);
}
void InnerWidget::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
if (_menu) {
_menu->deleteLater();
_menu = 0;
}
if (e->reason() == QContextMenuEvent::Mouse) {
mouseActionUpdate(e->globalPos());
}
// -1 - has selection, but no over, 0 - no selection, 1 - over text
auto isUponSelected = 0;
auto hasSelected = 0;
if (_selectedItem) {
isUponSelected = -1;
auto selFrom = _selectedText.from;
auto selTo = _selectedText.to;
hasSelected = (selTo > selFrom) ? 1 : 0;
if (App::mousedItem() && App::mousedItem() == App::hoveredItem()) {
auto mousePos = mapPointToItem(mapFromGlobal(_mousePosition), App::mousedItem());
HistoryStateRequest request;
request.flags |= Text::StateRequest::Flag::LookupSymbol;
auto dragState = App::mousedItem()->getState(mousePos, request);
if (dragState.cursor == HistoryInTextCursorState && dragState.symbol >= selFrom && dragState.symbol < selTo) {
isUponSelected = 1;
}
}
}
if (showFromTouch && hasSelected && isUponSelected < hasSelected) {
isUponSelected = hasSelected;
}
_menu = new Ui::PopupMenu(nullptr);
_contextMenuLink = ClickHandler::getActive();
auto item = App::hoveredItem() ? App::hoveredItem() : App::hoveredLinkItem();
auto lnkPhoto = dynamic_cast<PhotoClickHandler*>(_contextMenuLink.data());
auto lnkDocument = dynamic_cast<DocumentClickHandler*>(_contextMenuLink.data());
bool lnkIsVideo = lnkDocument ? lnkDocument->document()->isVideo() : false;
bool lnkIsAudio = lnkDocument ? (lnkDocument->document()->voice() != nullptr) : false;
bool lnkIsSong = lnkDocument ? (lnkDocument->document()->song() != nullptr) : false;
if (lnkPhoto || lnkDocument) {
if (isUponSelected > 0) {
_menu->addAction(lang(lng_context_copy_selected), [this] { copySelectedText(); })->setEnabled(true);
}
if (lnkPhoto) {
_menu->addAction(lang(lng_context_save_image), App::LambdaDelayed(st::defaultDropdownMenu.menu.ripple.hideDuration, this, [this, photo = lnkPhoto->photo()] {
savePhotoToFile(photo);
}))->setEnabled(true);
_menu->addAction(lang(lng_context_copy_image), [this, photo = lnkPhoto->photo()] {
copyContextImage(photo);
})->setEnabled(true);
} else {
auto document = lnkDocument->document();
if (document->loading()) {
_menu->addAction(lang(lng_context_cancel_download), [this] { cancelContextDownload(); })->setEnabled(true);
} else {
if (document->loaded() && document->isGifv()) {
if (!cAutoPlayGif()) {
_menu->addAction(lang(lng_context_open_gif), [this] { openContextGif(); })->setEnabled(true);
}
}
if (!document->filepath(DocumentData::FilePathResolveChecked).isEmpty()) {
_menu->addAction(lang((cPlatform() == dbipMac || cPlatform() == dbipMacOld) ? lng_context_show_in_finder : lng_context_show_in_folder), [this] { showContextInFolder(); })->setEnabled(true);
}
_menu->addAction(lang(lnkIsVideo ? lng_context_save_video : (lnkIsAudio ? lng_context_save_audio : (lnkIsSong ? lng_context_save_audio_file : lng_context_save_file))), App::LambdaDelayed(st::defaultDropdownMenu.menu.ripple.hideDuration, this, [this, document] {
saveDocumentToFile(document);
}))->setEnabled(true);
}
}
if (App::hoveredLinkItem()) {
App::contextItem(App::hoveredLinkItem());
}
} else { // maybe cursor on some text history item?
bool canDelete = item && item->canDelete() && (item->id > 0 || !item->serviceMsg());
bool canForward = item && item->canForward();
auto msg = dynamic_cast<HistoryMessage*>(item);
if (isUponSelected > 0) {
_menu->addAction(lang(lng_context_copy_selected), [this] { copySelectedText(); })->setEnabled(true);
} else {
if (item && !isUponSelected) {
auto mediaHasTextForCopy = false;
if (auto media = (msg ? msg->getMedia() : nullptr)) {
mediaHasTextForCopy = media->hasTextForCopy();
if (media->type() == MediaTypeWebPage && static_cast<HistoryWebPage*>(media)->attach()) {
media = static_cast<HistoryWebPage*>(media)->attach();
}
if (media->type() == MediaTypeSticker) {
if (auto document = media->getDocument()) {
if (document->sticker() && document->sticker()->set.type() != mtpc_inputStickerSetEmpty) {
_menu->addAction(lang(document->sticker()->setInstalled() ? lng_context_pack_info : lng_context_pack_add), [this] { showStickerPackInfo(); });
}
_menu->addAction(lang(lng_context_save_image), App::LambdaDelayed(st::defaultDropdownMenu.menu.ripple.hideDuration, this, [this, document] {
saveDocumentToFile(document);
}))->setEnabled(true);
}
} else if (media->type() == MediaTypeGif && !_contextMenuLink) {
if (auto document = media->getDocument()) {
if (document->loading()) {
_menu->addAction(lang(lng_context_cancel_download), [this] { cancelContextDownload(); })->setEnabled(true);
} else {
if (document->isGifv()) {
if (!cAutoPlayGif()) {
_menu->addAction(lang(lng_context_open_gif), [this] { openContextGif(); })->setEnabled(true);
}
}
if (!document->filepath(DocumentData::FilePathResolveChecked).isEmpty()) {
_menu->addAction(lang((cPlatform() == dbipMac || cPlatform() == dbipMacOld) ? lng_context_show_in_finder : lng_context_show_in_folder), [this] { showContextInFolder(); })->setEnabled(true);
}
_menu->addAction(lang(lng_context_save_file), App::LambdaDelayed(st::defaultDropdownMenu.menu.ripple.hideDuration, this, [this, document] {
saveDocumentToFile(document);
}))->setEnabled(true);
}
}
}
}
if (msg && !_contextMenuLink && (!msg->emptyText() || mediaHasTextForCopy)) {
_menu->addAction(lang(lng_context_copy_text), [this] { copyContextText(); })->setEnabled(true);
}
}
}
auto linkCopyToClipboardText = _contextMenuLink ? _contextMenuLink->copyToClipboardContextItemText() : QString();
if (!linkCopyToClipboardText.isEmpty()) {
_menu->addAction(linkCopyToClipboardText, [this] { copyContextUrl(); })->setEnabled(true);
}
App::contextItem(item);
}
if (_menu->actions().isEmpty()) {
delete base::take(_menu);
} else {
connect(_menu, &QObject::destroyed, this, [this](QObject *object) {
if (_menu == object) {
_menu = nullptr;
}
});
_menu->popup(e->globalPos());
e->accept();
}
}
void InnerWidget::savePhotoToFile(PhotoData *photo) {
if (!photo || !photo->date || !photo->loaded()) return;
auto filter = qsl("JPEG Image (*.jpg);;") + FileDialog::AllFilesFilter();
FileDialog::GetWritePath(lang(lng_save_photo), filter, filedialogDefaultName(qsl("photo"), qsl(".jpg")), base::lambda_guarded(this, [this, photo](const QString &result) {
if (!result.isEmpty()) {
photo->full->pix().toImage().save(result, "JPG");
}
}));
}
void InnerWidget::saveDocumentToFile(DocumentData *document) {
DocumentSaveClickHandler::doSave(document, true);
}
void InnerWidget::copyContextImage(PhotoData *photo) {
if (!photo || !photo->date || !photo->loaded()) return;
QApplication::clipboard()->setPixmap(photo->full->pix());
}
void InnerWidget::copySelectedText() {
setToClipboard(getSelectedText());
}
void InnerWidget::copyContextUrl() {
//if (_contextMenuLnk) {
// _contextMenuLnk->copyToClipboard();
//}
if (_contextMenuLink) {
_contextMenuLink->copyToClipboard();
}
}
void InnerWidget::showStickerPackInfo() {
if (!App::contextItem()) return;
if (auto media = App::contextItem()->getMedia()) {
if (auto doc = media->getDocument()) {
if (auto sticker = doc->sticker()) {
if (sticker->set.type() != mtpc_inputStickerSetEmpty) {
App::main()->stickersBox(sticker->set);
}
}
}
}
}
void InnerWidget::cancelContextDownload() {
if (auto lnkDocument = dynamic_cast<DocumentClickHandler*>(_contextMenuLink.data())) {
lnkDocument->document()->cancel();
} else if (auto item = App::contextItem()) {
if (auto media = item->getMedia()) {
if (auto doc = media->getDocument()) {
doc->cancel();
}
}
}
}
void InnerWidget::showContextInFolder() {
QString filepath;
if (auto lnkDocument = dynamic_cast<DocumentClickHandler*>(_contextMenuLink.data())) {
filepath = lnkDocument->document()->filepath(DocumentData::FilePathResolveChecked);
} else if (auto item = App::contextItem()) {
if (auto media = item->getMedia()) {
if (auto doc = media->getDocument()) {
filepath = doc->filepath(DocumentData::FilePathResolveChecked);
}
}
}
if (!filepath.isEmpty()) {
File::ShowInFolder(filepath);
}
}
void InnerWidget::openContextGif() {
if (auto item = App::contextItem()) {
if (auto media = item->getMedia()) {
if (auto document = media->getDocument()) {
_controller->window()->showDocument(document, item);
}
}
}
}
void InnerWidget::copyContextText() {
auto item = App::contextItem();
if (!item || (item->getMedia() && item->getMedia()->type() == MediaTypeSticker)) {
return;
}
setToClipboard(item->selectedText(FullSelection));
}
void InnerWidget::setToClipboard(const TextWithEntities &forClipboard, QClipboard::Mode mode) {
@ -866,7 +1121,7 @@ void InnerWidget::updateSelected() {
}
auto selection = TextSelection { qMin(second, _mouseTextSymbol), qMax(second, _mouseTextSymbol) };
if (_mouseSelectType != TextSelectType::Letters) {
_mouseActionItem->adjustSelection(selection, _mouseSelectType);
selection = _mouseActionItem->adjustSelection(selection, _mouseSelectType);
}
if (_selectedText != selection) {
_selectedText = selection;

View File

@ -97,8 +97,10 @@ protected:
void mousePressEvent(QMouseEvent *e) override;
void mouseMoveEvent(QMouseEvent *e) override;
void mouseReleaseEvent(QMouseEvent *e) override;
void mouseDoubleClickEvent(QMouseEvent *e) override;
void enterEventHook(QEvent *e) override;
void leaveEventHook(QEvent *e) override;
void contextMenuEvent(QContextMenuEvent *e) override;
// Resizes content and counts natural widget height for the desired width.
int resizeGetHeight(int newWidth) override;
@ -130,6 +132,20 @@ private:
QPoint mapPointToItem(QPoint point, const HistoryItem *item) const;
void handlePendingHistoryResize();
void showContextMenu(QContextMenuEvent *e, bool showFromTouch = false);
void savePhotoToFile(PhotoData *photo);
void saveDocumentToFile(DocumentData *document);
void copyContextImage(PhotoData *photo);
void showStickerPackInfo();
void copyContextUrl();
void cancelContextDownload();
void showContextInFolder();
void openContextGif();
void copyContextText();
void copySelectedText();
TextWithEntities getSelectedText() const;
void setToClipboard(const TextWithEntities &forClipboard, QClipboard::Mode mode = QClipboard::Clipboard);
void checkPreloadMore();
void updateVisibleTopItem();
void preloadMore(Direction direction);
@ -144,11 +160,6 @@ private:
void scrollDateCheck();
void scrollDateHideByTimer();
TextWithEntities getSelectedText() const;
void copySelectedText();
void copyContextUrl();
void setToClipboard(const TextWithEntities &forClipboard, QClipboard::Mode mode = QClipboard::Clipboard);
// This function finds all history items that are displayed and calls template method
// for each found message (in given direction) in the passed history with passed top offset.
//
@ -225,6 +236,8 @@ private:
QPoint _trippleClickPoint;
base::Timer _trippleClickTimer;
ClickHandlerPtr _contextMenuLink;
MTPDchannelAdminLogEventsFilter::Flags _filterFlags = 0;
std::vector<gsl::not_null<UserData*>> _filterAdmins;

View File

@ -1130,7 +1130,7 @@ void HistoryInner::contextMenuEvent(QContextMenuEvent *e) {
void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
if (_menu) {
_menu->deleteLater();
_menu = 0;
_menu = nullptr;
}
if (e->reason() == QContextMenuEvent::Mouse) {
mouseActionUpdate(e->globalPos());
@ -1140,7 +1140,8 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
auto canSendMessages = _widget->canSendMessages(_peer);
// -2 - has full selected items, but not over, -1 - has selection, but no over, 0 - no selection, 1 - over text, 2 - over full selected items
int32 isUponSelected = 0, hasSelected = 0;;
auto isUponSelected = 0;
auto hasSelected = 0;;
if (!_selected.isEmpty()) {
isUponSelected = -1;
if (_selected.cbegin().value() == FullSelection) {
@ -1170,10 +1171,10 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
_menu = new Ui::PopupMenu(nullptr);
_contextMenuLnk = ClickHandler::getActive();
_contextMenuLink = ClickHandler::getActive();
HistoryItem *item = App::hoveredItem() ? App::hoveredItem() : App::hoveredLinkItem();
PhotoClickHandler *lnkPhoto = dynamic_cast<PhotoClickHandler*>(_contextMenuLnk.data());
DocumentClickHandler *lnkDocument = dynamic_cast<DocumentClickHandler*>(_contextMenuLnk.data());
PhotoClickHandler *lnkPhoto = dynamic_cast<PhotoClickHandler*>(_contextMenuLink.data());
DocumentClickHandler *lnkDocument = dynamic_cast<DocumentClickHandler*>(_contextMenuLink.data());
bool lnkIsVideo = lnkDocument ? lnkDocument->document()->isVideo() : false;
bool lnkIsAudio = lnkDocument ? (lnkDocument->document()->voice() != nullptr) : false;
bool lnkIsSong = lnkDocument ? (lnkDocument->document()->song() != nullptr) : false;
@ -1197,7 +1198,9 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
_menu->addAction(lang(lng_context_save_image), App::LambdaDelayed(st::defaultDropdownMenu.menu.ripple.hideDuration, this, [this, photo = lnkPhoto->photo()] {
savePhotoToFile(photo);
}))->setEnabled(true);
_menu->addAction(lang(lng_context_copy_image), this, SLOT(copyContextImage()))->setEnabled(true);
_menu->addAction(lang(lng_context_copy_image), [this, photo = lnkPhoto->photo()] {
copyContextImage(photo);
})->setEnabled(true);
} else {
auto document = lnkDocument->document();
if (document->loading()) {
@ -1288,13 +1291,13 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
if (media->type() == MediaTypeSticker) {
if (auto document = media->getDocument()) {
if (document->sticker() && document->sticker()->set.type() != mtpc_inputStickerSetEmpty) {
_menu->addAction(lang(document->sticker()->setInstalled() ? lng_context_pack_info : lng_context_pack_add), _widget, SLOT(onStickerPackInfo()));
_menu->addAction(lang(document->sticker()->setInstalled() ? lng_context_pack_info : lng_context_pack_add), [this] { showStickerPackInfo(); });
}
_menu->addAction(lang(lng_context_save_image), App::LambdaDelayed(st::defaultDropdownMenu.menu.ripple.hideDuration, this, [this, document] {
saveDocumentToFile(document);
}))->setEnabled(true);
}
} else if (media->type() == MediaTypeGif && !_contextMenuLnk) {
} else if (media->type() == MediaTypeGif && !_contextMenuLink) {
if (auto document = media->getDocument()) {
if (document->loading()) {
_menu->addAction(lang(lng_context_cancel_download), this, SLOT(cancelContextDownload()))->setEnabled(true);
@ -1315,13 +1318,13 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
}
}
}
if (msg && !_contextMenuLnk && (!msg->emptyText() || mediaHasTextForCopy)) {
if (msg && !_contextMenuLink && (!msg->emptyText() || mediaHasTextForCopy)) {
_menu->addAction(lang(lng_context_copy_text), this, SLOT(copyContextText()))->setEnabled(true);
}
}
}
auto linkCopyToClipboardText = _contextMenuLnk ? _contextMenuLnk->copyToClipboardContextItemText() : QString();
auto linkCopyToClipboardText = _contextMenuLink ? _contextMenuLink->copyToClipboardContextItemText() : QString();
if (!linkCopyToClipboardText.isEmpty()) {
_menu->addAction(linkCopyToClipboardText, this, SLOT(copyContextUrl()))->setEnabled(true);
}
@ -1383,8 +1386,8 @@ void HistoryInner::copySelectedText() {
}
void HistoryInner::copyContextUrl() {
if (_contextMenuLnk) {
_contextMenuLnk->copyToClipboard();
if (_contextMenuLink) {
_contextMenuLink->copyToClipboard();
}
}
@ -1399,22 +1402,32 @@ void HistoryInner::savePhotoToFile(PhotoData *photo) {
}));
}
void HistoryInner::copyContextImage() {
PhotoClickHandler *lnk = dynamic_cast<PhotoClickHandler*>(_contextMenuLnk.data());
if (!lnk) return;
PhotoData *photo = lnk->photo();
void HistoryInner::copyContextImage(PhotoData *photo) {
if (!photo || !photo->date || !photo->loaded()) return;
QApplication::clipboard()->setPixmap(photo->full->pix());
}
void HistoryInner::showStickerPackInfo() {
if (!App::contextItem()) return;
if (auto media = App::contextItem()->getMedia()) {
if (auto doc = media->getDocument()) {
if (auto sticker = doc->sticker()) {
if (sticker->set.type() != mtpc_inputStickerSetEmpty) {
App::main()->stickersBox(sticker->set);
}
}
}
}
}
void HistoryInner::cancelContextDownload() {
if (DocumentClickHandler *lnkDocument = dynamic_cast<DocumentClickHandler*>(_contextMenuLnk.data())) {
if (auto lnkDocument = dynamic_cast<DocumentClickHandler*>(_contextMenuLink.data())) {
lnkDocument->document()->cancel();
} else if (HistoryItem *item = App::contextItem()) {
if (HistoryMedia *media = item->getMedia()) {
if (DocumentData *doc = media->getDocument()) {
} else if (auto item = App::contextItem()) {
if (auto media = item->getMedia()) {
if (auto doc = media->getDocument()) {
doc->cancel();
}
}
@ -1423,11 +1436,11 @@ void HistoryInner::cancelContextDownload() {
void HistoryInner::showContextInFolder() {
QString filepath;
if (DocumentClickHandler *lnkDocument = dynamic_cast<DocumentClickHandler*>(_contextMenuLnk.data())) {
if (auto lnkDocument = dynamic_cast<DocumentClickHandler*>(_contextMenuLink.data())) {
filepath = lnkDocument->document()->filepath(DocumentData::FilePathResolveChecked);
} else if (HistoryItem *item = App::contextItem()) {
if (HistoryMedia *media = item->getMedia()) {
if (DocumentData *doc = media->getDocument()) {
} else if (auto item = App::contextItem()) {
if (auto media = item->getMedia()) {
if (auto doc = media->getDocument()) {
filepath = doc->filepath(DocumentData::FilePathResolveChecked);
}
}
@ -2128,7 +2141,7 @@ void HistoryInner::onUpdateSelected() {
}
auto selState = TextSelection { qMin(second, _mouseTextSymbol), qMax(second, _mouseTextSymbol) };
if (_mouseSelectType != TextSelectType::Letters) {
_mouseActionItem->adjustSelection(selState, _mouseSelectType);
selState = _mouseActionItem->adjustSelection(selState, _mouseSelectType);
}
if (_selected[_mouseActionItem] != selState) {
_selected[_mouseActionItem] = selState;

View File

@ -109,7 +109,6 @@ public slots:
void onParentGeometryChanged();
void copyContextUrl();
void copyContextImage();
void cancelContextDownload();
void showContextInFolder();
void saveContextGif();
@ -145,6 +144,8 @@ private:
void itemRemoved(HistoryItem *item);
void savePhotoToFile(PhotoData *photo);
void saveDocumentToFile(DocumentData *document);
void copyContextImage(PhotoData *photo);
void showStickerPackInfo();
void touchResetSpeed();
void touchUpdateSpeed();
@ -227,7 +228,7 @@ private:
QPoint _trippleClickPoint;
QTimer _trippleClickTimer;
ClickHandlerPtr _contextMenuLnk;
ClickHandlerPtr _contextMenuLink;
HistoryItem *_dragSelFrom = nullptr;
HistoryItem *_dragSelTo = nullptr;

View File

@ -636,11 +636,11 @@ public:
return false;
}
virtual HistoryTextState getState(QPoint point, HistoryStateRequest request) const = 0;
virtual HistoryTextState getState(QPoint point, HistoryStateRequest request) const WARN_UNUSED_RESULT = 0;
virtual void updatePressed(QPoint point) {
}
virtual TextSelection adjustSelection(TextSelection selection, TextSelectType type) const {
virtual TextSelection adjustSelection(TextSelection selection, TextSelectType type) const WARN_UNUSED_RESULT {
return selection;
}
@ -990,10 +990,10 @@ protected:
return nullptr;
}
TextSelection skipTextSelection(TextSelection selection) const {
TextSelection skipTextSelection(TextSelection selection) const WARN_UNUSED_RESULT {
return internal::unshiftSelection(selection, _text);
}
TextSelection unskipTextSelection(TextSelection selection) const {
TextSelection unskipTextSelection(TextSelection selection) const WARN_UNUSED_RESULT {
return internal::shiftSelection(selection, _text);
}

View File

@ -80,23 +80,23 @@ public:
virtual bool toggleSelectionByHandlerClick(const ClickHandlerPtr &p) const = 0;
// if we press and drag on this media should we drag the item
virtual bool dragItem() const {
virtual bool dragItem() const WARN_UNUSED_RESULT {
return false;
}
virtual TextSelection adjustSelection(TextSelection selection, TextSelectType type) const {
virtual TextSelection adjustSelection(TextSelection selection, TextSelectType type) const WARN_UNUSED_RESULT {
return selection;
}
virtual bool consumeMessageText(const TextWithEntities &textWithEntities) {
virtual bool consumeMessageText(const TextWithEntities &textWithEntities) WARN_UNUSED_RESULT {
return false;
}
virtual uint16 fullSelectionLength() const {
virtual uint16 fullSelectionLength() const WARN_UNUSED_RESULT {
return 0;
}
TextSelection skipSelection(TextSelection selection) const {
TextSelection skipSelection(TextSelection selection) const WARN_UNUSED_RESULT {
return internal::unshiftSelection(selection, fullSelectionLength());
}
TextSelection unskipSelection(TextSelection selection) const {
TextSelection unskipSelection(TextSelection selection) const WARN_UNUSED_RESULT {
return internal::shiftSelection(selection, fullSelectionLength());
}

View File

@ -3630,11 +3630,11 @@ void HistoryWebPage::detachFromParent() {
}
TextWithEntities HistoryWebPage::selectedText(TextSelection selection) const {
if (selection == FullSelection) {
if (selection == FullSelection && !isLogEntryOriginal()) {
return TextWithEntities();
}
auto titleResult = _title.originalTextWithEntities(selection, ExpandLinksAll);
auto descriptionResult = _description.originalTextWithEntities(toDescriptionSelection(selection), ExpandLinksAll);
auto titleResult = _title.originalTextWithEntities((selection == FullSelection) ? AllTextSelection : selection, ExpandLinksAll);
auto descriptionResult = _description.originalTextWithEntities(toDescriptionSelection((selection == FullSelection) ? AllTextSelection : selection), ExpandLinksAll);
if (titleResult.text.isEmpty()) {
return descriptionResult;
} else if (descriptionResult.text.isEmpty()) {

View File

@ -136,7 +136,7 @@ public:
void draw(Painter &p, const QRect &r, TextSelection selection, TimeMs ms) const override;
HistoryTextState getState(QPoint point, HistoryStateRequest request) const override;
TextSelection adjustSelection(TextSelection selection, TextSelectType type) const override {
TextSelection adjustSelection(TextSelection selection, TextSelectType type) const override WARN_UNUSED_RESULT {
return _caption.adjustSelection(selection, type);
}
uint16 fullSelectionLength() const override {
@ -221,7 +221,7 @@ public:
void draw(Painter &p, const QRect &r, TextSelection selection, TimeMs ms) const override;
HistoryTextState getState(QPoint point, HistoryStateRequest request) const override;
TextSelection adjustSelection(TextSelection selection, TextSelectType type) const override {
TextSelection adjustSelection(TextSelection selection, TextSelectType type) const override WARN_UNUSED_RESULT {
return _caption.adjustSelection(selection, type);
}
uint16 fullSelectionLength() const override {
@ -372,7 +372,7 @@ public:
HistoryTextState getState(QPoint point, HistoryStateRequest request) const override;
void updatePressed(QPoint point) override;
TextSelection adjustSelection(TextSelection selection, TextSelectType type) const override {
TextSelection adjustSelection(TextSelection selection, TextSelectType type) const override WARN_UNUSED_RESULT {
if (auto captioned = Get<HistoryDocumentCaptioned>()) {
return captioned->_caption.adjustSelection(selection, type);
}
@ -484,7 +484,7 @@ public:
void draw(Painter &p, const QRect &r, TextSelection selection, TimeMs ms) const override;
HistoryTextState getState(QPoint point, HistoryStateRequest request) const override;
TextSelection adjustSelection(TextSelection selection, TextSelectType type) const override {
TextSelection adjustSelection(TextSelection selection, TextSelectType type) const override WARN_UNUSED_RESULT {
return _caption.adjustSelection(selection, type);
}
uint16 fullSelectionLength() const override {
@ -783,7 +783,7 @@ public:
void draw(Painter &p, const QRect &r, TextSelection selection, TimeMs ms) const override;
HistoryTextState getState(QPoint point, HistoryStateRequest request) const override;
TextSelection adjustSelection(TextSelection selection, TextSelectType type) const override;
TextSelection adjustSelection(TextSelection selection, TextSelectType type) const override WARN_UNUSED_RESULT;
uint16 fullSelectionLength() const override {
return _title.length() + _description.length();
}
@ -886,7 +886,7 @@ public:
void draw(Painter &p, const QRect &r, TextSelection selection, TimeMs ms) const override;
HistoryTextState getState(QPoint point, HistoryStateRequest request) const override;
TextSelection adjustSelection(TextSelection selection, TextSelectType type) const override;
TextSelection adjustSelection(TextSelection selection, TextSelectType type) const override WARN_UNUSED_RESULT;
uint16 fullSelectionLength() const override {
return _title.length() + _description.length();
}
@ -997,7 +997,7 @@ public:
void draw(Painter &p, const QRect &r, TextSelection selection, TimeMs ms) const override;
HistoryTextState getState(QPoint point, HistoryStateRequest request) const override;
TextSelection adjustSelection(TextSelection selection, TextSelectType type) const override;
TextSelection adjustSelection(TextSelection selection, TextSelectType type) const override WARN_UNUSED_RESULT;
uint16 fullSelectionLength() const override {
return _title.length() + _description.length();
}
@ -1083,7 +1083,7 @@ public:
void draw(Painter &p, const QRect &r, TextSelection selection, TimeMs ms) const override;
HistoryTextState getState(QPoint point, HistoryStateRequest request) const override;
TextSelection adjustSelection(TextSelection selection, TextSelectType type) const override;
TextSelection adjustSelection(TextSelection selection, TextSelectType type) const override WARN_UNUSED_RESULT;
uint16 fullSelectionLength() const override {
return _title.length() + _description.length();
}

View File

@ -1058,17 +1058,11 @@ void HistoryMessage::eraseFromOverview() {
}
TextWithEntities HistoryMessage::selectedText(TextSelection selection) const {
TextWithEntities textResult, mediaResult, logEntryOriginalResult;
if (selection == FullSelection) {
textResult = _text.originalTextWithEntities(AllTextSelection, ExpandLinksAll);
} else {
textResult = _text.originalTextWithEntities(selection, ExpandLinksAll);
}
TextWithEntities logEntryOriginalResult;
auto textResult = _text.originalTextWithEntities((selection == FullSelection) ? AllTextSelection : selection, ExpandLinksAll);
auto skipped = skipTextSelection(selection);
auto mediaDisplayed = (_media && _media->isDisplayed());
if (mediaDisplayed) {
mediaResult = _media->selectedText(skipped);
}
auto mediaResult = mediaDisplayed ? _media->selectedText(skipped) : TextWithEntities();
if (auto entry = Get<HistoryMessageLogEntryOriginal>()) {
logEntryOriginalResult = entry->_page->selectedText(mediaDisplayed ? _media->skipSelection(skipped) : skipped);
}

View File

@ -75,7 +75,7 @@ public:
bool hasPoint(QPoint point) const override;
HistoryTextState getState(QPoint point, HistoryStateRequest request) const override;
TextSelection adjustSelection(TextSelection selection, TextSelectType type) const override {
TextSelection adjustSelection(TextSelection selection, TextSelectType type) const override WARN_UNUSED_RESULT {
return _text.adjustSelection(selection, type);
}

View File

@ -5922,20 +5922,6 @@ void HistoryWidget::onFieldBarCancel() {
}
}
void HistoryWidget::onStickerPackInfo() {
if (!App::contextItem()) return;
if (HistoryMedia *media = App::contextItem()->getMedia()) {
if (DocumentData *doc = media->getDocument()) {
if (StickerData *sticker = doc->sticker()) {
if (sticker->set.type() != mtpc_inputStickerSetEmpty) {
App::main()->stickersBox(sticker->set);
}
}
}
}
}
void HistoryWidget::previewCancel() {
MTP::cancel(base::take(_previewRequest));
_previewData = nullptr;

View File

@ -388,8 +388,6 @@ public slots:
void onCancelSendAction();
void onStickerPackInfo();
void onPreviewParse();
void onPreviewCheck();
void onPreviewTimeout();

View File

@ -163,7 +163,7 @@ public:
return getStateElided(rtlpoint(point, outerw), width, request);
}
TextSelection adjustSelection(TextSelection selection, TextSelectType selectType) const;
TextSelection adjustSelection(TextSelection selection, TextSelectType selectType) const WARN_UNUSED_RESULT;
bool isFullSelection(TextSelection selection) const {
return (selection.from == 0) && (selection.to >= _text.size());
}