diff --git a/src/AccountDelegate.cpp b/src/AccountDelegate.cpp index 020a0e89a..5a4896bc1 100644 --- a/src/AccountDelegate.cpp +++ b/src/AccountDelegate.cpp @@ -470,7 +470,7 @@ AccountDelegate::editorEvent( QEvent* event, QAbstractItemModel* model, const QS else if ( m_cachedButtonRects.contains( index ) && m_cachedButtonRects[ index ].contains( me->pos() ) ) { // Install/create/etc button for this row - model->setData( index, true, AccountModel::ButtonClickedRole ); + model->setData( index, true, AccountModel::AddAccountButtonRole ); } } diff --git a/src/libtomahawk/accounts/AccountModel.cpp b/src/libtomahawk/accounts/AccountModel.cpp index 4ddc4df80..7a2c06660 100644 --- a/src/libtomahawk/accounts/AccountModel.cpp +++ b/src/libtomahawk/accounts/AccountModel.cpp @@ -30,8 +30,7 @@ using namespace Tomahawk; using namespace Accounts; AccountModel::AccountModel( QObject* parent ) - : QAbstractItemModel( parent ) - , m_rootItem( 0 ) + : QAbstractListModel( parent ) { loadData(); } @@ -41,9 +40,8 @@ AccountModel::loadData() { beginResetModel(); - delete m_rootItem; + qDeleteAll( m_accounts ); - m_rootItem = new AccountModelNode(); // Add all factories QList< AccountFactory* > factories = AccountManager::instance()->factories(); QList< Account* > allAccounts = AccountManager::instance()->accounts(); @@ -53,20 +51,20 @@ AccountModel::loadData() continue; qDebug() << "Creating factory node:" << fac->prettyName(); - new AccountModelNode( m_rootItem, fac ); + m_accounts << new AccountModelNode( fac ); } // add all attica resolvers (installed or uninstalled) Attica::Content::List fromAttica = AtticaManager::instance()->resolvers(); foreach ( const Attica::Content& content, fromAttica ) - new AccountModelNode( m_rootItem, content ); + m_accounts << new AccountModelNode( content ); // Add all non-attica manually installed resolvers foreach ( Account* acct, allAccounts ) { if ( qobject_cast< ResolverAccount* >( acct ) && !qobject_cast< AtticaResolverAccount* >( acct ) ) { - new AccountModelNode( m_rootItem, qobject_cast< ResolverAccount* >( acct ) ); + m_accounts << new AccountModelNode( qobject_cast< ResolverAccount* >( acct ) ); } } @@ -86,173 +84,140 @@ AccountModel::data( const QModelIndex& index, int role ) const if ( !hasIndex( index.row(), index.column(), index.parent() ) ) return QVariant(); - const AccountModelNode* node = nodeFromIndex( index ); - if ( node->parent == m_rootItem ) { - // This is a top-level item. 3 cases - Q_ASSERT( node->type != AccountModelNode::AccountType ); // must not be of this type, these should be children (other branch of if) + const AccountModelNode* node = m_accounts.at( index.row() ); + // This is a top-level item. 3 cases - switch ( node->type ) + switch ( node->type ) + { + case AccountModelNode::FactoryType: { - case AccountModelNode::FactoryType: - { - AccountFactory* fac = node->factory; - Q_ASSERT( fac ); + AccountFactory* fac = node->factory; + Q_ASSERT( fac ); + switch ( role ) + { + case Qt::DisplayRole: + return fac->prettyName(); + case Qt::DecorationRole: + return fac->icon(); + case StateRole: + return ShippedWithTomahawk; + case DescriptionRole: + return fac->description(); + case RowTypeRole: + return TopLevelFactory; + default: + return QVariant(); + } + } + case AccountModelNode::AtticaType: + { + Attica::Content c = node->atticaContent; + Q_ASSERT( !c.id().isNull() ); + + switch( role ) + { + case Qt::DisplayRole: + return c.name(); + case Qt::DecorationRole: + return QVariant::fromValue< QPixmap >( AtticaManager::instance()->iconForResolver( c ) ); + case StateRole: + return (int)AtticaManager::instance()->resolverState( c ); + case DescriptionRole: + return c.description(); + case AuthorRole: + return c.author(); + case RowTypeRole: + return TopLevelAccount; + case RatingRole: + return c.rating() / 20; // rating is out of 100 + case DownloadCounterRole: + return c.downloads(); + case VersionRole: + return c.version(); + case UserHasRatedRole: + return AtticaManager::instance()->userHasRated( c ); + default: + ; + } + + AtticaResolverAccount* atticaAcct = node->atticaAccount; + if ( atticaAcct ) + { + // If the resolver is installed or on disk, we expose some additional data switch ( role ) { - case Qt::DisplayRole: - return fac->prettyName(); - case Qt::DecorationRole: - return fac->icon(); - case StateRole: - return ShippedWithTomahawk; - case DescriptionRole: - return fac->description(); - case RowTypeRole: - return TopLevelFactory; - default: - return QVariant(); - } - } - case AccountModelNode::AtticaType: - { - Attica::Content c = node->atticaContent; - Q_ASSERT( !c.id().isNull() ); - - switch( role ) - { - case Qt::DisplayRole: - return c.name(); - case Qt::DecorationRole: - return QVariant::fromValue< QPixmap >( AtticaManager::instance()->iconForResolver( c ) ); - case StateRole: - return (int)AtticaManager::instance()->resolverState( c ); - case DescriptionRole: - return c.description(); - case AuthorRole: - return c.author(); - case RowTypeRole: - return TopLevelAccount; - case RatingRole: - return c.rating() / 20; // rating is out of 100 - case DownloadCounterRole: - return c.downloads(); - case VersionRole: - return c.version(); - case UserHasRatedRole: - return AtticaManager::instance()->userHasRated( c ); + case HasConfig: + return atticaAcct->configurationWidget() != 0; + case Qt::CheckStateRole: + return atticaAcct->enabled() ? Qt::Checked : Qt::Unchecked; + case AccountData: + return QVariant::fromValue< QObject* >( atticaAcct ); + case ConnectionStateRole: + return atticaAcct->connectionState(); default: ; } - - AtticaResolverAccount* atticaAcct = node->atticaAccount; - if ( atticaAcct ) - { - // If the resolver is installed or on disk, we expose some additional data - switch ( role ) - { - case HasConfig: - return atticaAcct->configurationWidget() != 0; - case Qt::CheckStateRole: - return atticaAcct->enabled() ? Qt::Checked : Qt::Unchecked; - case AccountData: - return QVariant::fromValue< QObject* >( atticaAcct ); - case ConnectionStateRole: - return atticaAcct->connectionState(); - default: - ; - } - } - return QVariant(); } - case AccountModelNode::ManualResolverType: - case AccountModelNode::UniqueFactoryType: - { - Account* acct = 0; - if ( node->type == AccountModelNode::ManualResolverType ) - acct = node->resolverAccount; - else if ( node->type == AccountModelNode::UniqueFactoryType ) - acct = node->account; - - // If there's no account*, then it means it's a unique factory that hasn't been created - if ( !acct ) - { - Q_ASSERT( node->type == AccountModelNode::UniqueFactoryType ); - Q_ASSERT( node->factory ); - - switch( role ) - { - case Qt::DisplayRole: - return node->factory->prettyName(); - case Qt::DecorationRole: - return node->factory->icon(); - case DescriptionRole: - return node->factory->description(); - case RowTypeRole: - return TopLevelFactory; - case StateRole: - return Uninstalled; - default: - return QVariant(); - } - } - else - { - switch ( role ) - { - case Qt::DisplayRole: - return acct->accountFriendlyName(); - case Qt::DecorationRole: - return acct->icon(); - case DescriptionRole: - return node->type == AccountModelNode::ManualResolverType ? QString() : node->factory->description(); - case Qt::CheckStateRole: - return acct->enabled() ? Qt::Checked : Qt::Unchecked; - case AccountData: - return QVariant::fromValue< QObject* >( acct ); - case RowTypeRole: - return TopLevelAccount; - case ConnectionStateRole: - return acct->connectionState(); - case HasConfig: - return acct->configurationWidget() != 0; - case StateRole: - return Installed; - default: - return QVariant(); - } - } - } - case AccountModelNode::AccountType: - Q_ASSERT( false ); // Should not be here---all account nodes should be children of top level nodes + return QVariant(); } - } - else - { - // This is a child account* of an accountfactory* - Q_ASSERT( node->type == AccountModelNode::AccountType ); - Q_ASSERT( node->children.isEmpty() ); - Q_ASSERT( node->account ); - - Account* acc = node->account; - switch ( role ) + case AccountModelNode::ManualResolverType: + case AccountModelNode::UniqueFactoryType: { - case RowTypeRole: - return ChildAccount; - case Qt::DisplayRole: - return acc->accountFriendlyName(); - case ConnectionStateRole: - return acc->connectionState(); - case HasConfig: - return ( acc->configurationWidget() != 0 ); - case ErrorString: - return acc->errorMessage(); - case Qt::CheckStateRole: - return acc->enabled() ? Qt::Checked : Qt::Unchecked; - case AccountData: - return QVariant::fromValue< QObject* >( acc ); - default: - return QVariant(); + Account* acct = 0; + if ( node->type == AccountModelNode::ManualResolverType ) + acct = node->resolverAccount; + else if ( node->type == AccountModelNode::UniqueFactoryType ) + acct = node->accounts.first(); + + // If there's no account*, then it means it's a unique factory that hasn't been created + if ( !acct ) + { + Q_ASSERT( node->type == AccountModelNode::UniqueFactoryType ); + Q_ASSERT( node->factory ); + + switch( role ) + { + case Qt::DisplayRole: + return node->factory->prettyName(); + case Qt::DecorationRole: + return node->factory->icon(); + case DescriptionRole: + return node->factory->description(); + case RowTypeRole: + return TopLevelFactory; + case StateRole: + return Uninstalled; + default: + return QVariant(); + } + } + else + { + switch ( role ) + { + case Qt::DisplayRole: + return acct->accountFriendlyName(); + case Qt::DecorationRole: + return acct->icon(); + case DescriptionRole: + return node->type == AccountModelNode::ManualResolverType ? QString() : node->factory->description(); + case Qt::CheckStateRole: + return acct->enabled() ? Qt::Checked : Qt::Unchecked; + case AccountData: + return QVariant::fromValue< QObject* >( acct ); + case RowTypeRole: + return TopLevelAccount; + case ConnectionStateRole: + return acct->connectionState(); + case HasConfig: + return acct->configurationWidget() != 0; + case StateRole: + return Installed; + default: + return QVariant(); + } + } } } @@ -267,32 +232,54 @@ AccountModel::setData( const QModelIndex& index, const QVariant& value, int role if ( !index.isValid() || !hasIndex( index.row(), index.column(), index.parent() ) ) return false; - AccountModelNode* node = nodeFromIndex( index ); + AccountModelNode* node = m_accounts.at( index.row() ); if ( role == CheckboxClickedRole ) { - // All checkboxes are for turning on/off an account. So we can just do that - Q_ASSERT( node->account || node->resolverAccount || node->atticaAccount ); - Q_ASSERT( node->type != AccountModelNode::FactoryType ); - Account* acct = 0; switch ( node->type ) { - case AccountModelNode::AccountType: case AccountModelNode::UniqueFactoryType: - acct = node->account; + Q_ASSERT( node->accounts.size() == 1 ); + acct = node->accounts.first(); break; case AccountModelNode::AtticaType: - acct = node->atticaAccount; - break; + { + // This may or may not be installed. if it's not installed yet, install it, then go ahead and enable it + Q_ASSERT( node->atticaContent.isValid() ); + + Attica::Content resolver = node->atticaContent; + AtticaManager::ResolverState state = AtticaManager::instance()->resolverState( resolver ); + if ( state == AtticaManager::Installed ) + { + acct = node->atticaAccount; + break; + } + else + { + connect( AtticaManager::instance(), SIGNAL( resolverInstalled( QString ) ), this, SLOT( atticaInstalled( QString ) ) ); + m_waitingForAtticaInstall.insert( resolver.id() ); + + AtticaManager::instance()->installResolver( resolver ); + return true; + } + + } case AccountModelNode::ManualResolverType: acct = node->resolverAccount; break; default: ; }; - Q_ASSERT( acct ); + if ( node->type == AccountModelNode::FactoryType ) + { + // TODO handle overall on/off + + return false; + } + + Q_ASSERT( acct ); Qt::CheckState state = static_cast< Qt::CheckState >( value.toInt() ); if ( state == Qt::Checked && !acct->enabled() ) @@ -307,69 +294,15 @@ AccountModel::setData( const QModelIndex& index, const QVariant& value, int role } // The install/create/remove/etc button was clicked. Handle it properly depending on this item - if ( role == ButtonClickedRole ) + if ( role == AddAccountButtonRole ) { - switch ( node->type ) - { - case AccountModelNode::FactoryType: - case AccountModelNode::UniqueFactoryType: - { - Q_ASSERT( node->factory ); - - // Make a new account of this factory type - emit createAccount( node->factory ); - break; - } - case AccountModelNode::AccountType: - case AccountModelNode::ManualResolverType: - { - Q_ASSERT( node->account || node->resolverAccount ); - Account* acct = node->type == AccountModelNode::AccountType ? node->account : node->resolverAccount; - - // This is a child account, and the remove button was just hit. Remove it! - // OR this is a manually added resolver, and - // the only thing we can do with a manual resolver is remove it completely from the list - AccountManager::instance()->removeAccount( acct ); - - break; - } - case AccountModelNode::AtticaType: - { - // This is an attica resolver, may be installed or not. Handle it properly - Q_ASSERT( node->atticaContent.isValid() ); - - Attica::Content resolver = node->atticaContent; - AtticaManager::ResolverState state = AtticaManager::instance()->resolverState( resolver ); - if ( role == Qt::EditRole ) - { - switch( state ) - { - case AtticaManager::Uninstalled: - // install - AtticaManager::instance()->installResolver( resolver ); - break; - case AtticaManager::Installing: - case AtticaManager::Upgrading: - // Do nothing, busy - break; - case AtticaManager::Installed: - // Uninstall - AtticaManager::instance()->uninstallResolver( resolver ); - break; - case AtticaManager::NeedsUpgrade: - AtticaManager::instance()->upgradeResolver( resolver ); - break; - default: - //FIXME -- this handles e.g. Failed - break; - }; - } - emit dataChanged( index, index ); - } - } - + Q_ASSERT( node->type == AccountModelNode::FactoryType ); + // Make a new account of this factory type + emit createAccount( node->factory ); return true; } + + if ( role == RatingRole ) { // We only support rating Attica resolvers for the moment. @@ -398,30 +331,16 @@ AccountModel::accountAdded( Account* account ) { // Find the factory this belongs up, and update AccountFactory* factory = AccountManager::instance()->factoryForAccount( account ); - for ( int i = 0; i < m_rootItem->children.size(); i++ ) + for ( int i = 0; i < m_accounts.size(); i++ ) { - AccountModelNode* n = m_rootItem->children.at( i ); + AccountModelNode* n = m_accounts.at( i ); if ( n->factory == factory ) { - if ( factory->isUnique() ) - { - Q_ASSERT( n->type == AccountModelNode::UniqueFactoryType ); - n->account = account; - const QModelIndex idx = index( i, 0, QModelIndex() ); - emit dataChanged( idx, idx ); + n->accounts << account; + const QModelIndex idx = index( i, 0, QModelIndex() ); + dataChanged( idx, idx ); - return; - } - else - { - Q_ASSERT( n->type == AccountModelNode::FactoryType ); - // This is our parent - beginInsertRows( index( i, 0, QModelIndex() ), n->children.size(), n->children.size() ); - new AccountModelNode( n, account ); - endInsertRows(); - - return; - } + return; } } @@ -434,12 +353,24 @@ AccountModel::accountAdded( Account* account ) if ( attica->atticaId() == c.id() ) { // This is us. Create the row -// const int count = m_rootItem->children.size() -// beginInsertRows( QModelIndex(), ); -// new AccountModelNode( ); + const int count = m_accounts.size(); + beginInsertRows( QModelIndex(), count, count ); + m_accounts << new AccountModelNode( c ); + endInsertRows(); + + return; } } } + + // Ok, just a plain resolver. add it at the end + if ( ResolverAccount* resolver = qobject_cast< ResolverAccount* >( account ) ) + { + const int count = m_accounts.size(); + beginInsertRows( QModelIndex(), count, count ); + m_accounts << new AccountModelNode( resolver ); + endInsertRows(); + } } @@ -448,15 +379,14 @@ AccountModel::accountStateChanged( Account* account , Account::ConnectionState ) { // Find the factory this belongs up, and update AccountFactory* factory = AccountManager::instance()->factoryForAccount( account ); - for ( int i = 0; i < m_rootItem->children.size(); i++ ) + for ( int i = 0; i < m_accounts.size(); i++ ) { - AccountModelNode* n = m_rootItem->children.at( i ); + AccountModelNode* n = m_accounts.at( i ); if ( n->type != AccountModelNode::FactoryType ) { // If this is not a non-unique factory, it has as top-level account, so find that and update it // For each type that this node could be, check the corresponding data - if ( ( n->type == AccountModelNode::UniqueFactoryType && n->account && n->account == account ) || - ( n->type == AccountModelNode::AccountType && n->account == account ) || + if ( ( n->type == AccountModelNode::UniqueFactoryType && n->accounts.size() && n->accounts.first() == account ) || ( n->type == AccountModelNode::AtticaType && n->atticaAccount && n->atticaAccount == account ) || ( n->type == AccountModelNode::ManualResolverType && n->resolverAccount && n->resolverAccount == account ) ) { @@ -466,14 +396,13 @@ AccountModel::accountStateChanged( Account* account , Account::ConnectionState ) } else { - for ( int k = 0; k < n->children.size(); k++ ) + for ( int k = 0; k < n->accounts.size(); k++ ) { - AccountModelNode* childAccount = n->children.at( k ); - Q_ASSERT( childAccount->type == AccountModelNode::AccountType ); - if ( childAccount->account == account ) + Account* childAccount = n->accounts.at( k ); + + if ( childAccount == account ) { - const QModelIndex parent = index( i, 0, QModelIndex() ); - const QModelIndex idx = index( k, 0, parent ); + const QModelIndex idx = index( i, 0, QModelIndex() ); emit dataChanged( idx, idx ); } } @@ -488,96 +417,44 @@ AccountModel::accountRemoved( Account* account ) { // Find the factory this belongs up, and update AccountFactory* factory = AccountManager::instance()->factoryForAccount( account ); - for ( int i = 0; i < m_rootItem->children.size(); i++ ) + for ( int i = 0; i < m_accounts.size(); i++ ) { - AccountModelNode* n = m_rootItem->children.at( i ); - if ( n->factory == factory ) + AccountModelNode* n = m_accounts.at( i ); + + if ( n->type == AccountModelNode::FactoryType && + n->factory == factory ) { - if ( factory->isUnique() ) - { - Q_ASSERT( n->type == AccountModelNode::UniqueFactoryType ); - n->account = account; - const QModelIndex idx = index( i, 0, QModelIndex() ); - emit dataChanged( idx, idx ); - } - else - { - Q_ASSERT( n->type == AccountModelNode::FactoryType ); - // This is our parent - beginInsertRows( index( i, 0, QModelIndex() ), n->children.size(), n->children.size() ); - new AccountModelNode( n, account ); - endInsertRows(); - } + n->accounts.removeAll( account ); + const QModelIndex idx = index( i, 0, QModelIndex() ); + emit dataChanged( idx, idx ); + + return; + } + + if ( ( n->type == AccountModelNode::UniqueFactoryType && n->accounts.size() && n->accounts.first() == account ) || + ( n->type == AccountModelNode::AtticaType && n->atticaAccount && n->atticaAccount == account ) || + ( n->type == AccountModelNode::ManualResolverType && n->resolverAccount && n->resolverAccount == account ) ) + { + beginRemoveRows( QModelIndex(), i, i ); + m_accounts.removeAt( i ); + endRemoveRows(); + + return; } } } -int -AccountModel::columnCount( const QModelIndex& parent ) const +void +AccountModel::atticaInstalled( const QString& atticaId ) { - return 1; + } int -AccountModel::rowCount( const QModelIndex& parent ) const +AccountModel::rowCount( const QModelIndex& ) const { - if ( !parent.isValid() ) - { - return m_rootItem->children.count(); - } - - // If it's a top-level item, return child count. Only factories will have any. - return nodeFromIndex( parent )->children.count(); + return m_accounts.size(); } - -QModelIndex -AccountModel::parent( const QModelIndex& child ) const -{ - if ( !child.isValid() ) - { - return QModelIndex(); - } - - AccountModelNode* node = nodeFromIndex( child ); - AccountModelNode* parent = node->parent; - - // top level, none - if( parent == m_rootItem ) - return QModelIndex(); - - // child Account* of an AccountFactory* - Q_ASSERT( m_rootItem->children.contains( parent ) ); - return createIndex( m_rootItem->children.indexOf( parent ), 0, parent ); -} - - -QModelIndex -AccountModel::index( int row, int column, const QModelIndex& parent ) const -{ - if( row < 0 || column < 0 ) - return QModelIndex(); - - if( hasIndex( row, column, parent ) ) - { - AccountModelNode *parentNode = nodeFromIndex( parent ); - AccountModelNode *childNode = parentNode->children.at( row ); - return createIndex( row, column, childNode ); - } - - return QModelIndex(); -} - - -AccountModelNode* -AccountModel::nodeFromIndex( const QModelIndex& idx ) const -{ - if( !idx.isValid() ) - return m_rootItem; - - Q_ASSERT( idx.internalPointer() ); - - return reinterpret_cast< AccountModelNode* >( idx.internalPointer() ); -} diff --git a/src/libtomahawk/accounts/AccountModel.h b/src/libtomahawk/accounts/AccountModel.h index ad16c4add..97da15c73 100644 --- a/src/libtomahawk/accounts/AccountModel.h +++ b/src/libtomahawk/accounts/AccountModel.h @@ -23,7 +23,7 @@ #include "Account.h" -#include +#include namespace Tomahawk { @@ -32,7 +32,7 @@ namespace Accounts { class AccountModelNode; -class DLLEXPORT AccountModel : public QAbstractItemModel +class DLLEXPORT AccountModel : public QAbstractListModel { Q_OBJECT @@ -58,7 +58,7 @@ public: AccountData = Qt::UserRole + 28, // raw plugin CheckboxClickedRole = Qt::UserRole + 29, // the checkbox for this row was toggled - ButtonClickedRole = Qt::UserRole + 30, // the generic install/create/remove/etc/ button was clicked + AddAccountButtonRole = Qt::UserRole + 30, // the add account button }; enum RowType { @@ -81,11 +81,8 @@ public: explicit AccountModel( QObject* parent = 0 ); virtual QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const; - virtual int columnCount( const QModelIndex& parent = QModelIndex() ) const; virtual int rowCount( const QModelIndex& parent = QModelIndex() ) const; - virtual QModelIndex parent( const QModelIndex& child ) const; - virtual QModelIndex index( int row, int column, const QModelIndex& parent = QModelIndex() ) const; - virtual bool setData( const QModelIndex& index, const QVariant& value, int role = Qt::EditRole ); + virtual bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole); signals: void createAccount( Tomahawk::Accounts::AccountFactory* factory ); @@ -95,11 +92,12 @@ private slots: void accountRemoved( Tomahawk::Accounts::Account* ); void accountStateChanged( Account*, Accounts::Account::ConnectionState ); + void atticaInstalled( const QString& atticaId ); private: - AccountModelNode* nodeFromIndex( const QModelIndex& index ) const; void loadData(); - AccountModelNode* m_rootItem; + QList< AccountModelNode* > m_accounts; + QSet< QString > m_waitingForAtticaInstall; }; } diff --git a/src/libtomahawk/accounts/AccountModelNode.h b/src/libtomahawk/accounts/AccountModelNode.h index 5c8396ba2..6b333a3b8 100644 --- a/src/libtomahawk/accounts/AccountModelNode.h +++ b/src/libtomahawk/accounts/AccountModelNode.h @@ -33,11 +33,9 @@ namespace Accounts { * Node for account tree. * * Basically a union with possible types: - * 1) AccountFactory* for accounts that are not unique (jabber, google, twitter) - * 2) Account* for accounts that are associated with an AccountFactory (children of AccountFactory) - * 3) Attica::Content for AtticaResolverAccounts (with associated AtticaResolverAccount*) (all synchrotron resolvers) - * 4) ResolverAccount* for manually added resolvers (from file). - * 5) AccountFactory* + Account* for factories that are unique + * 1) AccountFactory* for all factories that have child accounts. Also a list of children + * 2) Attica::Content for AtticaResolverAccounts (with associated AtticaResolverAccount*) (all synchrotron resolvers) + * 3) ResolverAccount* for manually added resolvers (from file). * * These are the top-level items in tree. * @@ -52,29 +50,25 @@ struct AccountModelNode { enum NodeType { FactoryType, UniqueFactoryType, - AccountType, AtticaType, ManualResolverType }; AccountModelNode* parent; NodeType type; - QList< AccountModelNode* > children; // list of children accounts (actually existing and configured accounts) - /// 1. + /// 1, 4 AccountFactory* factory; + QList< Account* > accounts; // list of children accounts (actually existing and configured accounts) /// 2. - Account* account; - - /// 3. Attica::Content atticaContent; AtticaResolverAccount* atticaAccount; - /// 4. + /// 3. ResolverAccount* resolverAccount; // Construct in one of four ways. Then access the corresponding members - explicit AccountModelNode( AccountModelNode* p, AccountFactory* fac ) : parent( p ), type( FactoryType ) + explicit AccountModelNode( AccountFactory* fac ) : type( FactoryType ) { init(); factory = fac; @@ -88,26 +82,12 @@ struct AccountModelNode { if ( AccountManager::instance()->factoryForAccount( acct ) == fac ) { qDebug() << "Found account for factory:" << acct->accountFriendlyName(); - if ( fac->isUnique() ) - { - account = acct; - break; - } - else - { - new AccountModelNode( this, acct ); - } + accounts.append( acct ); } } } - AccountModelNode( AccountModelNode* p, Account* acct ) : parent( p ), type( AccountType ) - { - init(); - account = acct; - } - - explicit AccountModelNode( AccountModelNode* p, Attica::Content cnt ) : parent( p ), type( AtticaType ) + explicit AccountModelNode( Attica::Content cnt ) : type( AtticaType ) { init(); atticaContent = cnt; @@ -128,26 +108,15 @@ struct AccountModelNode { } } - explicit AccountModelNode( AccountModelNode* p, ResolverAccount* ra ) : parent( p ), type( ManualResolverType ) + explicit AccountModelNode( ResolverAccount* ra ) : type( ManualResolverType ) { init(); resolverAccount = ra; } - AccountModelNode() : parent( 0 ) {} - - ~AccountModelNode() - { - qDeleteAll( children ); - } - - void init() { - parent->children.append( this ); - factory = 0; - account = 0; atticaAccount = 0; resolverAccount = 0; } diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp index cbd83833a..d015aabd7 100644 --- a/src/settingsdialog.cpp +++ b/src/settingsdialog.cpp @@ -113,7 +113,6 @@ SettingsDialog::SettingsDialog( QWidget *parent ) m_accountModel = new AccountModel( this ); ui->accountsView->setModel( m_accountModel ); - ui->accountsView->expandAll(); connect( m_accountModel, SIGNAL( createAccount( Tomahawk::Accounts::AccountFactory* ) ), this, SLOT( createAccountFromFactory( Tomahawk::Accounts::AccountFactory* ) ) ); diff --git a/src/stackedsettingsdialog.ui b/src/stackedsettingsdialog.ui index 82edf4921..c04c387ef 100644 --- a/src/stackedsettingsdialog.ui +++ b/src/stackedsettingsdialog.ui @@ -127,26 +127,7 @@ - - - 6 - - - false - - - false - - - true - - - true - - - false - - +