Use properties to get user details
authorNicolas Fella <nicolas.fella@gmx.de>
Tue, 16 Jun 2020 12:06:30 +0000 (14:06 +0200)
committerKevin Ottens <ervin@ipsquad.net>
Tue, 16 Jun 2020 13:01:37 +0000 (15:01 +0200)
Convert imperative QML code to declarative code using property bindings

Signed-off-by: Nicolas Fella <nicolas.fella@gmx.de>
src/gui/tray/UserModel.cpp
src/gui/tray/UserModel.h
src/gui/tray/Window.qml

index 2c656de679d2b2961597480316127e09acc071d3..2d60920b3145d1a83382a6714fbd6bee162471cd 100644 (file)
@@ -42,6 +42,9 @@ User::User(AccountStatePtr &account, const bool &isCurrent, QObject *parent)
             [=]() { if (isConnected()) {slotRefresh();} });
     connect(_account.data(), &AccountState::hasFetchedNavigationApps,
         this, &User::slotRebuildNavigationAppList);
+    connect(_account->account().data(), &Account::accountChangedDisplayName, this, &User::nameChanged);
+
+    connect(FolderMan::instance(), &FolderMan::folderListChanged, this, &User::hasLocalFolderChanged);
 }
 
 void User::slotBuildNotificationDisplay(const ActivityList &list)
@@ -149,6 +152,7 @@ void User::slotRefreshNotifications()
 
 void User::slotRebuildNavigationAppList()
 {
+    emit serverHasTalkChanged();
     // Rebuild App list
     UserAppsModel::instance()->buildAppList();
 }
@@ -399,7 +403,7 @@ void User::setCurrentUser(const bool &isCurrent)
     _isCurrentUser = isCurrent;
 }
 
-Folder *User::getFolder()
+Folder *User::getFolder() const
 {
     foreach (Folder *folder, FolderMan::instance()->map()) {
         if (folder->accountState() == _account.data()) {
@@ -472,6 +476,11 @@ QImage User::avatar(bool whiteBg) const
     }
 }
 
+bool User::hasLocalFolder() const
+{
+    return getFolder() != nullptr;
+}
+
 bool User::serverHasTalk() const
 {
     return _account->hasTalk();
@@ -544,7 +553,7 @@ Q_INVOKABLE int UserModel::numUsers()
     return _users.size();
 }
 
-Q_INVOKABLE int UserModel::currentUserId()
+Q_INVOKABLE int UserModel::currentUserId() const
 {
     return _currentUserId;
 }
@@ -579,15 +588,6 @@ QImage UserModel::avatarById(const int &id)
     return _users[id]->avatar(true);
 }
 
-Q_INVOKABLE QString UserModel::currentUserName()
-{
-    if (_users.count() >= 1) {
-        return _users[_currentUserId]->name();
-    } else {
-        return QString("No users");
-    }
-}
-
 Q_INVOKABLE QString UserModel::currentUserServer()
 {
     if (_users.count() >= 1) {
@@ -782,6 +782,11 @@ AccountAppList UserModel::appList() const
     }
 }
 
+User *UserModel::currentUser() const
+{
+    return _users[currentUserId()];
+}
+
 /*-------------------------------------------------------------------------------------*/
 
 ImageProvider::ImageProvider()
