Use QSharedPointer to save RoomStates

This commit is contained in:
Konstantinos Sideris 2018-01-13 17:15:47 +02:00
parent d2962ec0b2
commit 3929261a8e
8 changed files with 108 additions and 107 deletions

View file

@ -69,7 +69,8 @@ class Cache
public: public:
Cache(const QString &userId); Cache(const QString &userId);
void setState(const QString &nextBatchToken, const QMap<QString, RoomState> &states); void setState(const QString &nextBatchToken,
const QMap<QString, QSharedPointer<RoomState>> &states);
bool isInitialized() const; bool isInitialized() const;
QString nextBatchToken() const; QString nextBatchToken() const;
@ -107,7 +108,9 @@ public:
private: private:
void setNextBatchToken(lmdb::txn &txn, const QString &token); void setNextBatchToken(lmdb::txn &txn, const QString &token);
void insertRoomState(lmdb::txn &txn, const QString &roomid, const RoomState &state); void insertRoomState(lmdb::txn &txn,
const QString &roomid,
const QSharedPointer<RoomState> &state);
lmdb::env env_; lmdb::env env_;
lmdb::dbi stateDb_; lmdb::dbi stateDb_;

View file

@ -97,7 +97,7 @@ private:
static ChatPage *instance_; static ChatPage *instance_;
using UserID = QString; using UserID = QString;
using RoomStates = QMap<UserID, RoomState>; using RoomStates = QMap<UserID, QSharedPointer<RoomState>>;
using Membership = mtx::events::StateEvent<mtx::events::state::Member>; using Membership = mtx::events::StateEvent<mtx::events::state::Member>;
using Memberships = std::map<std::string, Membership>; using Memberships = std::map<std::string, Membership>;
@ -107,8 +107,9 @@ private:
void removeLeftRooms(const LeftRooms &rooms); void removeLeftRooms(const LeftRooms &rooms);
void updateJoinedRooms(const JoinedRooms &rooms); void updateJoinedRooms(const JoinedRooms &rooms);
RoomStates generateMembershipDifference(const JoinedRooms &rooms, QMap<QString, QSharedPointer<RoomState>> generateMembershipDifference(
const RoomStates &states) const; const JoinedRooms &rooms,
const RoomStates &states) const;
void updateTypingUsers(const QString &roomid, const std::vector<std::string> &user_ids); void updateTypingUsers(const QString &roomid, const std::vector<std::string> &user_ids);
@ -165,8 +166,8 @@ private:
UserInfoWidget *user_info_widget_; UserInfoWidget *user_info_widget_;
QMap<QString, RoomState> state_manager_; RoomStates roomStates_;
QMap<QString, QSharedPointer<RoomSettings>> settingsManager_; QMap<QString, QSharedPointer<RoomSettings>> roomSettings_;
QMap<QString, QSharedPointer<Community>> communityManager_; QMap<QString, QSharedPointer<Community>> communityManager_;

View file

@ -61,7 +61,7 @@ class RoomInfoListItem : public QWidget
public: public:
RoomInfoListItem(QSharedPointer<RoomSettings> settings, RoomInfoListItem(QSharedPointer<RoomSettings> settings,
RoomState state, QSharedPointer<RoomState> state,
QString room_id, QString room_id,
QWidget *parent = 0); QWidget *parent = 0);
@ -71,11 +71,15 @@ public:
void updateUnreadMessageCount(int count); void updateUnreadMessageCount(int count);
void clearUnreadMessageCount(); void clearUnreadMessageCount();
void setState(const RoomState &state); void setState(QSharedPointer<RoomState> state)
{
state_ = state;
update();
}
QString roomId(); QString roomId();
bool isPressed() const { return isPressed_; }; bool isPressed() const { return isPressed_; };
RoomState state() const { return state_; }; QSharedPointer<RoomState> state() const { return state_; }
int unreadMessageCount() const { return unreadMsgCount_; }; int unreadMessageCount() const { return unreadMsgCount_; };
void setAvatar(const QImage &avatar_image); void setAvatar(const QImage &avatar_image);
@ -127,7 +131,7 @@ private:
QString roomName() QString roomName()
{ {
if (roomType_ == RoomType::Joined) if (roomType_ == RoomType::Joined)
return state_.getName(); return state_->getName();
return roomName_; return roomName_;
} }
@ -145,7 +149,7 @@ private:
RoomType roomType_ = RoomType::Joined; RoomType roomType_ = RoomType::Joined;
// State information for the joined rooms. // State information for the joined rooms.
RoomState state_; QSharedPointer<RoomState> state_;
// State information for the invited rooms. // State information for the invited rooms.
mtx::responses::InvitedRoom invitedRoom_; mtx::responses::InvitedRoom invitedRoom_;

