Add basic support for replies (#292)

This commit is contained in:
Konstantinos Sideris 2018-06-30 15:13:15 +03:00
parent d56446ce97
commit 5b5d35fd1f
7 changed files with 41 additions and 1 deletions

View file

@ -76,6 +76,8 @@ signals:
void connectionLost(); void connectionLost();
void connectionRestored(); void connectionRestored();
void messageReply(const QString &username, const QString &msg);
void notificationsRetrieved(const mtx::responses::Notifications &); void notificationsRetrieved(const mtx::responses::Notifications &);
void uploadFailed(const QString &msg); void uploadFailed(const QString &msg);

View file

@ -144,6 +144,7 @@ public slots:
void openFileSelection(); void openFileSelection();
void hideUploadSpinner(); void hideUploadSpinner();
void focusLineEdit() { input_->setFocus(); } void focusLineEdit() { input_->setFocus(); }
void addReply(const QString &username, const QString &msg);
private slots: private slots:
void addSelectedEmoji(const QString &emoji); void addSelectedEmoji(const QString &emoji);

View file

@ -212,6 +212,8 @@ private:
void init(); void init();
//! Add a context menu option to save the image of the timeline item. //! Add a context menu option to save the image of the timeline item.
void addSaveImageAction(ImageItem *image); void addSaveImageAction(ImageItem *image);
//! Add the reply action in the context menu for widgets that support it.
void addReplyAction();
template<class Widget> template<class Widget>
void setupLocalWidgetLayout(Widget *widget, const QString &userid, bool withSender); void setupLocalWidgetLayout(Widget *widget, const QString &userid, bool withSender);
@ -240,6 +242,7 @@ private:
QAction *showReadReceipts_; QAction *showReadReceipts_;
QAction *markAsRead_; QAction *markAsRead_;
QAction *redactMsg_; QAction *redactMsg_;
QAction *replyMsg_;
QHBoxLayout *topLayout_ = nullptr; QHBoxLayout *topLayout_ = nullptr;
QHBoxLayout *messageLayout_ = nullptr; QHBoxLayout *messageLayout_ = nullptr;

View file

@ -605,6 +605,7 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent)
}); });
connect(this, &ChatPage::dropToLoginPageCb, this, &ChatPage::dropToLoginPage); connect(this, &ChatPage::dropToLoginPageCb, this, &ChatPage::dropToLoginPage);
connect(this, &ChatPage::messageReply, text_input_, &TextInputWidget::addReply);
instance_ = this; instance_ = this;
} }

View file

@ -614,3 +614,14 @@ TextInputWidget::paintEvent(QPaintEvent *)
p.setPen(QPen(borderColor())); p.setPen(QPen(borderColor()));
p.drawLine(QPointF(0, 0), QPointF(width(), 0)); p.drawLine(QPointF(0, 0), QPointF(width(), 0));
} }
void
TextInputWidget::addReply(const QString &username, const QString &msg)
{
input_->setText(QString("> %1: %2\n\n").arg(username).arg(msg));
input_->setFocus();
auto cursor = input_->textCursor();
cursor.movePosition(QTextCursor::End);
input_->setTextCursor(cursor);
}

View file

@ -125,6 +125,7 @@ TimelineItem::TimelineItem(mtx::events::MessageType ty,
, room_id_{room_id} , room_id_{room_id}
{ {
init(); init();
addReplyAction();
auto displayName = Cache::displayName(room_id_, userid); auto displayName = Cache::displayName(room_id_, userid);
auto timestamp = QDateTime::currentDateTime(); auto timestamp = QDateTime::currentDateTime();
@ -290,6 +291,7 @@ TimelineItem::TimelineItem(const mtx::events::RoomEvent<mtx::events::msg::Notice
, room_id_{room_id} , room_id_{room_id}
{ {
init(); init();
addReplyAction();
event_id_ = QString::fromStdString(event.event_id); event_id_ = QString::fromStdString(event.event_id);
const auto sender = QString::fromStdString(event.sender); const auto sender = QString::fromStdString(event.sender);
@ -341,6 +343,7 @@ TimelineItem::TimelineItem(const mtx::events::RoomEvent<mtx::events::msg::Emote>
, room_id_{room_id} , room_id_{room_id}
{ {
init(); init();
addReplyAction();
event_id_ = QString::fromStdString(event.event_id); event_id_ = QString::fromStdString(event.event_id);
const auto sender = QString::fromStdString(event.sender); const auto sender = QString::fromStdString(event.sender);
@ -388,6 +391,7 @@ TimelineItem::TimelineItem(const mtx::events::RoomEvent<mtx::events::msg::Text>
, room_id_{room_id} , room_id_{room_id}
{ {
init(); init();
addReplyAction();
event_id_ = QString::fromStdString(event.event_id); event_id_ = QString::fromStdString(event.event_id);
const auto sender = QString::fromStdString(event.sender); const auto sender = QString::fromStdString(event.sender);
@ -610,6 +614,24 @@ TimelineItem::addSaveImageAction(ImageItem *image)
} }
} }
void
TimelineItem::addReplyAction()
{
if (contextMenu_) {
auto replyAction = new QAction("Reply", this);
contextMenu_->addAction(replyAction);
connect(replyAction, &QAction::triggered, this, [this]() {
if (!body_)
return;
emit ChatPage::instance()->messageReply(
Cache::displayName(room_id_, descriptionMsg_.userid),
body_->toPlainText());
});
}
}
void void
TimelineItem::addAvatar() TimelineItem::addAvatar()
{ {

View file

@ -143,7 +143,7 @@ TimelineView::fetchHistory()
isPaginationInProgress_ = true; isPaginationInProgress_ = true;
getMessages(); getMessages();
paginationTimer_->start(5000); paginationTimer_->start(2000);
return; return;
} }