aboutsummaryrefslogtreecommitdiff
path: root/lib/room.cpp
diff options
context:
space:
mode:
authorBlack Hat <bhat@encom.eu.org>2018-09-12 21:04:29 +0800
committerGitHub <noreply@github.com>2018-09-12 21:04:29 +0800
commit1e78ca6b9c09cb16677ab3db1656085adbd4901b (patch)
tree633a6e8fe8a244b44b510b608ec3103431a0e042 /lib/room.cpp
parent79f338877dec3de5ec7394f190025395877cb00b (diff)
parent2a1596c16baad77fc80391c66694101f91028deb (diff)
downloadlibquotient-1e78ca6b9c09cb16677ab3db1656085adbd4901b.tar.gz
libquotient-1e78ca6b9c09cb16677ab3db1656085adbd4901b.zip
Merge pull request #1 from QMatrixClient/master
Merge to latest commit.
Diffstat (limited to 'lib/room.cpp')
-rw-r--r--lib/room.cpp74
1 files changed, 29 insertions, 45 deletions
diff --git a/lib/room.cpp b/lib/room.cpp
index a22f477b..869a81c8 100644
--- a/lib/room.cpp
+++ b/lib/room.cpp
@@ -234,14 +234,13 @@ class Room::Private
*/
bool processRedaction(const RedactionEvent& redaction);
- std::pair<TagsMap, QStringList> setTags(TagsMap newTags);
- void broadcastTagUpdates(const TagsMap& additions,
- const QStringList& removals)
+ void setTags(TagsMap newTags);
+ void sendTagUpdates()
{
connection->callApi<SetAccountDataPerRoomJob>(
connection->userId(), id, TagEvent::matrixTypeId(),
TagEvent(tags).contentJson());
- emit q->tagsChanged(additions, removals);
+ emit q->tagsChanged();
}
QJsonObject toJson() const;
@@ -703,7 +702,7 @@ std::pair<bool, QString> validatedTag(QString name)
return { false, name };
qWarning(MAIN) << "The tag" << name
- << "doesn't follow the CS API conventions, check your client code";
+ << "doesn't follow the CS API conventions";
name.prepend("u.");
qWarning(MAIN) << "Using " << name << "instead";
@@ -717,8 +716,10 @@ void Room::addTag(const QString& name, const TagRecord& record)
(checkRes.first && d->tags.contains(checkRes.second)))
return;
+ emit tagsAboutToChange();
d->tags.insert(checkRes.second, record);
- d->broadcastTagUpdates({{ checkRes.second, record }}, {});
+ emit tagsChanged();
+ d->sendTagUpdates();
}
void Room::addTag(const QString& name, const QString& order)
@@ -728,43 +729,32 @@ void Room::addTag(const QString& name, const QString& order)
void Room::removeTag(const QString& name)
{
- if (!d->tags.contains(name))
- return;
-
- d->tags.remove(name);
- d->broadcastTagUpdates({}, {{ name }});
+ if (d->tags.contains(name))
+ {
+ emit tagsAboutToChange();
+ d->tags.remove(name);
+ emit tagsChanged();
+ d->sendTagUpdates();
+ } else if (!name.startsWith("u."))
+ removeTag("u." + name);
+ else
+ qWarning(MAIN) << "Tag" << name << "on room" << objectName()
+ << "not found, nothing to remove";
}
void Room::setTags(TagsMap newTags)
{
- const auto& changes = d->setTags(move(newTags));
- d->broadcastTagUpdates(changes.first, changes.second);
+ d->setTags(move(newTags));
+ d->sendTagUpdates();
}
-std::pair<TagsMap, QStringList> Room::Private::setTags(TagsMap newTags)
+void Room::Private::setTags(TagsMap newTags)
{
- if (newTags == tags)
- return {};
-
- TagsMap additions;
- const auto& tagNames = newTags.keys();
- for (const auto& t: tagNames)
- {
- const auto& checkRes = validatedTag(t);
- const auto& value = checkRes.first ?
- newTags.insert(checkRes.second, newTags.take(t)).value() :
- newTags.value(checkRes.second);
- if (!tags.contains(checkRes.second))
- additions.insert(checkRes.second, value);
- }
-
- QStringList removals;
- for (const auto& tag: tags.keys())
- if (!newTags.contains(tag))
- removals.push_back(tag);
-
- tags = newTags;
- return { additions, removals };
+ emit q->tagsAboutToChange();
+ tags = move(newTags);
+ qCDebug(MAIN) << "Room" << id << "is tagged with:"
+ << q->tagNames().join(", ");
+ emit q->tagsChanged();
}
bool Room::isFavourite() const
@@ -1851,15 +1841,8 @@ void Room::processEphemeralEvent(EventPtr&& event)
void Room::processAccountDataEvent(EventPtr&& event)
{
if (auto* evt = eventCast<TagEvent>(event))
- {
- const auto& changes = d->setTags(evt->tags());
- if (!(changes.first.empty() && changes.second.empty()))
- {
- qCDebug(MAIN) << "Room" << id() << "is tagged with:"
- << tagNames().join(", ");
- emit tagsChanged(changes.first, changes.second);
- }
- }
+ d->setTags(evt->tags());
+
if (auto* evt = eventCast<ReadMarkerEvent>(event))
{
auto readEventId = evt->event_id();
@@ -1877,6 +1860,7 @@ void Room::processAccountDataEvent(EventPtr&& event)
// efficient; maaybe do it another day
if (!currentData || currentData->contentJson() != event->contentJson())
{
+ emit accountDataAboutToChange(event->matrixType());
currentData = move(event);
qCDebug(MAIN) << "Updated account data of type"
<< currentData->matrixType();