diff --git a/src/librssguard/gui/feedsview.cpp b/src/librssguard/gui/feedsview.cpp index 4fee3eb7c..66498fb29 100644 --- a/src/librssguard/gui/feedsview.cpp +++ b/src/librssguard/gui/feedsview.cpp @@ -71,12 +71,12 @@ void FeedsView::setSortingEnabled(bool enable) { connect(header(), &QHeaderView::sortIndicatorChanged, this, &FeedsView::saveSortState); } -QList FeedsView::selectedFeeds() const { +QList FeedsView::selectedFeeds(bool recursive) const { auto its = selectedItems(); QList feeds; for (RootItem* it : its) { - feeds.append(it->getSubTreeFeeds()); + feeds.append(it->getSubTreeFeeds(recursive)); } auto std_feeds = boolinq::from(feeds).distinct().toStdList(); @@ -128,7 +128,7 @@ QList FeedsView::selectedItems() const { } void FeedsView::copyUrlOfSelectedFeeds() const { - auto feeds = selectedFeeds(); + auto feeds = selectedFeeds(true); QStringList urls; for (const auto* feed : feeds) { @@ -229,7 +229,7 @@ void FeedsView::expandCollapseCurrentItem(bool recursive) { } void FeedsView::updateSelectedItems() { - qApp->feedReader()->updateFeeds(selectedFeeds()); + qApp->feedReader()->updateFeeds(selectedFeeds(true)); } void FeedsView::clearSelectedItems() { @@ -285,6 +285,7 @@ void FeedsView::editItems(const QList& items) { .where([](RootItem* it) { return it->canBeEdited(); }) + .distinct() .toStdList(); if (std_editable_items.empty()) { @@ -357,25 +358,30 @@ void FeedsView::editItems(const QList& items) { } void FeedsView::editChildFeeds() { - auto* item = selectedItem(); + auto items = selectedFeeds(false); - if (item != nullptr) { - auto children = item->childItems(); - auto std_feeds = boolinq::from(children) - .where([](RootItem* ch) { - return ch->kind() == RootItem::Kind::Feed; - }) - .toStdList(); + if (!items.isEmpty()) { + auto root_items = boolinq::from(items) + .select([](Feed* fd) { + return fd; + }) + .toStdList(); - editItems(FROM_STD_LIST(QList, std_feeds)); + editItems(FROM_STD_LIST(QList, root_items)); } } void FeedsView::editRecursiveFeeds() { - auto* item = selectedItem(); + auto items = selectedFeeds(true); - if (item != nullptr) { - editItems(item->getSubTree(RootItem::Kind::Feed)); + if (!items.isEmpty()) { + auto root_items = boolinq::from(items) + .select([](Feed* fd) { + return fd; + }) + .toStdList(); + + editItems(FROM_STD_LIST(QList, root_items)); } } diff --git a/src/librssguard/gui/feedsview.h b/src/librssguard/gui/feedsview.h index 11b8037cf..12aa20e93 100644 --- a/src/librssguard/gui/feedsview.h +++ b/src/librssguard/gui/feedsview.h @@ -30,7 +30,7 @@ class RSSGUARD_DLLSPEC FeedsView : public BaseTreeView { // Returns list of selected/all feeds. // NOTE: This is recursive method which returns all descendants. - QList selectedFeeds() const; + QList selectedFeeds(bool recursive) const; // Returns selected item. If multiple items are selected, returns // the one of them which is also "current". If none of them is diff --git a/src/librssguard/services/abstract/rootitem.cpp b/src/librssguard/services/abstract/rootitem.cpp index db48bcecd..81c37814e 100644 --- a/src/librssguard/services/abstract/rootitem.cpp +++ b/src/librssguard/services/abstract/rootitem.cpp @@ -397,9 +397,10 @@ QHash RootItem::getHashedSubTreeFeeds() const { return children; } -QList RootItem::getSubTreeFeeds() const { +QList RootItem::getSubTreeFeeds(bool recursive) const { QList children; QList traversable_items; + bool traversed = false; traversable_items.append(const_cast(this)); @@ -411,7 +412,10 @@ QList RootItem::getSubTreeFeeds() const { children.append(active_item->toFeed()); } - traversable_items.append(active_item->childItems()); + if (recursive || !traversed) { + traversed = true; + traversable_items.append(active_item->childItems()); + } } return children; diff --git a/src/librssguard/services/abstract/rootitem.h b/src/librssguard/services/abstract/rootitem.h index 182d34eda..1a85f7ec7 100644 --- a/src/librssguard/services/abstract/rootitem.h +++ b/src/librssguard/services/abstract/rootitem.h @@ -156,7 +156,7 @@ class RSSGUARD_DLLSPEC RootItem : public QObject { // Returns list of feeds complemented by their own string CUSTOM ID. QHash getHashedSubTreeFeeds() const; - QList getSubTreeFeeds() const; + QList getSubTreeFeeds(bool recursive = true) const; QList getSubTreeAutoFetchingWithManualIntervalsFeeds() const; QList getSubAutoFetchingEnabledFeeds() const;