Falkon Develop
Cross-platform Qt-based web browser
qmlbookmarks.cpp
Go to the documentation of this file.
1/* ============================================================
2* Falkon - Qt web browser
3* Copyright (C) 2018 Anmol Gautam <tarptaeya@gmail.com>
4*
5* This program is free software: you can redistribute it and/or modify
6* it under the terms of the GNU General Public License as published by
7* the Free Software Foundation, either version 3 of the License, or
8* (at your option) any later version.
9*
10* This program is distributed in the hope that it will be useful,
11* but WITHOUT ANY WARRANTY; without even the implied warranty of
12* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13* GNU General Public License for more details.
14*
15* You should have received a copy of the GNU General Public License
16* along with this program. If not, see <http://www.gnu.org/licenses/>.
17* ============================================================ */
18#include "qmlbookmarks.h"
19#include "bookmarks.h"
20#include "qml/qmlstaticdata.h"
21#include <QDebug>
22#include <QQmlEngine>
23
25 : QObject(parent)
26{
27 connect(mApp->bookmarks(), &Bookmarks::bookmarkAdded, this, [this](BookmarkItem *item){
28 auto treeNode = QmlStaticData::instance().getBookmarkTreeNode(item);
29 Q_EMIT created(treeNode);
30 });
31
32 connect(mApp->bookmarks(), &Bookmarks::bookmarkChanged, this, [this](BookmarkItem *item){
33 auto treeNode = QmlStaticData::instance().getBookmarkTreeNode(item);
34 Q_EMIT changed(treeNode);
35 });
36
37 connect(mApp->bookmarks(), &Bookmarks::bookmarkRemoved, this, [this](BookmarkItem *item){
38 auto treeNode = QmlStaticData::instance().getBookmarkTreeNode(item);
39 Q_EMIT removed(treeNode);
40 });
41}
42
43BookmarkItem *QmlBookmarks::getBookmarkItem(QmlBookmarkTreeNode *treeNode) const
44{
45 auto bookmarks = mApp->bookmarks();
46 QList<BookmarkItem*> items;
47
48 if (treeNode->url().isEmpty()) {
49 if (treeNode->item() == bookmarks->rootItem()) {
50 return bookmarks->rootItem();
51
52 } else if (treeNode->item() == bookmarks->toolbarFolder()) {
53 return bookmarks->toolbarFolder();
54
55 } else if (treeNode->item() == bookmarks->menuFolder()) {
56 return bookmarks->menuFolder();
57
58 } else if (treeNode->item() == bookmarks->unsortedFolder()) {
59 return bookmarks->unsortedFolder();
60 }
61
62 items = bookmarks->searchBookmarks(treeNode->title());
63 } else {
64 items = bookmarks->searchBookmarks(QUrl::fromEncoded(treeNode->url().toUtf8()));
65 }
66
67 for (BookmarkItem *item : std::as_const(items)) {
68 if (treeNode->item() == item) {
69 return item;
70 }
71 }
72
73 return nullptr;
74}
75
76BookmarkItem *QmlBookmarks::getBookmarkItem(QObject *object) const
77{
78 auto treeNode = qobject_cast<QmlBookmarkTreeNode*>(object);
79 if (!treeNode) {
80 return nullptr;
81 }
82
83 auto item = getBookmarkItem(treeNode);
84 if (!item || item->urlString() != treeNode->url()) {
85 return nullptr;
86 }
87
88 return item;
89}
90
91bool QmlBookmarks::isBookmarked(const QString &url) const
92{
93 return mApp->bookmarks()->isBookmarked(QUrl::fromEncoded(url.toUtf8()));
94}
95
97{
98 return QmlStaticData::instance().getBookmarkTreeNode(mApp->bookmarks()->rootItem());
99}
100
102{
103 return QmlStaticData::instance().getBookmarkTreeNode(mApp->bookmarks()->toolbarFolder());
104}
105
107{
108 return QmlStaticData::instance().getBookmarkTreeNode(mApp->bookmarks()->menuFolder());
109}
110
112{
113 return QmlStaticData::instance().getBookmarkTreeNode(mApp->bookmarks()->unsortedFolder());
114}
115
117{
118 return QmlStaticData::instance().getBookmarkTreeNode(mApp->bookmarks()->lastUsedFolder());
119}
120
121bool QmlBookmarks::create(const QVariantMap &map) const
122{
123 if (!map.contains(QSL("parent"))) {
124 qWarning() << "Unable to create new bookmark:" << "parent not found";
125 return false;
126 }
127 const QString title = map.value(QSL("title")).toString();
128 const QString urlString = map.value(QSL("url")).toString();
129 const QString description = map.value(QSL("description")).toString();
130
132 if (map.contains(QSL("type"))) {
133 type = BookmarkItem::Type(map.value(QSL("type")).toInt());
134 } else if (urlString.isEmpty()){
135 if (!title.isEmpty()) {
137 } else {
139 }
140 } else {
141 type = BookmarkItem::Url;
142 }
143
144 auto object = map.value(QSL("parent")).value<QObject*>();
145 auto parent = getBookmarkItem(object);
146 if (!parent) {
147 qWarning() << "Unable to create new bookmark:" << "parent not found";
148 return false;
149 }
150 auto item = new BookmarkItem(type);
151 item->setTitle(title);
152 item->setUrl(QUrl::fromEncoded(urlString.toUtf8()));
153 item->setDescription(description);
154 mApp->bookmarks()->addBookmark(parent, item);
155 return true;
156}
157
159{
160 auto item = getBookmarkItem(treeNode);
161 if (!item) {
162 qWarning() << "Unable to remove bookmark:" <<"BookmarkItem not found";
163 return false;
164 }
165 return mApp->bookmarks()->removeBookmark(item);
166}
167
168QList<QObject*> QmlBookmarks::search(const QVariantMap &map) const
169{
170 if (!map.contains(QSL("query")) && !map.contains(QSL("url"))) {
171 qWarning() << "Unable to search bookmarks";
172 return {};
173 }
174
175 const QString query = map.value(QSL("query")).toString();
176 const QString urlString = map.value(QSL("url")).toString();
177 QList<BookmarkItem*> items;
178 if (urlString.isEmpty()) {
179 items = mApp->bookmarks()->searchBookmarks(query);
180 } else {
181 items = mApp->bookmarks()->searchBookmarks(QUrl::fromEncoded(urlString.toUtf8()));
182 }
183 QList<QObject*> ret;
184 ret.reserve(items.size());
185 for (auto item : std::as_const(items)) {
186 ret.append(QmlStaticData::instance().getBookmarkTreeNode(item));
187 }
188 return ret;
189}
190
191bool QmlBookmarks::update(QObject *object, const QVariantMap &changes) const
192{
193 auto treeNode = qobject_cast<QmlBookmarkTreeNode*>(object);
194 if (!treeNode) {
195 qWarning() << "Unable to update bookmark:" << "unable to cast QVariant to QmlBookmarkTreeNode";
196 return false;
197 }
198
199 auto item = getBookmarkItem(treeNode);
200 if (!item) {
201 qWarning() << "Unable to update bookmark:" << "bookmark not found";
202 return false;
203 }
204
205 if (!mApp->bookmarks()->canBeModified(item)) {
206 qWarning() << "Unable to update bookmark:" << "bookmark can not be modified";
207 }
208
209 QString newTitle = treeNode->title();
210 if (changes.contains(QSL("title"))) {
211 newTitle = changes.value(QSL("title")).toString();
212 }
213 QString newDescription = treeNode->description();
214 if (changes.contains(QSL("description"))) {
215 newDescription = changes.value(QSL("description")).toString();
216 }
217 QString newKeyword = treeNode->keyword();
218 if (changes.contains(QSL("keyword"))) {
219 newKeyword = changes.value(QSL("keyword")).toString();
220 }
221
222 item->setTitle(newTitle);
223 item->setDescription(newDescription);
224 item->setKeyword(newKeyword);
225 mApp->bookmarks()->changeBookmark(item);
226 return true;
227}
228
229QmlBookmarkTreeNode *QmlBookmarks::get(const QString &string) const
230{
231 const QList<BookmarkItem*> items = mApp->bookmarks()->searchBookmarks(QUrl(string));
232 for (BookmarkItem *item : items) {
233 if (item->urlString() == string) {
235 }
236 }
237
238 return nullptr;
239}
240
241QList<QObject*> QmlBookmarks::getChildren(QObject *object) const
242{
243 QList<QObject*> ret;
244
245 auto bookmarkItem = getBookmarkItem(object);
246 if (!bookmarkItem) {
247 qWarning() << "Unable to get children:" << "parent not found";
248 return ret;
249 }
250
251 const QList<BookmarkItem*> items = bookmarkItem->children();
252 for (BookmarkItem *item : items) {
253 ret.append(QmlStaticData::instance().getBookmarkTreeNode(item));
254 }
255
256 return ret;
257}
void bookmarkRemoved(BookmarkItem *item)
void bookmarkAdded(BookmarkItem *item)
void bookmarkChanged(BookmarkItem *item)
The class exposing the bookmark item to QML.
QString description
description of bookmark tree node.
QString title
title of bookmark tree node.
QString url
url of bookmark tree node.
QString keyword
keyword of bookmark tree node.
Q_INVOKABLE QmlBookmarkTreeNode * lastUsedFolder() const
Get the last used bookmarks folder.
Q_INVOKABLE bool create(const QVariantMap &map) const
Creates a bookmark item.
Q_INVOKABLE QList< QObject * > search(const QVariantMap &map) const
QmlBookmarks::search.
QmlBookmarks(QObject *parent=nullptr)
Q_INVOKABLE QmlBookmarkTreeNode * get(const QString &string) const
Get the first matched bookmark item.
Q_INVOKABLE QmlBookmarkTreeNode * menuFolder() const
Get the bookmarks menu folder.
Q_INVOKABLE bool remove(QmlBookmarkTreeNode *treeNode) const
Removes a bookmark item.
Q_INVOKABLE QmlBookmarkTreeNode * toolbarFolder() const
Get the bookmarks toolbar.
Q_INVOKABLE bool update(QObject *object, const QVariantMap &changes) const
Updates a bookmark item.
Q_INVOKABLE QmlBookmarkTreeNode * rootItem() const
Get the root bookmark item.
Q_INVOKABLE bool isBookmarked(const QString &url) const
Checks if the url is bookmarked.
Q_INVOKABLE QList< QObject * > getChildren(QObject *object) const
Get children of the bookmark item.
Q_INVOKABLE QmlBookmarkTreeNode * unsortedFolder() const
Get the unsorted bookmarks folder.
static QmlStaticData & instance()
QmlBookmarkTreeNode * getBookmarkTreeNode(BookmarkItem *item)
#define mApp
#define QSL(x)
Definition: qzcommon.h:40