mirror of https://github.com/procxx/kepka.git
Event log context menu + improved text selection.
This commit is contained in:
parent
624f33c5e2
commit
816ee794e8
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -388,8 +388,6 @@ public slots:
|
|||
|
||||
void onCancelSendAction();
|
||||
|
||||
void onStickerPackInfo();
|
||||
|
||||
void onPreviewParse();
|
||||
void onPreviewCheck();
|
||||
void onPreviewTimeout();
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue