Skip to content

Commit 2ec02e2

Browse files
committed
Plugins::WebBrowser: add bookmark dialog
1 parent c7d7e8d commit 2ec02e2

File tree

10 files changed

+495
-9
lines changed

10 files changed

+495
-9
lines changed

Plugins/WebBrowser/Bookmark/BookmarkDatabase.cpp

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,35 @@ bool CBookmarkDatabase::deleteBookmark(int id)
238238
return success;
239239
}
240240

241+
bool CBookmarkDatabase::deleteBookmark(const QList<BookmarkItem> &items)
242+
{
243+
if(items.isEmpty()) {
244+
qWarning(log) << "The items is empty";
245+
return false;
246+
}
247+
248+
QSqlQuery query(m_database);
249+
250+
QString szSql("DELETE FROM bookmarks WHERE ");
251+
int i = 0;
252+
foreach(auto item, items) {
253+
if(0 == i++) {
254+
szSql += " id = " + QString::number(item.id);
255+
} else {
256+
szSql += " OR id = " + QString::number(item.id);
257+
}
258+
}
259+
bool success = query.exec(szSql);
260+
261+
if (success) {
262+
foreach(auto item, items)
263+
emit bookmarkDeleted(item.id);
264+
emit bookmarksChanged();
265+
}
266+
267+
return success;
268+
}
269+
241270
bool CBookmarkDatabase::moveBookmark(int id, int newFolderId)
242271
{
243272
QSqlQuery query(m_database);
@@ -379,8 +408,9 @@ BookmarkItem CBookmarkDatabase::getBookmark(int id)
379408
return item;
380409
}
381410

382-
BookmarkItem CBookmarkDatabase::getBookmarkByUrl(const QString &url)
411+
QList<BookmarkItem> CBookmarkDatabase::getBookmarkByUrl(const QString &url)
383412
{
413+
QList<BookmarkItem> lstItems;
384414
BookmarkItem item;
385415

386416
QSqlQuery query(m_database);
@@ -392,11 +422,14 @@ BookmarkItem CBookmarkDatabase::getBookmarkByUrl(const QString &url)
392422
);
393423
query.bindValue(":url", url);
394424

395-
if (query.exec() && query.next()) {
396-
item = bookmarkFromQuery(query);
425+
if (query.exec()) {
426+
while (query.next()) {
427+
item = bookmarkFromQuery(query);
428+
lstItems << item;
429+
}
397430
}
398431

399-
return item;
432+
return lstItems;
400433
}
401434

402435
QList<BookmarkItem> CBookmarkDatabase::getAllBookmarks(int folderId)

Plugins/WebBrowser/Bookmark/BookmarkDatabase.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ class CBookmarkDatabase : public QObject
9696
bool addBookmark(const BookmarkItem &item);
9797
bool updateBookmark(const BookmarkItem &item);
9898
bool deleteBookmark(int id);
99+
bool deleteBookmark(const QList<BookmarkItem>& items);
99100
bool moveBookmark(int id, int newFolderId);
100101

101102
// 文件夹操作
@@ -106,7 +107,7 @@ class CBookmarkDatabase : public QObject
106107

