]> dgit.raspbian.org Git - nextcloud-desktop.git/commitdiff
Model/View improvements, also fixes crash on account removal
authorDominique Fuchs <32204802+DominiqueFuchs@users.noreply.github.com>
Sun, 12 Jan 2020 15:16:24 +0000 (16:16 +0100)
committerDominique Fuchs <32204802+DominiqueFuchs@users.noreply.github.com>
Sun, 12 Jan 2020 15:16:24 +0000 (16:16 +0100)
Signed-off-by: Dominique Fuchs <32204802+DominiqueFuchs@users.noreply.github.com>
src/gui/tray/UserLine.qml
src/gui/tray/UserModel.cpp
src/gui/tray/UserModel.h
src/gui/tray/Window.qml

index 834c7001b6d2e9035f6005209e393bb46fc0de8d..6d41fc7d944f1d79512c68a68035d857c440f523 100644 (file)
@@ -38,12 +38,12 @@ MenuItem {
                         Layout.leftMargin: 4\r
                         verticalAlignment: Qt.AlignCenter\r
                         cache: false\r
-                        source: ("image://avatars/" + index)\r
+                        source: ("image://avatars/" + id)\r
                         Layout.preferredHeight: (userLineLayout.height -16)\r
                         Layout.preferredWidth: (userLineLayout.height -16)\r
                         Image {\r
                             id: accountStateIndicator\r
-                            source: userModelBackend.isUserConnected(index) ? "qrc:///client/theme/colored/state-ok.svg" : "qrc:///client/theme/colored/state-offline.svg"\r
+                            source: isConnected ? "qrc:///client/theme/colored/state-ok.svg" : "qrc:///client/theme/colored/state-offline.svg"\r
                             cache: false\r
                             anchors.bottom: accountAvatar.bottom\r
                             anchors.right: accountAvatar.right\r
@@ -114,9 +114,9 @@ MenuItem {
                     }\r
 \r
                     MenuItem {\r
-                        text: userModelBackend.isUserConnected(index) ? "Log out" : "Log in"\r
+                        text: isConnected ? "Log out" : "Log in"\r
                         onClicked: {\r
-                            userModelBackend.isUserConnected(index) ? userModelBackend.logout(index) : userModelBackend.login(index)\r
+                            isConnected ? userModelBackend.logout(index) : userModelBackend.login(index)\r
                             accountMenu.close()\r
                         }\r
                     }\r
@@ -125,6 +125,7 @@ MenuItem {
                         text: "Remove Account"\r
                         onClicked: {\r
                             userModelBackend.removeAccount(index)\r
+                            accountMenu.close()\r
                         }\r
                     }\r
                 }\r
index 67e49c48d1f8f7dd862f4230f8fe2897f2a74d39..510bbcbbcfa84269a540892ed50e2adef573bb2b 100644 (file)
 
 namespace OCC {
 
-User::User(AccountStatePtr &account, const bool &isCurrent)
-    : _account(account)
+User::User(AccountStatePtr &account, const bool &isCurrent, QObject* parent)
+    : QObject(parent)
+    , _account(account)
     , _isCurrentUser(isCurrent)
     , _activityModel(new ActivityListModel(_account.data()))
 {
 }
 
-bool User::operator==(const User &rhs) const
+AccountPtr User::account() const
 {
-    return (this->_account->account() == rhs._account->account());
+    return _account->account();
 }
 
 void User::setCurrentUser(const bool &isCurrent)
@@ -135,7 +136,7 @@ UserModel *UserModel::instance()
 }
 
 UserModel::UserModel(QObject *parent)
-    : QAbstractListModel()
+    : QAbstractListModel(parent)
     , _currentUserId()
 {
     // TODO: Remember selected user from last quit via settings file
@@ -154,7 +155,7 @@ void UserModel::buildUserList()
         addUser(user);
     }
     if (_init) {
-        _users.first().setCurrentUser(true);
+        _users.first()->setCurrentUser(true);
         _init = false;
     }
 }