View file

@ -51,16 +51,16 @@ public:
void setCache(QSharedPointer<Cache> cache) { cache_ = cache; } void setCache(QSharedPointer<Cache> cache) { cache_ = cache; }
void setInitialRooms(const QMap<QString, QSharedPointer<RoomSettings>> &settings, void setInitialRooms(const QMap<QString, QSharedPointer<RoomSettings>> &settings,
const QMap<QString, RoomState> &states); const QMap<QString, QSharedPointer<RoomState>> &states);
void sync(const QMap<QString, RoomState> &states, void sync(const QMap<QString, QSharedPointer<RoomState>> &states,
QMap<QString, QSharedPointer<RoomSettings>> &settings); const QMap<QString, QSharedPointer<RoomSettings>> &settings);
void syncInvites(const std::map<std::string, mtx::responses::InvitedRoom> &rooms); void syncInvites(const std::map<std::string, mtx::responses::InvitedRoom> &rooms);
void clear(); void clear();
void updateAvatar(const QString &room_id, const QString &url); void updateAvatar(const QString &room_id, const QString &url);
void addRoom(const QMap<QString, QSharedPointer<RoomSettings>> &settings, void addRoom(const QMap<QString, QSharedPointer<RoomSettings>> &settings,
const RoomState &state, const QSharedPointer<RoomState> &state,
const QString &room_id); const QString &room_id);
void addInvitedRoom(const QString &room_id, const mtx::responses::InvitedRoom &room); void addInvitedRoom(const QString &room_id, const mtx::responses::InvitedRoom &room);
void removeRoom(const QString &room_id, bool reset); void removeRoom(const QString &room_id, bool reset);

View file

