28#include <QJsonDocument>
31static const int bookmarksVersion = 1;
35 , m_autoSaver(nullptr)
54 m_showOnlyIconsInToolbar = settings.
value(
QSL(
"showOnlyIconsInToolbar"),
false).toBool();
55 m_showOnlyTextInToolbar = settings.
value(
QSL(
"showOnlyTextInToolbar"),
false).toBool();
61 return m_showOnlyIconsInToolbar;
66 return m_showOnlyTextInToolbar;
76 return m_folderToolbar;
86 return m_folderUnsorted;
108 return item != m_root &&
109 item != m_folderToolbar &&
110 item != m_folderMenu &&
111 item != m_folderUnsorted;
116 QList<BookmarkItem*> items;
117 search(&items, m_root, url);
123 QList<BookmarkItem*> items;
124 search(&items, m_root,
string, limit, sensitive);
130 QList<BookmarkItem*> items;
150 m_lastFolder = parent;
180 m_showOnlyIconsInToolbar =
state;
187 m_showOnlyTextInToolbar =
state;
192void Bookmarks::saveSettings()
196 settings.
setValue(
QSL(
"showOnlyIconsInToolbar"), m_showOnlyIconsInToolbar);
197 settings.
setValue(
QSL(
"showOnlyTextInToolbar"), m_showOnlyTextInToolbar);
203void Bookmarks::init()
208 m_folderToolbar->
setTitle(tr(
"Bookmarks Toolbar"));
209 m_folderToolbar->
setDescription(tr(
"Bookmarks located in Bookmarks Toolbar"));
212 m_folderMenu->
setTitle(tr(
"Bookmarks Menu"));
213 m_folderMenu->
setDescription(tr(
"Bookmarks located in Bookmarks Menu"));
216 m_folderUnsorted->
setTitle(tr(
"Unsorted Bookmarks"));
228 m_lastFolder = m_folderUnsorted;
232void Bookmarks::loadBookmarks()
235 const QString backupFile = bookmarksFile + QLatin1String(
".old");
239 const QVariant res = json.toVariant();
241 if (err.error != QJsonParseError::NoError || res.typeId() != QMetaType::QVariantMap) {
242 if (QFile(bookmarksFile).exists()) {
243 qWarning() <<
"Bookmarks::init() Error parsing bookmarks! Using default bookmarks!";
244 qWarning() <<
"Bookmarks::init() Your bookmarks have been backed up in" << backupFile;
247 QFile::remove(backupFile);
248 QFile::copy(bookmarksFile, backupFile);
253 const QVariant data = json.toVariant();
255 Q_ASSERT(err.error == QJsonParseError::NoError);
256 Q_ASSERT(data.typeId() == QMetaType::QVariantMap);
258 loadBookmarksFromMap(data.toMap().value(
QSL(
"roots")).toMap());
264 loadBookmarksFromMap(res.toMap().value(
QSL(
"roots")).toMap());
268void Bookmarks::saveBookmarks()
270 QVariantMap bookmarksMap;
272#define WRITE_FOLDER(name, mapName, folder) \
273 QVariantMap mapName; \
274 mapName.insert(QSL("children"), writeBookmarks(folder)); \
275 mapName.insert(QSL("expanded"), folder->isExpanded()); \
276 mapName.insert(QSL("expanded_sidebar"), folder->isSidebarExpanded()); \
277 mapName.insert(QSL("name"), folder->title()); \
278 mapName.insert(QSL("description"), folder->description()); \
279 mapName.insert(QSL("type"), QSL("folder")); \
280 bookmarksMap.insert(name, mapName);
288 map.insert(
QSL(
"version"), bookmarksVersion);
289 map.insert(
QSL(
"roots"), bookmarksMap);
291 const QJsonDocument json = QJsonDocument::fromVariant(map);
292 const QByteArray data = json.toJson();
294 if (data.isEmpty()) {
295 qWarning() <<
"Bookmarks::saveBookmarks() Error serializing bookmarks!";
300 if (!file.open(QFile::WriteOnly)) {
301 qWarning() <<
"Bookmarks::saveBookmarks() Error opening bookmarks file for writing!";
309void Bookmarks::loadBookmarksFromMap(
const QVariantMap &map)
311#define READ_FOLDER(name, folder) \
312 readBookmarks(map.value(name).toMap().value(QSL("children")).toList(), folder); \
313 folder->setExpanded(map.value(name).toMap().value(QSL("expanded")).toBool()); \
314 folder->setSidebarExpanded(map.value(name).toMap().value(QSL("expanded_sidebar")).toBool());
322void Bookmarks::readBookmarks(
const QVariantList &list,
BookmarkItem* parent)
326 for (
const QVariant &entry : list) {
327 const QVariantMap map = entry.toMap();
338 item->setUrl(QUrl::fromEncoded(map.value(
QSL(
"url")).toByteArray()));
339 item->setTitle(map.value(
QSL(
"name")).toString());
340 item->setDescription(map.value(
QSL(
"description")).toString());
341 item->setKeyword(map.value(
QSL(
"keyword")).toString());
342 item->setVisitCount(map.value(
QSL(
"visit_count")).toInt());
346 item->setTitle(map.value(
QSL(
"name")).toString());
347 item->setDescription(map.value(
QSL(
"description")).toString());
348 item->setExpanded(map.value(
QSL(
"expanded")).toBool());
349 item->setSidebarExpanded(map.value(
QSL(
"expanded_sidebar")).toBool());
356 if (map.contains(
QSL(
"children"))) {
357 readBookmarks(map.value(
QSL(
"children")).toList(), item);
362QVariantList Bookmarks::writeBookmarks(
BookmarkItem* parent)
368 const auto children = parent->
children();
373 switch (child->type()) {
375 map.insert(
QSL(
"url"), child->urlString());
376 map.insert(
QSL(
"name"), child->title());
377 map.insert(
QSL(
"description"), child->description());
378 map.insert(
QSL(
"keyword"), child->keyword());
379 map.insert(
QSL(
"visit_count"), child->visitCount());
383 map.insert(
QSL(
"name"), child->title());
384 map.insert(
QSL(
"description"), child->description());
385 map.insert(
QSL(
"expanded"), child->isExpanded());
386 map.insert(
QSL(
"expanded_sidebar"), child->isSidebarExpanded());
393 if (!child->children().isEmpty()) {
394 map.insert(
QSL(
"children"), writeBookmarks(child));
403void Bookmarks::search(QList<BookmarkItem*>* items,
BookmarkItem* parent,
const QUrl &url)
const
408 switch (parent->
type()) {
411 const auto children = parent->
children();
413 search(items, child, url);
419 if (parent->
url() == url) {
420 items->append(parent);
429void Bookmarks::search(QList<BookmarkItem*>* items,
BookmarkItem* parent,
const QString &
string,
int limit, Qt::CaseSensitivity sensitive)
const
434 if (limit == items->count()) {
438 switch (parent->
type()) {
441 const auto children = parent->
children();
443 search(items, child,
string, limit, sensitive);
449 if (parent->
title().contains(
string, sensitive) ||
450 parent->
urlString().contains(
string, sensitive) ||
451 parent->
description().contains(
string, sensitive) ||
452 parent->
keyword().compare(
string, sensitive) == 0
454 items->append(parent);
468 switch (parent->
type()) {
471 const auto children = parent->
children();
478 if (parent->
keyword() == keyword)
479 items->append(parent);
#define WRITE_FOLDER(name, mapName, folder)
#define READ_FOLDER(name, folder)
void setDescription(const QString &description)
QString urlString() const
QString description() const
static Type typeFromString(const QString &string)
static QString typeToString(Type type)
QList< BookmarkItem * > children() const
void setTitle(const QString &title)
BookmarkItem * menuFolder() const
BookmarkItem * rootItem() const
void changeBookmark(BookmarkItem *item)
void bookmarkRemoved(BookmarkItem *item)
void showOnlyIconsInToolbarChanged(bool show)
void addBookmark(BookmarkItem *parent, BookmarkItem *item)
void setShowOnlyTextInToolbar(bool state)
bool showOnlyTextInToolbar() const
QList< BookmarkItem * > searchBookmarks(const QUrl &url) const
bool showOnlyIconsInToolbar() const
void bookmarkAdded(BookmarkItem *item)
void bookmarkChanged(BookmarkItem *item)
BookmarkItem * unsortedFolder() const
bool canBeModified(BookmarkItem *item) const
bool removeBookmark(BookmarkItem *item)
BookmarkItem * lastUsedFolder() const
bool isBookmarked(const QUrl &url)
BookmarkItem * toolbarFolder() const
void insertBookmark(BookmarkItem *parent, int row, BookmarkItem *item)
Bookmarks(QObject *parent=nullptr)
void setShowOnlyIconsInToolbar(bool state)
QList< BookmarkItem * > searchKeyword(const QString &keyword) const
BookmarksModel * model() const
void showOnlyTextInToolbarChanged(bool show)
void removeBookmark(BookmarkItem *item)
void addBookmark(BookmarkItem *parent, int row, BookmarkItem *item)
static QString currentProfilePath()
void beginGroup(const QString &prefix)
QVariant value(const QString &key, const QVariant &defaultValue=QVariant())
void setValue(const QString &key, const QVariant &defaultValue=QVariant())