index 8245888f994913446de089867d6f130f2d95d0a3..3a28e65e3257c01f095ee0d0027877df352cce4f 100644 (file)
@@ -17,6 +17,10 @@ namespace OCC {
 class User : public QObject
 {
     Q_OBJECT
+    Q_PROPERTY(QString name READ name NOTIFY nameChanged)
+    Q_PROPERTY(QString server READ server CONSTANT)
+    Q_PROPERTY(bool hasLocalFolder READ hasLocalFolder NOTIFY hasLocalFolderChanged)
+    Q_PROPERTY(bool serverHasTalk READ serverHasTalk NOTIFY serverHasTalkChanged)
 public:
     User(AccountStatePtr &account, const bool &isCurrent = false, QObject* parent = 0);
 
@@ -25,11 +29,12 @@ public:
     bool isConnected() const;
     bool isCurrentUser() const;
     void setCurrentUser(const bool &isCurrent);
-    Folder *getFolder();
+    Folder *getFolder() const;
     ActivityListModel *getActivityModel();
     void openLocalFolder();
     QString name() const;
     QString server(bool shortened = true) const;
+    bool hasLocalFolder() const;
     bool serverHasTalk() const;
     bool hasActivities() const;
     AccountAppList appList() const;
@@ -41,6 +46,9 @@ public:
 
 signals:
     void guiLog(const QString &, const QString &);
+    void nameChanged();
+    void hasLocalFolderChanged();
+    void serverHasTalkChanged();
 
 public slots:
     void slotItemCompleted(const QString &folder, const SyncFileItemPtr &item);
@@ -79,6 +87,7 @@ private:
 class UserModel : public QAbstractListModel
 {
     Q_OBJECT
+    Q_PROPERTY(User* currentUser READ currentUser NOTIFY newUserSelected)
 public:
     static UserModel *instance();
     virtual ~UserModel() {};
@@ -92,18 +101,19 @@ public:
 
     QImage avatarById(const int &id);
 
+    User *currentUser() const;
+
     Q_INVOKABLE void fetchCurrentActivityModel();
     Q_INVOKABLE void openCurrentAccountLocalFolder();
     Q_INVOKABLE void openCurrentAccountTalk();
     Q_INVOKABLE void openCurrentAccountServer();
     Q_INVOKABLE QImage currentUserAvatar();
     Q_INVOKABLE int numUsers();
-    Q_INVOKABLE QString currentUserName();
     Q_INVOKABLE QString currentUserServer();
     Q_INVOKABLE bool currentUserHasActivities();
     Q_INVOKABLE bool currentUserHasLocalFolder();
     Q_INVOKABLE bool currentServerHasTalk();
-    Q_INVOKABLE int currentUserId();
+    Q_INVOKABLE int currentUserId() const;
     Q_INVOKABLE bool isUserConnected(const int &id);
     Q_INVOKABLE void switchCurrentUser(const int &id);
     Q_INVOKABLE void login(const int &id);
index 7d1f54caee7332d8acbebe350661bdc6d8417b6f..8128e4dd53e25aa947e5f6e2f08ae02a879dfbf1 100644 (file)
@@ -30,10 +30,6 @@ Window {
     onVisibleChanged: {\r
         currentAccountAvatar.source = ""\r
         currentAccountAvatar.source = "image://avatars/currentUser"\r
-        currentAccountUser.text = UserModel.currentUserName();\r
-        currentAccountServer.text = UserModel.currentUserServer();\r
-        openLocalFolderButton.visible = UserModel.currentUserHasLocalFolder();\r
-        trayWindowTalkButton.visible = UserModel.currentServerHasTalk();\r
         currentAccountStateIndicator.source = ""\r
         currentAccountStateIndicator.source = UserModel.isUserConnected(UserModel.currentUserId()) ? "qrc:///client/theme/colored/state-ok.svg" : "qrc:///client/theme/colored/state-offline.svg"\r
 \r
@@ -48,15 +44,11 @@ Window {
         onRefreshCurrentUserGui: {\r
             currentAccountAvatar.source = ""\r
             currentAccountAvatar.source = "image://avatars/currentUser"\r
-            currentAccountUser.text = UserModel.currentUserName();\r
-            currentAccountServer.text = UserModel.currentUserServer();\r
             currentAccountStateIndicator.source = ""\r
             currentAccountStateIndicator.source = UserModel.isUserConnected(UserModel.currentUserId()) ? "qrc:///client/theme/colored/state-ok.svg" : "qrc:///client/theme/colored/state-offline.svg"\r
         }\r
         onNewUserSelected: {\r
             accountMenu.close();\r
-            openLocalFolderButton.visible = UserModel.currentUserHasLocalFolder();\r
-            trayWindowTalkButton.visible = UserModel.currentServerHasTalk();\r
         }\r
     }\r
 \r
@@ -327,8 +319,9 @@ Window {
                             Layout.leftMargin: 6\r
                             Label {\r
                                 id: currentAccountUser\r
+\r
                                 width: Style.currentAccountLabelWidth\r
-                                text: UserModel.currentUserName()\r
+                                text: UserModel.currentUser.name\r
                                 elide: Text.ElideRight\r
                                 color: "white"\r
                                 font.pixelSize: Style.topLinePixelSize\r
@@ -337,7 +330,7 @@ Window {
                             Label {\r
                                 id: currentAccountServer\r
                                 width: Style.currentAccountLabelWidth\r
-                                text: UserModel.currentUserServer()\r
+                                text: UserModel.currentUser.server\r
                                 elide: Text.ElideRight\r
                                 color: "white"\r
                                 font.pixelSize: Style.subLinePixelSize\r
@@ -364,7 +357,7 @@ Window {
                 HeaderButton {\r
                     id: openLocalFolderButton\r
 \r
-                    visible: UserModel.currentUserHasLocalFolder()\r
+                    visible: UserModel.currentUser.hasLocalFolder\r
                     icon.source: "qrc:///client/theme/white/folder.svg"\r
                     onClicked: UserModel.openCurrentAccountLocalFolder()\r
                 }\r
@@ -372,7 +365,7 @@ Window {
                 HeaderButton {\r
                     id: trayWindowTalkButton\r
 \r
-                    visible: UserModel.currentServerHasTalk()\r
+                    visible: UserModel.currentUser.serverHasTalk\r
                     icon.source: "qrc:///client/theme/white/talk-app.svg"\r
                     onClicked: UserModel.openCurrentAccountTalk()\r
                 }\r