@ -150,7 +150,8 @@ Cache::image(const QString &url) const
} }
void void
Cache::setState(const QString &nextBatchToken, const QMap<QString, RoomState> &states) Cache::setState(const QString &nextBatchToken,
const QMap<QString, QSharedPointer<RoomState>> &states)
{ {
if (!isMounted_) if (!isMounted_)
return; return;
@ -173,14 +174,16 @@ Cache::setState(const QString &nextBatchToken, const QMap<QString, RoomState> &s
} }
void void
Cache::insertRoomState(lmdb::txn &txn, const QString &roomid, const RoomState &state) Cache::insertRoomState(lmdb::txn &txn,
const QString &roomid,
const QSharedPointer<RoomState> &state)
{ {
auto stateEvents = state.serialize(); auto stateEvents = state->serialize();
auto id = roomid.toUtf8(); auto id = roomid.toUtf8();
lmdb::dbi_put(txn, roomDb_, lmdb::val(id.data(), id.size()), lmdb::val(stateEvents)); lmdb::dbi_put(txn, roomDb_, lmdb::val(id.data(), id.size()), lmdb::val(stateEvents));
for (const auto &membership : state.memberships) { for (const auto &membership : state->memberships) {
lmdb::dbi membersDb = lmdb::dbi membersDb =
lmdb::dbi::open(txn, roomid.toStdString().c_str(), MDB_CREATE); lmdb::dbi::open(txn, roomid.toStdString().c_str(), MDB_CREATE);

View file

@ -179,13 +179,13 @@ ChatPage::ChatPage(QSharedPointer<MatrixClient> client,
&TimelineViewManager::unreadMessages, &TimelineViewManager::unreadMessages,
this, this,
[=](const QString &roomid, int count) { [=](const QString &roomid, int count) {
if (!settingsManager_.contains(roomid)) { if (!roomSettings_.contains(roomid)) {
qWarning() << "RoomId does not have settings" << roomid; qWarning() << "RoomId does not have settings" << roomid;
room_list_->updateUnreadMessageCount(roomid, count); room_list_->updateUnreadMessageCount(roomid, count);
return; return;
} }
if (settingsManager_[roomid]->isNotificationsEnabled()) if (roomSettings_[roomid]->isNotificationsEnabled())
room_list_->updateUnreadMessageCount(roomid, count); room_list_->updateUnreadMessageCount(roomid, count);
}); });
@ -405,8 +405,8 @@ ChatPage::resetUI()
{ {
room_avatars_.clear(); room_avatars_.clear();
room_list_->clear(); room_list_->clear();
settingsManager_.clear(); roomSettings_.clear();
state_manager_.clear(); roomStates_.clear();
top_bar_->reset(); top_bar_->reset();
user_info_widget_->reset(); user_info_widget_->reset();
view_manager_->clearAll(); view_manager_->clearAll();
@ -493,11 +493,11 @@ ChatPage::syncCompleted(const mtx::responses::Sync &response)
const auto nextBatchToken = QString::fromStdString(response.next_batch); const auto nextBatchToken = QString::fromStdString(response.next_batch);
auto stateDiff = generateMembershipDifference(response.rooms.join, state_manager_); auto stateDiff = generateMembershipDifference(response.rooms.join, roomStates_);
QtConcurrent::run(cache_.data(), &Cache::setState, nextBatchToken, stateDiff); QtConcurrent::run(cache_.data(), &Cache::setState, nextBatchToken, stateDiff);
QtConcurrent::run(cache_.data(), &Cache::setInvites, response.rooms.invite); QtConcurrent::run(cache_.data(), &Cache::setInvites, response.rooms.invite);
room_list_->sync(state_manager_, settingsManager_); room_list_->sync(roomStates_, roomSettings_);
room_list_->syncInvites(response.rooms.invite); room_list_->syncInvites(response.rooms.invite);
view_manager_->sync(response.rooms); view_manager_->sync(response.rooms);
@ -512,26 +512,26 @@ ChatPage::initialSyncCompleted(const mtx::responses::Sync &response)
auto joined = response.rooms.join; auto joined = response.rooms.join;
for (auto it = joined.cbegin(); it != joined.cend(); ++it) { for (auto it = joined.cbegin(); it != joined.cend(); ++it) {
RoomState room_state; auto roomState = QSharedPointer<RoomState>(new RoomState);
// Build the current state from the timeline and state events. // Build the current state from the timeline and state events.
room_state.updateFromEvents(it->second.state.events); roomState->updateFromEvents(it->second.state.events);
room_state.updateFromEvents(it->second.timeline.events); roomState->updateFromEvents(it->second.timeline.events);
// Remove redundant memberships. // Remove redundant memberships.
room_state.removeLeaveMemberships(); roomState->removeLeaveMemberships();
// Resolve room name and avatar. e.g in case of one-to-one chats. // Resolve room name and avatar. e.g in case of one-to-one chats.
room_state.resolveName(); roomState->resolveName();
room_state.resolveAvatar(); roomState->resolveAvatar();
const auto room_id = QString::fromStdString(it->first); const auto room_id = QString::fromStdString(it->first);
state_manager_.insert(room_id, room_state); roomStates_.insert(room_id, roomState);
settingsManager_.insert(room_id, roomSettings_.insert(room_id,
QSharedPointer<RoomSettings>(new RoomSettings(room_id))); QSharedPointer<RoomSettings>(new RoomSettings(room_id)));
for (const auto membership : room_state.memberships) { for (const auto membership : roomState->memberships) {
updateUserDisplayName(membership.second); updateUserDisplayName(membership.second);
updateUserAvatarUrl(membership.second); updateUserAvatarUrl(membership.second);
} }
@ -542,14 +542,14 @@ ChatPage::initialSyncCompleted(const mtx::responses::Sync &response)
QtConcurrent::run(cache_.data(), QtConcurrent::run(cache_.data(),
&Cache::setState, &Cache::setState,
QString::fromStdString(response.next_batch), QString::fromStdString(response.next_batch),
state_manager_); roomStates_);
QtConcurrent::run(cache_.data(), &Cache::setInvites, response.rooms.invite); QtConcurrent::run(cache_.data(), &Cache::setInvites, response.rooms.invite);
// Populate timelines with messages. // Populate timelines with messages.
view_manager_->initialize(response.rooms); view_manager_->initialize(response.rooms);
// Initialize room list. // Initialize room list.
room_list_->setInitialRooms(settingsManager_, state_manager_); room_list_->setInitialRooms(roomSettings_, roomStates_);
room_list_->syncInvites(response.rooms.invite); room_list_->syncInvites(response.rooms.invite);
client_->setNextBatchToken(QString::fromStdString(response.next_batch)); client_->setNextBatchToken(QString::fromStdString(response.next_batch));
@ -597,19 +597,19 @@ ChatPage::updateOwnCommunitiesInfo(const QList<QString> &own_communities)
void void
ChatPage::changeTopRoomInfo(const QString &room_id) ChatPage::changeTopRoomInfo(const QString &room_id)
{ {
if (!state_manager_.contains(room_id)) if (!roomStates_.contains(room_id))
return; return;
auto state = state_manager_[room_id]; auto state = roomStates_[room_id];
top_bar_->updateRoomName(state.getName()); top_bar_->updateRoomName(state->getName());
top_bar_->updateRoomTopic(state.getTopic()); top_bar_->updateRoomTopic(state->getTopic());
top_bar_->setRoomSettings(settingsManager_[room_id]); top_bar_->setRoomSettings(roomSettings_[room_id]);
if (room_avatars_.contains(room_id)) if (room_avatars_.contains(room_id))
top_bar_->updateRoomAvatar(room_avatars_.value(room_id).toImage()); top_bar_->updateRoomAvatar(room_avatars_.value(room_id).toImage());
else else
top_bar_->updateRoomAvatarFromName(state.getName()); top_bar_->updateRoomAvatarFromName(state->getName());
current_room_ = room_id; current_room_ = room_id;
} }
@ -638,22 +638,22 @@ ChatPage::loadStateFromCache()
auto rooms = cache_->states(); auto rooms = cache_->states();
for (auto it = rooms.constBegin(); it != rooms.constEnd(); ++it) { for (auto it = rooms.constBegin(); it != rooms.constEnd(); ++it) {
RoomState room_state = it.value(); auto roomState = QSharedPointer<RoomState>(new RoomState(it.value()));
// Clean up and prepare state for use. // Clean up and prepare state for use.
room_state.removeLeaveMemberships(); roomState->removeLeaveMemberships();
room_state.resolveName(); roomState->resolveName();
room_state.resolveAvatar(); roomState->resolveAvatar();
// Save the current room state. // Save the current room state.
state_manager_.insert(it.key(), room_state); roomStates_.insert(it.key(), roomState);
// Create or restore the settings for this room. // Create or restore the settings for this room.
settingsManager_.insert(it.key(), roomSettings_.insert(it.key(),
QSharedPointer<RoomSettings>(new RoomSettings(it.key()))); QSharedPointer<RoomSettings>(new RoomSettings(it.key())));
// Resolve user avatars. // Resolve user avatars.
for (const auto membership : room_state.memberships) { for (const auto membership : roomState->memberships) {
updateUserDisplayName(membership.second); updateUserDisplayName(membership.second);
updateUserAvatarUrl(membership.second); updateUserAvatarUrl(membership.second);
} }
@ -663,7 +663,7 @@ ChatPage::loadStateFromCache()
view_manager_->initialize(rooms.keys()); view_manager_->initialize(rooms.keys());
// Initialize room list from the restored state and settings. // Initialize room list from the restored state and settings.
room_list_->setInitialRooms(settingsManager_, state_manager_); room_list_->setInitialRooms(roomSettings_, roomStates_);
room_list_->syncInvites(cache_->invites()); room_list_->syncInvites(cache_->invites());
// Check periodically if the timelines have been loaded. // Check periodically if the timelines have been loaded.
@ -706,12 +706,12 @@ ChatPage::showQuickSwitcher()
QMap<QString, QString> rooms; QMap<QString, QString> rooms;
for (auto it = state_manager_.constBegin(); it != state_manager_.constEnd(); ++it) { for (auto it = roomStates_.constBegin(); it != roomStates_.constEnd(); ++it) {
QString deambiguator = QString deambiguator =
QString::fromStdString(it.value().canonical_alias.content.alias); QString::fromStdString(it.value()->canonical_alias.content.alias);
if (deambiguator == "") if (deambiguator == "")
deambiguator = it.key(); deambiguator = it.key();
rooms.insert(it.value().getName() + " (" + deambiguator + ")", it.key()); rooms.insert(it.value()->getName() + " (" + deambiguator + ")", it.key());
} }
quickSwitcher_->setRoomList(rooms); quickSwitcher_->setRoomList(rooms);
@ -721,14 +721,14 @@ ChatPage::showQuickSwitcher()
void void
ChatPage::addRoom(const QString &room_id) ChatPage::addRoom(const QString &room_id)
{ {
if (!state_manager_.contains(room_id)) { if (!roomStates_.contains(room_id)) {
RoomState room_state; auto room_state = QSharedPointer<RoomState>(new RoomState);
state_manager_.insert(room_id, room_state); roomStates_.insert(room_id, room_state);
settingsManager_.insert(room_id, roomSettings_.insert(room_id,
QSharedPointer<RoomSettings>(new RoomSettings(room_id))); QSharedPointer<RoomSettings>(new RoomSettings(room_id)));
room_list_->addRoom(settingsManager_, state_manager_[room_id], room_id); room_list_->addRoom(roomSettings_, roomStates_[room_id], room_id);
room_list_->highlightSelectedRoom(room_id); room_list_->highlightSelectedRoom(room_id);
changeTopRoomInfo(room_id); changeTopRoomInfo(room_id);
@ -738,8 +738,8 @@ ChatPage::addRoom(const QString &room_id)
void void
ChatPage::removeRoom(const QString &room_id) ChatPage::removeRoom(const QString &room_id)
{ {
state_manager_.remove(room_id); roomStates_.remove(room_id);
settingsManager_.remove(room_id); roomSettings_.remove(room_id);
try { try {
cache_->removeRoom(room_id); cache_->removeRoom(room_id);
cache_->removeInvite(room_id); cache_->removeInvite(room_id);
@ -820,7 +820,7 @@ ChatPage::removeLeftRooms(const std::map<std::string, mtx::responses::LeftRoom>
for (auto it = rooms.cbegin(); it != rooms.cend(); ++it) { for (auto it = rooms.cbegin(); it != rooms.cend(); ++it) {
const auto room_id = QString::fromStdString(it->first); const auto room_id = QString::fromStdString(it->first);
if (state_manager_.contains(room_id)) if (roomStates_.contains(room_id))
removeRoom(room_id); removeRoom(room_id);
} }
} }
@ -843,25 +843,25 @@ ChatPage::updateJoinedRooms(const std::map<std::string, mtx::responses::JoinedRo
const auto newTimelineEvents = it->second.timeline; const auto newTimelineEvents = it->second.timeline;
// Merge the new updates for rooms that we are tracking. // Merge the new updates for rooms that we are tracking.
if (state_manager_.contains(roomid)) { if (roomStates_.contains(roomid)) {
auto oldState = &state_manager_[roomid]; auto oldState = roomStates_[roomid];
oldState->updateFromEvents(newStateEvents.events); oldState->updateFromEvents(newStateEvents.events);
oldState->updateFromEvents(newTimelineEvents.events); oldState->updateFromEvents(newTimelineEvents.events);
oldState->resolveName(); oldState->resolveName();
oldState->resolveAvatar(); oldState->resolveAvatar();
} else { } else {
// Build the current state from the timeline and state events. // Build the current state from the timeline and state events.
RoomState room_state; auto roomState = QSharedPointer<RoomState>(new RoomState);
room_state.updateFromEvents(newStateEvents.events); roomState->updateFromEvents(newStateEvents.events);
room_state.updateFromEvents(newTimelineEvents.events); roomState->updateFromEvents(newTimelineEvents.events);
// Resolve room name and avatar. e.g in case of one-to-one chats. // Resolve room name and avatar. e.g in case of one-to-one chats.
room_state.resolveName(); roomState->resolveName();
room_state.resolveAvatar(); roomState->resolveAvatar();
state_manager_.insert(roomid, room_state); roomStates_.insert(roomid, roomState);
settingsManager_.insert( roomSettings_.insert(
roomid, QSharedPointer<RoomSettings>(new RoomSettings(roomid))); roomid, QSharedPointer<RoomSettings>(new RoomSettings(roomid)));
view_manager_->addRoom(it->second, roomid); view_manager_->addRoom(it->second, roomid);
@ -877,12 +877,12 @@ ChatPage::updateJoinedRooms(const std::map<std::string, mtx::responses::JoinedRo
} }
} }
QMap<QString, RoomState> QMap<QString, QSharedPointer<RoomState>>
ChatPage::generateMembershipDifference( ChatPage::generateMembershipDifference(
const std::map<std::string, mtx::responses::JoinedRoom> &rooms, const std::map<std::string, mtx::responses::JoinedRoom> &rooms,
const QMap<QString, RoomState> &states) const const QMap<QString, QSharedPointer<RoomState>> &states) const
{ {
QMap<QString, RoomState> stateDiff; QMap<QString, QSharedPointer<RoomState>> stateDiff;
for (auto it = rooms.cbegin(); it != rooms.cend(); ++it) { for (auto it = rooms.cbegin(); it != rooms.cend(); ++it) {
const auto room_id = QString::fromStdString(it->first); const auto room_id = QString::fromStdString(it->first);
@ -897,16 +897,16 @@ ChatPage::generateMembershipDifference(
for (auto mm = timelineMemberships.cbegin(); mm != timelineMemberships.cend(); ++mm) for (auto mm = timelineMemberships.cbegin(); mm != timelineMemberships.cend(); ++mm)
all_memberships.emplace(mm->first, mm->second); all_memberships.emplace(mm->first, mm->second);
RoomState local; auto local = QSharedPointer<RoomState>(new RoomState);
local.aliases = states[room_id].aliases; local->aliases = states[room_id]->aliases;
local.avatar = states[room_id].avatar; local->avatar = states[room_id]->avatar;
local.canonical_alias = states[room_id].canonical_alias; local->canonical_alias = states[room_id]->canonical_alias;
local.history_visibility = states[room_id].history_visibility; local->history_visibility = states[room_id]->history_visibility;
local.join_rules = states[room_id].join_rules; local->join_rules = states[room_id]->join_rules;
local.name = states[room_id].name; local->name = states[room_id]->name;
local.power_levels = states[room_id].power_levels; local->power_levels = states[room_id]->power_levels;
local.topic = states[room_id].topic; local->topic = states[room_id]->topic;
local.memberships = all_memberships; local->memberships = all_memberships;
stateDiff.insert(room_id, local); stateDiff.insert(room_id, local);
} }

View file

@ -69,7 +69,7 @@ RoomInfoListItem::RoomInfoListItem(QString room_id,
} }
RoomInfoListItem::RoomInfoListItem(QSharedPointer<RoomSettings> settings, RoomInfoListItem::RoomInfoListItem(QSharedPointer<RoomSettings> settings,
RoomState state, QSharedPointer<RoomState> state,
QString room_id, QString room_id,
QWidget *parent) QWidget *parent)
: QWidget(parent) : QWidget(parent)
@ -323,13 +323,6 @@ RoomInfoListItem::setPressedState(bool state)
} }
} }
void
RoomInfoListItem::setState(const RoomState &new_state)
{
state_ = new_state;
update();
}
void void
RoomInfoListItem::contextMenuEvent(QContextMenuEvent *event) RoomInfoListItem::contextMenuEvent(QContextMenuEvent *event)
{ {

View file

@ -83,7 +83,7 @@ RoomList::clear()
void void
RoomList::addRoom(const QMap<QString, QSharedPointer<RoomSettings>> &settings, RoomList::addRoom(const QMap<QString, QSharedPointer<RoomSettings>> &settings,
const RoomState &state, const QSharedPointer<RoomState> &state,
const QString &room_id) const QString &room_id)
{ {
RoomInfoListItem *room_item = RoomInfoListItem *room_item =
@ -93,8 +93,8 @@ RoomList::addRoom(const QMap<QString, QSharedPointer<RoomSettings>> &settings,
rooms_.insert(room_id, QSharedPointer<RoomInfoListItem>(room_item)); rooms_.insert(room_id, QSharedPointer<RoomInfoListItem>(room_item));
if (!state.getAvatar().toString().isEmpty()) if (!state->getAvatar().toString().isEmpty())
updateAvatar(room_id, state.getAvatar().toString()); updateAvatar(room_id, state->getAvatar().toString());
int pos = contentsLayout_->count() - 1; int pos = contentsLayout_->count() - 1;
contentsLayout_->insertWidget(pos, room_item); contentsLayout_->insertWidget(pos, room_item);
@ -161,7 +161,7 @@ RoomList::calculateUnreadMessageCount()
void void
RoomList::setInitialRooms(const QMap<QString, QSharedPointer<RoomSettings>> &settings, RoomList::setInitialRooms(const QMap<QString, QSharedPointer<RoomSettings>> &settings,
const QMap<QString, RoomState> &states) const QMap<QString, QSharedPointer<RoomState>> &states)
{ {
rooms_.clear(); rooms_.clear();
@ -212,24 +212,21 @@ RoomList::openLeaveRoomDialog(const QString &room_id)
} }
void void
RoomList::sync(const QMap<QString, RoomState> &states, RoomList::sync(const QMap<QString, QSharedPointer<RoomState>> &states,
QMap<QString, QSharedPointer<RoomSettings>> &settings) const QMap<QString, QSharedPointer<RoomSettings>> &settings)
{ {
for (auto it = states.constBegin(); it != states.constEnd(); ++it) { for (auto it = states.constBegin(); it != states.constEnd(); ++it) {
auto room_id = it.key(); auto room_id = it.key();
auto state = it.value(); auto state = it.value();
if (!rooms_.contains(room_id)) { if (!rooms_.contains(room_id))
settings.insert(room_id,
QSharedPointer<RoomSettings>(new RoomSettings(room_id)));
addRoom(settings, state, room_id); addRoom(settings, state, room_id);
}
auto room = rooms_[room_id]; auto room = rooms_[room_id];
auto current_avatar = room->state().getAvatar(); auto current_avatar = room->state()->getAvatar();
auto new_avatar = state.getAvatar(); auto new_avatar = state->getAvatar();
if (current_avatar != new_avatar && !new_avatar.toString().isEmpty()) if (current_avatar != new_avatar && !new_avatar.toString().isEmpty())
updateAvatar(room_id, new_avatar.toString()); updateAvatar(room_id, new_avatar.toString());