Added ability to fetch just icons.

This commit is contained in:
Martin Rotter 2015-05-27 07:26:08 +02:00
parent 835d66e94d
commit 98da617b75
5 changed files with 83 additions and 58 deletions

View File

@ -2,6 +2,7 @@
<center><h2>2.4.0</h2></center> <center><h2>2.4.0</h2></center>
Added: Added:
<ul> <ul>
<li>Ability to fetch only new icon for feed from its online source.</li>
<li>Option to search highlighted text in web browser via Google, available from context menu. (issue #72)</li> <li>Option to search highlighted text in web browser via Google, available from context menu. (issue #72)</li>
</ul> </ul>

View File

@ -63,8 +63,6 @@ FeedsView::FeedsView(QWidget *parent)
// Setup the timer. // Setup the timer.
updateAutoUpdateStatus(); updateAutoUpdateStatus();
setItemDelegateForColumn(1, new Delegate(this));
} }
FeedsView::~FeedsView() { FeedsView::~FeedsView() {
@ -690,39 +688,6 @@ void FeedsView::validateItemAfterDragDrop(const QModelIndex &source_index) {
} }
Delegate::Delegate(FeedsView *view, QObject *parent) : QStyledItemDelegate(parent) {
this->view = view;
}
void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyledItemDelegate::paint(painter, option, index);
QSize size = sizeHint(option, index);
int width = qMin(size.width(), option.rect.width()) - 4;
int height = qMin(size.height(), option.rect.height()) - 4;
int left = option.rect.left() + ((option.rect.width() - width) / 2.0);
int top = option.rect.top() + ((option.rect.height() - height) / 2.0);
QRect target_rect = QRect(left, top, width, height);
painter->save();
//if ((option.state & QStyle::State_MouseOver) == 0 && (option.state & QStyle::State_Selected) == 0) {
painter->setPen(QPen(QColor(Qt::black)));
painter->setRenderHint(QPainter::Antialiasing, false);
painter->setBrush(QBrush(Qt::lightGray));
/*painter->drawRoundRect(QRect(left,
top,
width,
height), 15, 15);*/
//}
QString str = view->sourceModel()->data(view->model()->mapToSource(index), Qt::DisplayRole).toString();
painter->drawRect(target_rect);
painter->drawText(target_rect, str, QTextOption(Qt::AlignCenter));
painter->restore();
}

View File

