47
48
struct HistoryItem : public QStandardItem {
49
KConfig config(mConfigPath, KConfig::SimpleConfig);
50
KConfigGroup group(&config, "general");
51
group.writeEntry("url", mUrl);
52
group.writeEntry("dateTime", mDateTime.toString(Qt::ISODate));
56
static HistoryItem* create(const KUrl& url, const QDateTime& dateTime, const QString& storageDir) {
57
if (!KStandardDirs::makeDir(storageDir, 0600)) {
58
kError() << "Could not create history dir" << storageDir;
62
file.setAutoRemove(false);
63
file.setPrefix(storageDir);
66
kError() << "Could not create history file";
70
HistoryItem* item = new HistoryItem(url, dateTime, file.fileName());
75
static HistoryItem* load(const QString& fileName) {
76
KConfig config(fileName, KConfig::SimpleConfig);
77
KConfigGroup group(&config, "general");
79
KUrl url(group.readEntry("url"));
81
kError() << "Invalid url" << url;
84
QDateTime dateTime = QDateTime::fromString(group.readEntry("dateTime"), Qt::ISODate);
85
if (!dateTime.isValid()) {
86
kError() << "Invalid dateTime" << dateTime;
90
return new HistoryItem(url, dateTime, fileName);
97
QDateTime dateTime() const {
101
void setDateTime(const QDateTime& dateTime) {
102
if (mDateTime != dateTime) {
103
mDateTime = dateTime;
109
QFile::remove(mConfigPath);
51
KConfig config(mConfigPath, KConfig::SimpleConfig);
52
KConfigGroup group(&config, "general");
53
group.writeEntry("url", mUrl);
54
group.writeEntry("dateTime", mDateTime.toString(Qt::ISODate));
58
static HistoryItem* create(const KUrl& url, const QDateTime& dateTime, const QString& storageDir) {
59
if (!KStandardDirs::makeDir(storageDir, 0600)) {
60
kError() << "Could not create history dir" << storageDir;
64
file.setAutoRemove(false);
65
file.setPrefix(storageDir);
68
kError() << "Could not create history file";
72
HistoryItem* item = new HistoryItem(url, dateTime, file.fileName());
77
static HistoryItem* load(const QString& fileName) {
78
KConfig config(fileName, KConfig::SimpleConfig);
79
KConfigGroup group(&config, "general");
81
KUrl url(group.readEntry("url"));
83
kError() << "Invalid url" << url;
86
QDateTime dateTime = QDateTime::fromString(group.readEntry("dateTime"), Qt::ISODate);
87
if (!dateTime.isValid()) {
88
kError() << "Invalid dateTime" << dateTime;
92
return new HistoryItem(url, dateTime, fileName);
99
QDateTime dateTime() const {
103
void setDateTime(const QDateTime& dateTime)
105
if (mDateTime != dateTime) {
106
mDateTime = dateTime;
113
QFile::remove(mConfigPath);
117
HistoryItem(const KUrl& url, const QDateTime& dateTime, const QString& configPath)
119
, mDateTime(dateTime)
120
, mConfigPath(configPath)
123
mUrl.adjustPath(KUrl::RemoveTrailingSlash);
124
setText(mUrl.pathOrUrl());
126
QString iconName = KMimeType::iconNameForUrl(mUrl);
127
setIcon(KIcon(iconName));
129
setData(QVariant(mUrl), KFilePlacesModel::UrlRole);
131
KFileItem fileItem(KFileItem::Unknown, KFileItem::Unknown, mUrl);
132
setData(QVariant(fileItem), KDirModel::FileItemRole);
134
QString date = KGlobal::locale()->formatDateTime(mDateTime, KLocale::FancyLongDate);
135
setData(QVariant(i18n("Last visited: %1", date)), Qt::ToolTipRole);
138
bool operator<(const QStandardItem& other) const {
139
return mDateTime > static_cast<const HistoryItem*>(&other)->mDateTime;
121
HistoryItem(const KUrl& url, const QDateTime& dateTime, const QString& configPath)
123
, mDateTime(dateTime)
124
, mConfigPath(configPath) {
126
mUrl.adjustPath(KUrl::RemoveTrailingSlash);
127
setText(mUrl.pathOrUrl());
129
QString iconName = KMimeType::iconNameForUrl(mUrl);
130
setIcon(KIcon(iconName));
132
setData(QVariant(mUrl), KFilePlacesModel::UrlRole);
134
KFileItem fileItem(KFileItem::Unknown, KFileItem::Unknown, mUrl);
135
setData(QVariant(fileItem), KDirModel::FileItemRole);
137
QString date = KGlobal::locale()->formatDateTime(mDateTime, KLocale::FancyLongDate);
138
setData(QVariant(i18n("Last visited: %1", date)), Qt::ToolTipRole);
141
bool operator<(const QStandardItem& other) const {
142
return mDateTime > static_cast<const HistoryItem*>(&other)->mDateTime;
144
146
struct HistoryModelPrivate {
149
QMap<KUrl, HistoryItem*> mHistoryItemForUrl;
152
QDir dir(mStorageDir);
156
Q_FOREACH(const QString& name, dir.entryList(QStringList() << "*rc")) {
157
HistoryItem* item = HistoryItem::load(dir.filePath(name));
161
HistoryItem* existingItem = mHistoryItemForUrl.value(item->url());
163
// We already know this url(!) update existing item dateTime
164
// and get rid of duplicate
165
if (existingItem->dateTime() < item->dateTime()) {
166
existingItem->setDateTime(item->dateTime());
171
mHistoryItemForUrl.insert(item->url(), item);
178
void garbageCollect() {
179
while (q->rowCount() > mMaxCount) {
180
HistoryItem* item = static_cast<HistoryItem*>(q->takeRow(q->rowCount() - 1).at(0));
181
mHistoryItemForUrl.remove(item->url());
151
QMap<KUrl, HistoryItem*> mHistoryItemForUrl;
155
QDir dir(mStorageDir);
159
Q_FOREACH(const QString & name, dir.entryList(QStringList() << "*rc")) {
160
HistoryItem* item = HistoryItem::load(dir.filePath(name));
164
HistoryItem* existingItem = mHistoryItemForUrl.value(item->url());
166
// We already know this url(!) update existing item dateTime
167
// and get rid of duplicate
168
if (existingItem->dateTime() < item->dateTime()) {
169
existingItem->setDateTime(item->dateTime());
174
mHistoryItemForUrl.insert(item->url(), item);
181
void garbageCollect()
183
while (q->rowCount() > mMaxCount) {
184
HistoryItem* item = static_cast<HistoryItem*>(q->takeRow(q->rowCount() - 1).at(0));
185
mHistoryItemForUrl.remove(item->url());
189
192
HistoryModel::HistoryModel(QObject* parent, const QString& storageDir, int maxCount)
190
193
: QStandardItemModel(parent)
191
, d(new HistoryModelPrivate) {
193
d->mStorageDir = storageDir;
194
d->mMaxCount = maxCount;
199
HistoryModel::~HistoryModel() {
204
void HistoryModel::addUrl(const KUrl& url, const QDateTime& _dateTime) {
205
QDateTime dateTime = _dateTime.isValid() ? _dateTime : QDateTime::currentDateTime();
206
HistoryItem* historyItem = d->mHistoryItemForUrl.value(url);
208
historyItem->setDateTime(dateTime);
211
historyItem = HistoryItem::create(url, dateTime, d->mStorageDir);
213
kError() << "Could not save history for url" << url;
216
appendRow(historyItem);
223
bool HistoryModel::removeRows(int start, int count, const QModelIndex& parent) {
224
Q_ASSERT(!parent.isValid());
225
for (int row=start + count - 1; row >= start ; --row) {
226
HistoryItem* historyItem = static_cast<HistoryItem*>(item(row, 0));
227
Q_ASSERT(historyItem);
228
d->mHistoryItemForUrl.remove(historyItem->url());
229
historyItem->unlink();
231
return QStandardItemModel::removeRows(start, count, parent);
194
, d(new HistoryModelPrivate)
197
d->mStorageDir = storageDir;
198
d->mMaxCount = maxCount;
202
HistoryModel::~HistoryModel()
207
void HistoryModel::addUrl(const KUrl& url, const QDateTime& _dateTime)
209
QDateTime dateTime = _dateTime.isValid() ? _dateTime : QDateTime::currentDateTime();
210
HistoryItem* historyItem = d->mHistoryItemForUrl.value(url);
212
historyItem->setDateTime(dateTime);
215
historyItem = HistoryItem::create(url, dateTime, d->mStorageDir);
217
kError() << "Could not save history for url" << url;
220
appendRow(historyItem);
226
bool HistoryModel::removeRows(int start, int count, const QModelIndex& parent)
228
Q_ASSERT(!parent.isValid());
229
for (int row = start + count - 1; row >= start ; --row) {
230
HistoryItem* historyItem = static_cast<HistoryItem*>(item(row, 0));
231
Q_ASSERT(historyItem);
232
d->mHistoryItemForUrl.remove(historyItem->url());
233
historyItem->unlink();
235
return QStandardItemModel::removeRows(start, count, parent);