• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdevelop API Reference
  • KDE Home
  • Contact Us
 

kdevplatform/project

  • sources
  • kfour-appscomplete
  • kdevelop
  • kdevplatform
  • project
projectfiltermanager.cpp
Go to the documentation of this file.
1 /*
2  This file is part of KDevelop
3 
4  Copyright 2013 Milian Wolff <[email protected]>
5 
6  This library is free software; you can redistribute it and/or
7  modify it under the terms of the GNU Library General Public
8  License as published by the Free Software Foundation; either
9  version 2 of the License, or (at your option) any later version.
10 
11  This library is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  Library General Public License for more details.
15 
16  You should have received a copy of the GNU Library General Public License
17  along with this library; see the file COPYING.LIB. If not, write to
18  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  Boston, MA 02110-1301, USA.
20 */
21 
22 #include "projectfiltermanager.h"
23 
24 #include <QVector>
25 
26 #include <interfaces/iproject.h>
27 #include <interfaces/iplugin.h>
28 #include <interfaces/icore.h>
29 #include <interfaces/iplugincontroller.h>
30 
31 #include "interfaces/iprojectfilterprovider.h"
32 #include "interfaces/iprojectfilter.h"
33 #include "interfaces/iprojectfilemanager.h"
34 #include "debug.h"
35 
36 using namespace KDevelop;
37 
38 //BEGIN helper
39 namespace {
40 
41 struct Filter
42 {
43  QSharedPointer<IProjectFilter> filter;
44  // required for bookkeeping
45  IProjectFilterProvider* provider;
46 };
47 
48 }
49 
50 Q_DECLARE_TYPEINFO(Filter, Q_MOVABLE_TYPE);
51 
52 //END helper
53 
54 //BEGIN private
55 class KDevelop::ProjectFilterManagerPrivate
56 {
57 public:
58  void pluginLoaded(IPlugin* plugin);
59  void unloadingPlugin(IPlugin* plugin);
60  void filterChanged(IProjectFilterProvider* provider, IProject* project);
61 
62  QVector<IProjectFilterProvider*> m_filterProvider;
63  QHash<IProject*, QVector<Filter> > m_filters;
64 
65  ProjectFilterManager* q;
66 };
67 
68 void ProjectFilterManagerPrivate::pluginLoaded(IPlugin* plugin)
69 {
70  auto* filterProvider = plugin->extension<IProjectFilterProvider>();
71  if (filterProvider) {
72  m_filterProvider << filterProvider;
73  // can't use qt5 signal slot syntax here, IProjectFilterProvider is not a QObject
74  QObject::connect(plugin, SIGNAL(filterChanged(KDevelop::IProjectFilterProvider*,KDevelop::IProject*)),
75  q, SLOT(filterChanged(KDevelop::IProjectFilterProvider*,KDevelop::IProject*)));
76  QHash< IProject*, QVector< Filter > >::iterator it = m_filters.begin();
77  while(it != m_filters.end()) {
78  Filter filter;
79  filter.provider = filterProvider;
80  filter.filter = filterProvider->createFilter(it.key());
81  it.value().append(filter);
82  ++it;
83  }
84  }
85 }
86 
87 void ProjectFilterManagerPrivate::unloadingPlugin(IPlugin* plugin)
88 {
89  auto* filterProvider = plugin->extension<IProjectFilterProvider>();
90  if (filterProvider) {
91  int idx = m_filterProvider.indexOf(qobject_cast<IProjectFilterProvider*>(plugin));
92  Q_ASSERT(idx != -1);
93  m_filterProvider.remove(idx);
94  QHash< IProject*, QVector<Filter> >::iterator filtersIt = m_filters.begin();
95  while(filtersIt != m_filters.end()) {
96  QVector<Filter>& filters = filtersIt.value();
97  QVector<Filter>::iterator filter = filters.begin();
98  while(filter != filters.end()) {
99  if ((*filter).provider == filterProvider) {
100  filter = filters.erase(filter);
101  continue;
102  }
103  ++filter;
104  }
105  ++filtersIt;
106  }
107  }
108 }
109 
110 void ProjectFilterManagerPrivate::filterChanged(IProjectFilterProvider* provider, IProject* project)
111 {
112  if (!m_filters.contains(project)) {
113  return;
114  }
115 
116  QVector< Filter >& filters = m_filters[project];
117  for (auto& filter : filters) {
118  if (filter.provider == provider) {
119  filter.filter = provider->createFilter(project);
120  qCDebug(PROJECT) << "project filter changed, reloading" << project->name();
121  project->projectFileManager()->reload(project->projectItem());
122  return;
123  }
124  }
125  Q_ASSERT_X(false, Q_FUNC_INFO, "Unknown provider changed its filter");
126 }
127 //END private
128 
129 //BEGIN
130 ProjectFilterManager::ProjectFilterManager(QObject* parent)
131  : QObject(parent)
132  , d_ptr(new ProjectFilterManagerPrivate)
133 {
134  Q_D(ProjectFilterManager);
135 
136  d->q = this;
137 
138  connect(ICore::self()->pluginController(), &IPluginController::pluginLoaded,
139  this, [this] (IPlugin* plugin) { Q_D(ProjectFilterManager);d->pluginLoaded(plugin); });
140  connect(ICore::self()->pluginController(), &IPluginController::unloadingPlugin,
141  this, [this] (IPlugin* plugin) { Q_D(ProjectFilterManager);d->unloadingPlugin(plugin); });
142 
143  const auto plugins = ICore::self()->pluginController()->loadedPlugins();
144  for (IPlugin* plugin : plugins) {
145  d->pluginLoaded(plugin);
146  }
147 }
148 
149 ProjectFilterManager::~ProjectFilterManager()
150 {
151 
152 }
153 
154 void ProjectFilterManager::add(IProject* project)
155 {
156  Q_D(ProjectFilterManager);
157 
158  QVector<Filter> filters;
159  filters.reserve(d->m_filterProvider.size());
160  for (IProjectFilterProvider* provider : qAsConst(d->m_filterProvider)) {
161  Filter filter;
162  filter.provider = provider;
163  filter.filter = provider->createFilter(project);
164  filters << filter;
165  }
166  d->m_filters[project] = filters;
167 }
168 
169 void ProjectFilterManager::remove(IProject* project)
170 {
171  Q_D(ProjectFilterManager);
172 
173  d->m_filters.remove(project);
174 }
175 
176 bool ProjectFilterManager::isManaged(IProject* project) const
177 {
178  Q_D(const ProjectFilterManager);
179 
180  return d->m_filters.contains(project);
181 }
182 
183 bool ProjectFilterManager::isValid(const Path& path, bool isFolder, IProject* project) const
184 {
185  Q_D(const ProjectFilterManager);
186 
187  const auto filters = d->m_filters[project];
188  return std::all_of(filters.begin(), filters.end(), [&](const Filter& filter) {
189  return (filter.filter->isValid(path, isFolder));
190  });
191 }
192 
193 QVector< QSharedPointer< IProjectFilter > > ProjectFilterManager::filtersForProject(IProject* project) const
194 {
195  Q_D(const ProjectFilterManager);
196 
197  QVector< QSharedPointer< IProjectFilter > > ret;
198  const QVector<Filter>& filters = d->m_filters[project];
199  ret.reserve(filters.size());
200  for (const Filter& filter : filters) {
201  ret << filter.filter;
202  }
203  return ret;
204 }
205 //END
206 
207 #include "moc_projectfiltermanager.cpp"
KDevelop::IProjectFilterProvider::createFilter
virtual QSharedPointer< IProjectFilter > createFilter(IProject *project) const =0
Factory function to create threadsafe project filter instances.
KDevelop::ProjectFilterManager::isManaged
bool isManaged(IProject *project) const
TODO: remove this once the cmake manager got cleaned up to not need this anymore.
Definition: projectfiltermanager.cpp:176
QHash::value
const T value(const Key &key) const
KDevelop::ProjectFilterManager::~ProjectFilterManager
~ProjectFilterManager() override
Definition: projectfiltermanager.cpp:149
QVector::begin
iterator begin()
Q_DECLARE_TYPEINFO
Q_DECLARE_TYPEINFO(Filter, Q_MOVABLE_TYPE)
KDevelop::IProjectFilterProvider
An interface to create project filters.
Definition: iprojectfilterprovider.h:54
KDevelop::ProjectFilterManager::remove
void remove(IProject *project)
Remove the managed filters of the given project.
Definition: projectfiltermanager.cpp:169
KDevelop::ProjectFilterManager
A helper class to manage project filtering in file managers.
Definition: projectfiltermanager.h:52
QHash::begin
iterator begin()
KDevelop::ProjectFilterManager::filtersForProject
QVector< QSharedPointer< IProjectFilter > > filtersForProject(IProject *project) const
Definition: projectfiltermanager.cpp:193
IPlugin
QSharedPointer
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QtConcurrent::filter
QFuture< void > filter(Sequence &sequence, FilterFunction filterFunction)
QObject
QHash::key
const Key key(const T &value) const
projectfiltermanager.h
iprojectfilter.h
QVector::reserve
void reserve(int size)
KDevelop::ProjectFilterManager::ProjectFilterManager
ProjectFilterManager(QObject *parent=nullptr)
Definition: projectfiltermanager.cpp:130
KDevelop::ProjectFilterManager::isValid
bool isValid(const Path &path, bool isFolder, IProject *project) const
Check whether the given path should be included in a project.
Definition: projectfiltermanager.cpp:183
QVector::end
iterator end()
QVector::erase
iterator erase(iterator begin, iterator end)
KDevelop
Definition: abstractfilemanagerplugin.h:33
iprojectfilterprovider.h
QVector::size
int size() const
QVector
iprojectfilemanager.h
QHash
debug.h
KDevelop::ProjectFilterManager::add
void add(IProject *project)
Manage the filters of the given project.
Definition: projectfiltermanager.cpp:154
This file is part of the KDE documentation.
Documentation copyright © 1996-2021 The KDE developers.
Generated on Wed Mar 3 2021 00:37:59 by doxygen 1.8.16 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kdevplatform/project

Skip menu "kdevplatform/project"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdevelop API Reference

Skip menu "kdevelop API Reference"
  • kdevplatform
  •   debugger
  •   documentation
  •   interfaces
  •   language
  •     assistant
  •     backgroundparser
  •     checks
  •     classmodel
  •     codecompletion
  •     codegen
  •     duchain
  •     editor
  •     highlighting
  •     interfaces
  •     util
  •   outputview
  •   project
  •   serialization
  •   shell
  •   sublime
  •   tests
  •   util
  •   vcs

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal