Krita Source Code Documentation
Loading...
Searching...
No Matches
KisMultiFeedRSSModel.cpp
Go to the documentation of this file.
1
/**************************************************************************
2
**
3
** This file is part of Qt Creator
4
**
5
** SPDX-FileCopyrightText: 2011 Nokia Corporation and /or its subsidiary(-ies).
6
**
7
** Contact: Nokia Corporation (qt-info@nokia.com)
8
**
9
**
10
** SPDX-License-Identifier: LGPL-2.1-only
11
**
12
** In addition, as a special exception, Nokia gives you certain additional
13
** rights. These rights are described in the Nokia Qt LGPL Exception
14
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
15
**
16
** Other Usage
17
**
18
** Alternatively, this file may be used in accordance with the terms and
19
** conditions contained in a signed written agreement between you and Nokia.
20
**
21
** If you have questions regarding the use of this file, please contact
22
** Nokia at qt-info@nokia.com.
23
**
24
**************************************************************************/
25
26
#include "
KisMultiFeedRSSModel.h
"
27
28
#include <QThread>
29
#include <QXmlStreamReader>
30
#include <QCoreApplication>
31
#include <QLocale>
32
#include <QFile>
33
#include <QTextBlock>
34
#include <QTextDocument>
35
36
#include <QNetworkRequest>
37
#include <QNetworkReply>
38
#include <
KisNetworkAccessManager.h
>
39
40
#include <
KisRssReader.h
>
41
#include <QApplication>
42
43
MultiFeedRssModel::MultiFeedRssModel
(QObject *parent) :
44
QAbstractListModel(parent),
45
m_networkAccessManager(new
KisNetworkAccessManager
),
46
m_articleCount(0)
47
{
48
initialize
();
49
}
50
51
MultiFeedRssModel::MultiFeedRssModel
(
KisNetworkAccessManager
* nam, QObject* parent)
52
: QAbstractListModel(parent),
53
m_networkAccessManager(nam),
54
m_articleCount(0)
55
{
56
initialize
();
57
}
58
59
60
MultiFeedRssModel::~MultiFeedRssModel
()
61
{
62
delete
m_networkAccessManager
;
63
}
64
65
QHash<int, QByteArray>
MultiFeedRssModel::roleNames
()
const
66
{
67
QHash<int, QByteArray>
roleNames
;
68
roleNames
[
KisRssReader::RssRoles::TitleRole
] =
"title"
;
69
roleNames
[
KisRssReader::RssRoles::DescriptionRole
] =
"description"
;
70
roleNames
[
KisRssReader::RssRoles::PubDateRole
] =
"pubDate"
;
71
roleNames
[
KisRssReader::RssRoles::LinkRole
] =
"link"
;
72
roleNames
[
KisRssReader::RssRoles::CategoryRole
] =
"category"
;
73
roleNames
[
KisRssReader::RssRoles::BlogNameRole
] =
"blogName"
;
74
roleNames
[
KisRssReader::RssRoles::BlogIconRole
] =
"blogIcon"
;
75
return
roleNames
;
76
}
77
78
void
MultiFeedRssModel::addFeed
(
const
QString& feed)
79
{
80
if
(
m_sites
.contains(feed)) {
81
// do not add the feed twice
82
return
;
83
}
84
85
m_sites
<< feed;
86
const
QUrl feedUrl(feed);
87
m_networkAccessManager
->
getUrl
(feedUrl);
88
}
89
90
bool
sortForPubDate
(
const
RssItem
& item1,
const
RssItem
& item2)
91
{
92
return
item1.
pubDate
> item2.
pubDate
;
93
}
94
95
void
MultiFeedRssModel::appendFeedData
(QNetworkReply *reply)
96
{
97
beginResetModel();
98
KisRssReader
reader;
99
m_aggregatedFeed
.append(reader.
parse
(reply));
100
sortAggregatedFeed
();
101
setArticleCount
(
m_aggregatedFeed
.size());
102
endResetModel();
103
104
Q_EMIT
feedDataChanged
();
105
}
106
107
void
MultiFeedRssModel::sortAggregatedFeed
()
108
{
109
std::sort(
m_aggregatedFeed
.begin(),
m_aggregatedFeed
.end(),
sortForPubDate
);
110
}
111
112
void
MultiFeedRssModel::initialize
()
113
{
114
connect
(
m_networkAccessManager
, SIGNAL(finished(QNetworkReply*)),
115
SLOT(
appendFeedData
(QNetworkReply*)), Qt::QueuedConnection);
116
}
117
118
void
MultiFeedRssModel::removeFeed
(
const
QString &feed)
119
{
120
bool
isRemoved =
m_sites
.removeOne(feed);
121
if
(isRemoved) {
122
beginResetModel();
123
QMutableListIterator<RssItem> it(
m_aggregatedFeed
);
124
while
(it.hasNext()) {
125
RssItem
item = it.next();
126
if
(item.
source
== feed)
127
it.remove();
128
}
129
setArticleCount
(
m_aggregatedFeed
.size());
130
endResetModel();
131
132
Q_EMIT
feedDataChanged
();
133
}
134
}
135
136
int
MultiFeedRssModel::rowCount
(
const
QModelIndex &)
const
137
{
138
return
m_aggregatedFeed
.size();
139
}
140
141
QVariant
MultiFeedRssModel::data
(
const
QModelIndex &index,
int
role)
const
142
{
143
if
(index.row() <
m_aggregatedFeed
.size()) {
144
RssItem
item =
m_aggregatedFeed
.at(index.row());
145
146
switch
(role) {
147
case
Qt::DisplayRole:
148
{
149
QTextDocument doc;
150
doc.setHtml(item.
description
);
151
// Extract the first text block, which is the `<p>` element containing
152
// the shortened post text, excluding the "This post [...] appeared
153
// first on [...]" text.
154
QString text = doc.firstBlock().text();
155
if
(text.length() > 292) {
156
text.truncate(290);
157
text.append(
"..."
);
158
}
159
return
QString(
"<b><a href=\""
+ item.
link
+
"\">"
+ item.
title
+
"</a></b>"
160
"<br><small>("
+ QLocale().toString(item.
pubDate
.toLocalTime(), QLocale::ShortFormat) +
") "
161
"<p style=\"margin-top: 4px\">"
+ text +
"</p></small>"
);
162
}
163
case
KisRssReader::RssRoles::TitleRole
:
164
return
item.
title
;
165
case
KisRssReader::RssRoles::DescriptionRole
:
166
return
item.
description
;
167
case
KisRssReader::RssRoles::PubDateRole
:
168
return
item.
pubDate
.toString(
"dd-MM-yyyy hh:mm"
);
169
case
KisRssReader::RssRoles::LinkRole
:
170
return
item.
link
;
171
case
KisRssReader::RssRoles::CategoryRole
:
172
return
item.
category
;
173
case
KisRssReader::RssRoles::BlogNameRole
:
174
return
item.
blogName
;
175
case
KisRssReader::RssRoles::BlogIconRole
:
176
return
item.
blogIcon
;
177
}
178
}
179
180
return
QVariant();
181
}
sortForPubDate
bool sortForPubDate(const RssItem &item1, const RssItem &item2)
Definition
KisMultiFeedRSSModel.cpp:90
KisMultiFeedRSSModel.h
KisNetworkAccessManager.h
KisRssReader.h
connect
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
KisNetworkAccessManager
Network Access Manager for use with Krita.
Definition
KisNetworkAccessManager.h:16
KisNetworkAccessManager::getUrl
void getUrl(const QUrl &url)
Definition
KisNetworkAccessManager.cpp:20
KisRssReader
Definition
KisRssReader.h:54
KisRssReader::TitleRole
@ TitleRole
Definition
KisRssReader.h:59
KisRssReader::DescriptionRole
@ DescriptionRole
Definition
KisRssReader.h:60
KisRssReader::BlogIconRole
@ BlogIconRole
Definition
KisRssReader.h:65
KisRssReader::BlogNameRole
@ BlogNameRole
Definition
KisRssReader.h:64
KisRssReader::LinkRole
@ LinkRole
Definition
KisRssReader.h:61
KisRssReader::PubDateRole
@ PubDateRole
Definition
KisRssReader.h:62
KisRssReader::CategoryRole
@ CategoryRole
Definition
KisRssReader.h:63
KisRssReader::parse
RssItemList parse(QNetworkReply *reply)
Definition
KisRssReader.cpp:110
MultiFeedRssModel::m_networkAccessManager
KisNetworkAccessManager * m_networkAccessManager
Definition
KisMultiFeedRSSModel.h:79
MultiFeedRssModel::~MultiFeedRssModel
~MultiFeedRssModel() override
Definition
KisMultiFeedRSSModel.cpp:60
MultiFeedRssModel::rowCount
int rowCount(const QModelIndex &parent=QModelIndex()) const override
Definition
KisMultiFeedRSSModel.cpp:136
MultiFeedRssModel::roleNames
QHash< int, QByteArray > roleNames() const override
Definition
KisMultiFeedRSSModel.cpp:65
MultiFeedRssModel::initialize
void initialize()
Definition
KisMultiFeedRSSModel.cpp:112
MultiFeedRssModel::addFeed
virtual void addFeed(const QString &feed)
Definition
KisMultiFeedRSSModel.cpp:78
MultiFeedRssModel::removeFeed
void removeFeed(const QString &feed)
Definition
KisMultiFeedRSSModel.cpp:118
MultiFeedRssModel::m_aggregatedFeed
RssItemList m_aggregatedFeed
Definition
KisMultiFeedRSSModel.h:78
MultiFeedRssModel::m_sites
QStringList m_sites
Definition
KisMultiFeedRSSModel.h:77
MultiFeedRssModel::feedDataChanged
void feedDataChanged()
MultiFeedRssModel::appendFeedData
void appendFeedData(QNetworkReply *reply)
Definition
KisMultiFeedRSSModel.cpp:95
MultiFeedRssModel::MultiFeedRssModel
MultiFeedRssModel(QObject *parent=0)
Definition
KisMultiFeedRSSModel.cpp:43
MultiFeedRssModel::setArticleCount
void setArticleCount(int arg)
Definition
KisMultiFeedRSSModel.h:62
MultiFeedRssModel::data
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
Definition
KisMultiFeedRSSModel.cpp:141
MultiFeedRssModel::sortAggregatedFeed
void sortAggregatedFeed()
Definition
KisMultiFeedRSSModel.cpp:107
RssItem
Definition
KisRssReader.h:37
RssItem::title
QString title
Definition
KisRssReader.h:39
RssItem::category
QString category
Definition
KisRssReader.h:42
RssItem::blogName
QString blogName
Definition
KisRssReader.h:43
RssItem::blogIcon
QString blogIcon
Definition
KisRssReader.h:44
RssItem::pubDate
QDateTime pubDate
Definition
KisRssReader.h:45
RssItem::source
QString source
Definition
KisRssReader.h:38
RssItem::description
QString description
Definition
KisRssReader.h:41
RssItem::link
QString link
Definition
KisRssReader.h:40
libs
ui
KisMultiFeedRSSModel.cpp
Generated at
2025-11-04 02:30:02+01:00
from
Krita
branch
master
, commit
c9dde2e79561a8aea4a7e8d9ac99c98a7bac9e52