Added ability to fetch just icons.
This commit is contained in:
parent
835d66e94d
commit
98da617b75
@ -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>
|
||||||
|
|
||||||
|
@ -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();
|
|
||||||
}
|
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user