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