Skip to content

Commit c5ad44b

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

File tree

10 files changed

+445
-9
lines changed

10 files changed

+445
-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: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
// Author: Kang Lin <[email protected]>
2+
3+
#include <QLoggingCategory>
4+
#include "FrmAddBookmark.h"
5+
#include "ui_FrmAddBookmark.h"
6+
7+
static Q_LOGGING_CATEGORY(log, "WebBrowser.Bookmark.Add")
8+
CFrmAddBookmark::CFrmAddBookmark(const QString &szTitle, const QUrl &url,
9+
const QIcon &icon, CParameterWebBrowser* pPara,
10+
CBookmarkDatabase *db, QWidget *parent)
11+
: QWidget(parent)
12+
, ui(new Ui::CFrmAddBookmark)
13+
, m_szTitle(szTitle)
14+
, m_Url(url)
15+
, m_Icon(icon)
16+
, m_pPara(pPara)
17+
, m_pDatabase(db)
18+
, m_pModelTree(nullptr)
19+
{
20+
ui->setupUi(this);
21+
ui->pbDelete->setVisible(false);
22+
23+
setWindowIcon(QIcon::fromTheme("user-bookmarks"));
24+
25+
if(m_szTitle.isEmpty())
26+
m_szTitle = m_Url.toString();
27+
28+
ui->leTitle->setText(m_szTitle);
29+
30+
if(m_pPara) {
31+
ui->cbSave->setChecked(m_pPara->GetBookmarkShowEditor());
32+
}
33+
34+
m_pModelTree = new QStandardItemModel(ui->tvFolder);
35+
if(m_pModelTree) {
36+
ui->tvFolder->setModel(m_pModelTree);
37+
m_pModelTree->setColumnCount(1);
38+
}
39+
40+
loadFolder();
41+
}
42+
43+
CFrmAddBookmark::~CFrmAddBookmark()
44+
{
45+
delete ui;
46+
}
47+
48+
void CFrmAddBookmark::on_pbAdd_clicked()
49+
{
50+
if(!m_pPara || !m_pDatabase) return;
51+
52+
m_pPara->SetBookmarkShowEditor(ui->cbSave->isChecked());
53+
54+
auto index = ui->tvFolder->currentIndex();
55+
if(index.isValid()) {
56+
int id = index.data((int)Role::ID).toInt();
57+
m_pPara->SetCurrentBookmarkFolder(id);
58+
auto items = m_pDatabase->getBookmarkByUrl(m_Url.toString());
59+
if(!items.isEmpty()) {
60+
auto item = items[0];
61+
item.title = ui->leTitle->text();
62+
item.url = m_Url.toString();
63+
item.folderId = id;
64+
m_pDatabase->updateBookmark(item);
65+
} else {
66+
BookmarkItem item;
67+
item.title = ui->leTitle->text();
68+
item.url = m_Url.toString();
69+
item.folderId = id;
70+
m_pDatabase->addBookmark(item);
71+
}
72+
}
73+
74+
close();
75+
}
76+
77+
void CFrmAddBookmark::on_pbCancel_clicked()
78+
{
79+
close();
80+
}
81+
82+
void CFrmAddBookmark::on_pbDelete_clicked()
83+
{
84+
auto items = m_pDatabase->getBookmarkByUrl(m_Url.toString());
85+
m_pDatabase->deleteBookmark(items);
86+
ui->pbDelete->setVisible(false);
87+
loadFolder();
88+
}
89+
90+
void CFrmAddBookmark::loadFolder()
91+
{
92+
if(!m_pDatabase || !m_pModelTree || !m_pPara) return;
93+
94+
m_pModelTree->clear();
95+
m_folderItems.clear();
96+
97+
// 设置表头
98+
m_pModelTree->setHorizontalHeaderLabels(QStringList() << tr("Title"));
99+
100+
QStandardItem* pCurrentItem = nullptr;
101+
// 加载文件夹结构
102+
QList<BookmarkItem> folders = m_pDatabase->getAllFolders();
103+
104+
// 创建根节点
105+
QStandardItem *rootItem = m_pModelTree->invisibleRootItem();
106+
107+
int nCurrent = m_pPara->GetCurrentBookmarkFolder();
108+
auto item = m_pDatabase->getBookmarkByUrl(m_Url.toString());
109+
if(!item.isEmpty()) {
110+
nCurrent = item[0].folderId;
111+
ui->pbDelete->setVisible(true);
112+
ui->pbDelete->setText(tr("Delete %1 bookmarks").arg(item.count()));
113+
}
114+
115+
// 先添加顶级文件夹
116+
for (const auto &folder : folders) {
117+
if (folder.folderId == 0) { // 顶级文件夹
118+
QStandardItem *pFolderItem = new QStandardItem(folder.getIcon(), folder.title);
119+
if(!pFolderItem) continue;
120+
pFolderItem->setData(folder.id, (int)Role::ID);
121+
pFolderItem->setData(BookmarkType_Folder, (int)Role::Type);
122+
rootItem->appendRow(pFolderItem);
123+
m_folderItems[folder.id] = pFolderItem;
124+
if(nCurrent == folder.id)
125+
pCurrentItem = pFolderItem;
126+
continue;
127+
}
128+
129+
auto it = m_folderItems.find(folder.folderId);
130+
if(m_folderItems.end() == it) {
131+
qWarning(log) << "The parent of folder is not find:" << folder.folderId;
132+
continue;
133+
}
134+
QStandardItem *pFolderItem = new QStandardItem(folder.getIcon(), folder.title);
135+
if(!pFolderItem) continue;
136+
pFolderItem->setData(folder.id, (int)Role::ID);
137+
pFolderItem->setData(BookmarkType_Folder, (int)Role::Type);
138+
(*it)->appendRow(pFolderItem);
139+
m_folderItems[folder.id] = pFolderItem;
140+
if(nCurrent == folder.id)
141+
pCurrentItem = pFolderItem;
142+
}
143+
144+
// Set current index
145+
if(pCurrentItem) {
146+
auto index = m_pModelTree->indexFromItem(pCurrentItem);
147+
ui->tvFolder->setCurrentIndex(index);
148+
}
149+
150+
ui->tvFolder->expandAll();
151+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
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+
31+
private:
32+
enum class Role {
33+
ID = Qt::UserRole,
34+
Type,
35+
Url
36+
};
37+
void loadFolder();
38+
39+
private:
40+
Ui::CFrmAddBookmark *ui;
41+
QString m_szTitle;
42+
QUrl m_Url;
43+
QIcon m_Icon;
44+
CParameterWebBrowser* m_pPara;
45+
CBookmarkDatabase *m_pDatabase;
46+
QStandardItemModel *m_pModelTree;
47+
QMap<int, QStandardItem*> m_folderItems;
48+
};
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<ui version="4.0">
3+
<class>CFrmAddBookmark</class>
4+
<widget class="QWidget" name="CFrmAddBookmark">
5+
<property name="geometry">
6+
<rect>
7+
<x>0</x>
8+
<y>0</y>
9+
<width>400</width>
10+
<height>336</height>
11+
</rect>
12+
</property>
13+
<property name="windowTitle">
14+
<string>Add bookmark</string>
15+
</property>
16+
<layout class="QGridLayout" name="gridLayout_3">
17+
<item row="0" column="0">
18+
<layout class="QHBoxLayout" name="horizontalLayout">
19+
<item>
20+
<widget class="QLabel" name="label">
21+
<property name="text">
22+
<string>Title:</string>
23+
</property>
24+
</widget>
25+
</item>
26+
<item>
27+
<widget class="QLineEdit" name="leTitle"/>
28+
</item>
29+
</layout>
30+
</item>
31+
<item row="1" column="0">
32+
<widget class="QGroupBox" name="groupBox">
33+
<property name="title">
34+
<string>Position:</string>
35+
</property>
36+
<layout class="QGridLayout" name="gridLayout">
37+
<item row="0" column="0">
38+
<widget class="QTreeView" name="tvFolder"/>
39+
</item>
40+
</layout>
41+
</widget>
42+
</item>
43+
<item row="2" column="0">
44+
<widget class="QGroupBox" name="groupBox_2">
45+
<property name="title">
46+
<string>Tag:</string>
47+
</property>
48+
<layout class="QGridLayout" name="gridLayout_2">
49+
<item row="0" column="0">
50+
<widget class="QListView" name="listView"/>
51+
</item>
52+
</layout>
53+
</widget>
54+
</item>
55+
<item row="3" column="0">
56+
<widget class="QCheckBox" name="cbSave">
57+
<property name="text">
58+
<string>Show editor when saving</string>
59+
</property>
60+
</widget>
61+
</item>
62+
<item row="4" column="0">
63+
<layout class="QHBoxLayout" name="horizontalLayout_2">
64+
<item>
65+
<spacer name="horizontalSpacer">
66+
<property name="orientation">
67+
<enum>Qt::Orientation::Horizontal</enum>
68+
</property>
69+
<property name="sizeHint" stdset="0">
70+
<size>
71+
<width>40</width>
72+
<height>20</height>
73+
</size>
74+
</property>
75+
</spacer>
76+
</item>
77+
<item>
78+
<widget class="QPushButton" name="pbDelete">
79+
<property name="text">
80+
<string>Delete</string>
81+
</property>
82+
</widget>
83+
</item>
84+
<item>
85+
<widget class="QPushButton" name="pbAdd">
86+
<property name="text">
87+
<string>Add</string>
88+
</property>
89+
</widget>
90+
</item>
91+
<item>
92+
<widget class="QPushButton" name="pbCancel">
93+
<property name="text">
94+
<string>Cancel</string>
95+
</property>
96+
</widget>
97+
</item>
98+
</layout>
99+
</item>
100+
</layout>
101+
</widget>
102+
<resources/>
103+
<connections/>
104+
</ui>

Plugins/WebBrowser/Bookmark/FrmBookmark.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,9 @@ void CFrmBookmark::setupTreeView()
170170
// 设置列
171171
m_pModel->setColumnCount(1);
172172
}
173+
/*
173174
if(m_pTreeView->header())
174-
m_pTreeView->header()->setStretchLastSection(true); // 最后一列自适应
175+
m_pTreeView->header()->setStretchLastSection(true); // 最后一列自适应//*/
175176
}
176177

177178
void CFrmBookmark::loadBookmarks()

0 commit comments

Comments
 (0)