@@ -171,13 +172,13 @@ Q_INVOKABLE int UserModel::currentUserId()
 
 Q_INVOKABLE bool UserModel::isUserConnected(const int &id)
 {
-    return _users[id].isConnected();
+    return _users[id]->isConnected();
 }
 
 Q_INVOKABLE QImage UserModel::currentUserAvatar()
 {
     if (_users.count() >= 1) {
-        return _users[_currentUserId].avatar();
+        return _users[_currentUserId]->avatar();
     } else {
         QImage image(128, 128, QImage::Format_ARGB32);
         image.fill(Qt::GlobalColor::transparent);
@@ -191,13 +192,13 @@ Q_INVOKABLE QImage UserModel::currentUserAvatar()
 
 QImage UserModel::avatarById(const int &id)
 {
-    return _users[id].avatar(true);
+    return _users[id]->avatar(true);
 }
 
 Q_INVOKABLE QString UserModel::currentUserName()
 {
     if (_users.count() >= 1) {
-        return _users[_currentUserId].name();
+        return _users[_currentUserId]->name();
     } else {
         return QString("No users");
     }
@@ -206,7 +207,7 @@ Q_INVOKABLE QString UserModel::currentUserName()
 Q_INVOKABLE QString UserModel::currentUserServer()
 {
     if (_users.count() >= 1) {
-        return _users[_currentUserId].server();
+        return _users[_currentUserId]->server();
     } else {
         return QString("");
     }
@@ -215,7 +216,7 @@ Q_INVOKABLE QString UserModel::currentUserServer()
 Q_INVOKABLE bool UserModel::currentServerHasTalk()
 {
     if (_users.count() >= 1) {
-        return _users[_currentUserId].serverHasTalk();
+        return _users[_currentUserId]->serverHasTalk();
     } else {
         return false;
     }
@@ -225,7 +226,7 @@ void UserModel::addUser(AccountStatePtr &user, const bool &isCurrent)
 {
     bool containsUser = false;
     for (int i = 0; i < _users.size(); i++) {
-        if (_users[i] == user) {
+        if (_users[i]->account() == user->account()) {
             containsUser = true;
             continue;
         }
@@ -233,7 +234,7 @@ void UserModel::addUser(AccountStatePtr &user, const bool &isCurrent)
 
     if (!containsUser) {
         beginInsertRows(QModelIndex(), rowCount(), rowCount());
-        _users << User(user, isCurrent);
+        _users << new User(user, isCurrent);
         if (isCurrent) {
             _currentUserId = _users.indexOf(_users.last());
         }
@@ -248,45 +249,44 @@ int UserModel::currentUserIndex()
 
 Q_INVOKABLE void UserModel::openCurrentAccountLocalFolder()
 {
-    _users[_currentUserId].openLocalFolder();
+    _users[_currentUserId]->openLocalFolder();
 }
 
 Q_INVOKABLE void UserModel::openCurrentAccountTalk()
 {
-    QString url = _users[_currentUserId].server(false) + "/apps/spreed";
+    QString url = _users[_currentUserId]->server(false) + "/apps/spreed";
     if (!(url.contains("http://") || url.contains("https://"))) {
-        url = "https://" + _users[_currentUserId].server(false) + "/apps/spreed";
+        url = "https://" + _users[_currentUserId]->server(false) + "/apps/spreed";
     }
     QDesktopServices::openUrl(QUrl(url));
 }
 
 Q_INVOKABLE void UserModel::openCurrentAccountServer()
 {
-    QString url = _users[_currentUserId].server(false);
+    QString url = _users[_currentUserId]->server(false);
     if (!(url.contains("http://") || url.contains("https://"))) {
-        url = "https://" + _users[_currentUserId].server(false);
+        url = "https://" + _users[_currentUserId]->server(false);
     }
     QDesktopServices::openUrl(QUrl(url));
 }
 
 Q_INVOKABLE void UserModel::switchCurrentUser(const int &id)
 {
-    _users[_currentUserId].setCurrentUser(false);
-    _users[id].setCurrentUser(true);
+    _users[_currentUserId]->setCurrentUser(false);
+    _users[id]->setCurrentUser(true);
     _currentUserId = id;
     emit newUserSelected();
-    emit refreshUserMenu();
     emit refreshCurrentUserGui();
 }
 
 Q_INVOKABLE void UserModel::login(const int &id) {
-    _users[id].login();
+    _users[id]->login();
     emit refreshCurrentUserGui();
 }
 
 Q_INVOKABLE void UserModel::logout(const int &id)
 {
-    _users[id].logout();
+    _users[id]->logout();
     emit refreshCurrentUserGui();
 }
 
@@ -296,7 +296,7 @@ Q_INVOKABLE void UserModel::removeAccount(const int &id)
         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()),
+            .arg(_users[id]->name()),
         QMessageBox::NoButton);
     QPushButton *yesButton =
         messageBox.addButton(tr("Remove connection"), QMessageBox::YesRole);
@@ -307,12 +307,18 @@ Q_INVOKABLE void UserModel::removeAccount(const int &id)
         return;
     }
 
-    _users[id].logout();
-    _users[id].removeAccount();
-    if (_users.count() > 1) {
+    if (_users[id]->isCurrentUser() && _users.count() > 1) {
         id == 0 ? switchCurrentUser(1) : switchCurrentUser(0);
     }
+
+    _users[id]->logout();
+    _users[id]->removeAccount();
+
+    beginRemoveRows(QModelIndex(), id, id);
     _users.removeAt(id);
+    endRemoveRows();
+
+    emit refreshCurrentUserGui();
 }
 
 int UserModel::rowCount(const QModelIndex &parent) const
@@ -327,15 +333,18 @@ QVariant UserModel::data(const QModelIndex &index, int role) const
         return QVariant();
     }
 
-    const User &user = _users[index.row()];
     if (role == NameRole) {
-        return user.name();
+        return _users[index.row()]->name();
     } else if (role == ServerRole) {
-        return user.server();
+        return _users[index.row()]->server();
     } else if (role == AvatarRole) {
-        return user.avatar();
+        return _users[index.row()]->avatar();
     } else if (role == IsCurrentUserRole) {
-        return user.isCurrentUser();
+        return _users[index.row()]->isCurrentUser();
+    } else if (role == IsConnectedRole) {
+        return _users[index.row()]->isConnected();
+    } else if (role == IdRole) {
+        return index.row();
     }
     return QVariant();
 }
@@ -347,17 +356,19 @@ QHash<int, QByteArray> UserModel::roleNames() const
     roles[ServerRole] = "server";
     roles[AvatarRole] = "avatar";
     roles[IsCurrentUserRole] = "isCurrentUser";
+    roles[IsConnectedRole] = "isConnected";
+    roles[IdRole] = "id";
     return roles;
 }
 
 ActivityListModel *UserModel::currentActivityModel()
 {
-    return _users[currentUserIndex()].getActivityModel();
+    return _users[currentUserIndex()]->getActivityModel();
 }
 
 bool UserModel::currentUserHasActivities()
 {
-    return _users[currentUserIndex()].hasActivities();
+    return _users[currentUserIndex()]->hasActivities();
 }
 
 /*-------------------------------------------------------------------------------------*/
index 18d0e334b83fabf6dd91c87df6bc4b158c8ce67e..9f9ad55d7e3036c9d41577e204449db95b78c7d2 100644 (file)
 
 namespace OCC {
 
-class User
+class User : public QObject
 {
+    Q_OBJECT
 public:
-    User(AccountStatePtr &account, const bool &isCurrent = false);
+    User(AccountStatePtr &account, const bool &isCurrent = false, QObject* parent = 0);
 
-    bool operator==(const User &) const;
+    AccountPtr account() const;
 
     bool isConnected() const;
     bool isCurrentUser() const;
@@ -79,14 +80,15 @@ public:
         NameRole = Qt::UserRole + 1,
         ServerRole,
         AvatarRole,
-        IsCurrentUserRole
+        IsCurrentUserRole,
+        IsConnectedRole,
+        IdRole
     };
 
 signals:
     Q_INVOKABLE void addAccount();
     Q_INVOKABLE void refreshCurrentUserGui();
     Q_INVOKABLE void newUserSelected();
-    Q_INVOKABLE void refreshUserMenu();
 
 protected:
     QHash<int, QByteArray> roleNames() const;
@@ -94,7 +96,7 @@ protected:
 private:
     static UserModel *_instance;
     UserModel(QObject *parent = 0);
-    QList<User> _users;
+    QList<User*> _users;
     int _currentUserId;
     bool _init = true;
 
index cda5374b51d6c68d9024ba137f0c42da8b76f3fe..a9094761571f60e304f93837c086cd289014e2d3 100644 (file)
@@ -1,4 +1,5 @@
-import QtQml 2.0\r
+import QtQml 2.1\r
+import QtQml.Models 2.1\r
 import QtQuick 2.9\r
 import QtQuick.Window 2.2\r
 import QtQuick.Controls 2.2\r