diff --git a/src/core/feedsmodel.cpp b/src/core/feedsmodel.cpp index 9249df650..66652ed54 100755 --- a/src/core/feedsmodel.cpp +++ b/src/core/feedsmodel.cpp @@ -687,6 +687,9 @@ void FeedsModel::reloadWholeLayout() { bool FeedsModel::addServiceAccount(ServiceRoot *root) { m_rootItem->appendChild(root); + // Item add, reload da shit. + reloadWholeLayout(); + // Connect. connect(root, SIGNAL(readFeedsFilterInvalidationRequested()), this, SIGNAL(readFeedsFilterInvalidationRequested())); connect(root, SIGNAL(dataChanged(QList)), this, SLOT(onItemDataChanged(QList))); diff --git a/src/gui/dialogs/formaddaccount.cpp b/src/gui/dialogs/formaddaccount.cpp index 1feefac7f..4d86eaf14 100755 --- a/src/gui/dialogs/formaddaccount.cpp +++ b/src/gui/dialogs/formaddaccount.cpp @@ -39,6 +39,7 @@ FormAddAccount::FormAddAccount(const QList &entry_points, Fe MessageBox::iconify(m_ui->m_buttonBox); #endif + connect(m_ui->m_buttonBox, SIGNAL(accepted()), this, SLOT(addSelectedAccount())); connect(m_ui->m_listEntryPoints, SIGNAL(itemSelectionChanged()), this, SLOT(displayActiveEntryPointDetails())); loadEntryPoints(); } @@ -47,27 +48,43 @@ FormAddAccount::~FormAddAccount() { delete m_ui; } -void FormAddAccount::displayActiveEntryPointDetails() { - QList selected_items = m_ui->m_listEntryPoints->selectedItems(); +void FormAddAccount::addSelectedAccount() { + accept(); - if (!selected_items.isEmpty()) { - ServiceEntryPoint *point = static_cast(selected_items.at(0)->data(Qt::UserRole).value()); + ServiceEntryPoint *point = selectedEntryPoint(); + ServiceRoot *new_root = point->createNewRoot(m_model); - m_ui->m_txtAuthor->setText(point->author()); - m_ui->m_txtDescription->setText(point->description()); - m_ui->m_txtName->setText(point->name()); - m_ui->m_txtVersion->setText(point->version()); + if (new_root != NULL) { + m_model->addServiceAccount(new_root); } + else { + qApp->showGuiMessage(tr("Cannot add account"), + tr("Some critical error occurred, report this to developers."), + QSystemTrayIcon::Critical, parentWidget(), true); + } +} + +void FormAddAccount::displayActiveEntryPointDetails() { + ServiceEntryPoint *point = selectedEntryPoint(); + + m_ui->m_txtAuthor->setText(point->author()); + m_ui->m_txtDescription->setText(point->description()); + m_ui->m_txtName->setText(point->name()); + m_ui->m_txtVersion->setText(point->version()); +} + +ServiceEntryPoint *FormAddAccount::selectedEntryPoint() { + return m_entryPoints.at(m_ui->m_listEntryPoints->currentRow()); } void FormAddAccount::loadEntryPoints() { foreach (ServiceEntryPoint *entry_point, m_entryPoints) { QListWidgetItem *item = new QListWidgetItem(entry_point->icon(), entry_point->name(), m_ui->m_listEntryPoints); - item->setData(Qt::UserRole, QVariant::fromValue((void*) entry_point)); if (entry_point->isSingleInstanceService() && m_model->containsServiceRootFromEntryPoint(entry_point)) { // Oops, this item cannot be added, it is single instance and is already added. item->setFlags(Qt::NoItemFlags); + item->setToolTip(tr("This account can be added only once.")); } } diff --git a/src/gui/dialogs/formaddaccount.h b/src/gui/dialogs/formaddaccount.h index a5c29998d..bacf59892 100755 --- a/src/gui/dialogs/formaddaccount.h +++ b/src/gui/dialogs/formaddaccount.h @@ -38,9 +38,11 @@ class FormAddAccount : public QDialog { virtual ~FormAddAccount(); private slots: + void addSelectedAccount(); void displayActiveEntryPointDetails(); private: + ServiceEntryPoint *selectedEntryPoint(); void loadEntryPoints(); Ui::FormAddAccount *m_ui; diff --git a/src/services/abstract/serviceentrypoint.h b/src/services/abstract/serviceentrypoint.h index 1429ceb90..4602666a8 100755 --- a/src/services/abstract/serviceentrypoint.h +++ b/src/services/abstract/serviceentrypoint.h @@ -33,6 +33,13 @@ class ServiceEntryPoint { explicit ServiceEntryPoint(); virtual ~ServiceEntryPoint(); + // Creates new service root item, which is ready to be added + // into the model. This method can for example display + // some kind of first-time configuration dialog inside itself + // before returning the root item. + // Returns NULL if initialization of new root cannot be done. + virtual ServiceRoot *createNewRoot(FeedsModel *main_model) = 0; + // Performs initialization of all service accounts created using this entry // point from persistent DB. // Returns list of root nodes which will be afterwards added diff --git a/src/services/standard/standardserviceentrypoint.cpp b/src/services/standard/standardserviceentrypoint.cpp index b71298520..1f9f11e82 100755 --- a/src/services/standard/standardserviceentrypoint.cpp +++ b/src/services/standard/standardserviceentrypoint.cpp @@ -22,6 +22,8 @@ #include "miscellaneous/application.h" #include "services/standard/standardserviceroot.h" +#include + StandardServiceEntryPoint::StandardServiceEntryPoint() { } @@ -57,10 +59,31 @@ QString StandardServiceEntryPoint::code() { return SERVICE_CODE_STD_RSS; } +ServiceRoot *StandardServiceEntryPoint::createNewRoot(FeedsModel *main_model) { + // Switch DB. + QSqlDatabase database = qApp->database()->connection(QSL("StandardServiceEntryPoint"), DatabaseFactory::FromSettings); + QSqlQuery query(database); + + if (query.exec(QSL("UPDATE Information SET inf_value = 1 WHERE inf_key = 'standard_account_enabled';"))) { + return new StandardServiceRoot(true, main_model); + } + else { + return NULL; + } +} + QList StandardServiceEntryPoint::initializeSubtree(FeedsModel *main_model) { - StandardServiceRoot *root = new StandardServiceRoot(true, main_model); + // Check DB if standard account is enabled. + QSqlDatabase database = qApp->database()->connection(QSL("StandardServiceEntryPoint"), DatabaseFactory::FromSettings); + QSqlQuery query(database); QList roots; - roots.append(root); + if (query.exec(QSL("SELECT inf_value FROM Information WHERE inf_key = 'standard_account_enabled';"))) { + if (query.next() && query.value(0).toInt() == 1) { + StandardServiceRoot *root = new StandardServiceRoot(true, main_model); + roots.append(root); + } + } + return roots; } diff --git a/src/services/standard/standardserviceentrypoint.h b/src/services/standard/standardserviceentrypoint.h index 088ff7294..8e4904cb4 100755 --- a/src/services/standard/standardserviceentrypoint.h +++ b/src/services/standard/standardserviceentrypoint.h @@ -34,6 +34,7 @@ class StandardServiceEntryPoint : public ServiceEntryPoint { QIcon icon(); QString code(); + ServiceRoot *createNewRoot(FeedsModel *main_model); QList initializeSubtree(FeedsModel *main_model); }; diff --git a/src/services/tt-rss/ttrssserviceentrypoint.cpp b/src/services/tt-rss/ttrssserviceentrypoint.cpp index 28d1c2920..6d5a24c03 100755 --- a/src/services/tt-rss/ttrssserviceentrypoint.cpp +++ b/src/services/tt-rss/ttrssserviceentrypoint.cpp @@ -58,6 +58,10 @@ QString TtRssServiceEntryPoint::code() { return SERVICE_CODE_TT_RSS; } +ServiceRoot *TtRssServiceEntryPoint::createNewRoot(FeedsModel *main_model) { + return NULL; +} + QList TtRssServiceEntryPoint::initializeSubtree(FeedsModel *main_model) { return QList(); } diff --git a/src/services/tt-rss/ttrssserviceentrypoint.h b/src/services/tt-rss/ttrssserviceentrypoint.h index 478f9c801..17e9a7635 100755 --- a/src/services/tt-rss/ttrssserviceentrypoint.h +++ b/src/services/tt-rss/ttrssserviceentrypoint.h @@ -35,6 +35,7 @@ class TtRssServiceEntryPoint : public ServiceEntryPoint { QIcon icon(); QString code(); + ServiceRoot *createNewRoot(FeedsModel *main_model); QList initializeSubtree(FeedsModel *main_model); };