@ -32,9 +32,6 @@ class FeedsModelFeed;
class FeedsModelCategory; class FeedsModelCategory;
class QTimer; class QTimer;
#include <QPainter>
class FeedsView : public QTreeView { class FeedsView : public QTreeView {
Q_OBJECT Q_OBJECT
@ -203,13 +200,45 @@ class FeedsView : public QTreeView {
int m_globalAutoUpdateRemainingInterval; int m_globalAutoUpdateRemainingInterval;
}; };
/*
class Delegate : public QStyledItemDelegate { class Delegate : public QStyledItemDelegate {
public: public:
explicit Delegate(FeedsView *view, QObject *parent = 0); explicit Delegate(FeedsView *view, QObject *parent = 0) : QStyledItemDelegate(parent) {
this->view = view;
}
// QAbstractItemDelegate interface // QAbstractItemDelegate interface
public: public:
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
//QStyledItemDelegate::paint(painter, option, index);
QSize size = sizeHint(option, index);
int width = qMin(size.width(), option.rect.width()) - 4;
int height = qMin(size.height(), option.rect.height()) - 4;
int left = option.rect.left() + ((option.rect.width() - width) / 2.0);
int top = option.rect.top() + ((option.rect.height() - height) / 2.0);
QRect target_rect = QRect(left, top, width, height);
painter->save();
//if ((option.state & QStyle::State_MouseOver) == 0 && (option.state & QStyle::State_Selected) == 0) {
painter->setPen(QPen(QColor(Qt::black)));
painter->setRenderHint(QPainter::Antialiasing, false);
painter->setBrush(QBrush(Qt::lightGray));
//}
QString str = view->sourceModel()->data(view->model()->mapToSource(index), Qt::DisplayRole).toString();
painter->drawRect(target_rect);
painter->drawText(target_rect, str, QTextOption(Qt::AlignCenter));
painter->restore();
}
// QStyledItemDelegate interface // QStyledItemDelegate interface
public: public:
@ -230,5 +259,6 @@ class Delegate : public QStyledItemDelegate {
private: private:
FeedsView *view; FeedsView *view;
}; };
*/
#endif // FEEDSVIEW_H #endif // FEEDSVIEW_H

View File

@ -306,28 +306,51 @@ void FormFeedDetails::guessFeed() {
} }
} }
void FormFeedDetails::guessIconOnly() {
QPair<FeedsModelFeed*, QNetworkReply::NetworkError> result = FeedsModelFeed::guessFeed(m_ui->m_txtUrl->lineEdit()->text(),
m_ui->m_txtUsername->lineEdit()->text(),
m_ui->m_txtPassword->lineEdit()->text());
if (result.first != NULL) {
// Icon or whole feed was guessed.
m_ui->m_btnIcon->setIcon(result.first->icon());
if (result.second == QNetworkReply::NoError) {
m_ui->m_lblFetchMetadata->setStatus(WidgetWithStatus::Ok,
tr("Icon fetched successfully."),
tr("Icon metadata fetched."));
}
else {
m_ui->m_lblFetchMetadata->setStatus(WidgetWithStatus::Warning,
tr("Result: %1.").arg(NetworkFactory::networkErrorText(result.second)),
tr("Icon metatada not fetched."));
}
// Remove temporary feed object.
delete result.first;
}
else {
// No feed guessed, even no icon available.
m_ui->m_lblFetchMetadata->setStatus(WidgetWithStatus::Error,
tr("Error: %1.").arg(NetworkFactory::networkErrorText(result.second)),
tr("No icon fetched."));
}
}
void FormFeedDetails::createConnections() { void FormFeedDetails::createConnections() {
// General connections. // General connections.
connect(m_ui->m_buttonBox, SIGNAL(accepted()), connect(m_ui->m_buttonBox, SIGNAL(accepted()), this, SLOT(apply()));
this, SLOT(apply())); connect(m_ui->m_txtTitle->lineEdit(), SIGNAL(textChanged(QString)), this, SLOT(onTitleChanged(QString)));
connect(m_ui->m_txtTitle->lineEdit(), SIGNAL(textChanged(QString)), connect(m_ui->m_txtDescription->lineEdit(), SIGNAL(textChanged(QString)), this, SLOT(onDescriptionChanged(QString)));
this, SLOT(onTitleChanged(QString))); connect(m_ui->m_txtUrl->lineEdit(), SIGNAL(textChanged(QString)), this, SLOT(onUrlChanged(QString)));
connect(m_ui->m_txtDescription->lineEdit(), SIGNAL(textChanged(QString)), connect(m_ui->m_txtUsername->lineEdit(), SIGNAL(textChanged(QString)), this, SLOT(onUsernameChanged(QString)));
this, SLOT(onDescriptionChanged(QString))); connect(m_ui->m_txtPassword->lineEdit(), SIGNAL(textChanged(QString)), this, SLOT(onPasswordChanged(QString)));
connect(m_ui->m_txtUrl->lineEdit(), SIGNAL(textChanged(QString)), connect(m_ui->m_gbAuthentication, SIGNAL(toggled(bool)), this, SLOT(onAuthenticationSwitched()));
this, SLOT(onUrlChanged(QString))); connect(m_ui->m_cmbAutoUpdateType, SIGNAL(currentIndexChanged(int)), this, SLOT(onAutoUpdateTypeChanged(int)));
connect(m_ui->m_txtUsername->lineEdit(), SIGNAL(textChanged(QString)), connect(m_ui->m_btnFetchMetadata, SIGNAL(clicked()), this, SLOT(guessFeed()));
this, SLOT(onUsernameChanged(QString)));
connect(m_ui->m_txtPassword->lineEdit(), SIGNAL(textChanged(QString)),
this, SLOT(onPasswordChanged(QString)));
connect(m_ui->m_gbAuthentication, SIGNAL(toggled(bool)),
this, SLOT(onAuthenticationSwitched()));
connect(m_ui->m_cmbAutoUpdateType, SIGNAL(currentIndexChanged(int)),
this, SLOT(onAutoUpdateTypeChanged(int)));
connect(m_ui->m_btnFetchMetadata, SIGNAL(clicked()),
this, SLOT(guessFeed()));
// Icon connections. // Icon connections.
connect(m_actionFetchIcon, SIGNAL(triggered()), this, SLOT(guessIconOnly()));
connect(m_actionLoadIconFromFile, SIGNAL(triggered()), this, SLOT(onLoadIconFromFile())); connect(m_actionLoadIconFromFile, SIGNAL(triggered()), this, SLOT(onLoadIconFromFile()));
connect(m_actionNoIcon, SIGNAL(triggered()), this, SLOT(onNoIconSelected())); connect(m_actionNoIcon, SIGNAL(triggered()), this, SLOT(onNoIconSelected()));
connect(m_actionUseDefaultIcon, SIGNAL(triggered()), this, SLOT(onUseDefaultIcon())); connect(m_actionUseDefaultIcon, SIGNAL(triggered()), this, SLOT(onUseDefaultIcon()));
@ -410,6 +433,10 @@ void FormFeedDetails::initialize() {
m_actionUseDefaultIcon = new QAction(qApp->icons()->fromTheme("folder-feed"), m_actionUseDefaultIcon = new QAction(qApp->icons()->fromTheme("folder-feed"),
tr("Use default icon"), tr("Use default icon"),
this); this);
m_actionFetchIcon = new QAction(qApp->icons()->fromTheme("document-download"),
tr("Fetch icon from feed"),
this);
m_iconMenu->addAction(m_actionFetchIcon);
m_iconMenu->addAction(m_actionLoadIconFromFile); m_iconMenu->addAction(m_actionLoadIconFromFile);
m_iconMenu->addAction(m_actionUseDefaultIcon); m_iconMenu->addAction(m_actionUseDefaultIcon);
m_iconMenu->addAction(m_actionNoIcon); m_iconMenu->addAction(m_actionNoIcon);

View File

@ -48,6 +48,7 @@ class FormFeedDetails : public QDialog {
// Applies changes. // Applies changes.
void apply(); void apply();
void guessFeed(); void guessFeed();
void guessIconOnly();
// Trigerred when title/description/url/username/password changes. // Trigerred when title/description/url/username/password changes.
void onTitleChanged(const QString &new_title); void onTitleChanged(const QString &new_title);
@ -88,6 +89,7 @@ class FormFeedDetails : public QDialog {
QMenu *m_iconMenu; QMenu *m_iconMenu;
QAction *m_actionLoadIconFromFile; QAction *m_actionLoadIconFromFile;
QAction *m_actionUseDefaultIcon; QAction *m_actionUseDefaultIcon;
QAction *m_actionFetchIcon;
QAction *m_actionNoIcon; QAction *m_actionNoIcon;
}; };