Skip to content

Commit 093188e

Browse files
committed
Plugins::WebBrowser: add bookmark dialog
1 parent c7d7e8d commit 093188e

File tree

10 files changed

+500
-9
lines changed

10 files changed

+500
-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: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
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+
ui->tvFolder->setContextMenuPolicy(Qt::CustomContextMenu);
37+
ui->tvFolder->setEditTriggers(QAbstractItemView::NoEditTriggers);
38+
m_pModelTree = new QStandardItemModel(ui->tvFolder);
39+
if(m_pModelTree) {
40+
ui->tvFolder->setModel(m_pModelTree);
41+
m_pModelTree->setColumnCount(1);
42+
}
43+
44+
bool check = false;
45+
check = connect(ui->tvFolder, SIGNAL(customContextMenuRequested(QPoint)),
46+
this, SLOT(onCustomContextMenu(QPoint)));
47+
Q_ASSERT(check);
48+
check = connect(m_pDatabase, &CBookmarkDatabase::folderAdded,
49+
this, [&](const BookmarkItem &folder){
50+
loadFolder(folder.id);
51+
});
52+
Q_ASSERT(check);
53+
loadFolder();
54+
}
55+
56+
CFrmAddBookmark::~CFrmAddBookmark()
57+
{
58+
delete ui;
59+
}
60+
61+
void CFrmAddBookmark::on_pbAdd_clicked()
62+
{
63+
if(!m_pPara || !m_pDatabase) return;
64+
65+
m_pPara->SetBookmarkShowEditor(ui->cbSave->isChecked());
66+
67+
auto index = ui->tvFolder->currentIndex();
68+
if(index.isValid()) {
69+
int id = index.data((int)Role::ID).toInt();
70+
m_pPara->SetCurrentBookmarkFolder(id);
71+
auto items = m_pDatabase->getBookmarkByUrl(m_Url.toString());
72+
if(!items.isEmpty()) {
73+
auto item = items[0];
74+
item.title = ui->leTitle->text();
75+
item.url = m_Url.toString();
76+
item.folderId = id;
77+
m_pDatabase->updateBookmark(item);
78+
} else {
79+
BookmarkItem item;
80+
item.title = ui->leTitle->text();
81+
item.url = m_Url.toString();
82+
item.folderId = id;
83+
m_pDatabase->addBookmark(item);
84+
}
85+
}
86+
87+
close();
88+
}
89+
90+
void CFrmAddBookmark::on_pbCancel_clicked()
91+
{
92+
close();
93+
}
94+
95+
void CFrmAddBookmark::on_pbDelete_clicked()
96+
{
97+
auto items = m_pDatabase->getBookmarkByUrl(m_Url.toString());
98+
m_pDatabase->deleteBookmark(items);
99+
ui->pbDelete->setVisible(false);
100+
loadFolder();
101+
}
102+
103+
void CFrmAddBookmark::loadFolder(int nCurrent)
104+
{
105+
if(!m_pDatabase || !m_pModelTree || !m_pPara) return;
106+
107+
m_pModelTree->clear();
108+
m_folderItems.clear();
109+
110+
// 设置表头
111+
m_pModelTree->setHorizontalHeaderLabels(QStringList() << tr("Title"));
112+
113+
QStandardItem* pCurrentItem = nullptr;
114+
// 加载文件夹结构
115+
QList<BookmarkItem> folders = m_pDatabase->getAllFolders();
116+
117+
// 创建根节点
118+
QStandardItem *rootItem = m_pModelTree->invisibleRootItem();
119+
120+
if(0 == nCurrent) {
121+
nCurrent = m_pPara->GetCurrentBookmarkFolder();
122+
auto item = m_pDatabase->getBookmarkByUrl(m_Url.toString());
123+
if(!item.isEmpty()) {
124+
nCurrent = item[0].folderId;
125+
ui->pbDelete->setVisible(true);
126+
ui->pbDelete->setText(tr("Delete %1 bookmarks").arg(item.count()));
127+
}
128+
}
129+
130+
// 先添加顶级文件夹
131+
for (const auto &folder : folders) {
132+
if (folder.folderId == 0) { // 顶级文件夹
133+
QStandardItem *pFolderItem = new QStandardItem(folder.getIcon(), folder.title);
134+
if(!pFolderItem) continue;
135+
pFolderItem->setData(folder.id, (int)Role::ID);
136+
pFolderItem->setData(BookmarkType_Folder, (int)Role::Type);
137+
rootItem->appendRow(pFolderItem);
138+
m_folderItems[folder.id] = pFolderItem;
139+
if(nCurrent == folder.id)
140+
pCurrentItem = pFolderItem;
141+
continue;
142+
}
143+
144+
auto it = m_folderItems.find(folder.folderId);
145+
if(m_folderItems.end() == it) {
146+
qWarning(log) << "The parent of folder is not find:" << folder.folderId;
147+
continue;
148+
}
149+
QStandardItem *pFolderItem = new QStandardItem(folder.getIcon(), folder.title);
150+
if(!pFolderItem) continue;
151+
pFolderItem->setData(folder.id, (int)Role::ID);
152+
pFolderItem->setData(BookmarkType_Folder, (int)Role::Type);
153+
(*it)->appendRow(pFolderItem);
154+
m_folderItems[folder.id] = pFolderItem;
155+
if(nCurrent == folder.id)
156+
pCurrentItem = pFolderItem;
157+
}
158+
159+
// Set current index
160+
if(pCurrentItem) {
161+
auto index = m_pModelTree->indexFromItem(pCurrentItem);
162+
ui->tvFolder->setCurrentIndex(index);
163+
}
164+
165+
ui->tvFolder->expandAll();
166+
}
167+
168+
void CFrmAddBookmark::on_pbNewFolder_clicked()
169+
{
170+
auto index = ui->tvFolder->currentIndex();
171+
if(!index.isValid()) return;
172+
QString szParent = index.data().toString();
173+
int parentId = index.data((int)Role::ID).toInt();
174+
QString szFolder = QInputDialog::getText(
175+
this, tr("New folder:"), tr("Create new folder in folder \"%1\"").arg(szParent));
176+
if(szFolder.isEmpty()) return;
177+
m_pDatabase->addFolder(szFolder, parentId);
178+
}
179+
180+
void CFrmAddBookmark::onCustomContextMenu(const QPoint &pos)
181+
{
182+
QModelIndex index = ui->tvFolder->indexAt(pos);
183+
if (!index.isValid()) return;
184+
185+
QMenu menu(this);
186+
187+
menu.addAction(QIcon::fromTheme("folder-new"), tr("Add folder"),
188+
this, &CFrmAddBookmark::on_pbNewFolder_clicked);
189+
190+
menu.exec(ui->tvFolder->viewport()->mapToGlobal(pos));
191+
}
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)