Change chat for forwarded items by click on them.

Closes #3637
This commit is contained in:
John Preston 2017-07-11 13:23:15 +03:00
parent d94ef82327
commit ac99784bf7
9 changed files with 84 additions and 62 deletions

View File

@ -2951,7 +2951,7 @@ void DialogsWidget::updateDragInScroll(bool inScroll) {
if (_dragInScroll != inScroll) { if (_dragInScroll != inScroll) {
_dragInScroll = inScroll; _dragInScroll = inScroll;
if (_dragInScroll) { if (_dragInScroll) {
App::main()->forwardLayer(1); App::main()->showForwardLayer(SelectedItemSet());
} else { } else {
App::main()->dialogsCancelled(); App::main()->dialogsCancelled();
} }

View File

@ -167,11 +167,6 @@ void stickersBox(const QString &name) {
if (MainWidget *m = main()) m->stickersBox(MTP_inputStickerSetShortName(MTP_string(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) { void removeDialog(History *history) {
if (MainWidget *m = main()) { if (MainWidget *m = main()) {
m->removeDialog(history); m->removeDialog(history);

View File

@ -73,7 +73,6 @@ void searchByHashtag(const QString &tag, PeerData *inPeer);
void openPeerByName(const QString &username, MsgId msgId = ShowAtUnreadMsgId, const QString &startToken = QString()); void openPeerByName(const QString &username, MsgId msgId = ShowAtUnreadMsgId, const QString &startToken = QString());
void joinGroupByHash(const QString &hash); void joinGroupByHash(const QString &hash);
void stickersBox(const QString &name); void stickersBox(const QString &name);
bool forward(const PeerId &peer, ForwardWhatMessages what);
void removeDialog(History *history); void removeDialog(History *history);
void showSettings(); void showSettings();

View File

@ -170,8 +170,8 @@ void ReportSpamPanel::setReported(bool reported, PeerData *onPeer) {
update(); update();
} }
HistoryHider::HistoryHider(MainWidget *parent, bool forwardSelected) : TWidget(parent) HistoryHider::HistoryHider(MainWidget *parent, const SelectedItemSet &items) : TWidget(parent)
, _forwardSelected(forwardSelected) , _forwardItems(items)
, _send(this, langFactory(lng_forward_send), st::defaultBoxButton) , _send(this, langFactory(lng_forward_send), st::defaultBoxButton)
, _cancel(this, langFactory(lng_cancel), st::defaultBoxButton) { , _cancel(this, langFactory(lng_cancel), st::defaultBoxButton) {
init(); init();
@ -318,7 +318,7 @@ void HistoryHider::forward() {
} else if (!_botAndQuery.isEmpty()) { } else if (!_botAndQuery.isEmpty()) {
parent()->onInlineSwitchChosen(_offered->id, _botAndQuery); parent()->onInlineSwitchChosen(_offered->id, _botAndQuery);
} else { } else {
parent()->onForward(_offered->id, _forwardSelected ? ForwardSelectedMessages : ForwardContextMessage); parent()->setForwardDraft(_offered->id, _forwardItems);
} }
} }
emit forwarded(); emit forwarded();
@ -401,7 +401,7 @@ bool HistoryHider::offerPeer(PeerId peer) {
} else { } else {
auto toId = _offered->id; auto toId = _offered->id;
_offered = nullptr; _offered = nullptr;
if (parent()->onForward(toId, _forwardSelected ? ForwardSelectedMessages : ForwardContextMessage)) { if (parent()->setForwardDraft(toId, _forwardItems)) {
startHide(); startHide();
} }
return false; return false;
@ -3320,14 +3320,14 @@ void HistoryWidget::mouseMoveEvent(QMouseEvent *e) {
void HistoryWidget::updateOverStates(QPoint pos) { void HistoryWidget::updateOverStates(QPoint pos) {
auto inField = pos.y() >= (_scroll->y() + _scroll->height()) && pos.y() < height() && pos.x() >= 0 && pos.x() < width(); 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 inPinnedMsg = QRect(0, _topBar->bottomNoMargins(), width(), st::historyReplyHeight).contains(pos) && _pinnedBar;
auto inClickable = inReplyEdit || inPinnedMsg; auto inClickable = inReplyEditForward || inPinnedMsg;
if (inField != _inField && _recording) { if (inField != _inField && _recording) {
_inField = inField; _inField = inField;
_send->setRecordActive(_inField); _send->setRecordActive(_inField);
} }
_inReplyEdit = inReplyEdit; _inReplyEditForward = inReplyEditForward;
_inPinnedMsg = inPinnedMsg; _inPinnedMsg = inPinnedMsg;
if (inClickable != _inClickable) { if (inClickable != _inClickable) {
_inClickable = inClickable; _inClickable = inClickable;
@ -3886,7 +3886,9 @@ void HistoryWidget::forwardMessage() {
auto item = App::contextItem(); auto item = App::contextItem();
if (!item || item->id < 0 || item->serviceMsg()) return; 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() { 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()); _replyForwardPressed = QRect(0, _field->y() - st::historySendPadding - st::historyReplyHeight, st::historyReplySkip, st::historyReplyHeight).contains(e->pos());
if (_replyForwardPressed && !_fieldBarCancel->isHidden()) { if (_replyForwardPressed && !_fieldBarCancel->isHidden()) {
updateField(); updateField();
} else if (_inReplyEdit) { } else if (_inReplyEditForward) {
Ui::showPeerHistory(_peer, _editMsgId ? _editMsgId : replyToId()); if (readyToForward()) {
auto items = _toForward;
App::main()->cancelForwarding(_history);
App::main()->showForwardLayer(items);
} else {
Ui::showPeerHistory(_peer, _editMsgId ? _editMsgId : replyToId());
}
} else if (_inPinnedMsg) { } else if (_inPinnedMsg) {
t_assert(_pinnedBar != nullptr); t_assert(_pinnedBar != nullptr);
Ui::showPeerHistory(_peer, _pinnedBar->msgId); Ui::showPeerHistory(_peer, _pinnedBar->msgId);
@ -5650,7 +5658,9 @@ void HistoryWidget::onReplyToMessage() {
auto item = App::contextItem(); auto item = App::contextItem();
if (!item || item->id < 0 || item->serviceMsg()) return; 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() { void HistoryWidget::onForwardSelected() {
if (!_list) return; if (!_list) return;
App::main()->forwardLayer(true); App::main()->showForwardLayer(getSelectedItems());
} }
void HistoryWidget::confirmDeleteContextItem() { void HistoryWidget::confirmDeleteContextItem() {

View File

@ -97,7 +97,7 @@ class HistoryHider : public TWidget, private base::Subscriber {
Q_OBJECT Q_OBJECT
public: 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, UserData *sharedContact); // share contact
HistoryHider(MainWidget *parent); // send path from command line argument HistoryHider(MainWidget *parent); // send path from command line argument
HistoryHider(MainWidget *parent, const QString &url, const QString &text); // share url HistoryHider(MainWidget *parent, const QString &url, const QString &text); // share url
@ -138,7 +138,7 @@ private:
MainWidget *parent(); MainWidget *parent();
UserData *_sharedContact = nullptr; UserData *_sharedContact = nullptr;
bool _forwardSelected = false; SelectedItemSet _forwardItems;
bool _sendPath = false; bool _sendPath = false;
QString _shareUrl, _shareText; QString _shareUrl, _shareText;
@ -804,7 +804,7 @@ private:
object_ptr<MessageField> _field; object_ptr<MessageField> _field;
bool _recording = false; bool _recording = false;
bool _inField = false; bool _inField = false;
bool _inReplyEdit = false; bool _inReplyEditForward = false;
bool _inPinnedMsg = false; bool _inPinnedMsg = false;
bool _inClickable = false; bool _inClickable = false;
int _recordingSamples = 0; int _recordingSamples = 0;

View File

@ -563,24 +563,7 @@ void MainWidget::finishFloatPlayerDrag(gsl::not_null<Float*> instance, bool clos
} }
} }
bool MainWidget::onForward(const PeerId &peerId, ForwardWhatMessages what) { bool MainWidget::setForwardDraft(PeerId peerId, ForwardWhatMessages what) {
Expects(peerId != 0);
auto peer = App::peer(peerId);
auto finishWithError = [this, what](const QString &error) {
Ui::show(Box<InformBox>(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));
}
auto toForward = SelectedItemSet(); auto toForward = SelectedItemSet();
if (what == ForwardSelectedMessages) { if (what == ForwardSelectedMessages) {
toForward = _overview ? _overview->getSelectedItems() : _history->getSelectedItems(); toForward = _overview ? _overview->getSelectedItems() : _history->getSelectedItems();
@ -597,22 +580,48 @@ bool MainWidget::onForward(const PeerId &peerId, ForwardWhatMessages what) {
toForward.insert(item->id, item); 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<InformBox>(error));
return false;
};
if (!peer->canWrite()) {
return finishWithError(lang(lng_forward_cant));
}
if (auto megagroup = peer->asMegagroup()) { 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)); 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)); 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)); 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)); 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)); return finishWithError(lang(lng_restricted_send_inline));
} }
} }
App::history(peer)->setForwardDraft(toForward); App::history(peer)->setForwardDraft(items);
_history->cancelReply(); if (_history->peer() == peer) {
_history->cancelReply();
}
Ui::showPeerHistory(peer, ShowAtUnreadMsgId); Ui::showPeerHistory(peer, ShowAtUnreadMsgId);
_history->onClearSelected(); _history->onClearSelected();
return true; return true;
@ -803,11 +812,11 @@ bool MainWidget::onSendPaths(const PeerId &peerId) {
void MainWidget::onFilesOrForwardDrop(const PeerId &peerId, const QMimeData *data) { void MainWidget::onFilesOrForwardDrop(const PeerId &peerId, const QMimeData *data) {
Expects(peerId != 0); Expects(peerId != 0);
if (data->hasFormat(qsl("application/x-td-forward-selected"))) { 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"))) { } 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"))) { } else if (data->hasFormat(qsl("application/x-td-forward-pressed"))) {
onForward(peerId, ForwardPressedMessage); setForwardDraft(peerId, ForwardPressedMessage);
} else { } else {
auto peer = App::peer(peerId); auto peer = App::peer(peerId);
if (!peer->canWrite()) { if (!peer->canWrite()) {
@ -983,8 +992,12 @@ void MainWidget::hiderLayer(object_ptr<HistoryHider> h) {
checkFloatPlayerVisibility(); checkFloatPlayerVisibility();
} }
void MainWidget::forwardLayer(int forwardSelected) { void MainWidget::showForwardLayer(const SelectedItemSet &items) {
hiderLayer((forwardSelected < 0) ? object_ptr<HistoryHider>(this) : object_ptr<HistoryHider>(this, forwardSelected > 0)); hiderLayer(object_ptr<HistoryHider>(this, items));
}
void MainWidget::showSendPathsLayer() {
hiderLayer(object_ptr<HistoryHider>(this));
} }
void MainWidget::deleteLayer(int selectedCount) { void MainWidget::deleteLayer(int selectedCount) {
@ -4494,7 +4507,7 @@ void MainWidget::activate() {
} }
} else if (App::wnd() && !Ui::isLayerShown()) { } else if (App::wnd() && !Ui::isLayerShown()) {
if (!cSendPaths().isEmpty()) { if (!cSendPaths().isEmpty()) {
forwardLayer(-1); showSendPathsLayer();
} else if (_history->peer()) { } else if (_history->peer()) {
_history->activate(); _history->activate();
} else { } else {

View File

@ -238,7 +238,8 @@ public:
int32 dlgsWidth() const; 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 deleteLayer(int selectedCount = 0); // 0 - context item
void cancelUploadLayer(); void cancelUploadLayer();
void shareContactLayer(UserData *contact); void shareContactLayer(UserData *contact);
@ -246,7 +247,8 @@ public:
void inlineSwitchLayer(const QString &botAndQuery); void inlineSwitchLayer(const QString &botAndQuery);
void hiderLayer(object_ptr<HistoryHider> h); void hiderLayer(object_ptr<HistoryHider> h);
void noHider(HistoryHider *destroyed); 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 onShareUrl(const PeerId &peer, const QString &url, const QString &text);
bool onInlineSwitchChosen(const PeerId &peer, const QString &botAndQuery); bool onInlineSwitchChosen(const PeerId &peer, const QString &botAndQuery);
void onShareContact(const PeerId &peer, UserData *contact); void onShareContact(const PeerId &peer, UserData *contact);

View File

@ -951,13 +951,14 @@ void MediaView::onShowInFolder() {
void MediaView::onForward() { void MediaView::onForward() {
auto item = App::histItemById(_msgmigrated ? 0 : _channel, _msgid); auto item = App::histItemById(_msgmigrated ? 0 : _channel, _msgid);
if (!_msgid || !item) return; if (!_msgid || !item || item->id < 0 || item->serviceMsg()) return;
if (App::wnd()) { if (App::wnd()) {
close(); close();
if (App::main()) { if (auto main = App::main()) {
App::contextItem(item); auto items = SelectedItemSet();
App::main()->forwardLayer(); items.insert(item->id, item);
main->showForwardLayer(items);
} }
} }
} }

View File

@ -1417,9 +1417,11 @@ void OverviewInner::goToMessage() {
void OverviewInner::forwardMessage() { void OverviewInner::forwardMessage() {
auto item = App::contextItem(); 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 { MsgId OverviewInner::complexMsgId(const HistoryItem *item) const {
@ -2336,7 +2338,7 @@ bool OverviewWidget::touchScroll(const QPoint &delta) {
} }
void OverviewWidget::onForwardSelected() { void OverviewWidget::onForwardSelected() {
App::main()->forwardLayer(true); App::main()->showForwardLayer(getSelectedItems());
} }
void OverviewWidget::confirmDeleteContextItem() { void OverviewWidget::confirmDeleteContextItem() {