107108
// 查询操作
108109
BookmarkItem getBookmark(int id);
109-
BookmarkItem getBookmarkByUrl(const QString &url);
110+
QList<BookmarkItem> getBookmarkByUrl(const QString &url);
110111
QList<BookmarkItem> getAllBookmarks(int folderId = 0);
111112
QList<BookmarkItem> getFavoriteBookmarks();
112113
QList<BookmarkItem> searchBookmarks(const QString &keyword);
Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
// Author: Kang Lin <[email protected]>
2+
3+
#include <QMenu>
4+
#include <QLoggingCategory>
5+
#include <QInputDialog>
6+
#include "FrmAddBookmark.h"
7+
#include "ui_FrmAddBookmark.h"
8+
9+
static Q_LOGGING_CATEGORY(log, "WebBrowser.Bookmark.Add")
10+
CFrmAddBookmark::CFrmAddBookmark(const QString &szTitle, const QUrl &url,
11+
const QIcon &icon, CParameterWebBrowser* pPara,
12+
CBookmarkDatabase *db, QWidget *parent)
13+
: QWidget(parent)
14+
, ui(new Ui::CFrmAddBookmark)
15+
, m_szTitle(szTitle)
16+
, m_Url(url)
17+
, m_Icon(icon)
18+
, m_pPara(pPara)
19+
, m_pDatabase(db)
20+
, m_pModelTree(nullptr)
21+
{
22+
ui->setupUi(this);
23+
ui->pbDelete->setVisible(false);
24+
25+
setWindowIcon(QIcon::fromTheme("user-bookmarks"));
26+
27+
if(m_szTitle.isEmpty())
28+
m_szTitle = m_Url.toString();
29+
30+
ui->leTitle->setText(m_szTitle);
31+
32+
if(m_pPara) {
33+
ui->cbSave->setChecked(m_pPara->GetBookmarkShowEditor());
34+
}
35+
36+
m_pModelTree = new QStandardItemModel(ui->tvFolder);
37+
if(m_pModelTree) {
38+
ui->tvFolder->setModel(m_pModelTree);
39+
m_pModelTree->setColumnCount(1);
40+
}
41+
42+
bool check = false;
43+
check = connect(m_pDatabase, &CBookmarkDatabase::folderAdded,
44+
this, [&](const BookmarkItem &folder){
45+
loadFolder(folder.id);
46+
});
47+
Q_ASSERT(check);
48+
loadFolder();
49+
}
50+
51+
CFrmAddBookmark::~CFrmAddBookmark()
52+
{
53+
delete ui;
54+
}
55+
56+
void CFrmAddBookmark::on_pbAdd_clicked()
57+
{
58+
if(!m_pPara || !m_pDatabase) return;
59+
60+
m_pPara->SetBookmarkShowEditor(ui->cbSave->isChecked());
61+
62+
auto index = ui->tvFolder->currentIndex();
63+
if(index.isValid()) {
64+
int id = index.data((int)Role::ID).toInt();
65+
m_pPara->SetCurrentBookmarkFolder(id);
66+
auto items = m_pDatabase->getBookmarkByUrl(m_Url.toString());
67+
if(!items.isEmpty()) {
68+
auto item = items[0];
69+
item.title = ui->leTitle->text();
70+
item.url = m_Url.toString();
71+
item.folderId = id;
72+
m_pDatabase->updateBookmark(item);
73+
} else {
74+
BookmarkItem item;
75+
item.title = ui->leTitle->text();
76+
item.url = m_Url.toString();
77+
item.folderId = id;
78+
m_pDatabase->addBookmark(item);
79+
}
80+
}
81+
82+
close();
83+
}
84+
85+
void CFrmAddBookmark::on_pbCancel_clicked()
86+
{
87+
close();
88+
}
89+
90+
void CFrmAddBookmark::on_pbDelete_clicked()
91+
{
92+
auto items = m_pDatabase->getBookmarkByUrl(m_Url.toString());
93+
m_pDatabase->deleteBookmark(items);
94+
ui->pbDelete->setVisible(false);
95+
loadFolder();
96+
}
97+
98+
void CFrmAddBookmark::loadFolder(int nCurrent)
99+
{
100+
if(!m_pDatabase || !m_pModelTree || !m_pPara) return;
101+
102+
m_pModelTree->clear();
103+
m_folderItems.clear();
104+
105+
// 设置表头
106+
m_pModelTree->setHorizontalHeaderLabels(QStringList() << tr("Title"));
107+
108+
QStandardItem* pCurrentItem = nullptr;
109+
// 加载文件夹结构
110+
QList<BookmarkItem> folders = m_pDatabase->getAllFolders();
111+
112+
// 创建根节点
113+
QStandardItem *rootItem = m_pModelTree->invisibleRootItem();
114+
115+
if(0 == nCurrent) {
116+
nCurrent = m_pPara->GetCurrentBookmarkFolder();
117+
auto item = m_pDatabase->getBookmarkByUrl(m_Url.toString());
118+
if(!item.isEmpty()) {
119+
nCurrent = item[0].folderId;
120+
ui->pbDelete->setVisible(true);
121+
ui->pbDelete->setText(tr("Delete %1 bookmarks").arg(item.count()));
122+
}
123+
}
124+
125+
// 先添加顶级文件夹
126+
for (const auto &folder : folders) {
127+
if (folder.folderId == 0) { // 顶级文件夹
128+
QStandardItem *pFolderItem = new QStandardItem(folder.getIcon(), folder.title);
129+
if(!pFolderItem) continue;
130+
pFolderItem->setData(folder.id, (int)Role::ID);
131+
pFolderItem->setData(BookmarkType_Folder, (int)Role::Type);
132+
rootItem->appendRow(pFolderItem);
133+
m_folderItems[folder.id] = pFolderItem;
134+
if(nCurrent == folder.id)
135+
pCurrentItem = pFolderItem;
136+
continue;
137+
}
138+
139+
auto it = m_folderItems.find(folder.folderId);
140+
if(m_folderItems.end() == it) {
141+
qWarning(log) << "The parent of folder is not find:" << folder.folderId;
142+
continue;
143+
}
144+
QStandardItem *pFolderItem = new QStandardItem(folder.getIcon(), folder.title);
145+
if(!pFolderItem) continue;
146+
pFolderItem->setData(folder.id, (int)Role::ID);
147+
pFolderItem->setData(BookmarkType_Folder, (int)Role::Type);
148+
(*it)->appendRow(pFolderItem);
149+
m_folderItems[folder.id] = pFolderItem;
150+
if(nCurrent == folder.id)
151+
pCurrentItem = pFolderItem;
152+
}
153+
154+
// Set current index
155+
if(pCurrentItem) {
156+
auto index = m_pModelTree->indexFromItem(pCurrentItem);
157+
ui->tvFolder->setCurrentIndex(index);
158+
}
159+
160+
ui->tvFolder->expandAll();
161+
}
162+
163+
void CFrmAddBookmark::on_pbNewFolder_clicked()
164+
{
165+
auto index = ui->tvFolder->currentIndex();
166+
QString szParent = index.data().toString();
167+
int parentId = index.data((int)Role::ID).toInt();
168+
QString szFolder = QInputDialog::getText(
169+
this, tr("Create in folder %1").arg(szParent), tr("New folder:"));
170+
if(szFolder.isEmpty()) return;
171+
m_pDatabase->addFolder(szFolder, parentId);
172+
}
173+
174+
void CFrmAddBookmark::onCustomContextMenu(const QPoint &pos)
175+
{
176+
if(!ui->tvFolder || !m_pDatabase || !m_pModelTree) return;
177+
QModelIndex index = ui->tvFolder->indexAt(pos);
178+
if (!index.isValid()) return;
179+
180+
QMenu menu(this);
181+
182+
menu.addAction(QIcon::fromTheme("folder-new"), tr("Add folder"),
183+
this, &CFrmAddBookmark::on_pbNewFolder_clicked);
184+
185+
menu.exec(ui->tvFolder->viewport()->mapToGlobal(pos));
186+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Author: Kang Lin <[email protected]>
2+
3+
#pragma once
4+
5+
#include <QUrl>
6+
#include <QWidget>
7+
#include "QStandardItemModel"
8+
#include "BookmarkDatabase.h"
9+
#include "ParameterWebBrowser.h"
10+
11+
namespace Ui {
12+
class CFrmAddBookmark;
13+
}
14+
15+
class CFrmAddBookmark : public QWidget
16+
{
17+
Q_OBJECT
18+
19+
public:
20+
explicit CFrmAddBookmark(
21+
const QString &szTitle, const QUrl &url,
22+
const QIcon &icon, CParameterWebBrowser* pPara,
23+
CBookmarkDatabase *db, QWidget *parent = nullptr);
24+
~CFrmAddBookmark();
25+
26+
private slots:
27+
void on_pbAdd_clicked();
28+
void on_pbCancel_clicked();
29+
void on_pbDelete_clicked();
30+
void on_pbNewFolder_clicked();
31+
void onCustomContextMenu(const QPoint &pos);
32+
33+
private:
34+
enum class Role {
35+
ID = Qt::UserRole,
36+
Type,
37+
Url
38+
};
39+
void loadFolder(int nCurrent = 0);
40+
41+
private:
42+
Ui::CFrmAddBookmark *ui;
43+
QString m_szTitle;
44+
QUrl m_Url;
45+
QIcon m_Icon;
46+
CParameterWebBrowser* m_pPara;
47+
CBookmarkDatabase *m_pDatabase;
48+
QStandardItemModel *m_pModelTree;
49+
QMap<int, QStandardItem*> m_folderItems;
50+
};

0 commit comments

Comments
 (0)