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) {
_dragInScroll = inScroll;
if (_dragInScroll) {
App::main()->forwardLayer(1);
App::main()->showForwardLayer(SelectedItemSet());
} else {
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)));
}
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);

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 joinGroupByHash(const QString &hash);
void stickersBox(const QString &name);
bool forward(const PeerId &peer, ForwardWhatMessages what);
void removeDialog(History *history);
void showSettings();

View File

@ -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() {

View File

@ -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<MessageField> _field;
bool _recording = false;
bool _inField = false;
bool _inReplyEdit = false;
bool _inReplyEditForward = false;
bool _inPinnedMsg = false;
bool _inClickable = false;
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) {
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));
}
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<InformBox>(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<HistoryHider> h) {
checkFloatPlayerVisibility();
}
void MainWidget::forwardLayer(int forwardSelected) {
hiderLayer((forwardSelected < 0) ? object_ptr<HistoryHider>(this) : object_ptr<HistoryHider>(this, forwardSelected > 0));
void MainWidget::showForwardLayer(const SelectedItemSet &items) {
hiderLayer(object_ptr<HistoryHider>(this, items));
}
void MainWidget::showSendPathsLayer() {
hiderLayer(object_ptr<HistoryHider>(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 {

View File

@ -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<HistoryHider> 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);

View File

@ -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);
}
}
}

View File

@ -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() {