From 5eff8608fe40b935762afe5a047400ea8d954a72 Mon Sep 17 00:00:00 2001 From: Dominique Fuchs <32204802+DominiqueFuchs@users.noreply.github.com> Date: Thu, 5 Dec 2019 08:21:19 +0100 Subject: [PATCH] Account swtich logic and UI updates Signed-off-by: Dominique Fuchs <32204802+DominiqueFuchs@users.noreply.github.com> --- src/gui/tray/UserLine.qml | 18 +++++++--- src/gui/tray/UserModel.cpp | 71 +++++++++++++++++++++++--------------- src/gui/tray/UserModel.h | 22 +++++++----- src/gui/tray/window.qml | 3 ++ 4 files changed, 73 insertions(+), 41 deletions(-) diff --git a/src/gui/tray/UserLine.qml b/src/gui/tray/UserLine.qml index 9489f077e..d694aaaf2 100644 --- a/src/gui/tray/UserLine.qml +++ b/src/gui/tray/UserLine.qml @@ -5,15 +5,23 @@ import QtQuick.Layouts 1.3 MenuItem { + Connections { + target: systrayBackend + onRefreshUserMenu: { + userLine.visible = isCurrentUser ? false : true + userLine.height = isCurrentUser ? 0 : 60 + } + } + id: userLine - visible: true + visible: isCurrentUser ? false : true width: 216 - height: 60 + height: isCurrentUser ? 0 : 60 //color: "transparent" Rectangle { id: userLineBackground - height: 60 + height: userLine.height anchors.fill: parent color: "transparent" @@ -35,7 +43,7 @@ MenuItem { } onClicked: { - systrayBackend.switchUser(index) + systrayBackend.switchCurrentUser(index) } RowLayout { @@ -45,7 +53,7 @@ MenuItem { spacing: 0 Image { id: accountAvatar - Layout.leftMargin: 6 + Layout.leftMargin: 4 verticalAlignment: Qt.AlignCenter source: avatar Layout.preferredHeight: (userLineBackground.height -16) diff --git a/src/gui/tray/UserModel.cpp b/src/gui/tray/UserModel.cpp index a7db2dd0c..4e42f48ef 100644 --- a/src/gui/tray/UserModel.cpp +++ b/src/gui/tray/UserModel.cpp @@ -6,11 +6,22 @@ namespace OCC { -User::User(const AccountStatePtr &account) +User::User(AccountStatePtr &account, const bool &isCurrent) : _account(account) + , _isCurrentUser(isCurrent) { } +bool User::operator==(const User &rhs) const +{ + return (this->_account->account() == rhs._account->account()); +} + +void User::setCurrentUser(const bool &isCurrent) +{ + _isCurrentUser = isCurrent; +} + QString User::name() const { // If davDisplayName is empty (can be several reasons, simplest is missing login at startup), fall back to username @@ -57,9 +68,9 @@ QString User::avatar() const return img; } -QString User::id() const +bool User::isCurrentUser() const { - return _account->account()->id(); + return _isCurrentUser; } bool User::isConnected() const @@ -81,72 +92,73 @@ UserModel *UserModel::instance() UserModel::UserModel(QObject *parent) : QAbstractListModel() - , _currentUser(nullptr) + , _currentUserId() { // TODO: Remember selected user from last quit via settings file // this is the reason why this looks like an unnecessary double check atm - if (AccountManager::instance()->accounts().size() > 0) { - addCurrentUser(AccountManager::instance()->accounts().first()); + /*if (AccountManager::instance()->accounts().size() > 0) { + addUser(AccountManager::instance()->accounts().first(), true); } else { return; + }*/ + if (AccountManager::instance()->accounts().size() > 0) { + initUserList(); } - - refreshUserList(); } -void UserModel::refreshUserList() +void UserModel::initUserList() { for (int i = 0; i < AccountManager::instance()->accounts().size(); i++) { auto user = AccountManager::instance()->accounts().at(i); - if ((user->account()->id() != _currentUser->id())) { - addUser(user); - } + addUser(user); } + _users.first().setCurrentUser(true); } Q_INVOKABLE int UserModel::numUsers() { - auto test = _users.size(); return _users.size(); } Q_INVOKABLE bool UserModel::isCurrentUserConnected() { - return _currentUser->isConnected(); + return _users[_currentUserId].isConnected(); } Q_INVOKABLE QString UserModel::currentUserAvatar() { - return _currentUser->avatar(); + return _users[_currentUserId].avatar(); } Q_INVOKABLE QString UserModel::currentUserName() { - return _currentUser->name(); + return _users[_currentUserId].name(); } Q_INVOKABLE QString UserModel::currentUserServer() { - return _currentUser->server(); + return _users[_currentUserId].server(); } -Q_INVOKABLE void UserModel::switchUser(const int id) -{ - addCurrentUser(_users.at(id)); - refreshUserList(); - emit refreshCurrentUserGui(); -} - -void UserModel::addUser(const User &user) +void UserModel::addUser(AccountStatePtr &user, const bool &isCurrent) { + auto newUser = User(user, isCurrent); beginInsertRows(QModelIndex(), rowCount(), rowCount()); - _users << user; + _users << newUser; + if (isCurrent) { + _currentUserId = _users.indexOf(newUser); + } endInsertRows(); } -void UserModel::addCurrentUser(const User &user) +Q_INVOKABLE void UserModel::switchCurrentUser(const int &id) { - _currentUser = new User(user); + _users[_currentUserId].setCurrentUser(false); + _users[id].setCurrentUser(true); + _currentUserId = id; + emit refreshCurrentUserGui(); + emit refreshUserMenu(); + emit newUserSelected(); } int UserModel::rowCount(const QModelIndex &parent) const @@ -168,6 +180,8 @@ QVariant UserModel::data(const QModelIndex &index, int role) const return user.server(); } else if (role == AvatarRole) { return user.avatar(); + } else if (role == IsCurrentUserRole) { + return user.isCurrentUser(); } return QVariant(); } @@ -178,6 +192,7 @@ QHash UserModel::roleNames() const roles[NameRole] = "name"; roles[ServerRole] = "server"; roles[AvatarRole] = "avatar"; + roles[IsCurrentUserRole] = "isCurrentUser"; return roles; } } \ No newline at end of file diff --git a/src/gui/tray/UserModel.h b/src/gui/tray/UserModel.h index 8e433385f..b8a9eb776 100644 --- a/src/gui/tray/UserModel.h +++ b/src/gui/tray/UserModel.h @@ -11,9 +11,13 @@ namespace OCC { class User { public: - User(const AccountStatePtr &account); + User(AccountStatePtr &account, const bool &isCurrent = false); + + bool operator==(const User &) const; bool isConnected() const; + bool isCurrentUser() const; + void setCurrentUser(const bool &isCurrent); void login(); void logout(); QString name() const; @@ -23,18 +27,17 @@ public: private: AccountStatePtr _account; + bool _isCurrentUser; }; class UserModel : public QAbstractListModel { Q_OBJECT - public: static UserModel *instance(); virtual ~UserModel() {}; - void addUser(const User &user); - void addCurrentUser(const User &user); + void addUser(AccountStatePtr &user, const bool &isCurrent = false); int rowCount(const QModelIndex &parent = QModelIndex()) const; @@ -45,12 +48,13 @@ public: Q_INVOKABLE QString currentUserAvatar(); Q_INVOKABLE QString currentUserName(); Q_INVOKABLE QString currentUserServer(); - Q_INVOKABLE void switchUser(const int id); + Q_INVOKABLE void switchCurrentUser(const int &id); enum UserRoles { NameRole = Qt::UserRole + 1, ServerRole, - AvatarRole + AvatarRole, + IsCurrentUserRole }; signals: @@ -60,6 +64,8 @@ signals: Q_INVOKABLE void removeAccount(); Q_INVOKABLE void refreshCurrentUserGui(); + Q_INVOKABLE void newUserSelected(); + Q_INVOKABLE void refreshUserMenu(); protected: QHash roleNames() const; @@ -68,9 +74,9 @@ private: static UserModel *_instance; UserModel(QObject *parent = 0); QList _users; - User *_currentUser; + int _currentUserId; - void refreshUserList(); + void initUserList(); }; } diff --git a/src/gui/tray/window.qml b/src/gui/tray/window.qml index f13012c20..85cff3b5b 100644 --- a/src/gui/tray/window.qml +++ b/src/gui/tray/window.qml @@ -29,6 +29,9 @@ Window { currentAccountUser.text = systrayBackend.currentUserName() currentAccountServer.text = systrayBackend.currentUserServer() } + onNewUserSelected: { + accountMenu.close() + } } Rectangle { -- 2.30.2