summary refs log tree commit diff
path: root/src/RoomList.cc
diff options
context:
space:
mode:
authorKonstantinos Sideris <sideris.konstantin@gmail.com>2018-01-24 20:46:37 +0200
committerKonstantinos Sideris <sideris.konstantin@gmail.com>2018-01-24 20:46:37 +0200
commit1fad9398fce58a8d7bf96bdaa2629a80b336b14c (patch)
tree28483acf18d91d6ccfa40eaa0564e50dd9291c51 /src/RoomList.cc
parentRemove trailing whitespace from text messages (diff)
downloadnheko-1fad9398fce58a8d7bf96bdaa2629a80b336b14c.tar.xz
Use more stl containers & minor refactorings
Diffstat (limited to 'src/RoomList.cc')
-rw-r--r--src/RoomList.cc160
1 files changed, 83 insertions, 77 deletions
diff --git a/src/RoomList.cc b/src/RoomList.cc

index 61acfb83..fefd8dac 100644 --- a/src/RoomList.cc +++ b/src/RoomList.cc
@@ -82,16 +82,15 @@ RoomList::clear() } void -RoomList::addRoom(const QMap<QString, QSharedPointer<RoomSettings>> &settings, +RoomList::addRoom(const QSharedPointer<RoomSettings> &settings, const QSharedPointer<RoomState> &state, const QString &room_id) { - RoomInfoListItem *room_item = - new RoomInfoListItem(settings[room_id], state, room_id, scrollArea_); + auto room_item = new RoomInfoListItem(settings, state, room_id, scrollArea_); connect(room_item, &RoomInfoListItem::clicked, this, &RoomList::highlightSelectedRoom); connect(room_item, &RoomInfoListItem::leaveRoom, this, &RoomList::openLeaveRoomDialog); - rooms_.insert(room_id, QSharedPointer<RoomInfoListItem>(room_item)); + rooms_.emplace(room_id, QSharedPointer<RoomInfoListItem>(room_item)); if (!state->getAvatar().toString().isEmpty()) updateAvatar(room_id, state->getAvatar().toString()); @@ -124,21 +123,24 @@ RoomList::updateAvatar(const QString &room_id, const QString &url) void RoomList::removeRoom(const QString &room_id, bool reset) { - rooms_.remove(room_id); + rooms_.erase(rooms_.find(room_id)); - if (rooms_.isEmpty() || !reset) + if (rooms_.empty() || !reset) return; - auto first_room = rooms_.first(); - first_room->setPressedState(true); + auto room = firstRoom(); - emit roomChanged(rooms_.firstKey()); + if (room.second.isNull()) + return; + + room.second->setPressedState(true); + emit roomChanged(room.first); } void RoomList::updateUnreadMessageCount(const QString &roomid, int count) { - if (!rooms_.contains(roomid)) { + if (!roomExists(roomid)) { qWarning() << "UpdateUnreadMessageCount: Unknown roomid"; return; } @@ -153,15 +155,17 @@ RoomList::calculateUnreadMessageCount() { int total_unread_msgs = 0; - for (const auto &room : rooms_) - total_unread_msgs += room->unreadMessageCount(); + for (const auto &room : rooms_) { + if (!room.second.isNull()) + total_unread_msgs += room.second->unreadMessageCount(); + } emit totalUnreadMessageCountUpdated(total_unread_msgs); } void -RoomList::setInitialRooms(const QMap<QString, QSharedPointer<RoomSettings>> &settings, - const QMap<QString, QSharedPointer<RoomState>> &states) +RoomList::setInitialRooms(const std::map<QString, QSharedPointer<RoomSettings>> &settings, + const std::map<QString, QSharedPointer<RoomState>> &states) { rooms_.clear(); @@ -171,22 +175,18 @@ RoomList::setInitialRooms(const QMap<QString, QSharedPointer<RoomSettings>> &set return; } - for (auto it = states.constBegin(); it != states.constEnd(); ++it) { - const auto room_id = it.key(); - const auto state = it.value(); + for (auto const &state : states) + addRoom(settings.at(state.first), state.second, state.first); - addRoom(settings, state, room_id); - } - - if (rooms_.isEmpty()) + if (rooms_.empty()) return; - setFilterRooms(filterRooms_); - - auto first_room = rooms_.first(); - first_room->setPressedState(true); + auto room = firstRoom(); + if (room.second.isNull()) + return; - emit roomChanged(rooms_.firstKey()); + room.second->setPressedState(true); + emit roomChanged(room.first); } void @@ -212,33 +212,30 @@ RoomList::openLeaveRoomDialog(const QString &room_id) } void -RoomList::sync(const QMap<QString, QSharedPointer<RoomState>> &states, - const QMap<QString, QSharedPointer<RoomSettings>> &settings) +RoomList::sync(const std::map<QString, QSharedPointer<RoomState>> &states, + const std::map<QString, QSharedPointer<RoomSettings>> &settings) { - for (auto it = states.constBegin(); it != states.constEnd(); ++it) { - auto room_id = it.key(); - auto state = it.value(); + for (auto const &state : states) { + if (!roomExists(state.first)) + addRoom(settings.at(state.first), state.second, state.first); - if (!rooms_.contains(room_id)) - addRoom(settings, state, room_id); - - auto room = rooms_[room_id]; + auto room = rooms_[state.first]; auto current_avatar = room->state()->getAvatar(); - auto new_avatar = state->getAvatar(); + auto new_avatar = state.second->getAvatar(); if (current_avatar != new_avatar && !new_avatar.toString().isEmpty()) - updateAvatar(room_id, new_avatar.toString()); + updateAvatar(state.first, new_avatar.toString()); - room->setState(state); + room->setState(state.second); } } void RoomList::clearRoomMessageCount(const QString &room_id) { - if (!rooms_.contains(room_id)) + if (!roomExists(room_id)) return; auto room = rooms_[room_id]; @@ -252,7 +249,7 @@ RoomList::highlightSelectedRoom(const QString &room_id) { emit roomChanged(room_id); - if (!rooms_.contains(room_id)) { + if (!roomExists(room_id)) { qDebug() << "RoomList: clicked unknown roomid"; return; } @@ -261,13 +258,15 @@ RoomList::highlightSelectedRoom(const QString &room_id) calculateUnreadMessageCount(); - for (auto it = rooms_.constBegin(); it != rooms_.constEnd(); ++it) { - if (it.key() != room_id) { - it.value()->setPressedState(false); + for (auto const &room : rooms_) { + if (room.second.isNull()) + continue; + + if (room.first != room_id) { + room.second->setPressedState(false); } else { - it.value()->setPressedState(true); - scrollArea_->ensureWidgetVisible( - qobject_cast<QWidget *>(it.value().data())); + room.second->setPressedState(true); + scrollArea_->ensureWidgetVisible(room.second.data()); } } @@ -277,12 +276,12 @@ RoomList::highlightSelectedRoom(const QString &room_id) void RoomList::updateRoomAvatar(const QString &roomid, const QPixmap &img) { - if (!rooms_.contains(roomid)) { + if (!roomExists(roomid)) { qWarning() << "Avatar update on non existent room" << roomid; return; } - rooms_.value(roomid)->setAvatar(img.toImage()); + rooms_[roomid]->setAvatar(img.toImage()); // Used to inform other widgets for the new image data. emit roomAvatarChanged(roomid, img); @@ -291,12 +290,12 @@ RoomList::updateRoomAvatar(const QString &roomid, const QPixmap &img) void RoomList::updateRoomDescription(const QString &roomid, const DescInfo &info) { - if (!rooms_.contains(roomid)) { + if (!roomExists(roomid)) { qWarning() << "Description update on non existent room" << roomid << info.body; return; } - rooms_.value(roomid)->setDescriptionMessage(info); + rooms_[roomid]->setDescriptionMessage(info); if (underMouse()) { // When the user hover out of the roomlist a sort will be triggered. @@ -359,9 +358,8 @@ RoomList::closeJoinRoomDialog(bool isJoining, QString roomAlias) { joinRoomModal_->fadeOut(); - if (isJoining) { + if (isJoining) client_->joinRoom(roomAlias); - } } void @@ -369,48 +367,44 @@ RoomList::closeLeaveRoomDialog(bool leaving, const QString &room_id) { leaveRoomModal_->fadeOut(); - if (leaving) { + if (leaving) client_->leaveRoom(room_id); - } } void -RoomList::setFilterRooms(bool filterRooms) +RoomList::setFilterRooms(bool isFilteringEnabled) { - filterRooms_ = filterRooms; - for (int i = 0; i < contentsLayout_->count(); i++) { // If roomFilter_ contains the room for the current RoomInfoListItem, // show the list item, otherwise hide it - RoomInfoListItem *listitem = - (RoomInfoListItem *)contentsLayout_->itemAt(i)->widget(); + auto listitem = + qobject_cast<RoomInfoListItem *>(contentsLayout_->itemAt(i)->widget()); - if (listitem != nullptr) { - if (!filterRooms) { - contentsLayout_->itemAt(i)->widget()->show(); - } else if (roomFilter_.contains(listitem->roomId())) { - contentsLayout_->itemAt(i)->widget()->show(); - } else { - contentsLayout_->itemAt(i)->widget()->hide(); - } - } + if (!listitem) + continue; + + if (!isFilteringEnabled || filterItemExists(listitem->roomId())) + listitem->show(); + else + listitem->hide(); } - if (filterRooms_ && !roomFilter_.contains(selectedRoom_)) { + if (isFilteringEnabled && !filterItemExists(selectedRoom_)) { RoomInfoListItem *firstVisibleRoom = nullptr; + for (int i = 0; i < contentsLayout_->count(); i++) { QWidget *item = contentsLayout_->itemAt(i)->widget(); + if (item != nullptr && item->isVisible()) { - firstVisibleRoom = (RoomInfoListItem *)item; + firstVisibleRoom = qobject_cast<RoomInfoListItem *>(item); break; } } - if (firstVisibleRoom != nullptr) { + + if (firstVisibleRoom != nullptr) highlightSelectedRoom(firstVisibleRoom->roomId()); - } } else { - scrollArea_->ensureWidgetVisible( - qobject_cast<QWidget *>(rooms_.value(selectedRoom_).data())); + scrollArea_->ensureWidgetVisible(rooms_[selectedRoom_].data()); } } @@ -429,13 +423,13 @@ RoomList::syncInvites(const std::map<std::string, mtx::responses::InvitedRoom> & for (auto it = rooms.cbegin(); it != rooms.cend(); ++it) { const auto room_id = QString::fromStdString(it->first); - if (!rooms_.contains(room_id)) + if (!roomExists(room_id)) addInvitedRoom(room_id, it->second); } } void -RoomList::setRoomFilter(QList<QString> room_ids) +RoomList::setRoomFilter(std::vector<QString> room_ids) { roomFilter_ = room_ids; setFilterRooms(true); @@ -448,10 +442,22 @@ RoomList::addInvitedRoom(const QString &room_id, const mtx::responses::InvitedRo connect(room_item, &RoomInfoListItem::acceptInvite, this, &RoomList::acceptInvite); connect(room_item, &RoomInfoListItem::declineInvite, this, &RoomList::declineInvite); - rooms_.insert(room_id, QSharedPointer<RoomInfoListItem>(room_item)); + rooms_.emplace(room_id, QSharedPointer<RoomInfoListItem>(room_item)); updateAvatar(room_id, QString::fromStdString(room.avatar())); int pos = contentsLayout_->count() - 1; contentsLayout_->insertWidget(pos, room_item); } + +std::pair<QString, QSharedPointer<RoomInfoListItem>> +RoomList::firstRoom() const +{ + auto firstRoom = rooms_.begin(); + + while (firstRoom->second.isNull() && firstRoom != rooms_.end()) + firstRoom++; + + return std::pair<QString, QSharedPointer<RoomInfoListItem>>(firstRoom->first, + firstRoom->second); +}