diff --git a/src/plugins/bookmarks/bookmarkfilter.cpp b/src/plugins/bookmarks/bookmarkfilter.cpp new file mode 100644 index 00000000000..c57f72fedf1 --- /dev/null +++ b/src/plugins/bookmarks/bookmarkfilter.cpp @@ -0,0 +1,103 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "bookmarkfilter.h" + +#include "bookmark.h" +#include "bookmarkmanager.h" + +#include + +using namespace Bookmarks::Internal; +using namespace Core; +using namespace Utils; + +BookmarkFilter::BookmarkFilter(BookmarkManager *manager) + : m_manager(manager) +{ + setId("Bookmarks"); + setDisplayName(tr("Bookmarks")); + setPriority(Medium); + setShortcutString("b"); +} + +QList BookmarkFilter::matchesFor(QFutureInterface &future, + const QString &entry) +{ + Q_UNUSED(future); + if (m_manager->rowCount() == 0) + return QList(); + + const QModelIndexList matches = filteredUnique( + m_manager->match(m_manager->index(0, 0), BookmarkManager::Filename, entry, -1, + Qt::MatchContains | Qt::MatchWrap) + + m_manager->match(m_manager->index(0, 0), BookmarkManager::Note, entry, -1, + Qt::MatchContains | Qt::MatchWrap)); + QList entries; + for (const QModelIndex &idx : matches) { + const Bookmark *bookmark = m_manager->bookmarkForIndex(idx); + const QString filename = FileName::fromString(bookmark->fileName()).fileName(); + LocatorFilterEntry filterEntry(this, + QString("%1:%2").arg(filename).arg(bookmark->lineNumber()), + QVariant::fromValue(idx)); + if (!bookmark->note().isEmpty()) + filterEntry.extraInfo = bookmark->note(); + else if (!bookmark->lineText().isEmpty()) + filterEntry.extraInfo = bookmark->lineText(); + else + filterEntry.extraInfo = bookmark->fileName(); + int highlightIndex = filterEntry.displayName.indexOf(entry, 0, Qt::CaseInsensitive); + if (highlightIndex >= 0) { + filterEntry.highlightInfo = {highlightIndex, entry.length()}; + } else { + highlightIndex = filterEntry.extraInfo.indexOf(entry, 0, Qt::CaseInsensitive); + if (highlightIndex >= 0) { + filterEntry.highlightInfo = {highlightIndex, entry.length(), + LocatorFilterEntry::HighlightInfo::ExtraInfo}; + } + } + + filterEntry.displayIcon = bookmark->icon(); + entries.append(filterEntry); + } + return entries; +} + +void BookmarkFilter::accept(LocatorFilterEntry selection, QString *newText, + int *selectionStart, int *selectionLength) const +{ + Q_UNUSED(newText); + Q_UNUSED(selectionStart); + Q_UNUSED(selectionLength); + if (const Bookmark *bookmark = m_manager->bookmarkForIndex( + selection.internalData.toModelIndex())) { + m_manager->gotoBookmark(bookmark); + } +} + +void BookmarkFilter::refresh(QFutureInterface &future) +{ + Q_UNUSED(future); +} diff --git a/src/plugins/bookmarks/bookmarkfilter.h b/src/plugins/bookmarks/bookmarkfilter.h new file mode 100644 index 00000000000..e665cc2f5d5 --- /dev/null +++ b/src/plugins/bookmarks/bookmarkfilter.h @@ -0,0 +1,50 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include + +namespace Bookmarks { +namespace Internal { + +class BookmarkManager; + +class BookmarkFilter : public Core::ILocatorFilter +{ +public: + explicit BookmarkFilter(BookmarkManager *manager); + QList matchesFor(QFutureInterface &future, + const QString &entry) override; + void accept(Core::LocatorFilterEntry selection, QString *newText, + int *selectionStart, int *selectionLength) const override; + void refresh(QFutureInterface &future) override; + +private: + BookmarkManager *m_manager = nullptr; // not owned +}; + +} // namespace Internal +} // namespace Bookmarks diff --git a/src/plugins/bookmarks/bookmarks.pro b/src/plugins/bookmarks/bookmarks.pro index 1445aa9fa78..85886fa515b 100644 --- a/src/plugins/bookmarks/bookmarks.pro +++ b/src/plugins/bookmarks/bookmarks.pro @@ -1,10 +1,14 @@ include(../../qtcreatorplugin.pri) -HEADERS += bookmarksplugin.h \ - bookmark.h \ - bookmarkmanager.h \ - bookmarks_global.h +HEADERS += \ + bookmark.h \ + bookmarkfilter.h \ + bookmarkmanager.h \ + bookmarks_global.h \ + bookmarksplugin.h -SOURCES += bookmarksplugin.cpp \ - bookmark.cpp \ - bookmarkmanager.cpp +SOURCES += \ + bookmark.cpp \ + bookmarkfilter.cpp \ + bookmarkmanager.cpp \ + bookmarksplugin.cpp diff --git a/src/plugins/bookmarks/bookmarks.qbs b/src/plugins/bookmarks/bookmarks.qbs index 0d7b16e54d1..cfbecfea325 100644 --- a/src/plugins/bookmarks/bookmarks.qbs +++ b/src/plugins/bookmarks/bookmarks.qbs @@ -13,6 +13,8 @@ QtcPlugin { files: [ "bookmark.cpp", "bookmark.h", + "bookmarkfilter.cpp", + "bookmarkfilter.h", "bookmarkmanager.cpp", "bookmarkmanager.h", "bookmarks_global.h", diff --git a/src/plugins/bookmarks/bookmarksplugin.cpp b/src/plugins/bookmarks/bookmarksplugin.cpp index f388040ea31..1875606f224 100644 --- a/src/plugins/bookmarks/bookmarksplugin.cpp +++ b/src/plugins/bookmarks/bookmarksplugin.cpp @@ -24,6 +24,8 @@ ****************************************************************************/ #include "bookmarksplugin.h" + +#include "bookmarkfilter.h" #include "bookmarkmanager.h" #include "bookmarks_global.h" @@ -109,6 +111,8 @@ bool BookmarksPlugin::initialize(const QStringList & /*arguments*/, QString *) m_bookmarkManager = new BookmarkManager; + addAutoReleasedObject(new BookmarkFilter(m_bookmarkManager)); + connect(m_toggleAction, &QAction::triggered, [this]() { BaseTextEditor *editor = BaseTextEditor::currentTextEditor(); if (editor && !editor->document()->isTemporary())