Implement account list and account list dialog

This commit is contained in:
Andrew
2013-11-18 12:05:35 -06:00
parent ad8aeb0b2b
commit cdca530139
12 changed files with 520 additions and 9 deletions

View File

@ -26,7 +26,7 @@
#include "logger/QsLog.h"
AuthenticateTask::AuthenticateTask(MojangAccount* account, const QString& password, QObject* parent) :
AuthenticateTask::AuthenticateTask(MojangAccountPtr account, const QString& password, QObject* parent) :
YggdrasilTask(account, parent), m_password(password)
{
}

View File

@ -29,7 +29,7 @@ class AuthenticateTask : public YggdrasilTask
{
Q_OBJECT
public:
AuthenticateTask(MojangAccount* account, const QString& password, QObject* parent=0);
AuthenticateTask(MojangAccountPtr account, const QString& password, QObject* parent=0);
protected:
virtual QJsonObject getRequestContent() const;

View File

@ -41,6 +41,16 @@ MojangAccount::MojangAccount(const QString& username, const QString& clientToken
m_currentProfile = -1;
}
MojangAccount::MojangAccount(const MojangAccount& other, QObject* parent)
{
m_username = other.username();
m_clientToken = other.clientToken();
m_accessToken = other.accessToken();
m_profiles = other.m_profiles;
m_currentProfile = other.m_currentProfile;
}
QString MojangAccount::username() const
{

View File

@ -19,6 +19,7 @@
#include <QString>
#include <QList>
#include <memory>
/**
* Class that represents a profile within someone's Mojang account.
@ -65,6 +66,11 @@ public:
*/
explicit MojangAccount(const QString& username, const QString& clientToken, const QString& accessToken, QObject* parent = 0);
/**
* Constructs a new MojangAccount matching the given account.
*/
MojangAccount(const MojangAccount& other, QObject* parent);
/**
* This MojangAccount's username. May be an email address if the account is migrated.
@ -124,3 +130,6 @@ protected:
ProfileList m_profiles; // List of available profiles.
};
typedef std::shared_ptr<MojangAccount> MojangAccountPtr;
Q_DECLARE_METATYPE(MojangAccountPtr)

View File

@ -25,7 +25,7 @@
#include <MultiMC.h>
#include <logic/auth/MojangAccount.h>
YggdrasilTask::YggdrasilTask(MojangAccount* account, QObject* parent) : Task(parent)
YggdrasilTask::YggdrasilTask(MojangAccountPtr account, QObject* parent) : Task(parent)
{
m_error = nullptr;
m_account = account;
@ -175,7 +175,7 @@ YggdrasilTask::Error *YggdrasilTask::getError() const
return this->m_error;
}
MojangAccount* YggdrasilTask::getMojangAccount() const
MojangAccountPtr YggdrasilTask::getMojangAccount() const
{
return this->m_account;
}

View File

@ -20,8 +20,7 @@
#include <QString>
#include <QJsonObject>
class MojangAccount;
#include "logic/auth/MojangAccount.h"
class QNetworkReply;
@ -33,7 +32,7 @@ class YggdrasilTask : public Task
{
Q_OBJECT
public:
explicit YggdrasilTask(MojangAccount* account, QObject* parent=0);
explicit YggdrasilTask(MojangAccountPtr account, QObject* parent=0);
~YggdrasilTask();
/**
@ -61,7 +60,7 @@ public:
/**
* Gets the Mojang account that this task is operating on.
*/
virtual MojangAccount* getMojangAccount() const;
virtual MojangAccountPtr getMojangAccount() const;
/**
* Returns a pointer to a YggdrasilTask::Error object if an error has occurred.
@ -117,7 +116,7 @@ protected:
*/
virtual QString getStateMessage(const State state) const;
MojangAccount* m_account;
MojangAccountPtr m_account;
QNetworkReply* m_netReply;

View File

@ -0,0 +1,146 @@
/* Copyright 2013 MultiMC Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "logic/lists/MojangAccountList.h"
#include "logic/auth/MojangAccount.h"
MojangAccountList::MojangAccountList(QObject *parent) : QAbstractListModel(parent)
{
}
MojangAccountPtr MojangAccountList::findAccount(const QString &username)
{
for (int i = 0; i < count(); i++)
{
MojangAccountPtr account = at(i);
if (account->username() == username)
return account;
}
return MojangAccountPtr();
}
const MojangAccountPtr MojangAccountList::at(int i) const
{
return MojangAccountPtr(m_accounts.at(i));
}
void MojangAccountList::addAccount(const MojangAccountPtr account)
{
beginResetModel();
m_accounts.append(account);
endResetModel();
}
void MojangAccountList::removeAccount(const QString& username)
{
beginResetModel();
for (auto account : m_accounts)
{
if (account->username() == username)
{
m_accounts.removeOne(account);
return;
}
}
endResetModel();
}
int MojangAccountList::count() const
{
return m_accounts.count();
}
QVariant MojangAccountList::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (index.row() > count())
return QVariant();
MojangAccountPtr account = at(index.row());
switch (role)
{
case Qt::DisplayRole:
switch (index.column())
{
case NameColumn:
return account->username();
default:
return QVariant();
}
case Qt::ToolTipRole:
return account->username();
case PointerRole:
return qVariantFromValue(account);
default:
return QVariant();
}
}
QVariant MojangAccountList::headerData(int section, Qt::Orientation orientation, int role) const
{
switch (role)
{
case Qt::DisplayRole:
switch (section)
{
case NameColumn:
return "Name";
default:
return QVariant();
}
case Qt::ToolTipRole:
switch (section)
{
case NameColumn:
return "The name of the version.";
default:
return QVariant();
}
default:
return QVariant();
}
}
int MojangAccountList::rowCount(const QModelIndex &parent) const
{
// Return count
return count();
}
int MojangAccountList::columnCount(const QModelIndex &parent) const
{
return 1;
}
void MojangAccountList::updateListData(QList<MojangAccountPtr> versions)
{
beginResetModel();
m_accounts = versions;
endResetModel();
}

View File

@ -0,0 +1,109 @@
/* Copyright 2013 MultiMC Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <QObject>
#include <QVariant>
#include <QAbstractListModel>
#include <QSharedPointer>
#include "logic/auth/MojangAccount.h"
/*!
* \brief List of available Mojang accounts.
* This should be loaded in the background by MultiMC on startup.
*
* This class also inherits from QAbstractListModel. Methods from that
* class determine how this list shows up in a list view. Said methods
* all have a default implementation, but they can be overridden by subclasses to
* change the behavior of the list.
*/
class MojangAccountList : public QAbstractListModel
{
Q_OBJECT
public:
enum ModelRoles
{
PointerRole = 0x34B1CB48
};
enum VListColumns
{
// TODO: Add icon column.
// First column - Name
NameColumn = 0,
};
explicit MojangAccountList(QObject *parent = 0);
//! Gets the account at the given index.
virtual const MojangAccountPtr at(int i) const;
//! Returns the number of accounts in the list.
virtual int count() const;
//////// List Model Functions ////////
virtual QVariant data(const QModelIndex &index, int role) const;
virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
virtual int rowCount(const QModelIndex &parent) const;
virtual int columnCount(const QModelIndex &parent) const;
/*!
* Adds a the given Mojang account to the account list.
*/
virtual void addAccount(const MojangAccountPtr account);
/*!
* Removes the mojang account with the given username from the account list.
*/
virtual void removeAccount(const QString& username);
/*!
* \brief Finds an account by its username.
* \param The username of the account to find.
* \return A const pointer to the account with the given username. NULL if
* one doesn't exist.
*/
virtual MojangAccountPtr findAccount(const QString &username);
signals:
/*!
* Signal emitted to indicate that the account list has changed.
* This will also fire if the value of an element in the list changes (will be implemented later).
*/
void listChanged();
protected:
QList<MojangAccountPtr> m_accounts;
protected
slots:
/*!
* Updates this list with the given list of accounts.
* This is done by copying each account in the given list and inserting it
* into this one.
* We need to do this so that we can set the parents of the accounts are set to this
* account list. This can't be done in the load task, because the accounts the load
* task creates are on the load task's thread and Qt won't allow their parents
* to be set to something created on another thread.
* To get around that problem, we invoke this method on the GUI thread, which
* then copies the accounts and sets their parents correctly.
* \param accounts List of accounts whose parents should be set.
*/
virtual void updateListData(QList<MojangAccountPtr> versions);
};