Skip to content

Commit c8dcd9a

Browse files
committed
Plugins::WebBrowser: add export boolmark to json
1 parent 1b9ab3e commit c8dcd9a

4 files changed

Lines changed: 124 additions & 14 deletions

File tree

Plugins/WebBrowser/Bookmark/BookmarkDatabase.cpp

Lines changed: 91 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <QFile>
1111
#include <QTextStream>
1212
#include <QLoggingCategory>
13+
#include <QJsonArray>
1314

1415
#include "BookmarkDatabase.h"
1516

@@ -112,7 +113,7 @@ bool CBookmarkDatabase::moveFolder(int folderId, int newParentId)
112113

113114
BookmarkItem CBookmarkDatabase::getBookmark(int id)
114115
{
115-
BookmarkItem item;
116+
BookmarkItem item(BookmarkType_Bookmark);
116117

117118
auto leaf = m_TreeDB.GetLeaf(id);
118119
if(leaf.GetId() == 0) return item;
@@ -123,7 +124,7 @@ BookmarkItem CBookmarkDatabase::getBookmark(int id)
123124
QList<BookmarkItem> CBookmarkDatabase::getBookmarkByUrl(const QString &url)
124125
{
125126
QList<BookmarkItem> lstItems;
126-
BookmarkItem item;
127+
BookmarkItem item(BookmarkType_Bookmark);
127128

128129
auto urlItem = m_UrlDB.GetItem(url);
129130
auto leaves = m_TreeDB.GetLeavesByKey(urlItem.id);
@@ -532,7 +533,7 @@ int CBookmarkDatabase::importBookmark(const QDomElement &aElement,
532533
QDateTime lastModified = parseTimestamp(lastModifiedStr);
533534

534535
// 创建书签对象
535-
BookmarkItem item;
536+
BookmarkItem item(BookmarkType_Bookmark);
536537
item.url = url;
537538
item.title = title;
538539
item.createdTime = addDate.isValid() ? addDate : QDateTime::currentDateTime();
@@ -721,7 +722,7 @@ TreeItem CBookmarkDatabase::BookmarkToTree(const BookmarkItem& tree, bool setKey
721722

722723
BookmarkItem CBookmarkDatabase::TreeToBookmark(const TreeItem& tree)
723724
{
724-
BookmarkItem item;
725+
BookmarkItem item(BookmarkType_Bookmark);
725726
CDatabaseUrl::UrlItem url = m_UrlDB.GetItem(tree.GetKey());
726727
item = TreeToBookmark(tree, url);
727728
return item;
@@ -730,7 +731,7 @@ BookmarkItem CBookmarkDatabase::TreeToBookmark(const TreeItem& tree)
730731
BookmarkItem CBookmarkDatabase::TreeToBookmark(
731732
const TreeItem& tree, const CDatabaseUrl::UrlItem& url)
732733
{
733-
BookmarkItem item;
734+
BookmarkItem item(BookmarkType_Bookmark);
734735
item.id = tree.GetId();
735736
item.folderId = tree.GetParentId();
736737
item.createdTime = tree.GetCreateTime();
@@ -749,13 +750,96 @@ BookmarkItem CBookmarkDatabase::TreeToBookmark(
749750
return item;
750751
}
751752

752-
753753
bool CBookmarkDatabase::ExportToJson(QJsonObject &obj)
754754
{
755-
return true;
755+
bool bRet = true;
756+
QJsonArray root;
757+
bRet = ExportToJson(0, root);
758+
if(bRet)
759+
obj.insert("browser_bookmark", root);
760+
return bRet;
756761
}
757762

758763
bool CBookmarkDatabase::ImportFromJson(const QJsonObject &obj)
759764
{
765+
bool bRet = false;
766+
QJsonArray bookmark = obj["browser_bookmark"].toArray();
767+
if(bookmark.isEmpty()) {
768+
SetError(tr("The file format is error. Json without \"browser_bookmark\""));
769+
qCritical(log) << GetError();
770+
return false;
771+
}
772+
773+
bRet = ImportFromJson(0, bookmark);
774+
return bRet;
775+
}
776+
777+
bool CBookmarkDatabase::ImportFromJson(int parentId, const QJsonArray &obj)
778+
{
779+
for(auto it = obj.begin(); it != obj.end(); it++) {
780+
QJsonObject itemObj = it->toObject();
781+
if(itemObj.isEmpty()) continue;
782+
if(BookmarkType::BookmarkType_Folder == itemObj["type"].toInt()) {
783+
QString szName = itemObj["title"].toString();
784+
int id = addFolder(szName, parentId);
785+
QJsonArray items = itemObj["title"].toArray();
786+
if(items.isEmpty()) continue;
787+
ImportFromJson(id, items);
788+
continue;
789+
}
790+
791+
BookmarkItem item(BookmarkType::BookmarkType_Bookmark);
792+
item.title = itemObj["title"].toString();
793+
item.url = itemObj["url"].toString();
794+
item.folderId = parentId;
795+
796+
QIcon icon;
797+
bool bRet = CDatabaseIcon::ImportIconFromJson(itemObj, icon);
798+
if(!bRet) continue;
799+
item.icon =icon;
800+
801+
addBookmark(item);
802+
}
803+
804+
return true;
805+
}
806+
807+
bool CBookmarkDatabase::ExportToJson(int parentId, QJsonArray &obj)
808+
{
809+
auto items = getSubFolders(parentId);
810+
foreach(auto item, items) {
811+
QJsonObject oItem;
812+
if(item.isFolder()) {
813+
QJsonArray aItem;
814+
bool bRet = ExportToJson(item.id, aItem);
815+
if(!bRet) continue;
816+
817+
oItem.insert("type", item.type);
818+
oItem.insert("title", item.title);
819+
oItem.insert(item.title, aItem);
820+
} else {
821+
Q_ASSERT_X(false, "ExportBookmark", "The item is not node");
822+
continue;
823+
}
824+
825+
obj.append(oItem);
826+
}
827+
828+
items = getAllBookmarks(parentId);
829+
foreach(auto item, items) {
830+
QJsonObject oItem;
831+
if(item.isBookmark()) {
832+
oItem.insert("type", item.type);
833+
oItem.insert("title", item.title);
834+
oItem.insert("url", item.url);
835+
// Icon
836+
bool bRet = CDatabaseIcon::ExportIconToJson(item.getIcon(), oItem);
837+
if(!bRet) continue;
838+
} else {
839+
Q_ASSERT_X(false, "ExportBookmark", "The item is not bookmark");
840+
continue;
841+
}
842+
obj.append(oItem);
843+
}
760844
return true;
761845
}

Plugins/WebBrowser/Bookmark/BookmarkDatabase.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@ struct BookmarkItem {
3030
int folderId;
3131
BookmarkType type;
3232

33-
BookmarkItem()
33+
BookmarkItem(BookmarkType t)
3434
: id(0)
3535
, folderId(1) // 指向默认收藏夹
36-
, type(BookmarkType_Bookmark)
36+
, type(t)
3737
{}
3838

3939
[[nodiscard]] bool isFolder() const { return type == BookmarkType_Folder; }
@@ -142,5 +142,8 @@ class CBookmarkDatabase : public CDatabase
142142

143143
virtual bool ExportToJson(QJsonObject &obj) override;
144144
virtual bool ImportFromJson(const QJsonObject &obj) override;
145+
private:
146+
bool ExportToJson(int parentId, QJsonArray& obj);
147+
bool ImportFromJson(int parentId, const QJsonArray& obj);
145148
};
146149

Plugins/WebBrowser/Bookmark/FrmAddBookmark.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ void CFrmAddBookmark::on_pbAdd_clicked()
7979
item.folderId = id;
8080
m_pDatabase->updateBookmark(item);
8181
} else {
82-
BookmarkItem item;
82+
BookmarkItem item(BookmarkType::BookmarkType_Bookmark);
8383
item.title = ui->leTitle->text();
8484
item.url = m_Url.toString();
8585
item.folderId = id;

Plugins/WebBrowser/Bookmark/FrmBookmark.cpp

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -276,8 +276,8 @@ void CFrmBookmark::onAddBookmark()
276276
tr("Title:"), QLineEdit::Normal,
277277
"", &ok);
278278
if (!ok) return;
279-
280-
BookmarkItem item;
279+
280+
BookmarkItem item(BookmarkType_Bookmark);
281281
item.url = url;
282282
item.title = title.isEmpty() ? url : title;
283283
item.createdTime = QDateTime::currentDateTime();
@@ -424,11 +424,23 @@ void CFrmBookmark::onImportBookmarks()
424424
QString filename = QFileDialog::getOpenFileName(
425425
this, tr("Import bookmarks"),
426426
RabbitCommon::CDir::Instance()->GetDirUserDocument(),
427-
tr("HTML(*.html);; All files (*.*)"));
427+
tr("JSON (*.json);; HTML(*.html);; All files (*.*)"));
428428

429429
if (filename.isEmpty()) return;
430430

431431
QFileInfo fi(filename);
432+
if(0 == fi.suffix().compare("json", Qt::CaseInsensitive)) {
433+
if (m_pDatabase->ImportFromJsonFile(filename)) {
434+
QMessageBox::information(this, tr("Import bookmarks"),
435+
tr("Successfully imported bookmarks from file: %1").arg(filename));
436+
refresh();
437+
} else {
438+
QMessageBox::critical(this, tr("Import bookmarks"),
439+
tr("Failed to import bookmark from file: %1").arg(filename) + "\n\n"
440+
+ tr("Error: ") + m_pDatabase->GetError());
441+
}
442+
return;
443+
}
432444
if(0 == fi.suffix().compare("html", Qt::CaseInsensitive)) {
433445
if (m_pDatabase->importFromHtml(filename)) {
434446
QMessageBox::information(this, tr("Import bookmarks"),
@@ -451,11 +463,22 @@ void CFrmBookmark::onExportBookmarks()
451463
QString filename = QFileDialog::getSaveFileName(
452464
this, tr("Export bookmarks"),
453465
RabbitCommon::CDir::Instance()->GetDirUserDocument(),
454-
tr("HTML (*.html);; All files (*.*)"));
466+
tr("JSON (*.json);; HTML (*.html);; All files (*.*)"));
455467

456468
if (filename.isEmpty()) return;
457469

458470
QFileInfo fi(filename);
471+
if(0 == fi.suffix().compare("json", Qt::CaseInsensitive)) {
472+
if (m_pDatabase->ExportToJsonFile(filename)) {
473+
QMessageBox::information(this, tr("Export bookmarks"),
474+
tr("Bookmarks successfully exported to file: %1").arg(filename));
475+
} else {
476+
QMessageBox::critical(this, tr("Export bookmarks"),
477+
tr("Failed to export bookmark to file: %1").arg(filename) + "\n\n"
478+
+ tr("Error: ") + m_pDatabase->GetError());
479+
}
480+
return;
481+
}
459482
if(0 == fi.suffix().compare("html", Qt::CaseInsensitive)) {
460483
if (m_pDatabase->exportToHtml(filename)) {
461484
QMessageBox::information(this, tr("Export bookmarks"),

0 commit comments

Comments
 (0)