diff --git a/src/librssguard/services/abstract/accountcheckmodel.cpp b/src/librssguard/services/abstract/accountcheckmodel.cpp index f30d865ff..d3932dd67 100644 --- a/src/librssguard/services/abstract/accountcheckmodel.cpp +++ b/src/librssguard/services/abstract/accountcheckmodel.cpp @@ -26,6 +26,8 @@ void AccountCheckModel::setRootItem(RootItem* root_item, bool delete_previous_ro emit layoutAboutToBeChanged(); } + beginResetModel(); + if (delete_previous_root && m_rootItem != nullptr) { m_rootItem->deleteLater(); } @@ -33,6 +35,8 @@ void AccountCheckModel::setRootItem(RootItem* root_item, bool delete_previous_ro m_checkStates.clear(); m_rootItem = root_item; + endResetModel(); + if (with_layout_change) { emit layoutChanged(); } @@ -64,7 +68,7 @@ void AccountCheckModel::uncheckAllItems() { QModelIndex AccountCheckModel::index(int row, int column, const QModelIndex& parent) const { if (!hasIndex(row, column, parent)) { - return QModelIndex(); + return {}; } RootItem* parent_item = itemForIndex(parent); @@ -74,7 +78,7 @@ QModelIndex AccountCheckModel::index(int row, int column, const QModelIndex& par return createIndex(row, column, child_item); } else { - return QModelIndex(); + return {}; } } @@ -121,14 +125,14 @@ QModelIndex AccountCheckModel::indexForItem(RootItem* item) const { QModelIndex AccountCheckModel::parent(const QModelIndex& child) const { if (!child.isValid()) { - return QModelIndex(); + return {}; } RootItem* child_item = itemForIndex(child); RootItem* parent_item = child_item->parent(); - if (parent_item == m_rootItem) { - return QModelIndex(); + if (parent_item == m_rootItem || parent_item == nullptr) { + return {}; } else { return createIndex(parent_item->row(), 0, parent_item); diff --git a/src/librssguard/services/standard/gui/formdiscoverfeeds.cpp b/src/librssguard/services/standard/gui/formdiscoverfeeds.cpp index f7fd8ec64..e9125acfa 100644 --- a/src/librssguard/services/standard/gui/formdiscoverfeeds.cpp +++ b/src/librssguard/services/standard/gui/formdiscoverfeeds.cpp @@ -47,23 +47,22 @@ FormDiscoverFeeds::FormDiscoverFeeds(ServiceRoot* service_root, connect(m_btnGoAdvanced, &QPushButton::clicked, this, &FormDiscoverFeeds::userWantsAdvanced); connect(m_ui.m_btnDiscover, &QPushButton::clicked, this, &FormDiscoverFeeds::discoverFeeds); - connect(&m_watcherLookup, &QFutureWatcher>::progressValueChanged, this, [=](int prog) { - m_ui.m_pbDiscovery->setValue(prog); - qDebugNN << "progress"; - }); + connect(&m_watcherLookup, + &QFutureWatcher>::progressValueChanged, + this, + &FormDiscoverFeeds::onDiscoveryProgress); - connect(&m_watcherLookup, &QFutureWatcher>::finished, this, [=]() { - auto res = m_watcherLookup.future().result(); - - loadDiscoveredFeeds(res); - }); + connect(&m_watcherLookup, + &QFutureWatcher>::finished, + this, + &FormDiscoverFeeds::onDiscoveryFinished); loadCategories(m_serviceRoot->getSubTreeCategories(), m_serviceRoot); m_ui.m_tvFeeds->setModel(m_discoveredModel); - m_ui.m_tvFeeds->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeMode::Stretch); - m_ui.m_tvFeeds->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeMode::ResizeToContents); + m_ui.m_tvFeeds->header()->setSectionResizeMode(0, QHeaderView::ResizeMode::Stretch); + m_ui.m_tvFeeds->header()->setSectionResizeMode(1, QHeaderView::ResizeMode::ResizeToContents); m_ui.m_pbDiscovery->setVisible(false); m_ui.m_txtUrl->lineEdit()->setText(url); @@ -93,8 +92,27 @@ FormDiscoverFeeds::FormDiscoverFeeds(ServiceRoot* service_root, } } +void FormDiscoverFeeds::onDiscoveryProgress(int progress) { + m_ui.m_pbDiscovery->setValue(progress); +} + +void FormDiscoverFeeds::onDiscoveryFinished() { + try { + auto res = m_watcherLookup.future().result(); + + loadDiscoveredFeeds(res); + } + catch (const ApplicationException& ex) { + // TODO: display error + } + + setEnabled(true); +} + FormDiscoverFeeds::~FormDiscoverFeeds() { qDeleteAll(m_parsers); + + m_discoveredModel->setRootItem(nullptr); } QList FormDiscoverFeeds::discoverFeedsWithParser(const FeedParser* parser, const QString& url) { @@ -137,6 +155,7 @@ void FormDiscoverFeeds::discoverFeeds() { m_ui.m_pbDiscovery->setMaximum(m_parsers.size()); m_ui.m_pbDiscovery->setValue(0); m_ui.m_pbDiscovery->setVisible(true); + setEnabled(false); } void FormDiscoverFeeds::onUrlChanged(const QString& new_url) { @@ -175,70 +194,34 @@ void FormDiscoverFeeds::userWantsAdvanced() { } void FormDiscoverFeeds::loadDiscoveredFeeds(const QList& feeds) { + RootItem* root = new RootItem(); + + for (Feed* feed : feeds) { + root->appendChild(feed); + } + m_ui.m_pbDiscovery->setVisible(false); - m_discoveredModel->setDiscoveredFeeds(feeds); + m_discoveredModel->setRootItem(root); qDebugNN << "finish"; } -DiscoveredFeedsModel::DiscoveredFeedsModel(QObject* parent) : QAbstractListModel(parent) {} - -int DiscoveredFeedsModel::rowCount(const QModelIndex& parent) const { - return m_discoveredFeeds.size(); -} +DiscoveredFeedsModel::DiscoveredFeedsModel(QObject* parent) : AccountCheckModel(parent) {} int DiscoveredFeedsModel::columnCount(const QModelIndex& parent) const { return 2; } QVariant DiscoveredFeedsModel::data(const QModelIndex& index, int role) const { - switch (role) { - case Qt::ItemDataRole::DisplayRole: { - if (index.column() == 0) { - return m_discoveredFeeds.at(index.row()).m_feed->title(); - } - else { - return StandardFeed::typeToString(m_discoveredFeeds.at(index.row()).m_feed->type()); - } + if (role == Qt::ItemDataRole::DisplayRole && index.column() == 1) { + StandardFeed* fd = qobject_cast(itemForIndex(index)); + + if (fd != nullptr) { + return StandardFeed::typeToString(fd->type()); } - - case Qt::ItemDataRole::CheckStateRole: { - if (index.column() == 0) { - return m_discoveredFeeds.at(index.row()).m_isChecked ? Qt::CheckState::Checked : Qt::CheckState::Unchecked; - } - else { - return {}; - } - - break; - } - - case Qt::ItemDataRole::DecorationRole: { - if (index.column() == 0) { - return m_discoveredFeeds.at(index.row()).m_feed->fullIcon(); - } - } - - default: - return {}; } -} -QList DiscoveredFeedsModel::discoveredFeeds() const { - return m_discoveredFeeds; -} - -void DiscoveredFeedsModel::setDiscoveredFeeds(const QList& feeds) { - auto std_feeds = boolinq::from(feeds) - .select([](StandardFeed* fd) { - return FeedItem{false, fd}; - }) - .toStdList(); - - m_discoveredFeeds = FROM_STD_LIST(QList, std_feeds); - - emit layoutAboutToBeChanged(); - emit layoutChanged(); + return AccountCheckModel::data(index, role); } QVariant DiscoveredFeedsModel::headerData(int section, Qt::Orientation orientation, int role) const { @@ -254,17 +237,3 @@ QVariant DiscoveredFeedsModel::headerData(int section, Qt::Orientation orientati return {}; } - -Qt::ItemFlags DiscoveredFeedsModel::flags(const QModelIndex& index) const { - return index.column() == 0 ? Qt::ItemFlag::ItemIsUserCheckable | QAbstractListModel::flags(index) - : QAbstractListModel::flags(index); -} - -bool DiscoveredFeedsModel::setData(const QModelIndex& index, const QVariant& value, int role) { - if (role == Qt::ItemDataRole::CheckStateRole && index.column() == 0) { - m_discoveredFeeds[index.row()].m_isChecked = value.value() == Qt::CheckState::Checked; - return true; - } - - return QAbstractListModel::setData(index, value, role); -} diff --git a/src/librssguard/services/standard/gui/formdiscoverfeeds.h b/src/librssguard/services/standard/gui/formdiscoverfeeds.h index 6615e4a06..dcd35989f 100644 --- a/src/librssguard/services/standard/gui/formdiscoverfeeds.h +++ b/src/librssguard/services/standard/gui/formdiscoverfeeds.h @@ -7,6 +7,7 @@ #include "ui_formdiscoverfeeds.h" +#include "services/abstract/accountcheckmodel.h" #include "services/standard/parsers/feedparser.h" #include @@ -15,29 +16,15 @@ class ServiceRoot; class RootItem; class Category; -class DiscoveredFeedsModel : public QAbstractListModel { +class DiscoveredFeedsModel : public AccountCheckModel { Q_OBJECT public: - struct FeedItem { - bool m_isChecked; - StandardFeed* m_feed; - }; - explicit DiscoveredFeedsModel(QObject* parent = {}); 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; virtual QVariant data(const QModelIndex& index, int role) const; - virtual bool setData(const QModelIndex& index, const QVariant& value, int role); - virtual Qt::ItemFlags flags(const QModelIndex& index) const; - - QList discoveredFeeds() const; - void setDiscoveredFeeds(const QList& feeds); - - private: - QList m_discoveredFeeds; }; class FormDiscoverFeeds : public QDialog { @@ -56,6 +43,9 @@ class FormDiscoverFeeds : public QDialog { void addSingleFeed(StandardFeed* feed); void importSelectedFeeds(); + void onDiscoveryProgress(int progress); + void onDiscoveryFinished(); + private: QList discoverFeedsWithParser(const FeedParser* parser, const QString& url); diff --git a/src/librssguard/services/standard/gui/formdiscoverfeeds.ui b/src/librssguard/services/standard/gui/formdiscoverfeeds.ui index 358fe774e..1fc2e3d47 100644 --- a/src/librssguard/services/standard/gui/formdiscoverfeeds.ui +++ b/src/librssguard/services/standard/gui/formdiscoverfeeds.ui @@ -6,7 +6,7 @@ 0 0 - 513 + 593 360 @@ -45,7 +45,7 @@ - + @@ -57,31 +57,6 @@ Discovered feeds - - - - true - - - QAbstractItemView::SingleSelection - - - QAbstractItemView::SelectRows - - - false - - - true - - - true - - - false - - - @@ -125,23 +100,38 @@ - - - - - 16777215 - 5 - + + + + true - + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + 0 + + + true + + false + + true + + + false + - + Qt::Horizontal @@ -151,6 +141,19 @@ + + + + + 16777215 + 8 + + + + false + + +