Merge remote-tracking branch 'upstream/master' into voip
This commit is contained in:
commit
c73cfe1810
15 changed files with 179 additions and 128 deletions
|
|
@ -589,8 +589,12 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent)
|
|||
emit notificationsRetrieved(std::move(res));
|
||||
});
|
||||
});
|
||||
connect(this, &ChatPage::syncRoomlist, room_list_, &RoomList::sync);
|
||||
connect(this, &ChatPage::syncTags, communitiesList_, &CommunitiesList::syncTags);
|
||||
connect(this, &ChatPage::syncRoomlist, room_list_, &RoomList::sync, Qt::QueuedConnection);
|
||||
connect(this,
|
||||
&ChatPage::syncTags,
|
||||
communitiesList_,
|
||||
&CommunitiesList::syncTags,
|
||||
Qt::QueuedConnection);
|
||||
connect(
|
||||
this, &ChatPage::syncTopBar, this, [this](const std::map<QString, RoomInfo> &updates) {
|
||||
if (updates.find(currentRoom()) != updates.end())
|
||||
|
|
@ -605,11 +609,15 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent)
|
|||
user_info_widget_->setDisplayName(name);
|
||||
});
|
||||
|
||||
connect(this, &ChatPage::tryInitialSyncCb, this, &ChatPage::tryInitialSync);
|
||||
connect(this, &ChatPage::trySyncCb, this, &ChatPage::trySync);
|
||||
connect(this, &ChatPage::tryDelayedSyncCb, this, [this]() {
|
||||
QTimer::singleShot(RETRY_TIMEOUT, this, &ChatPage::trySync);
|
||||
});
|
||||
connect(
|
||||
this, &ChatPage::tryInitialSyncCb, this, &ChatPage::tryInitialSync, Qt::QueuedConnection);
|
||||
connect(this, &ChatPage::trySyncCb, this, &ChatPage::trySync, Qt::QueuedConnection);
|
||||
connect(
|
||||
this,
|
||||
&ChatPage::tryDelayedSyncCb,
|
||||
this,
|
||||
[this]() { QTimer::singleShot(RETRY_TIMEOUT, this, &ChatPage::trySync); },
|
||||
Qt::QueuedConnection);
|
||||
|
||||
connect(this, &ChatPage::dropToLoginPageCb, this, &ChatPage::dropToLoginPage);
|
||||
|
||||
|
|
|
|||
|
|
@ -53,9 +53,9 @@ namespace strings {
|
|||
const QString url_html = "<a href=\"\\1\">\\1</a>";
|
||||
const QRegularExpression url_regex(
|
||||
// match an URL, that is not quoted, i.e.
|
||||
// vvvvvv match quote via negative lookahead/lookbehind vv
|
||||
// vvvv atomic match url -> fail if there is a " before or after vvv
|
||||
R"((?<!")(?>((www\.(?!\.)|[a-z][a-z0-9+.-]*://)[^\s<>'"]+[^!,\.\s<>'"\]\)\:]))(?!"))");
|
||||
// vvvvvv match quote via negative lookahead/lookbehind vv
|
||||
// vvvv atomic match url -> fail if there is a " before or after vvv
|
||||
R"((?<!["'])(?>((www\.(?!\.)|[a-z][a-z0-9+.-]*://)[^\s<>'"]+[^!,\.\s<>'"\]\)\:]))(?!["']))");
|
||||
}
|
||||
|
||||
// Window geometry.
|
||||
|
|
|
|||
|
|
@ -85,8 +85,10 @@ struct EventFormattedBody
|
|||
template<class T>
|
||||
std::string operator()(const mtx::events::RoomEvent<T> &e)
|
||||
{
|
||||
if constexpr (is_detected<formatted_body_t, T>::value)
|
||||
return e.content.formatted_body;
|
||||
if constexpr (is_detected<formatted_body_t, T>::value) {
|
||||
if (e.content.format == "org.matrix.custom.html")
|
||||
return e.content.formatted_body;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -159,72 +159,96 @@ TimelineModel::TimelineModel(TimelineViewManager *manager, QString room_id, QObj
|
|||
, room_id_(room_id)
|
||||
, manager_(manager)
|
||||
{
|
||||
connect(this,
|
||||
&TimelineModel::oldMessagesRetrieved,
|
||||
this,
|
||||
&TimelineModel::addBackwardsEvents,
|
||||
Qt::QueuedConnection);
|
||||
connect(
|
||||
this, &TimelineModel::oldMessagesRetrieved, this, &TimelineModel::addBackwardsEvents);
|
||||
connect(this, &TimelineModel::messageFailed, this, [this](QString txn_id) {
|
||||
nhlog::ui()->error("Failed to send {}, retrying", txn_id.toStdString());
|
||||
|
||||
QTimer::singleShot(5000, this, [this]() { emit nextPendingMessage(); });
|
||||
});
|
||||
connect(this, &TimelineModel::messageSent, this, [this](QString txn_id, QString event_id) {
|
||||
pending.removeOne(txn_id);
|
||||
|
||||
auto ev = events.value(txn_id);
|
||||
|
||||
if (auto reaction =
|
||||
std::get_if<mtx::events::RoomEvent<mtx::events::msg::Reaction>>(&ev)) {
|
||||
QString reactedTo =
|
||||
QString::fromStdString(reaction->content.relates_to.event_id);
|
||||
auto &rModel = reactions[reactedTo];
|
||||
rModel.removeReaction(*reaction);
|
||||
auto rCopy = *reaction;
|
||||
rCopy.event_id = event_id.toStdString();
|
||||
rModel.addReaction(room_id_.toStdString(), rCopy);
|
||||
}
|
||||
|
||||
int idx = idToIndex(txn_id);
|
||||
if (idx < 0) {
|
||||
// transaction already received via sync
|
||||
return;
|
||||
}
|
||||
eventOrder[idx] = event_id;
|
||||
ev = std::visit(
|
||||
[event_id](const auto &e) -> mtx::events::collections::TimelineEvents {
|
||||
auto eventCopy = e;
|
||||
eventCopy.event_id = event_id.toStdString();
|
||||
return eventCopy;
|
||||
},
|
||||
ev);
|
||||
|
||||
events.remove(txn_id);
|
||||
events.insert(event_id, ev);
|
||||
|
||||
// mark our messages as read
|
||||
readEvent(event_id.toStdString());
|
||||
|
||||
emit dataChanged(index(idx, 0), index(idx, 0));
|
||||
|
||||
if (pending.size() > 0)
|
||||
emit nextPendingMessage();
|
||||
});
|
||||
connect(this, &TimelineModel::redactionFailed, this, [](const QString &msg) {
|
||||
emit ChatPage::instance()->showNotification(msg);
|
||||
});
|
||||
this,
|
||||
&TimelineModel::messageFailed,
|
||||
this,
|
||||
[this](QString txn_id) {
|
||||
nhlog::ui()->error("Failed to send {}, retrying", txn_id.toStdString());
|
||||
|
||||
QTimer::singleShot(5000, this, [this]() { emit nextPendingMessage(); });
|
||||
},
|
||||
Qt::QueuedConnection);
|
||||
connect(
|
||||
this, &TimelineModel::nextPendingMessage, this, &TimelineModel::processOnePendingMessage);
|
||||
connect(this, &TimelineModel::newMessageToSend, this, &TimelineModel::addPendingMessage);
|
||||
this,
|
||||
&TimelineModel::messageSent,
|
||||
this,
|
||||
[this](QString txn_id, QString event_id) {
|
||||
pending.removeOne(txn_id);
|
||||
|
||||
auto ev = events.value(txn_id);
|
||||
|
||||
if (auto reaction =
|
||||
std::get_if<mtx::events::RoomEvent<mtx::events::msg::Reaction>>(&ev)) {
|
||||
QString reactedTo =
|
||||
QString::fromStdString(reaction->content.relates_to.event_id);
|
||||
auto &rModel = reactions[reactedTo];
|
||||
rModel.removeReaction(*reaction);
|
||||
auto rCopy = *reaction;
|
||||
rCopy.event_id = event_id.toStdString();
|
||||
rModel.addReaction(room_id_.toStdString(), rCopy);
|
||||
}
|
||||
|
||||
int idx = idToIndex(txn_id);
|
||||
if (idx < 0) {
|
||||
// transaction already received via sync
|
||||
return;
|
||||
}
|
||||
eventOrder[idx] = event_id;
|
||||
ev = std::visit(
|
||||
[event_id](const auto &e) -> mtx::events::collections::TimelineEvents {
|
||||
auto eventCopy = e;
|
||||
eventCopy.event_id = event_id.toStdString();
|
||||
return eventCopy;
|
||||
},
|
||||
ev);
|
||||
|
||||
events.remove(txn_id);
|
||||
events.insert(event_id, ev);
|
||||
|
||||
// mark our messages as read
|
||||
readEvent(event_id.toStdString());
|
||||
|
||||
emit dataChanged(index(idx, 0), index(idx, 0));
|
||||
|
||||
if (pending.size() > 0)
|
||||
emit nextPendingMessage();
|
||||
},
|
||||
Qt::QueuedConnection);
|
||||
connect(
|
||||
this,
|
||||
&TimelineModel::redactionFailed,
|
||||
this,
|
||||
[](const QString &msg) { emit ChatPage::instance()->showNotification(msg); },
|
||||
Qt::QueuedConnection);
|
||||
|
||||
connect(this,
|
||||
&TimelineModel::eventFetched,
|
||||
&TimelineModel::nextPendingMessage,
|
||||
this,
|
||||
[this](QString requestingEvent, mtx::events::collections::TimelineEvents event) {
|
||||
events.insert(QString::fromStdString(mtx::accessors::event_id(event)),
|
||||
event);
|
||||
auto idx = idToIndex(requestingEvent);
|
||||
if (idx >= 0)
|
||||
emit dataChanged(index(idx, 0), index(idx, 0));
|
||||
});
|
||||
&TimelineModel::processOnePendingMessage,
|
||||
Qt::QueuedConnection);
|
||||
connect(this,
|
||||
&TimelineModel::newMessageToSend,
|
||||
this,
|
||||
&TimelineModel::addPendingMessage,
|
||||
Qt::QueuedConnection);
|
||||
|
||||
connect(
|
||||
this,
|
||||
&TimelineModel::eventFetched,
|
||||
this,
|
||||
[this](QString requestingEvent, mtx::events::collections::TimelineEvents event) {
|
||||
events.insert(QString::fromStdString(mtx::accessors::event_id(event)), event);
|
||||
auto idx = idToIndex(requestingEvent);
|
||||
if (idx >= 0)
|
||||
emit dataChanged(index(idx, 0), index(idx, 0));
|
||||
},
|
||||
Qt::QueuedConnection);
|
||||
}
|
||||
|
||||
QHash<int, QByteArray>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
#include "TimelineViewManager.h"
|
||||
|
||||
#include <QDesktopServices>
|
||||
#include <QMetaType>
|
||||
#include <QPalette>
|
||||
#include <QQmlContext>
|
||||
|
|
@ -112,7 +113,10 @@ TimelineViewManager::TimelineViewManager(QSharedPointer<UserSettings> userSettin
|
|||
container = view;
|
||||
view->setResizeMode(QQuickWidget::SizeRootObjectToView);
|
||||
container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
|
||||
view->quickWindow()->setTextRenderType(QQuickWindow::NativeTextRendering);
|
||||
#endif
|
||||
|
||||
connect(view, &QQuickWidget::statusChanged, this, [](QQuickWidget::Status status) {
|
||||
nhlog::ui()->debug("Status changed to {}", status);
|
||||
|
|
@ -231,6 +235,12 @@ TimelineViewManager::openImageOverlay(QString mxcUrl, QString eventId) const
|
|||
});
|
||||
}
|
||||
|
||||
void
|
||||
TimelineViewManager::openLink(QString link) const
|
||||
{
|
||||
QDesktopServices::openUrl(link);
|
||||
}
|
||||
|
||||
void
|
||||
TimelineViewManager::updateReadReceipts(const QString &room_id,
|
||||
const std::vector<QString> &event_ids)
|
||||
|
|
|
|||
|
|
@ -50,6 +50,8 @@ public:
|
|||
Q_INVOKABLE QString userPresence(QString id) const;
|
||||
Q_INVOKABLE QString userStatus(QString id) const;
|
||||
|
||||
Q_INVOKABLE void openLink(QString link) const;
|
||||
|
||||
signals:
|
||||
void clearRoomMessageCount(QString roomid);
|
||||
void updateRoomsLastMessage(QString roomid, const DescInfo &info);
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ SnackBar::hideMessage()
|
|||
// Moving on to the next message.
|
||||
messages_.pop_front();
|
||||
|
||||
// Reseting the starting position of the widget.
|
||||
// Resetting the starting position of the widget.
|
||||
offset_ = STARTING_OFFSET;
|
||||
|
||||
if (!messages_.empty())
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue