Fix accounts avatar issue when it becomes completely white due to non-changing accoun...
authorallexzander <blackslayer4@gmail.com>
Tue, 25 Oct 2022 13:49:56 +0000 (16:49 +0300)
committerallexzander <allexzander@users.noreply.github.com>
Thu, 3 Nov 2022 09:14:44 +0000 (10:14 +0100)
Signed-off-by: allexzander <blackslayer4@gmail.com>
src/gui/tray/usermodel.cpp
src/gui/tray/usermodel.h

index c7d71ec3bd3df10ba84d03831b510c8eb9acce9d..3cee8809d50808ece7d3666ebc2943d8a989ba51 100644 (file)
@@ -915,12 +915,17 @@ bool UserModel::isUserConnected(const int id)
     return _users[id]->isConnected();
 }
 
-QImage UserModel::avatarById(const int id)
+QImage UserModel::avatarById(const int id) const
 {
-    if (id < 0 || id >= _users.size())
+    const auto foundUserByIdIter = std::find_if(std::cbegin(_users), std::cend(_users), [&id](const OCC::User* const user) {
+        return user->account()->id() == QString::number(id);
+    });
+
+    if (foundUserByIdIter == std::cend(_users)) {
         return {};
+    }
 
-    return _users[id]->avatar();
+    return (*foundUserByIdIter)->avatar();
 }
 
 QString UserModel::currentUserServer()
@@ -1018,32 +1023,31 @@ void UserModel::openCurrentAccountServer()
 
 void UserModel::setCurrentUserId(const int id)
 {
-    if (_currentUserId == id) {
-        // order has changed, index remained the same
-        if (id >= 0 && id < _users.size() && !_users[id]->isCurrentUser()) {
-            for (auto &user : _users) {
-                user->setCurrentUser(false);
-            }
-            _users[id]->setCurrentUser(true);
+    Q_ASSERT(id < _users.size());
+
+    if (id < 0 || id >= _users.size()) {
+        if (id < 0 && _currentUserId != id) {
+            _currentUserId = id;
             emit currentUserChanged();
         }
         return;
     }
-    _currentUserId = id;
 
-    if (_users.isEmpty()) {
-        emit currentUserChanged();
-        return;
-    }
-
-    if (id >= 0 && id < _users.size()) {
-        for (auto &user : _users) {
+    const auto isCurrentUserChanged = !_users[id]->isCurrentUser();
+    if (isCurrentUserChanged) {
+        for (const auto user : _users) {
             user->setCurrentUser(false);
         }
         _users[id]->setCurrentUser(true);
     }
 
-    emit currentUserChanged();
+    if (_currentUserId == id && isCurrentUserChanged) {
+        // order has changed, index remained the same
+        emit currentUserChanged();
+    } else if (_currentUserId != id) {
+        _currentUserId = id;
+        emit currentUserChanged();
+    }
 }
 
 void UserModel::login(const int id)
@@ -1069,11 +1073,12 @@ void UserModel::removeAccount(const int id)
     }
 
     QMessageBox messageBox(QMessageBox::Question,
-        tr("Confirm Account Removal"),
-        tr("<p>Do you really want to remove the connection to the account <i>%1</i>?</p>"
-           "<p><b>Note:</b> This will <b>not</b> delete any files.</p>")
-            .arg(_users[id]->name()), QMessageBox::NoButton);
-    QPushButton *yesButton = messageBox.addButton(tr("Remove connection"), QMessageBox::YesRole);
+                           tr("Confirm Account Removal"),
+                           tr("<p>Do you really want to remove the connection to the account <i>%1</i>?</p>"
+                              "<p><b>Note:</b> This will <b>not</b> delete any files.</p>")
+                               .arg(_users[id]->name()),
+                           QMessageBox::NoButton);
+    const auto * const yesButton = messageBox.addButton(tr("Remove connection"), QMessageBox::YesRole);
     messageBox.addButton(tr("Cancel"), QMessageBox::NoRole);
 
     messageBox.exec();
@@ -1088,14 +1093,12 @@ void UserModel::removeAccount(const int id)
     _users.removeAt(id);
     endRemoveRows();
 
-    if (_users.isEmpty()) {
-        setCurrentUserId(-1);
-    } else if (_users.size() == 1) {
-        setCurrentUserId(0);
-    } else {
-        if (currentUserId() != id && currentUserId() < id) {
-            return;
-        }
+    if (_users.size() <= 1) {
+        setCurrentUserId(_users.size() - 1);
+    } else if (currentUserId() > id) {
+        // an account was removed from the in-between 0 and the current one, the index of the current one needs a decrement
+        setCurrentUserId(currentUserId() - 1);
+    } else if (currentUserId() == id) {
         setCurrentUserId(id < _users.size() ? id : id - 1);
     }
 }
index 3ebc8d6237b008b63f7b24d42d5e7387771f6362..08e23f0b361bfe9f41502a6bf74ca4ff01804c3f 100644 (file)
@@ -160,7 +160,7 @@ public:
     [[nodiscard]] int rowCount(const QModelIndex &parent = QModelIndex()) const override;
     [[nodiscard]] QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
 
-    QImage avatarById(const int id);
+    [[nodiscard]]  QImage avatarById(const int id) const;
 
     [[nodiscard]] User *currentUser() const;