9#include <QtWidgets/QFileDialog>
10#include <QtWidgets/QMessageBox>
12#include <QtGui/QCloseEvent>
13#include <QtGui/QKeySequence>
14#include <QtGui/QShortcut>
16#include <QtCore/QCoreApplication>
17#include <QtCore/QFile>
22using namespace Qt::StringLiterals;
27 , bookmarkModel(sourceModel)
32 ui.treeView->setModel(bookmarkModel);
34 ui.treeView->expandAll();
35 ui.treeView->installEventFilter(
this);
36 ui.treeView->viewport()->installEventFilter(
this);
37 ui.treeView->setContextMenuPolicy(Qt::CustomContextMenu);
39 connect(ui.treeView, &QWidget::customContextMenuRequested,
40 this, &BookmarkManagerWidget::customContextMenuRequested);
42 connect(ui.remove, &QAbstractButton::clicked,
43 this, [
this]() { removeItem(); });
44 connect(ui.lineEdit, &QLineEdit::textChanged,
45 this, &BookmarkManagerWidget::textChanged);
46 QShortcut *shortcut =
new QShortcut(QKeySequence::Find, ui.lineEdit);
47 connect(shortcut, &QShortcut::activated,
48 ui.lineEdit, QOverload<>::of(&QWidget::setFocus));
50 importExportMenu.addAction(tr(
"Import..."),
this,
51 &BookmarkManagerWidget::importBookmarks);
52 importExportMenu.addAction(tr(
"Export..."),
this,
53 &BookmarkManagerWidget::exportBookmarks);
54 ui.importExport->setMenu(&importExportMenu);
56 shortcut =
new QShortcut(QKeySequence::FindNext,
this);
57 connect(shortcut, &QShortcut::activated,
58 this, &BookmarkManagerWidget::findNext);
59 shortcut =
new QShortcut(QKeySequence::FindPrevious,
this);
60 connect(shortcut, &QShortcut::activated,
61 this, &BookmarkManagerWidget::findPrevious);
63 connect(bookmarkModel, &QAbstractItemModel::rowsRemoved,
64 this, &BookmarkManagerWidget::refeshBookmarkCache);
65 connect(bookmarkModel, &QAbstractItemModel::rowsInserted,
66 this, &BookmarkManagerWidget::refeshBookmarkCache);
67 connect(bookmarkModel, &QAbstractItemModel::dataChanged,
68 this, &BookmarkManagerWidget::refeshBookmarkCache);
70 ui.treeView->setCurrentIndex(ui.treeView->indexAt(QPoint(2, 2)));
82 emit managerWidgetAboutToClose();
89 if (!bookmarkModel->parent(index).isValid())
93 ui.treeView->edit(index);
97static int nextIndex(
int current,
int count,
bool forward)
101 return (forward ? (current + 1) : ((current - 1) + count)) % count;
107 QModelIndex current = ui.treeView->currentIndex();
108 if (current.isValid() && !cache.isEmpty()) {
109 current = cache.at(nextIndex(cache.indexOf(current), cache.size(),
112 ui.treeView->setCurrentIndex(current);
118 if (object != ui.treeView && object != ui.treeView->viewport())
119 return QWidget::eventFilter(object, event);
121 if (event->type() == QEvent::KeyPress) {
122 QKeyEvent *ke =
static_cast<QKeyEvent*>(event);
125 renameItem(ui.treeView->currentIndex());
129 removeItem(ui.treeView->currentIndex());
136 if (event->type() == QEvent::MouseButtonRelease) {
137 QMouseEvent *me =
static_cast<QMouseEvent*>(event);
138 switch (me->button()) {
140 if (me->modifiers() & Qt::ControlModifier)
141 setSourceFromIndex(ui.treeView->currentIndex(),
true);
144 case Qt::MiddleButton:
145 setSourceFromIndex(ui.treeView->currentIndex(),
true);
151 return QObject::eventFilter(object, event);
157 selectNextIndex(
true);
163 selectNextIndex(
false);
169 const QString &fileName = QFileDialog::getOpenFileName(
nullptr, tr(
"Open File"),
170 QDir::currentPath(), tr(
"Files (*.xbel)"));
172 if (fileName.isEmpty())
175 QFile file(fileName);
176 if (file.open(QIODevice::ReadOnly)) {
178 reader.readFromFile(&file);
185 QString fileName = QFileDialog::getSaveFileName(
nullptr, tr(
"Save File"),
"untitled.xbel"_L1,
186 tr(
"Files (*.xbel)"));
188 const QLatin1StringView suffix(
".xbel");
189 if (!fileName.endsWith(suffix))
190 fileName.append(suffix);
192 QFile file(fileName);
193 if (file.open(QIODevice::WriteOnly)) {
195 writer.writeToFile(&file);
197 QMessageBox::information(
this, tr(
"Qt Assistant"),
198 tr(
"Unable to save bookmarks."), QMessageBox::Ok);
207 const QString &text = ui.lineEdit->text();
209 cache = bookmarkModel->indexListFor(text);
215 refeshBookmarkCache();
216 if (!cache.isEmpty())
217 ui.treeView->setCurrentIndex(cache.at(0));
223 QModelIndex current = index.isValid() ? index : ui.treeView->currentIndex();
224 if (!current.parent().isValid() && current.row() < 2)
227 if (bookmarkModel->hasChildren(current)) {
228 int value = QMessageBox::question(
this, tr(
"Remove"), tr(
"You are going"
229 "to delete a Folder, this will also<br> remove it's content. Are "
230 "you sure to continue?"),
231 QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel);
232 if (value == QMessageBox::Cancel)
235 bookmarkModel->removeItem(current);
241 const QModelIndex &index = ui.treeView->indexAt(point);
242 if (!index.isValid())
246 if (!bookmarkModel->parent(index).isValid())
249 QAction *remove =
nullptr;
250 QAction *rename =
nullptr;
251 QAction *showItem =
nullptr;
252 QAction *showItemInNewTab =
nullptr;
256 remove = menu.addAction(tr(
"Delete Folder"));
257 rename = menu.addAction(tr(
"Rename Folder"));
259 showItem = menu.addAction(tr(
"Show Bookmark"));
260 showItemInNewTab = menu.addAction(tr(
"Show Bookmark in New Tab"));
262 remove = menu.addAction(tr(
"Delete Bookmark"));
263 rename = menu.addAction(tr(
"Rename Bookmark"));
266 QAction *pickedAction = menu.exec(ui.treeView->mapToGlobal(point));
267 if (pickedAction == rename)
269 else if (pickedAction == remove)
271 else if (pickedAction == showItem || pickedAction == showItemInNewTab)
272 setSourceFromIndex(index, pickedAction == showItemInNewTab);
282 const QVariant &data = bookmarkModel->data(index, UserRoleUrl);
283 if (data.canConvert<QUrl>()) {
285 emit setSourceInNewTab(data.toUrl());
287 emit setSource(data.toUrl());
void setItemsEditable(bool editable)
XbelReader(BookmarkModel *model)
XbelWriter(BookmarkModel *model)
Combined button and popup list for selecting options.