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