summary refs log tree commit diff
path: root/src/HistoryView.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/HistoryView.cc')
-rw-r--r--src/HistoryView.cc88
1 files changed, 81 insertions, 7 deletions
diff --git a/src/HistoryView.cc b/src/HistoryView.cc

index ce2e2f6c..f1e19aec 100644 --- a/src/HistoryView.cc +++ b/src/HistoryView.cc
@@ -17,6 +17,7 @@ #include <QDebug> #include <QScrollBar> +#include <QSettings> #include <QtWidgets/QLabel> #include <QtWidgets/QSpacerItem> @@ -51,18 +52,21 @@ void HistoryView::sliderRangeChanged(int min, int max) void HistoryView::addEvents(const QList<Event> &events) { + QSettings settings; + auto local_user = settings.value("auth/user_id").toString(); + for (const auto &event : events) { if (event.type() == "m.room.message") { auto msg_type = event.content().value("msgtype").toString(); + if (isPendingMessage(event, local_user)) { + removePendingMessage(event); + continue; + } + if (msg_type == "m.text" || msg_type == "m.notice") { auto with_sender = last_sender_ != event.sender(); - auto color = HistoryViewManager::NICK_COLORS.value(event.sender()); - - if (color.isEmpty()) { - color = HistoryViewManager::chooseRandomColor(); - HistoryViewManager::NICK_COLORS.insert(event.sender(), color); - } + auto color = HistoryViewManager::getUserColor(event.sender()); addHistoryItem(event, color, with_sender); last_sender_ = event.sender(); @@ -103,11 +107,81 @@ void HistoryView::init() void HistoryView::addHistoryItem(const Event &event, const QString &color, bool with_sender) { - // TODO: Probably create another function instead of passing the flag. HistoryViewItem *item = new HistoryViewItem(event, with_sender, color, scroll_widget_); scroll_layout_->addWidget(item); } +void HistoryView::updatePendingMessage(int txn_id, QString event_id) +{ + for (auto &msg : pending_msgs_) { + if (msg.txn_id == txn_id) { + msg.event_id = event_id; + break; + } + } +} + +bool HistoryView::isPendingMessage(const Event &event, const QString &userid) +{ + if (event.sender() != userid || event.type() != "m.room.message") + return false; + + auto msgtype = event.content().value("msgtype").toString(); + auto body = event.content().value("body").toString(); + + // FIXME: should contain more checks later on for other types of messages. + if (msgtype != "m.text") + return false; + + for (const auto &msg : pending_msgs_) { + if (msg.event_id == event.eventId() || msg.body == body) + return true; + } + + return false; +} + +void HistoryView::removePendingMessage(const Event &event) +{ + auto body = event.content().value("body").toString(); + + for (auto it = pending_msgs_.begin(); it != pending_msgs_.end(); it++) { + int index = std::distance(pending_msgs_.begin(), it); + + if (it->event_id == event.eventId() || it->body == body) { + pending_msgs_.removeAt(index); + break; + } + } +} + +void HistoryView::addUserTextMessage(const QString &body, int txn_id) +{ + QSettings settings; + auto user_id = settings.value("auth/user_id").toString(); + + auto with_sender = last_sender_ != user_id; + auto color = HistoryViewManager::getUserColor(user_id); + + HistoryViewItem *view_item; + + if (with_sender) + view_item = new HistoryViewItem(user_id, color, body, scroll_widget_); + else + view_item = new HistoryViewItem(body, scroll_widget_); + + scroll_layout_->addWidget(view_item); + + last_sender_ = user_id; + + PendingMessage message = {}; + message.txn_id = txn_id; + message.body = body; + message.widget = view_item; + + pending_msgs_.push_back(message); +} + HistoryView::~HistoryView() { }