diff --git a/Telegram/SourceFiles/dialogswidget.cpp b/Telegram/SourceFiles/dialogswidget.cpp index 4e98574f6a..8f9f1880ec 100644 --- a/Telegram/SourceFiles/dialogswidget.cpp +++ b/Telegram/SourceFiles/dialogswidget.cpp @@ -2951,7 +2951,7 @@ void DialogsWidget::updateDragInScroll(bool inScroll) { if (_dragInScroll != inScroll) { _dragInScroll = inScroll; if (_dragInScroll) { - App::main()->forwardLayer(1); + App::main()->showForwardLayer(SelectedItemSet()); } else { App::main()->dialogsCancelled(); } diff --git a/Telegram/SourceFiles/facades.cpp b/Telegram/SourceFiles/facades.cpp index 24f558af5c..9b938504dd 100644 --- a/Telegram/SourceFiles/facades.cpp +++ b/Telegram/SourceFiles/facades.cpp @@ -167,11 +167,6 @@ void stickersBox(const QString &name) { if (MainWidget *m = main()) m->stickersBox(MTP_inputStickerSetShortName(MTP_string(name))); } -bool forward(const PeerId &peer, ForwardWhatMessages what) { - if (MainWidget *m = main()) return m->onForward(peer, what); - return false; -} - void removeDialog(History *history) { if (MainWidget *m = main()) { m->removeDialog(history); diff --git a/Telegram/SourceFiles/facades.h b/Telegram/SourceFiles/facades.h index 00f08a7287..e7113572cd 100644 --- a/Telegram/SourceFiles/facades.h +++ b/Telegram/SourceFiles/facades.h @@ -73,7 +73,6 @@ void searchByHashtag(const QString &tag, PeerData *inPeer); void openPeerByName(const QString &username, MsgId msgId = ShowAtUnreadMsgId, const QString &startToken = QString()); void joinGroupByHash(const QString &hash); void stickersBox(const QString &name); -bool forward(const PeerId &peer, ForwardWhatMessages what); void removeDialog(History *history); void showSettings(); diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index af8ee7fadb..9e1d8b1bd9 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -170,8 +170,8 @@ void ReportSpamPanel::setReported(bool reported, PeerData *onPeer) { update(); } -HistoryHider::HistoryHider(MainWidget *parent, bool forwardSelected) : TWidget(parent) -, _forwardSelected(forwardSelected) +HistoryHider::HistoryHider(MainWidget *parent, const SelectedItemSet &items) : TWidget(parent) +, _forwardItems(items) , _send(this, langFactory(lng_forward_send), st::defaultBoxButton) , _cancel(this, langFactory(lng_cancel), st::defaultBoxButton) { init(); @@ -318,7 +318,7 @@ void HistoryHider::forward() { } else if (!_botAndQuery.isEmpty()) { parent()->onInlineSwitchChosen(_offered->id, _botAndQuery); } else { - parent()->onForward(_offered->id, _forwardSelected ? ForwardSelectedMessages : ForwardContextMessage); + parent()->setForwardDraft(_offered->id, _forwardItems); } } emit forwarded(); @@ -401,7 +401,7 @@ bool HistoryHider::offerPeer(PeerId peer) { } else { auto toId = _offered->id; _offered = nullptr; - if (parent()->onForward(toId, _forwardSelected ? ForwardSelectedMessages : ForwardContextMessage)) { + if (parent()->setForwardDraft(toId, _forwardItems)) { startHide(); } return false; @@ -3320,14 +3320,14 @@ void HistoryWidget::mouseMoveEvent(QMouseEvent *e) { void HistoryWidget::updateOverStates(QPoint pos) { auto inField = pos.y() >= (_scroll->y() + _scroll->height()) && pos.y() < height() && pos.x() >= 0 && pos.x() < width(); - auto inReplyEdit = QRect(st::historyReplySkip, _field->y() - st::historySendPadding - st::historyReplyHeight, width() - st::historyReplySkip - _fieldBarCancel->width(), st::historyReplyHeight).contains(pos) && (_editMsgId || replyToId()); + auto inReplyEditForward = QRect(st::historyReplySkip, _field->y() - st::historySendPadding - st::historyReplyHeight, width() - st::historyReplySkip - _fieldBarCancel->width(), st::historyReplyHeight).contains(pos) && (_editMsgId || replyToId() || readyToForward()); auto inPinnedMsg = QRect(0, _topBar->bottomNoMargins(), width(), st::historyReplyHeight).contains(pos) && _pinnedBar; - auto inClickable = inReplyEdit || inPinnedMsg; + auto inClickable = inReplyEditForward || inPinnedMsg; if (inField != _inField && _recording) { _inField = inField; _send->setRecordActive(_inField); } - _inReplyEdit = inReplyEdit; + _inReplyEditForward = inReplyEditForward; _inPinnedMsg = inPinnedMsg; if (inClickable != _inClickable) { _inClickable = inClickable; @@ -3886,7 +3886,9 @@ void HistoryWidget::forwardMessage() { auto item = App::contextItem(); if (!item || item->id < 0 || item->serviceMsg()) return; - App::main()->forwardLayer(); + auto items = SelectedItemSet(); + items.insert(item->id, item); + App::main()->showForwardLayer(items); } void HistoryWidget::selectMessage() { @@ -5270,8 +5272,14 @@ void HistoryWidget::mousePressEvent(QMouseEvent *e) { _replyForwardPressed = QRect(0, _field->y() - st::historySendPadding - st::historyReplyHeight, st::historyReplySkip, st::historyReplyHeight).contains(e->pos()); if (_replyForwardPressed && !_fieldBarCancel->isHidden()) { updateField(); - } else if (_inReplyEdit) { - Ui::showPeerHistory(_peer, _editMsgId ? _editMsgId : replyToId()); + } else if (_inReplyEditForward) { + if (readyToForward()) { + auto items = _toForward; + App::main()->cancelForwarding(_history); + App::main()->showForwardLayer(items); + } else { + Ui::showPeerHistory(_peer, _editMsgId ? _editMsgId : replyToId()); + } } else if (_inPinnedMsg) { t_assert(_pinnedBar != nullptr); Ui::showPeerHistory(_peer, _pinnedBar->msgId); @@ -5650,7 +5658,9 @@ void HistoryWidget::onReplyToMessage() { auto item = App::contextItem(); if (!item || item->id < 0 || item->serviceMsg()) return; - App::forward(_peer->id, ForwardContextMessage); + auto items = SelectedItemSet(); + items.insert(item->id, item); + App::main()->setForwardDraft(_peer->id, items); }))); } } @@ -6153,7 +6163,7 @@ void HistoryWidget::peerUpdated(PeerData *data) { void HistoryWidget::onForwardSelected() { if (!_list) return; - App::main()->forwardLayer(true); + App::main()->showForwardLayer(getSelectedItems()); } void HistoryWidget::confirmDeleteContextItem() { diff --git a/Telegram/SourceFiles/history/history_widget.h b/Telegram/SourceFiles/history/history_widget.h index 22ba2a57d2..472954c28b 100644 --- a/Telegram/SourceFiles/history/history_widget.h +++ b/Telegram/SourceFiles/history/history_widget.h @@ -97,7 +97,7 @@ class HistoryHider : public TWidget, private base::Subscriber { Q_OBJECT public: - HistoryHider(MainWidget *parent, bool forwardSelected); // forward messages + HistoryHider(MainWidget *parent, const SelectedItemSet &items); // forward messages HistoryHider(MainWidget *parent, UserData *sharedContact); // share contact HistoryHider(MainWidget *parent); // send path from command line argument HistoryHider(MainWidget *parent, const QString &url, const QString &text); // share url @@ -138,7 +138,7 @@ private: MainWidget *parent(); UserData *_sharedContact = nullptr; - bool _forwardSelected = false; + SelectedItemSet _forwardItems; bool _sendPath = false; QString _shareUrl, _shareText; @@ -804,7 +804,7 @@ private: object_ptr _field; bool _recording = false; bool _inField = false; - bool _inReplyEdit = false; + bool _inReplyEditForward = false; bool _inPinnedMsg = false; bool _inClickable = false; int _recordingSamples = 0; diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index 555db1a966..1e46433814 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -563,24 +563,7 @@ void MainWidget::finishFloatPlayerDrag(gsl::not_null instance, bool clos } } -bool MainWidget::onForward(const PeerId &peerId, ForwardWhatMessages what) { - Expects(peerId != 0); - auto peer = App::peer(peerId); - auto finishWithError = [this, what](const QString &error) { - Ui::show(Box(error)); - if (what == ForwardPressedMessage || what == ForwardPressedLinkMessage) { - // We've already released the mouse button, so the forwarding is cancelled. - if (_hider) { - _hider->startHide(); - noHider(_hider); - } - } - return false; - }; - if (!peer->canWrite()) { - return finishWithError(lang(lng_forward_cant)); - } - +bool MainWidget::setForwardDraft(PeerId peerId, ForwardWhatMessages what) { auto toForward = SelectedItemSet(); if (what == ForwardSelectedMessages) { toForward = _overview ? _overview->getSelectedItems() : _history->getSelectedItems(); @@ -597,22 +580,48 @@ bool MainWidget::onForward(const PeerId &peerId, ForwardWhatMessages what) { toForward.insert(item->id, item); } } + auto result = setForwardDraft(peerId, toForward); + if (!result) { + if (what == ForwardPressedMessage || what == ForwardPressedLinkMessage) { + // We've already released the mouse button, so the forwarding is cancelled. + if (_hider) { + _hider->startHide(); + noHider(_hider); + } + } + } + return result; +} + +bool MainWidget::setForwardDraft(PeerId peerId, const SelectedItemSet &items) { + Expects(peerId != 0); + auto peer = App::peer(peerId); + auto finishWithError = [this](const QString &error) { + Ui::show(Box(error)); + return false; + }; + if (!peer->canWrite()) { + return finishWithError(lang(lng_forward_cant)); + } + if (auto megagroup = peer->asMegagroup()) { - if (megagroup->restrictedRights().is_send_media() && HasMediaItems(toForward)) { + if (megagroup->restrictedRights().is_send_media() && HasMediaItems(items)) { return finishWithError(lang(lng_restricted_send_media)); - } else if (megagroup->restrictedRights().is_send_stickers() && HasStickerItems(toForward)) { + } else if (megagroup->restrictedRights().is_send_stickers() && HasStickerItems(items)) { return finishWithError(lang(lng_restricted_send_stickers)); - } else if (megagroup->restrictedRights().is_send_gifs() && HasGifItems(toForward)) { + } else if (megagroup->restrictedRights().is_send_gifs() && HasGifItems(items)) { return finishWithError(lang(lng_restricted_send_gifs)); - } else if (megagroup->restrictedRights().is_send_games() && HasGameItems(toForward)) { + } else if (megagroup->restrictedRights().is_send_games() && HasGameItems(items)) { return finishWithError(lang(lng_restricted_send_inline)); - } else if (megagroup->restrictedRights().is_send_inline() && HasInlineItems(toForward)) { + } else if (megagroup->restrictedRights().is_send_inline() && HasInlineItems(items)) { return finishWithError(lang(lng_restricted_send_inline)); } } - App::history(peer)->setForwardDraft(toForward); - _history->cancelReply(); + App::history(peer)->setForwardDraft(items); + if (_history->peer() == peer) { + _history->cancelReply(); + } Ui::showPeerHistory(peer, ShowAtUnreadMsgId); _history->onClearSelected(); return true; @@ -803,11 +812,11 @@ bool MainWidget::onSendPaths(const PeerId &peerId) { void MainWidget::onFilesOrForwardDrop(const PeerId &peerId, const QMimeData *data) { Expects(peerId != 0); if (data->hasFormat(qsl("application/x-td-forward-selected"))) { - onForward(peerId, ForwardSelectedMessages); + setForwardDraft(peerId, ForwardSelectedMessages); } else if (data->hasFormat(qsl("application/x-td-forward-pressed-link"))) { - onForward(peerId, ForwardPressedLinkMessage); + setForwardDraft(peerId, ForwardPressedLinkMessage); } else if (data->hasFormat(qsl("application/x-td-forward-pressed"))) { - onForward(peerId, ForwardPressedMessage); + setForwardDraft(peerId, ForwardPressedMessage); } else { auto peer = App::peer(peerId); if (!peer->canWrite()) { @@ -983,8 +992,12 @@ void MainWidget::hiderLayer(object_ptr h) { checkFloatPlayerVisibility(); } -void MainWidget::forwardLayer(int forwardSelected) { - hiderLayer((forwardSelected < 0) ? object_ptr(this) : object_ptr(this, forwardSelected > 0)); +void MainWidget::showForwardLayer(const SelectedItemSet &items) { + hiderLayer(object_ptr(this, items)); +} + +void MainWidget::showSendPathsLayer() { + hiderLayer(object_ptr(this)); } void MainWidget::deleteLayer(int selectedCount) { @@ -4494,7 +4507,7 @@ void MainWidget::activate() { } } else if (App::wnd() && !Ui::isLayerShown()) { if (!cSendPaths().isEmpty()) { - forwardLayer(-1); + showSendPathsLayer(); } else if (_history->peer()) { _history->activate(); } else { diff --git a/Telegram/SourceFiles/mainwidget.h b/Telegram/SourceFiles/mainwidget.h index c44376c0bb..91c03a3f40 100644 --- a/Telegram/SourceFiles/mainwidget.h +++ b/Telegram/SourceFiles/mainwidget.h @@ -238,7 +238,8 @@ public: int32 dlgsWidth() const; - void forwardLayer(int forwardSelected = 0); // -1 - send paths + void showForwardLayer(const SelectedItemSet &items); + void showSendPathsLayer(); void deleteLayer(int selectedCount = 0); // 0 - context item void cancelUploadLayer(); void shareContactLayer(UserData *contact); @@ -246,7 +247,8 @@ public: void inlineSwitchLayer(const QString &botAndQuery); void hiderLayer(object_ptr h); void noHider(HistoryHider *destroyed); - bool onForward(const PeerId &peer, ForwardWhatMessages what); + bool setForwardDraft(PeerId peer, ForwardWhatMessages what); + bool setForwardDraft(PeerId peer, const SelectedItemSet &items); bool onShareUrl(const PeerId &peer, const QString &url, const QString &text); bool onInlineSwitchChosen(const PeerId &peer, const QString &botAndQuery); void onShareContact(const PeerId &peer, UserData *contact); diff --git a/Telegram/SourceFiles/mediaview.cpp b/Telegram/SourceFiles/mediaview.cpp index b5e34581d6..a4ccaa6f2d 100644 --- a/Telegram/SourceFiles/mediaview.cpp +++ b/Telegram/SourceFiles/mediaview.cpp @@ -951,13 +951,14 @@ void MediaView::onShowInFolder() { void MediaView::onForward() { auto item = App::histItemById(_msgmigrated ? 0 : _channel, _msgid); - if (!_msgid || !item) return; + if (!_msgid || !item || item->id < 0 || item->serviceMsg()) return; if (App::wnd()) { close(); - if (App::main()) { - App::contextItem(item); - App::main()->forwardLayer(); + if (auto main = App::main()) { + auto items = SelectedItemSet(); + items.insert(item->id, item); + main->showForwardLayer(items); } } } diff --git a/Telegram/SourceFiles/overviewwidget.cpp b/Telegram/SourceFiles/overviewwidget.cpp index 6623f73c6b..9e3ac65497 100644 --- a/Telegram/SourceFiles/overviewwidget.cpp +++ b/Telegram/SourceFiles/overviewwidget.cpp @@ -1417,9 +1417,11 @@ void OverviewInner::goToMessage() { void OverviewInner::forwardMessage() { auto item = App::contextItem(); - if (!item || item->id < 0) return; + if (!item || item->id < 0 || item->serviceMsg()) return; - App::main()->forwardLayer(); + auto items = SelectedItemSet(); + items.insert(item->id, item); + App::main()->showForwardLayer(items); } MsgId OverviewInner::complexMsgId(const HistoryItem *item) const { @@ -2336,7 +2338,7 @@ bool OverviewWidget::touchScroll(const QPoint &delta) { } void OverviewWidget::onForwardSelected() { - App::main()->forwardLayer(true); + App::main()->showForwardLayer(getSelectedItems()); } void OverviewWidget::confirmDeleteContextItem() {