1
mirror of https://invent.kde.org/network/falkon.git synced 2024-09-23 10:42:11 +02:00
falkonOfficial/src/rss/rssmanager.cpp

387 lines
12 KiB
C++
Raw Normal View History

2011-03-03 18:29:20 +01:00
/* ============================================================
* QupZilla - WebKit based browser
2011-10-17 09:57:07 +02:00
* Copyright (C) 2010-2011 David Rosca
2011-03-03 18:29:20 +01:00
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* ============================================================ */
2011-03-02 16:57:41 +01:00
#include "rssmanager.h"
#include "ui_rssmanager.h"
#include "qupzilla.h"
#include "tabwidget.h"
#include "mainapplication.h"
#include "treewidget.h"
#include "iconprovider.h"
#include "browsinglibrary.h"
#include "globalfunctions.h"
#include "followredirectreply.h"
#include "databasewriter.h"
2011-03-02 16:57:41 +01:00
RSSManager::RSSManager(QupZilla* mainClass, QWidget* parent)
: QWidget(parent)
, ui(new Ui::RSSManager)
, p_QupZilla(mainClass)
2011-03-02 16:57:41 +01:00
{
ui->setupUi(this);
ui->tabWidget->setElideMode(Qt::ElideRight);
m_networkManager = new QNetworkAccessManager();
connect(ui->reload, SIGNAL(clicked()), this, SLOT(reloadFeed()));
connect(ui->deletebutton, SIGNAL(clicked()), this, SLOT(deleteFeed()));
connect(ui->edit, SIGNAL(clicked()), this, SLOT(editFeed()));
connect(ui->optimizeDb, SIGNAL(clicked(QPoint)), this, SLOT(optimizeDb()));
2011-03-02 16:57:41 +01:00
}
QupZilla* RSSManager::getQupZilla()
{
if (!p_QupZilla.data()) {
2011-03-04 13:59:07 +01:00
p_QupZilla = mApp->getWindow();
}
return p_QupZilla.data();
2011-03-02 16:57:41 +01:00
}
2011-03-17 17:03:04 +01:00
void RSSManager::setMainWindow(QupZilla* window)
2011-03-02 16:57:41 +01:00
{
if (window) {
2011-03-02 16:57:41 +01:00
p_QupZilla = window;
}
2011-03-02 16:57:41 +01:00
}
void RSSManager::refreshTable()
{
QSqlQuery query;
ui->tabWidget->clear();
query.exec("SELECT address, title, icon FROM rss");
2011-03-02 16:57:41 +01:00
int i = 0;
while (query.next()) {
QUrl address = query.value(0).toUrl();
QString title = query.value(1).toString();
QIcon icon = IconProvider::iconFromBase64(query.value(2).toByteArray());
2011-03-02 16:57:41 +01:00
TreeWidget* tree = new TreeWidget();
tree->setHeaderLabel(tr("News"));
tree->setContextMenuPolicy(Qt::CustomContextMenu);
connect(tree, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(customContextMenuRequested(const QPoint &)));
ui->tabWidget->addTab(tree, title);
ui->tabWidget->setTabToolTip(i, address.toString());
connect(tree, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), this, SLOT(loadFeed(QTreeWidgetItem*)));
connect(tree, SIGNAL(itemMiddleButtonClicked(QTreeWidgetItem*)), this, SLOT(controlLoadFeed(QTreeWidgetItem*)));
2011-03-02 16:57:41 +01:00
connect(tree, SIGNAL(itemControlClicked(QTreeWidgetItem*)), this, SLOT(controlLoadFeed(QTreeWidgetItem*)));
QTreeWidgetItem* item = new QTreeWidgetItem();
item->setText(0, tr("Loading..."));
tree->addTopLevelItem(item);
ui->tabWidget->setTabIcon(i, icon);
2011-03-02 16:57:41 +01:00
beginToLoadSlot(address);
i++;
}
if (i > 0) {
ui->deletebutton->setEnabled(true);
ui->reload->setEnabled(true);
ui->edit->setEnabled(true);
}
else {
ui->deletebutton->setEnabled(false);
ui->reload->setEnabled(false);
ui->edit->setEnabled(false);
QFrame* frame = new QFrame();
frame->setObjectName("rssmanager-frame");
QVBoxLayout* verticalLayout = new QVBoxLayout(frame);
QLabel* label_2 = new QLabel(frame);
label_2->setPixmap(QPixmap(":/icons/menu/rss.png"));
label_2->setAlignment(Qt::AlignBottom | Qt::AlignHCenter);
verticalLayout->addWidget(label_2);
QLabel* label = new QLabel(frame);
label->setAlignment(Qt::AlignHCenter | Qt::AlignTop);
label->setText(tr("You don't have any RSS Feeds.<br/>\nPlease add some with RSS icon in navigation bar on site which offers feeds."));
verticalLayout->addWidget(label);
ui->tabWidget->addTab(frame, tr("Empty"));
2011-03-02 16:57:41 +01:00
}
}
void RSSManager::reloadFeed()
{
TreeWidget* treeWidget = qobject_cast<TreeWidget*>(ui->tabWidget->widget(ui->tabWidget->currentIndex()));
if (!treeWidget) {
2011-03-02 16:57:41 +01:00
return;
}
2011-03-02 16:57:41 +01:00
treeWidget->clear();
QTreeWidgetItem* item = new QTreeWidgetItem();
item->setText(0, tr("Loading..."));
treeWidget->addTopLevelItem(item);
beginToLoadSlot(QUrl(ui->tabWidget->tabToolTip(ui->tabWidget->currentIndex())));
2011-03-02 16:57:41 +01:00
}
void RSSManager::deleteFeed()
{
QString url = ui->tabWidget->tabToolTip(ui->tabWidget->currentIndex());
if (url.isEmpty()) {
2011-03-02 16:57:41 +01:00
return;
}
2011-03-02 16:57:41 +01:00
QSqlQuery query;
query.exec("DELETE FROM rss WHERE address='" + url + "'");
2011-03-02 16:57:41 +01:00
ui->tabWidget->removeTab(ui->tabWidget->currentIndex());
if (ui->tabWidget->count() == 0) {
2011-03-02 16:57:41 +01:00
refreshTable();
}
2011-03-02 16:57:41 +01:00
}
void RSSManager::editFeed()
{
QString url = ui->tabWidget->tabToolTip(ui->tabWidget->currentIndex());
if (url.isEmpty()) {
2011-03-02 16:57:41 +01:00
return;
}
2011-03-02 16:57:41 +01:00
QDialog* dialog = new QDialog(this);
QFormLayout* layout = new QFormLayout(dialog);
QLabel* label = new QLabel(dialog);
QLineEdit* editUrl = new QLineEdit(dialog);
QLineEdit* editTitle = new QLineEdit(dialog);
QDialogButtonBox* box = new QDialogButtonBox(dialog);
box->addButton(QDialogButtonBox::Ok);
box->addButton(QDialogButtonBox::Cancel);
connect(box, SIGNAL(rejected()), dialog, SLOT(reject()));
connect(box, SIGNAL(accepted()), dialog, SLOT(accept()));
label->setText(tr("Fill title and URL of a feed: "));
layout->addRow(label);
layout->addRow(new QLabel(tr("Feed title: ")), editTitle);
layout->addRow(new QLabel(tr("Feed URL: ")), editUrl);
layout->addRow(box);
editUrl->setText(ui->tabWidget->tabToolTip(ui->tabWidget->currentIndex()));
editTitle->setText(ui->tabWidget->tabText(ui->tabWidget->currentIndex()));
2011-03-02 16:57:41 +01:00
dialog->setWindowTitle(tr("Edit RSS Feed"));
dialog->setMinimumSize(400, 100);
dialog->exec();
if (dialog->result() == QDialog::Rejected) {
2011-03-02 16:57:41 +01:00
return;
}
2011-03-02 16:57:41 +01:00
QString address = editUrl->text();
QString title = editTitle->text();
if (address.isEmpty() || title.isEmpty()) {
2011-03-02 16:57:41 +01:00
return;
}
2011-03-02 16:57:41 +01:00
QSqlQuery query;
query.prepare("UPDATE rss SET address=?, title=? WHERE address=?");
query.bindValue(0, address);
query.bindValue(1, title);
query.bindValue(2, url);
query.exec();
refreshTable();
}
void RSSManager::customContextMenuRequested(const QPoint &position)
{
TreeWidget* treeWidget = qobject_cast<TreeWidget*>(ui->tabWidget->widget(ui->tabWidget->currentIndex()));
if (!treeWidget) {
2011-03-02 16:57:41 +01:00
return;
}
2011-03-02 16:57:41 +01:00
if (!treeWidget->itemAt(position)) {
2011-03-02 16:57:41 +01:00
return;
}
2011-03-02 16:57:41 +01:00
QString link = treeWidget->itemAt(position)->toolTip(0);
if (link.isEmpty()) {
2011-03-02 16:57:41 +01:00
return;
}
2011-03-02 16:57:41 +01:00
QMenu menu;
menu.addAction(tr("Open link in actual tab"), getQupZilla(), SLOT(loadActionUrl()))->setData(link);
menu.addAction(tr("Open link in new tab"), this, SLOT(loadFeedInNewTab()))->setData(link);
//Prevent choosing first option with double rightclick
QPoint pos = QCursor::pos();
QPoint p(pos.x(), pos.y() + 1);
2011-03-02 16:57:41 +01:00
menu.exec(p);
}
2011-03-17 17:03:04 +01:00
void RSSManager::loadFeed(QTreeWidgetItem* item)
2011-03-02 16:57:41 +01:00
{
if (!item) {
2011-03-02 16:57:41 +01:00
return;
}
if (item->whatsThis(0).isEmpty()) {
2011-03-02 16:57:41 +01:00
return;
}
2011-03-02 16:57:41 +01:00
getQupZilla()->loadAddress(QUrl(item->whatsThis(0)));
}
2011-03-17 17:03:04 +01:00
void RSSManager::controlLoadFeed(QTreeWidgetItem* item)
2011-03-02 16:57:41 +01:00
{
if (!item) {
2011-03-02 16:57:41 +01:00
return;
}
if (item->whatsThis(0).isEmpty()) {
2011-03-02 16:57:41 +01:00
return;
}
2011-03-02 16:57:41 +01:00
getQupZilla()->tabWidget()->addView(QUrl(item->whatsThis(0)), tr("New Tab"), TabWidget::NewNotSelectedTab);
}
void RSSManager::loadFeedInNewTab()
{
if (QAction* action = qobject_cast<QAction*>(sender())) {
2011-03-02 16:57:41 +01:00
getQupZilla()->tabWidget()->addView(action->data().toUrl(), tr("New Tab"), TabWidget::NewNotSelectedTab);
}
2011-03-02 16:57:41 +01:00
}
void RSSManager::beginToLoadSlot(const QUrl &url)
{
FollowRedirectReply* reply = new FollowRedirectReply(url, m_networkManager);
connect(reply, SIGNAL(finished()), this, SLOT(finished()));
2011-03-02 16:57:41 +01:00
QPair<FollowRedirectReply*, QUrl> pair;
pair.first = reply;
pair.second = url;
m_replies.append(pair);
2011-03-02 16:57:41 +01:00
}
void RSSManager::finished()
2011-03-02 16:57:41 +01:00
{
FollowRedirectReply* reply = qobject_cast<FollowRedirectReply*> (sender());
if (!reply) {
return;
}
QString replyUrl;
for (int i = 0; i < m_replies.count(); i++) {
QPair<FollowRedirectReply*, QUrl> pair = m_replies.at(i);
if (pair.first == reply) {
replyUrl = pair.second.toString();
break;
}
}
if (replyUrl.isEmpty()) {
2011-03-02 16:57:41 +01:00
return;
}
2011-03-02 16:57:41 +01:00
QString currentTag;
QString linkString;
QString titleString;
2011-03-02 16:57:41 +01:00
QXmlStreamReader xml;
xml.addData(reply->reply()->readAll());
reply->deleteLater();
2011-03-02 16:57:41 +01:00
int tabIndex = -1;
for (int i = 0; i < ui->tabWidget->count(); i++) {
2011-03-02 16:57:41 +01:00
if (replyUrl == ui->tabWidget->tabToolTip(i)) {
tabIndex = i;
break;
}
}
if (tabIndex == -1) {
2011-03-02 16:57:41 +01:00
return;
}
2011-03-02 16:57:41 +01:00
TreeWidget* treeWidget = qobject_cast<TreeWidget*>(ui->tabWidget->widget(tabIndex));
if (!treeWidget) {
2011-03-02 16:57:41 +01:00
return;
}
2011-03-02 16:57:41 +01:00
treeWidget->clear();
while (!xml.atEnd()) {
xml.readNext();
if (xml.isStartElement()) {
if (xml.name() == "item") {
2011-03-02 16:57:41 +01:00
linkString = xml.attributes().value("rss:about").toString();
}
2011-03-02 16:57:41 +01:00
currentTag = xml.name().toString();
}
else if (xml.isEndElement()) {
if (xml.name() == "item") {
QTreeWidgetItem* item = new QTreeWidgetItem;
item->setText(0, titleString);
item->setWhatsThis(0, linkString);
item->setIcon(0, QIcon(":/icons/other/feed.png"));
item->setToolTip(0, linkString);
treeWidget->addTopLevelItem(item);
titleString.clear();
linkString.clear();
2011-03-02 16:57:41 +01:00
}
}
else if (xml.isCharacters() && !xml.isWhitespace()) {
if (currentTag == "title") {
titleString = xml.text().toString();
}
else if (currentTag == "link") {
linkString += xml.text().toString();
}
}
2011-03-02 16:57:41 +01:00
}
if (treeWidget->topLevelItemCount() == 0) {
2011-03-17 17:03:04 +01:00
QTreeWidgetItem* item = new QTreeWidgetItem;
2011-03-02 16:57:41 +01:00
item->setText(0, tr("Error in fetching feed"));
treeWidget->addTopLevelItem(item);
}
}
bool RSSManager::addRssFeed(const QString &address, const QString &title, const QIcon &icon)
2011-03-02 16:57:41 +01:00
{
if (address.isEmpty()) {
2011-03-02 16:57:41 +01:00
return false;
}
2011-03-02 16:57:41 +01:00
QSqlQuery query;
query.exec("SELECT id FROM rss WHERE address='" + address + "'");
2011-03-02 16:57:41 +01:00
if (!query.next()) {
QByteArray iconData;
if (icon.pixmap(16, 16).toImage() == QWebSettings::webGraphic(QWebSettings::DefaultFrameIconGraphic).toImage()) {
iconData = IconProvider::iconToBase64(QIcon(":icons/other/feed.png"));
}
else {
iconData = IconProvider::iconToBase64(icon);
}
query.prepare("INSERT INTO rss (address, title, icon) VALUES(?,?,?)");
2011-03-02 16:57:41 +01:00
query.bindValue(0, address);
query.bindValue(1, title);
query.bindValue(2, iconData);
mApp->dbWriter()->executeQuery(query);
2011-03-02 16:57:41 +01:00
return true;
}
2011-03-03 15:24:23 +01:00
QMessageBox::warning(getQupZilla(), tr("RSS feed duplicated"), tr("You already have this feed."));
2011-03-02 16:57:41 +01:00
return false;
}
void RSSManager::optimizeDb()
{
BrowsingLibrary* b = qobject_cast<BrowsingLibrary*>(parentWidget()->parentWidget());
if (!b) {
return;
}
b->optimizeDatabase();
}
2011-03-02 16:57:41 +01:00
RSSManager::~RSSManager()
{
delete ui;
}