Files
qt-creator/src/shared/help/bookmarkmanager.cpp

809 lines
26 KiB
C++
Raw Normal View History

// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
2008-12-02 12:01:29 +01:00
#include "bookmarkmanager.h"
#include <localhelpmanager.h>
2008-12-02 12:01:29 +01:00
#include <coreplugin/icore.h>
#include <utils/fancylineedit.h>
#include <utils/layoutbuilder.h>
#include <utils/styledbar.h>
#include <utils/utilsicons.h>
#include <QMenu>
#include <QIcon>
#include <QStyle>
#include <QLabel>
#include <QLayout>
#include <QEvent>
#include <QComboBox>
#include <QKeyEvent>
#include <QLineEdit>
#include <QMessageBox>
#include <QHeaderView>
#include <QToolButton>
#include <QPushButton>
#include <QApplication>
#include <QDialogButtonBox>
#include <QSortFilterProxyModel>
#include <QRegularExpression>
2008-12-02 12:01:29 +01:00
#include <QHelpEngine>
using namespace Help::Internal;
2008-12-02 12:01:29 +01:00
static const char kBookmarksKey[] = "Help/Bookmarks";
2008-12-02 12:01:29 +01:00
BookmarkDialog::BookmarkDialog(BookmarkManager *manager, const QString &title,
2009-06-24 13:38:19 +02:00
const QString &url, QWidget *parent)
2008-12-02 12:01:29 +01:00
: QDialog(parent)
, m_url(url)
, m_title(title)
, bookmarkManager(manager)
{
installEventFilter(this);
resize(450, 0);
setWindowTitle(tr("Add Bookmark"));
2008-12-02 12:01:29 +01:00
proxyModel = new QSortFilterProxyModel(this);
proxyModel->setFilterKeyColumn(0);
proxyModel->setDynamicSortFilter(true);
proxyModel->setFilterRole(Qt::UserRole + 10);
proxyModel->setSourceModel(bookmarkManager->treeBookmarkModel());
proxyModel->setFilterRegularExpression(QRegularExpression(QLatin1String("Folder")));
2008-12-02 12:01:29 +01:00
m_bookmarkEdit = new QLineEdit(title);
m_bookmarkFolders = new QComboBox;
m_bookmarkFolders->addItems(bookmarkManager->bookmarkFolders());
m_toolButton = new QToolButton;
m_toolButton->setFixedSize(24, 24);
m_treeView = new QTreeView;
m_treeView->setModel(proxyModel);
m_treeView->expandAll();
m_treeView->header()->setVisible(false);
m_treeView->setContextMenuPolicy(Qt::CustomContextMenu);
QSizePolicy treeViewSP(QSizePolicy::Preferred, QSizePolicy::Ignored);
treeViewSP.setVerticalStretch(1);
m_treeView->setSizePolicy(treeViewSP);
m_newFolderButton = new QPushButton(tr("New Folder"));
m_buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
using namespace Utils::Layouting;
Column {
Form {
tr("Bookmark:"), m_bookmarkEdit, br,
tr("Add in folder:"), m_bookmarkFolders, br,
},
Row { m_toolButton, hr },
m_treeView,
Row { m_newFolderButton, m_buttonBox, }
}.attachTo(this);
toggleExpanded();
connect(m_buttonBox, &QDialogButtonBox::rejected, this, &BookmarkDialog::reject);
connect(m_buttonBox, &QDialogButtonBox::accepted, this, &BookmarkDialog::addAccepted);
connect(m_newFolderButton, &QPushButton::clicked, this, &BookmarkDialog::addNewFolder);
connect(m_toolButton, &QToolButton::clicked, this, &BookmarkDialog::toggleExpanded);
connect(m_bookmarkEdit, &QLineEdit::textChanged, this, &BookmarkDialog::textChanged);
2008-12-02 12:01:29 +01:00
2009-06-24 13:38:19 +02:00
connect(bookmarkManager->treeBookmarkModel(),
&QStandardItemModel::itemChanged,
this, &BookmarkDialog::itemChanged);
2008-12-02 12:01:29 +01:00
connect(m_bookmarkFolders, &QComboBox::currentIndexChanged,
this, &BookmarkDialog::selectBookmarkFolder);
2008-12-02 12:01:29 +01:00
connect(m_treeView, &TreeView::customContextMenuRequested,
this, &BookmarkDialog::showContextMenu);
2008-12-02 12:01:29 +01:00
connect(m_treeView->selectionModel(), &QItemSelectionModel::currentChanged,
this, &BookmarkDialog::currentChanged);
2008-12-02 12:01:29 +01:00
}
BookmarkDialog::~BookmarkDialog()
{
}
void BookmarkDialog::addAccepted()
{
QItemSelectionModel *model = m_treeView->selectionModel();
2009-06-24 13:38:19 +02:00
const QModelIndexList &list = model->selection().indexes();
2008-12-02 12:01:29 +01:00
QModelIndex index;
if (!list.isEmpty())
index = proxyModel->mapToSource(list.at(0));
bookmarkManager->addNewBookmark(index, m_bookmarkEdit->text(), m_url);
2008-12-02 12:01:29 +01:00
accept();
}
void BookmarkDialog::addNewFolder()
{
QItemSelectionModel *model = m_treeView->selectionModel();
2009-06-24 13:38:19 +02:00
const QModelIndexList &list = model->selection().indexes();
2008-12-02 12:01:29 +01:00
QModelIndex index;
if (!list.isEmpty())
index = list.at(0);
QModelIndex newFolder =
bookmarkManager->addNewFolder(proxyModel->mapToSource(index));
if (newFolder.isValid()) {
m_treeView->expand(index);
2008-12-02 12:01:29 +01:00
const QModelIndex &index = proxyModel->mapFromSource(newFolder);
2009-06-24 13:38:19 +02:00
model->setCurrentIndex(index, QItemSelectionModel::ClearAndSelect);
2008-12-02 12:01:29 +01:00
m_bookmarkFolders->clear();
m_bookmarkFolders->addItems(bookmarkManager->bookmarkFolders());
2008-12-02 12:01:29 +01:00
2009-06-24 13:38:19 +02:00
const QString &name = index.data().toString();
m_bookmarkFolders->setCurrentIndex(m_bookmarkFolders->findText(name));
2008-12-02 12:01:29 +01:00
}
m_treeView->setFocus();
2008-12-02 12:01:29 +01:00
}
void BookmarkDialog::toggleExpanded()
2008-12-02 12:01:29 +01:00
{
const char expand[] = "+";
const char collapse[] = "-";
const bool doCollapse = m_toolButton->text() != expand;
m_toolButton->setText(doCollapse ? expand : collapse);
m_treeView->setVisible(!doCollapse);
m_newFolderButton->setVisible(!doCollapse);
for (int i = 0; i <= 1; ++i) // Hack: resize twice to avoid "jumping" of m_toolButton
resize(width(), (doCollapse ? 1 : 400));
2008-12-02 12:01:29 +01:00
}
void BookmarkDialog::itemChanged(QStandardItem *item)
{
if (renameItem != item) {
renameItem = item;
oldText = item->text();
return;
}
if (item->text() != oldText) {
m_bookmarkFolders->clear();
m_bookmarkFolders->addItems(bookmarkManager->bookmarkFolders());
2008-12-02 12:01:29 +01:00
QString name = tr("Bookmarks");
const QModelIndex& index = m_treeView->currentIndex();
2008-12-02 12:01:29 +01:00
if (index.isValid())
name = index.data().toString();
m_bookmarkFolders->setCurrentIndex(m_bookmarkFolders->findText(name));
2008-12-02 12:01:29 +01:00
}
}
void BookmarkDialog::textChanged(const QString& string)
{
m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!string.isEmpty());
2008-12-02 12:01:29 +01:00
}
void BookmarkDialog::selectBookmarkFolder(int index)
2008-12-02 12:01:29 +01:00
{
const QString folderName = m_bookmarkFolders->itemText(index);
2008-12-02 12:01:29 +01:00
if (folderName == tr("Bookmarks")) {
m_treeView->clearSelection();
2008-12-02 12:01:29 +01:00
return;
}
QStandardItemModel *model = bookmarkManager->treeBookmarkModel();
QList<QStandardItem*> list = model->findItems(folderName,
Qt::MatchCaseSensitive | Qt::MatchRecursive, 0);
if (!list.isEmpty()) {
2009-06-24 13:38:19 +02:00
const QModelIndex &index = model->indexFromItem(list.at(0));
QItemSelectionModel *model = m_treeView->selectionModel();
2009-06-24 13:38:19 +02:00
if (model) {
model->setCurrentIndex(proxyModel->mapFromSource(index),
QItemSelectionModel::ClearAndSelect);
}
2008-12-02 12:01:29 +01:00
}
}
void BookmarkDialog::showContextMenu(const QPoint &point)
2008-12-02 12:01:29 +01:00
{
QModelIndex index = m_treeView->indexAt(point);
2008-12-02 12:01:29 +01:00
if (!index.isValid())
return;
QMenu menu(this);
2008-12-02 12:01:29 +01:00
QAction *removeItem = menu.addAction(tr("Delete Folder"));
QAction *renameItem = menu.addAction(tr("Rename Folder"));
QAction *picked = menu.exec(m_treeView->mapToGlobal(point));
2009-06-24 13:38:19 +02:00
if (!picked)
2008-12-02 12:01:29 +01:00
return;
2009-06-24 13:38:19 +02:00
const QModelIndex &proxyIndex = proxyModel->mapToSource(index);
if (picked == removeItem) {
bookmarkManager->removeBookmarkItem(m_treeView, proxyIndex);
m_bookmarkFolders->clear();
m_bookmarkFolders->addItems(bookmarkManager->bookmarkFolders());
2008-12-02 12:01:29 +01:00
QString name = tr("Bookmarks");
index = m_treeView->currentIndex();
2008-12-02 12:01:29 +01:00
if (index.isValid())
name = index.data().toString();
m_bookmarkFolders->setCurrentIndex(m_bookmarkFolders->findText(name));
} else if (picked == renameItem) {
2009-06-24 13:38:19 +02:00
BookmarkModel *model = bookmarkManager->treeBookmarkModel();
if (QStandardItem *item = model->itemFromIndex(proxyIndex)) {
2008-12-02 12:01:29 +01:00
item->setEditable(true);
m_treeView->edit(index);
2008-12-02 12:01:29 +01:00
item->setEditable(false);
}
}
}
2009-06-24 13:38:19 +02:00
void BookmarkDialog::currentChanged(const QModelIndex &current)
2008-12-02 12:01:29 +01:00
{
2009-06-24 13:38:19 +02:00
QString text = tr("Bookmarks");
if (current.isValid())
text = current.data().toString();
m_bookmarkFolders->setCurrentIndex(m_bookmarkFolders->findText(text));
2008-12-02 12:01:29 +01:00
}
bool BookmarkDialog::eventFilter(QObject *object, QEvent *e)
{
if (object == this && e->type() == QEvent::KeyPress) {
QKeyEvent *ke = static_cast<QKeyEvent*>(e);
QModelIndex index = m_treeView->currentIndex();
2008-12-02 12:01:29 +01:00
switch (ke->key()) {
case Qt::Key_F2: {
2009-06-24 13:38:19 +02:00
const QModelIndex &source = proxyModel->mapToSource(index);
2008-12-02 12:01:29 +01:00
QStandardItem *item =
bookmarkManager->treeBookmarkModel()->itemFromIndex(source);
if (item) {
item->setEditable(true);
m_treeView->edit(index);
2008-12-02 12:01:29 +01:00
item->setEditable(false);
}
} break;
case Qt::Key_Backspace:
2008-12-02 12:01:29 +01:00
case Qt::Key_Delete: {
bookmarkManager->removeBookmarkItem(m_treeView,
2008-12-02 12:01:29 +01:00
proxyModel->mapToSource(index));
m_bookmarkFolders->clear();
m_bookmarkFolders->addItems(bookmarkManager->bookmarkFolders());
2008-12-02 12:01:29 +01:00
QString name = tr("Bookmarks");
index = m_treeView->currentIndex();
2008-12-02 12:01:29 +01:00
if (index.isValid())
name = index.data().toString();
m_bookmarkFolders->setCurrentIndex(m_bookmarkFolders->findText(name));
2008-12-02 12:01:29 +01:00
} break;
default:
break;
}
}
return QObject::eventFilter(object, e);
}
2009-06-24 13:38:19 +02:00
// #pragma mark -- BookmarkWidget
2008-12-02 12:01:29 +01:00
BookmarkWidget::BookmarkWidget(BookmarkManager *manager, QWidget *parent)
2008-12-02 12:01:29 +01:00
: QWidget(parent)
, bookmarkManager(manager)
, m_isOpenInNewPageActionVisible(true)
2008-12-02 12:01:29 +01:00
{
setup();
2008-12-02 12:01:29 +01:00
installEventFilter(this);
}
BookmarkWidget::~BookmarkWidget()
{
}
void BookmarkWidget::setOpenInNewPageActionVisible(bool visible)
{
m_isOpenInNewPageActionVisible = visible;
}
2008-12-02 12:01:29 +01:00
void BookmarkWidget::filterChanged()
{
bool searchBookmarks = searchField->text().isEmpty();
if (!searchBookmarks) {
regExp.setPattern(QRegularExpression::escape(searchField->text()));
2008-12-02 12:01:29 +01:00
filterBookmarkModel->setSourceModel(bookmarkManager->listBookmarkModel());
} else {
regExp.setPattern(QString());
2008-12-02 12:01:29 +01:00
filterBookmarkModel->setSourceModel(bookmarkManager->treeBookmarkModel());
}
filterBookmarkModel->setFilterRegularExpression(regExp);
2008-12-02 12:01:29 +01:00
2009-06-24 13:38:19 +02:00
const QModelIndex &index = treeView->indexAt(QPoint(1, 1));
2008-12-02 12:01:29 +01:00
if (index.isValid())
treeView->setCurrentIndex(index);
if (searchBookmarks)
expandItems();
}
void BookmarkWidget::expand(const QModelIndex& index)
{
const QModelIndex& source = filterBookmarkModel->mapToSource(index);
2009-06-24 13:38:19 +02:00
QStandardItem *item =
bookmarkManager->treeBookmarkModel()->itemFromIndex(source);
2008-12-02 12:01:29 +01:00
if (item)
item->setData(treeView->isExpanded(index), Qt::UserRole + 11);
}
void BookmarkWidget::activated(const QModelIndex &index)
{
if (!index.isValid())
return;
QString data = index.data(Qt::UserRole + 10).toString();
if (data != QLatin1String("Folder"))
emit linkActivated(data);
2008-12-02 12:01:29 +01:00
}
void BookmarkWidget::showContextMenu(const QPoint &point)
2008-12-02 12:01:29 +01:00
{
QModelIndex index = treeView->indexAt(point);
if (!index.isValid())
return;
QAction *showItem = 0;
QAction *removeItem = 0;
QAction *renameItem = 0;
QAction *showItemNewTab = 0;
QMenu menu(this);
2008-12-02 12:01:29 +01:00
QString data = index.data(Qt::UserRole + 10).toString();
if (data == QLatin1String("Folder")) {
removeItem = menu.addAction(tr("Delete Folder"));
renameItem = menu.addAction(tr("Rename Folder"));
} else {
showItem = menu.addAction(tr("Show Bookmark"));
if (m_isOpenInNewPageActionVisible)
showItemNewTab = menu.addAction(tr("Show Bookmark as New Page"));
2008-12-02 12:01:29 +01:00
if (searchField->text().isEmpty()) {
menu.addSeparator();
removeItem = menu.addAction(tr("Delete Bookmark"));
renameItem = menu.addAction(tr("Rename Bookmark"));
}
}
2009-06-24 13:38:19 +02:00
QAction *pickedAction = menu.exec(treeView->mapToGlobal(point));
if (!pickedAction)
2008-12-02 12:01:29 +01:00
return;
if (pickedAction == showItem) {
emit linkActivated(data);
} else if (pickedAction == showItemNewTab) {
emit createPage(QUrl(data), false);
} else if (pickedAction == removeItem) {
2008-12-02 12:01:29 +01:00
bookmarkManager->removeBookmarkItem(treeView,
filterBookmarkModel->mapToSource(index));
} else if (pickedAction == renameItem) {
2009-06-24 13:38:19 +02:00
const QModelIndex &source = filterBookmarkModel->mapToSource(index);
2008-12-02 12:01:29 +01:00
QStandardItem *item =
bookmarkManager->treeBookmarkModel()->itemFromIndex(source);
if (item) {
item->setEditable(true);
treeView->edit(index);
item->setEditable(false);
}
}
}
void BookmarkWidget::setup()
2008-12-02 12:01:29 +01:00
{
regExp.setPatternOptions(QRegularExpression::CaseInsensitiveOption);
2008-12-02 12:01:29 +01:00
QLayout *vlayout = new QVBoxLayout(this);
vlayout->setContentsMargins(0, 0, 0, 0);
vlayout->setSpacing(0);
2008-12-02 12:01:29 +01:00
searchField = new Utils::FancyLineEdit(this);
searchField->setFiltering(true);
setFocusProxy(searchField);
Utils::StyledBar *toolbar = new Utils::StyledBar(this);
toolbar->setSingleRow(false);
QLayout *tbLayout = new QHBoxLayout();
tbLayout->setContentsMargins(4, 4, 4, 4);
tbLayout->addWidget(searchField);
toolbar->setLayout(tbLayout);
vlayout->addWidget(toolbar);
searchField->installEventFilter(this);
connect(searchField, &Utils::FancyLineEdit::textChanged,
this, &BookmarkWidget::filterChanged);
2008-12-02 12:01:29 +01:00
treeView = new TreeView(this);
vlayout->addWidget(treeView);
filterBookmarkModel = new QSortFilterProxyModel(this);
treeView->setModel(filterBookmarkModel);
treeView->setDragEnabled(true);
treeView->setAcceptDrops(true);
treeView->setAutoExpandDelay(1000);
treeView->setDropIndicatorShown(true);
treeView->viewport()->installEventFilter(this);
treeView->setContextMenuPolicy(Qt::CustomContextMenu);
// work around crash on Windows with drag & drop
// in combination with proxy model and ResizeToContents section resize mode
treeView->header()->setSectionResizeMode(QHeaderView::Stretch);
2008-12-02 12:01:29 +01:00
connect(treeView, &TreeView::expanded, this, &BookmarkWidget::expand);
connect(treeView, &TreeView::collapsed, this, &BookmarkWidget::expand);
connect(treeView, &TreeView::activated, this, &BookmarkWidget::activated);
connect(treeView, &TreeView::customContextMenuRequested,
this, &BookmarkWidget::showContextMenu);
2008-12-02 12:01:29 +01:00
filterBookmarkModel->setFilterKeyColumn(0);
filterBookmarkModel->setDynamicSortFilter(true);
filterBookmarkModel->setSourceModel(bookmarkManager->treeBookmarkModel());
expandItems();
}
void BookmarkWidget::expandItems()
{
QStandardItemModel *model = bookmarkManager->treeBookmarkModel();
const QList<QStandardItem *> list = model->findItems(QLatin1String("*"),
Qt::MatchWildcard | Qt::MatchRecursive,
0);
for (const QStandardItem *item : list) {
2008-12-02 12:01:29 +01:00
const QModelIndex& index = model->indexFromItem(item);
treeView->setExpanded(filterBookmarkModel->mapFromSource(index),
item->data(Qt::UserRole + 11).toBool());
}
}
bool BookmarkWidget::eventFilter(QObject *object, QEvent *e)
{
if ((object == this) || (object == treeView->viewport())) {
2008-12-02 12:01:29 +01:00
QModelIndex index = treeView->currentIndex();
if (e->type() == QEvent::KeyPress) {
QKeyEvent *ke = static_cast<QKeyEvent*>(e);
2008-12-02 12:01:29 +01:00
if (index.isValid() && searchField->text().isEmpty()) {
2009-06-24 13:38:19 +02:00
const QModelIndex &src = filterBookmarkModel->mapToSource(index);
if (ke->key() == Qt::Key_F2) {
2009-06-24 13:38:19 +02:00
QStandardItem *item =
bookmarkManager->treeBookmarkModel()->itemFromIndex(src);
2008-12-02 12:01:29 +01:00
if (item) {
item->setEditable(true);
treeView->edit(index);
item->setEditable(false);
}
} else if (ke->key() == Qt::Key_Delete || ke->key() == Qt::Key_Backspace) {
2009-06-24 13:38:19 +02:00
bookmarkManager->removeBookmarkItem(treeView, src);
}
2008-12-02 12:01:29 +01:00
}
switch (ke->key()) {
default: break;
case Qt::Key_Up:
case Qt::Key_Down: {
treeView->subclassKeyPressEvent(ke);
} break;
2008-12-02 12:01:29 +01:00
case Qt::Key_Enter:
case Qt::Key_Return: {
index = treeView->selectionModel()->currentIndex();
if (index.isValid()) {
QString data = index.data(Qt::UserRole + 10).toString();
if (!data.isEmpty() && data != QLatin1String("Folder"))
emit linkActivated(data);
}
} break;
}
} else if (e->type() == QEvent::MouseButtonRelease) {
if (index.isValid()) {
QMouseEvent *me = static_cast<QMouseEvent*>(e);
bool controlPressed = me->modifiers() & Qt::ControlModifier;
if (((me->button() == Qt::LeftButton) && controlPressed)
|| (me->button() == Qt::MiddleButton)) {
QString data = index.data(Qt::UserRole + 10).toString();
if (!data.isEmpty() && data != QLatin1String("Folder"))
emit createPage(QUrl(data), false);
}
}
2008-12-02 12:01:29 +01:00
}
} else if (object == searchField && e->type() == QEvent::FocusIn) {
if (static_cast<QFocusEvent *>(e)->reason() != Qt::MouseFocusReason) {
searchField->selectAll();
searchField->setFocus();
QModelIndex index = treeView->indexAt(QPoint(1, 1));
if (index.isValid())
treeView->setCurrentIndex(index);
}
2008-12-02 12:01:29 +01:00
}
return QWidget::eventFilter(object, e);
}
2009-06-24 13:38:19 +02:00
// #pragma mark -- BookmarkModel
2008-12-02 12:01:29 +01:00
BookmarkModel::BookmarkModel(int rows, int columns, QObject * parent)
: QStandardItemModel(rows, columns, parent)
{
}
BookmarkModel::~BookmarkModel()
{
}
Qt::DropActions BookmarkModel::supportedDropActions() const
{
return Qt::MoveAction;
}
Qt::ItemFlags BookmarkModel::flags(const QModelIndex &index) const
{
Qt::ItemFlags defaultFlags = QStandardItemModel::flags(index);
2009-06-24 13:38:19 +02:00
if ((!index.isValid()) // can only happen for the invisible root item
|| index.data(Qt::UserRole + 10).toString() == QLatin1String("Folder"))
2008-12-02 12:01:29 +01:00
return (Qt::ItemIsDropEnabled | defaultFlags) &~ Qt::ItemIsDragEnabled;
return (Qt::ItemIsDragEnabled | defaultFlags) &~ Qt::ItemIsDropEnabled;
}
2009-06-24 13:38:19 +02:00
// #pragma mark -- BookmarkManager
2008-12-02 12:01:29 +01:00
BookmarkManager::BookmarkManager()
: m_folderIcon(QApplication::style()->standardIcon(QStyle::SP_DirClosedIcon))
, m_bookmarkIcon(Utils::Icons::BOOKMARK.icon())
, treeModel(new BookmarkModel(0, 1, this))
, listModel(new BookmarkModel(0, 1, this))
2008-12-02 12:01:29 +01:00
{
connect(treeModel, &BookmarkModel::itemChanged,
this, &BookmarkManager::itemChanged);
2008-12-02 12:01:29 +01:00
}
BookmarkManager::~BookmarkManager()
{
treeModel->clear();
listModel->clear();
}
2010-03-23 17:00:41 +01:00
BookmarkModel* BookmarkManager::treeBookmarkModel() const
2008-12-02 12:01:29 +01:00
{
return treeModel;
}
2010-03-23 17:00:41 +01:00
BookmarkModel* BookmarkManager::listBookmarkModel() const
2008-12-02 12:01:29 +01:00
{
return listModel;
}
void BookmarkManager::saveBookmarks()
{
if (!m_isModelSetup)
return;
2008-12-02 12:01:29 +01:00
QByteArray bookmarks;
QDataStream stream(&bookmarks, QIODevice::WriteOnly);
2009-06-24 13:38:19 +02:00
readBookmarksRecursive(treeModel->invisibleRootItem(), stream, 0);
Core::ICore::settings()->setValue(QLatin1String(kBookmarksKey), bookmarks);
2008-12-02 12:01:29 +01:00
}
QStringList BookmarkManager::bookmarkFolders() const
{
QStringList folders(tr("Bookmarks"));
const QList<QStandardItem *> list = treeModel->findItems(QLatin1String("*"),
Qt::MatchWildcard | Qt::MatchRecursive,
0);
2008-12-02 12:01:29 +01:00
QString data;
for (const QStandardItem *item : list) {
2008-12-02 12:01:29 +01:00
data = item->data(Qt::UserRole + 10).toString();
if (data == QLatin1String("Folder"))
folders << item->data(Qt::DisplayRole).toString();
}
return folders;
}
QModelIndex BookmarkManager::addNewFolder(const QModelIndex& index)
{
QStandardItem *item = new QStandardItem(uniqueFolderName());
item->setEditable(false);
item->setIcon(m_folderIcon);
2008-12-02 12:01:29 +01:00
item->setData(false, Qt::UserRole + 11);
item->setData(QLatin1String("Folder"), Qt::UserRole + 10);
item->setIcon(QApplication::style()->standardIcon(QStyle::SP_DirClosedIcon));
if (index.isValid())
2008-12-02 12:01:29 +01:00
treeModel->itemFromIndex(index)->appendRow(item);
else
2008-12-02 12:01:29 +01:00
treeModel->appendRow(item);
return treeModel->indexFromItem(item);
}
2009-06-24 13:38:19 +02:00
void BookmarkManager::removeBookmarkItem(QTreeView *treeView,
const QModelIndex& index)
2008-12-02 12:01:29 +01:00
{
QStandardItem *item = treeModel->itemFromIndex(index);
if (item) {
QString data = index.data(Qt::UserRole + 10).toString();
if (data == QLatin1String("Folder") && item->rowCount() > 0) {
int value = QMessageBox::question(treeView, tr("Remove"),
tr("Deleting a folder also removes its content.<br>"
"Do you want to continue?"),
2009-06-24 13:38:19 +02:00
QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel);
2008-12-02 12:01:29 +01:00
if (value == QMessageBox::Cancel)
return;
}
if (data != QLatin1String("Folder")) {
const QList<QStandardItem *> itemList = listModel->findItems(item->text());
for (const QStandardItem *i : itemList) {
2008-12-02 12:01:29 +01:00
if (i->data(Qt::UserRole + 10) == data) {
listModel->removeRow(i->row());
break;
}
}
} else {
removeBookmarkFolderItems(item);
}
treeModel->removeRow(item->row(), index.parent());
}
}
void BookmarkManager::showBookmarkDialog(QWidget* parent, const QString &name,
2009-06-24 13:38:19 +02:00
const QString &url)
2008-12-02 12:01:29 +01:00
{
BookmarkDialog dialog(this, name, url, parent);
dialog.exec();
}
void BookmarkManager::addNewBookmark(const QModelIndex& index,
2009-06-24 13:38:19 +02:00
const QString &name, const QString &url)
2008-12-02 12:01:29 +01:00
{
QStandardItem *item = new QStandardItem(name);
item->setEditable(false);
item->setIcon(m_bookmarkIcon);
2008-12-02 12:01:29 +01:00
item->setData(false, Qt::UserRole + 11);
item->setData(url, Qt::UserRole + 10);
2009-06-24 13:38:19 +02:00
if (index.isValid())
2008-12-02 12:01:29 +01:00
treeModel->itemFromIndex(index)->appendRow(item);
2009-06-24 13:38:19 +02:00
else
2008-12-02 12:01:29 +01:00
treeModel->appendRow(item);
2009-06-24 13:38:19 +02:00
listModel->appendRow(item->clone());
2008-12-02 12:01:29 +01:00
}
void BookmarkManager::itemChanged(QStandardItem *item)
{
if (renameItem != item) {
renameItem = item;
oldText = item->text();
return;
}
if (item->text() != oldText) {
if (item->data(Qt::UserRole + 10).toString() != QLatin1String("Folder")) {
QList<QStandardItem*>itemList = listModel->findItems(oldText);
if (!itemList.isEmpty())
2008-12-02 12:01:29 +01:00
itemList.at(0)->setText(item->text());
}
}
}
void BookmarkManager::setupBookmarkModels()
{
m_isModelSetup = true;
2008-12-02 12:01:29 +01:00
treeModel->clear();
listModel->clear();
qint32 depth;
bool expanded;
QString name, type;
QList<int> lastDepths;
QList<QStandardItem*> parents;
QByteArray ba;
QSettings *settings = Core::ICore::settings();
ba = settings->value(QLatin1String(kBookmarksKey)).toByteArray();
2008-12-02 12:01:29 +01:00
QDataStream stream(ba);
while (!stream.atEnd()) {
stream >> depth >> name >> type >> expanded;
QStandardItem *item = new QStandardItem(name);
item->setEditable(false);
item->setData(type, Qt::UserRole + 10);
item->setData(expanded, Qt::UserRole + 11);
if (depth == 0) {
parents.clear(); lastDepths.clear();
treeModel->appendRow(item);
parents << item; lastDepths << depth;
} else {
if (depth <= lastDepths.last()) {
while (depth <= lastDepths.last() && parents.count() > 0) {
parents.pop_back(); lastDepths.pop_back();
}
}
parents.last()->appendRow(item);
if (type == QLatin1String("Folder")) {
2008-12-02 12:01:29 +01:00
parents << item; lastDepths << depth;
}
2008-12-02 12:01:29 +01:00
}
2009-06-24 13:38:19 +02:00
if (type != QLatin1String("Folder")) {
item->setIcon(m_bookmarkIcon);
2008-12-02 12:01:29 +01:00
listModel->appendRow(item->clone());
2009-06-24 13:38:19 +02:00
} else {
item->setIcon(m_folderIcon);
2009-06-24 13:38:19 +02:00
}
2008-12-02 12:01:29 +01:00
}
}
QString BookmarkManager::uniqueFolderName() const
{
QString folderName = tr("New Folder");
const QList<QStandardItem *> list = treeModel->findItems(folderName,
Qt::MatchContains | Qt::MatchRecursive,
0);
2008-12-02 12:01:29 +01:00
if (!list.isEmpty()) {
QStringList names;
for (const QStandardItem *item : list)
2008-12-02 12:01:29 +01:00
names << item->text();
QString folderNameBase = tr("New Folder") + QLatin1String(" %1");
2008-12-02 12:01:29 +01:00
for (int i = 1; i <= names.count(); ++i) {
folderName = folderNameBase.arg(i);
2008-12-02 12:01:29 +01:00
if (!names.contains(folderName))
break;
}
}
return folderName;
}
void BookmarkManager::removeBookmarkFolderItems(QStandardItem *item)
{
for (int j = 0; j < item->rowCount(); ++j) {
QStandardItem *child = item->child(j);
if (child->rowCount() > 0)
removeBookmarkFolderItems(child);
QString data = child->data(Qt::UserRole + 10).toString();
const QList<QStandardItem*> itemList = listModel->findItems(child->text());
for (const QStandardItem *i : itemList) {
2008-12-02 12:01:29 +01:00
if (i->data(Qt::UserRole + 10) == data) {
listModel->removeRow(i->row());
break;
}
}
}
}
void BookmarkManager::readBookmarksRecursive(const QStandardItem *item,
2009-06-24 13:38:19 +02:00
QDataStream &stream, const qint32 depth) const
2008-12-02 12:01:29 +01:00
{
for (int j = 0; j < item->rowCount(); ++j) {
const QStandardItem *child = item->child(j);
stream << depth;
stream << child->data(Qt::DisplayRole).toString();
stream << child->data(Qt::UserRole + 10).toString();
stream << child->data(Qt::UserRole + 11).toBool();
if (child->rowCount() > 0)
readBookmarksRecursive(child, stream, (depth +1));
}
}