diff --git a/Telegram/SourceFiles/history/history_admin_log_inner.cpp b/Telegram/SourceFiles/history/history_admin_log_inner.cpp index 670bfb30d..865cc5315 100644 --- a/Telegram/SourceFiles/history/history_admin_log_inner.cpp +++ b/Telegram/SourceFiles/history/history_admin_log_inner.cpp @@ -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(_contextMenuLink.data()); + auto lnkDocument = dynamic_cast(_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(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(media)->attach()) { + media = static_cast(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(_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(_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; diff --git a/Telegram/SourceFiles/history/history_admin_log_inner.h b/Telegram/SourceFiles/history/history_admin_log_inner.h index 3c0ac7252..1eb839d92 100644 --- a/Telegram/SourceFiles/history/history_admin_log_inner.h +++ b/Telegram/SourceFiles/history/history_admin_log_inner.h @@ -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> _filterAdmins; diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index 730de50ba..ad0359a6d 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -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(_contextMenuLnk.data()); - DocumentClickHandler *lnkDocument = dynamic_cast(_contextMenuLnk.data()); + PhotoClickHandler *lnkPhoto = dynamic_cast(_contextMenuLink.data()); + DocumentClickHandler *lnkDocument = dynamic_cast(_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(_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(_contextMenuLnk.data())) { + if (auto lnkDocument = dynamic_cast(_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(_contextMenuLnk.data())) { + if (auto lnkDocument = dynamic_cast(_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; diff --git a/Telegram/SourceFiles/history/history_inner_widget.h b/Telegram/SourceFiles/history/history_inner_widget.h index 282d94ff0..e09c4e373 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.h +++ b/Telegram/SourceFiles/history/history_inner_widget.h @@ -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; diff --git a/Telegram/SourceFiles/history/history_item.h b/Telegram/SourceFiles/history/history_item.h index 24df6d942..5e5c52168 100644 --- a/Telegram/SourceFiles/history/history_item.h +++ b/Telegram/SourceFiles/history/history_item.h @@ -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); } diff --git a/Telegram/SourceFiles/history/history_media.h b/Telegram/SourceFiles/history/history_media.h index 636cd019d..a658b8ca6 100644 --- a/Telegram/SourceFiles/history/history_media.h +++ b/Telegram/SourceFiles/history/history_media.h @@ -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()); } diff --git a/Telegram/SourceFiles/history/history_media_types.cpp b/Telegram/SourceFiles/history/history_media_types.cpp index d03ca3178..a30eb47f7 100644 --- a/Telegram/SourceFiles/history/history_media_types.cpp +++ b/Telegram/SourceFiles/history/history_media_types.cpp @@ -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()) { diff --git a/Telegram/SourceFiles/history/history_media_types.h b/Telegram/SourceFiles/history/history_media_types.h index 65bfeba57..23231a0d9 100644 --- a/Telegram/SourceFiles/history/history_media_types.h +++ b/Telegram/SourceFiles/history/history_media_types.h @@ -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()) { 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(); } diff --git a/Telegram/SourceFiles/history/history_message.cpp b/Telegram/SourceFiles/history/history_message.cpp index a94b04449..7d42d835c 100644 --- a/Telegram/SourceFiles/history/history_message.cpp +++ b/Telegram/SourceFiles/history/history_message.cpp @@ -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()) { logEntryOriginalResult = entry->_page->selectedText(mediaDisplayed ? _media->skipSelection(skipped) : skipped); } diff --git a/Telegram/SourceFiles/history/history_service.h b/Telegram/SourceFiles/history/history_service.h index 914098852..2129036e4 100644 --- a/Telegram/SourceFiles/history/history_service.h +++ b/Telegram/SourceFiles/history/history_service.h @@ -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); } diff --git a/Telegram/SourceFiles/historywidget.cpp b/Telegram/SourceFiles/historywidget.cpp index 5f9395aae..8868401f2 100644 --- a/Telegram/SourceFiles/historywidget.cpp +++ b/Telegram/SourceFiles/historywidget.cpp @@ -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; diff --git a/Telegram/SourceFiles/historywidget.h b/Telegram/SourceFiles/historywidget.h index 46cfa0db7..22ba2a57d 100644 --- a/Telegram/SourceFiles/historywidget.h +++ b/Telegram/SourceFiles/historywidget.h @@ -388,8 +388,6 @@ public slots: void onCancelSendAction(); - void onStickerPackInfo(); - void onPreviewParse(); void onPreviewCheck(); void onPreviewTimeout(); diff --git a/Telegram/SourceFiles/ui/text/text.h b/Telegram/SourceFiles/ui/text/text.h index 7698da1b1..4eccd56c7 100644 --- a/Telegram/SourceFiles/ui/text/text.h +++ b/Telegram/SourceFiles/ui/text/text.h @@ -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()); }