void RSSWidget::askNewFolder() { bool ok; QString newName = AutoExpandableDialog::getText( this, tr("Please choose a folder name"), tr("Folder name:"), QLineEdit::Normal , tr("New folder"), &ok); if (!ok) return; newName = newName.trimmed(); if (newName.isEmpty()) return; // Determine destination folder for new item QTreeWidgetItem *destItem = nullptr; QList<QTreeWidgetItem *> selectedItems = m_feedListWidget->selectedItems(); if (!selectedItems.empty()) { destItem = selectedItems.first(); if (!m_feedListWidget->isFolder(destItem)) destItem = destItem->parent(); } // Consider the case where the user clicked on Unread item RSS::Folder *rssDestFolder = ((!destItem || (destItem == m_feedListWidget->stickyUnreadItem())) ? RSS::Session::instance()->rootFolder() : qobject_cast<RSS::Folder *>(m_feedListWidget->getRSSItem(destItem))); QString error; const QString newFolderPath = RSS::Item::joinPath(rssDestFolder->path(), newName); if (!RSS::Session::instance()->addFolder(newFolderPath, &error)) QMessageBox::warning(this, "qBittorrent", error, QMessageBox::Ok); // Expand destination folder to display new feed if (destItem && (destItem != m_feedListWidget->stickyUnreadItem())) destItem->setExpanded(true); // As new RSS items are added synchronously, we can do the following here. m_feedListWidget->setCurrentItem(m_feedListWidget->mapRSSItem(RSS::Session::instance()->itemByPath(newFolderPath))); }
void FeedListWidget::dropEvent(QDropEvent *event) { QTreeWidgetItem *destFolderItem = itemAt(event->pos()); RSS::Folder *destFolder = (destFolderItem ? static_cast<RSS::Folder *>(getRSSItem(destFolderItem)) : RSS::Session::instance()->rootFolder()); // move as much items as possible for (QTreeWidgetItem *srcItem : asConst(selectedItems())) { auto rssItem = getRSSItem(srcItem); RSS::Session::instance()->moveItem(rssItem, RSS::Item::joinPath(destFolder->path(), rssItem->name())); } QTreeWidget::dropEvent(event); if (destFolderItem) destFolderItem->setExpanded(true); }
QModelIndex RSSModel::index(int row, int column, const QModelIndex &parent) const { if (column > 0) return QModelIndex(); const bool isTopLevel = !parent.isValid(); if (isTopLevel && (row == 0)) { // Extra "Unread" item return createIndex(row, column, RSS::Manager::instance()->rootFolder()); } RSS::Folder *folder = isTopLevel ? RSS::Manager::instance()->rootFolder() : qobject_cast<RSS::Folder *>(getAttachedItem(parent)); Q_ASSERT(folder); const int itemPos = isTopLevel ? row - 1 : row; if (itemPos < folder->items().count()) return createIndex(row, column, folder->items().at(itemPos)); return QModelIndex(); }
// add a stream by a button void RSSWidget::on_newFeedButton_clicked() { // Ask for feed URL const QString clipText = qApp->clipboard()->text(); const QString defaultURL = (Utils::Misc::isUrl(clipText) ? clipText : "http://"); bool ok; QString newURL = AutoExpandableDialog::getText( this, tr("Please type a RSS feed URL"), tr("Feed URL:"), QLineEdit::Normal, defaultURL, &ok); if (!ok) return; newURL = newURL.trimmed(); if (newURL.isEmpty()) return; // Determine destination folder for new item QTreeWidgetItem *destItem = nullptr; QList<QTreeWidgetItem *> selectedItems = m_feedListWidget->selectedItems(); if (!selectedItems.empty()) { destItem = selectedItems.first(); if (!m_feedListWidget->isFolder(destItem)) destItem = destItem->parent(); } // Consider the case where the user clicked on Unread item RSS::Folder *rssDestFolder = ((!destItem || (destItem == m_feedListWidget->stickyUnreadItem())) ? RSS::Session::instance()->rootFolder() : qobject_cast<RSS::Folder *>(m_feedListWidget->getRSSItem(destItem))); QString error; // NOTE: We still add feed using legacy way (with URL as feed name) const QString newFeedPath = RSS::Item::joinPath(rssDestFolder->path(), newURL); if (!RSS::Session::instance()->addFeed(newURL, newFeedPath, &error)) QMessageBox::warning(this, "qBittorrent", error, QMessageBox::Ok); // Expand destination folder to display new feed if (destItem && (destItem != m_feedListWidget->stickyUnreadItem())) destItem->setExpanded(true); // As new RSS items are added synchronously, we can do the following here. m_feedListWidget->setCurrentItem(m_feedListWidget->mapRSSItem(RSS::Session::instance()->itemByPath(newFeedPath))); }