GODT-2003: introduces 3 phases user state (SignedOut/Locked/Connected)

WIP: introduced UserState enum in GUI and implemented logic.
This commit is contained in:
Xavier Michelon
2022-11-15 17:24:54 +01:00
parent 49b3c18903
commit e087a7972e
27 changed files with 1516 additions and 1276 deletions

View File

@ -52,7 +52,7 @@ void User::update(User const &user)
this->setPassword(user.password());
this->setAddresses(user.addresses());
this->setAvatarText(user.avatarText());
this->setLoggedIn(user.loggedIn());
this->setState(user.state());
this->setSplitMode(user.splitMode());
this->setSetupGuideSeen(user.setupGuideSeen());
this->setUsedBytes(user.usedBytes());
@ -217,24 +217,24 @@ void User::setAvatarText(QString const &avatarText)
//****************************************************************************************************************************************************
/// \return The login status.
/// \return The user state.
//****************************************************************************************************************************************************
bool User::loggedIn() const
UserState User::state() const
{
return loggedIn_;
return state_;
}
//****************************************************************************************************************************************************
/// \param[in] loggedIn The login status.
/// \param[in] state The user state.
//****************************************************************************************************************************************************
void User::setLoggedIn(bool loggedIn)
void User::setState(UserState state)
{
if (loggedIn == loggedIn_)
if (state_ == state)
return;
loggedIn_ = loggedIn;
emit loggedInChanged(loggedIn_);
state_ = state;
emit stateChanged(state);
}

View File

@ -24,6 +24,36 @@ namespace bridgepp
{
//****************************************************************************************************************************************************
/// A wrapper QObject class around a C++ enum. The purpose of this is to be able to use this enum in both Qt and QML code.
/// See https://qml.guide/enums-in-qt-qml/ for details (we used Q_OBJECT instead of Q_GADGET as in the reference document avoid a QML warning
/// complaining about the case of the data type).
//****************************************************************************************************************************************************
class EUserState: public QObject
{
Q_OBJECT
public:
enum State
{
SignedOut = 0,
Locked = 1,
Connected = 2
};
Q_ENUM(State)
EUserState() = delete; ///< Default constructor.
EUserState(EUserState const&) = delete; ///< Disabled copy-constructor.
EUserState(EUserState&&) = delete; ///< Disabled assignment copy-constructor.
~EUserState() = default; ///< Destructor.
EUserState& operator=(EUserState const&) = delete; ///< Disabled assignment operator.
EUserState& operator=(EUserState&&) = delete; ///< Disabled move assignment operator.
};
typedef EUserState::State UserState;
typedef std::shared_ptr<class User> SPUser; ///< Type definition for shared pointer to user.
@ -32,6 +62,7 @@ typedef std::shared_ptr<class User> SPUser; ///< Type definition for shared poin
//****************************************************************************************************************************************************
class User : public QObject
{
Q_OBJECT
public: // static member function
static SPUser newUser(QObject *parent); ///< Create a new user
@ -58,14 +89,13 @@ signals: // signal used to forward QML event received in the above slots
void removeUser(QString const &userID);
void configureAppleMailForUser(QString const &userID, QString const &address);
public:
Q_PROPERTY(QString id READ id WRITE setID NOTIFY idChanged) // _ string ID
Q_PROPERTY(QString username READ username WRITE setUsername NOTIFY usernameChanged) // _ string `property:"username"`
Q_PROPERTY(QString password READ password WRITE setPassword NOTIFY passwordChanged) // _ string `property:"password"`
Q_PROPERTY(QStringList addresses READ addresses WRITE setAddresses NOTIFY addressesChanged) // _ []string `property:"addresses"`
Q_PROPERTY(QString avatarText READ avatarText WRITE setAvatarText NOTIFY avatarTextChanged) // _ string `property:"avatarText"`
Q_PROPERTY(bool loggedIn READ loggedIn WRITE setLoggedIn NOTIFY loggedInChanged) // _ bool `property:"loggedIn"`
Q_PROPERTY(UserState state READ state WRITE setState NOTIFY stateChanged)
Q_PROPERTY(bool splitMode READ splitMode WRITE setSplitMode NOTIFY splitModeChanged) // _ bool `property:"splitMode"`
Q_PROPERTY(bool setupGuideSeen READ setupGuideSeen WRITE setSetupGuideSeen NOTIFY setupGuideSeenChanged) // _ bool `property:"setupGuideSeen"`
Q_PROPERTY(float usedBytes READ usedBytes WRITE setUsedBytes NOTIFY usedBytesChanged) // _ float32 `property:"usedBytes"`
@ -81,8 +111,8 @@ public:
void setAddresses(QStringList const &addresses);
QString avatarText() const;
void setAvatarText(QString const &avatarText);
bool loggedIn() const;
void setLoggedIn(bool loggedIn);
UserState state() const;
void setState(UserState state);
bool splitMode() const;
void setSplitMode(bool splitMode);
bool setupGuideSeen() const;
@ -100,11 +130,11 @@ signals:
void addressesChanged(QStringList const &);
void avatarTextChanged(QString const &avatarText);
void loggedInChanged(bool loggedIn);
void stateChanged(UserState state);
void splitModeChanged(bool splitMode);
void setupGuideSeenChanged(bool seen);
void usedBytesChanged(float byteCount);
void totalBytesChanged(float byteCount);
void toggleSplitModeFinished();
private: // member functions.
@ -116,7 +146,7 @@ private: // data members.
QString password_; ///< The IMAP password of the user.
QStringList addresses_; ///< The email address list of the user.
QString avatarText_; ///< The avatar text (i.e. initials of the user)
bool loggedIn_ { true }; ///< Is the user logged in.
UserState state_ { UserState::SignedOut }; ///< The state of the user
bool splitMode_ { false }; ///< Is split mode active.
bool setupGuideSeen_ { false }; ///< Has the setup guide been seen.
float usedBytes_ { 0.0f }; ///< The storage used by the user.