32 #include <QDragMoveEvent>
34 #include <QHeaderView>
35 #include <QTreeWidgetItem>
54 using QTreeWidgetItem::QTreeWidgetItem;
57 bool operator<(
const QTreeWidgetItem &other)
const override
62 if (lhsSticky == rhsSticky)
65 const int order = treeWidget()->header()->sortIndicatorOrder();
66 return ((order == Qt::AscendingOrder) ? lhsSticky : rhsSticky);
70 QIcon
loadIcon(
const QString &path,
const QString &fallbackId)
72 const QPixmap pixmap {path};
93 setContextMenuPolicy(Qt::CustomContextMenu);
94 setDragDropMode(QAbstractItemView::InternalMove);
95 setSelectionMode(QAbstractItemView::ExtendedSelection);
97 headerItem()->setText(0, tr(
"RSS feeds"));
116 setSortingEnabled(
false);
118 setSortingEnabled(
true);
135 item->setData(0, Qt::DecorationRole,
rssFeedIcon(feed));
145 item->setData(0, Qt::DecorationRole,
rssFeedIcon(feed));
159 item->setData(0, Qt::DisplayRole, QString::fromLatin1(
"%1 (%2)").arg(rssItem->
name(), QString::number(rssItem->
unreadCount())));
168 item->setData(0, Qt::DisplayRole, QString::fromLatin1(
"%1 (%2)").arg(rssItem->
name(), QString::number(rssItem->
unreadCount())));
171 QTreeWidgetItem *parentItem =
mapRSSItem(parentRssItem);
172 Q_ASSERT(parentItem);
174 parentItem->addChild(item);
179 rssItem->disconnect(
this);
185 setCurrentItem(
nullptr);
195 QList<QTreeWidgetItem *> openedFolders;
196 int nbChildren = (parent ? parent->childCount() : topLevelItemCount());
197 for (
int i = 0; i < nbChildren; ++i)
199 QTreeWidgetItem *item (parent ? parent->child(i) : topLevelItem(i));
200 if (
isFolder(item) && item->isExpanded())
203 if (!openedSubfolders.empty())
204 openedFolders << openedSubfolders;
206 openedFolders << item;
209 return openedFolders;
214 if (!item)
return nullptr;
216 return reinterpret_cast<RSS::Item *
>(item->data(0, Qt::UserRole).value<quintptr>());
231 return qobject_cast<RSS::Feed *>(
getRSSItem(item));
236 return qobject_cast<RSS::Folder *>(
getRSSItem(item));
241 QTreeWidget::dragMoveEvent(event);
243 QTreeWidgetItem *item = itemAt(event->pos());
251 else if (item &&
isFeed(item))
257 QTreeWidgetItem *destFolderItem = itemAt(event->pos());
263 for (QTreeWidgetItem *srcItem :
asConst(selectedItems()))
269 QTreeWidget::dropEvent(event);
271 destFolderItem->setExpanded(
true);
276 auto *item =
new FeedListItem;
277 item->setData(0, Qt::DisplayRole, QString::fromLatin1(
"%1 (%2)").arg(rssItem->
name(), QString::number(rssItem->
unreadCount())));
278 item->setData(0, Qt::UserRole,
reinterpret_cast<quintptr
>(rssItem));
282 if (
auto feed = qobject_cast<RSS::Feed *>(rssItem))
286 item->setData(0, Qt::DecorationRole, icon);
291 addTopLevelItem(item);
293 parentItem->addChild(item);
302 QTreeWidgetItem *item =
createItem(rssItem, parent);
304 if (
auto folder = qobject_cast<RSS::Folder *>(rssItem))
QList< Item * > items() const
static QString joinPath(const QString &path1, const QString &path2)
static QString parentPath(const QString &path)
void unreadCountChanged(Item *item=nullptr)
virtual int unreadCount() const =0
static Session * instance()
void itemPathChanged(Item *item)
Folder * rootFolder() const
void feedStateChanged(Feed *feed)
Item * itemByPath(const QString &path) const
nonstd::expected< void, QString > moveItem(const QString &itemPath, const QString &destPath)
void itemAdded(Item *item)
void feedIconLoaded(Feed *feed)
void itemAboutToBeRemoved(Item *item)
static UIThemeManager * instance()
QIcon getIcon(const QString &iconId, const QString &fallback={}) const
bool operator<(const Digest32< N > &left, const Digest32< N > &right)
constexpr std::add_const_t< T > & asConst(T &t) noexcept