Skip to content

Commit 1d2117f

Browse files
committed
[PluginManager] Filter by repository under rightclick on the repo list (only active if > 1 repo configured)
1 parent 6caa8bc commit 1d2117f

File tree

4 files changed

+69
-15
lines changed

4 files changed

+69
-15
lines changed

python/pyplugin_installer/installer.py

+15-2
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ def fetchAvailablePlugins(self, reloadMode):
9999

100100
if reloadMode:
101101
repositories.load()
102+
plugins.clearRepoCache()
102103
plugins.getAllInstalled()
103104

104105
for key in repositories.allEnabled():
@@ -164,13 +165,18 @@ def exportRepositoriesToManager(self):
164165
v=str(QGis.QGIS_VERSION_INT)
165166
url += "?qgis=%d.%d" % ( int(v[0]), int(v[1:3]) )
166167
repository = repositories.all()[key]
168+
if repositories.inspectionFilter():
169+
enabled = ( key == repositories.inspectionFilter() )
170+
else:
171+
enabled = repositories.all()[key]["enabled"]
167172
iface.pluginManagerInterface().addToRepositoryList({
168173
"name" : key,
169174
"url" : url,
170-
"enabled" : repositories.all()[key]["enabled"] and "true" or "false",
175+
"enabled" : enabled and "true" or "false",
171176
"valid" : repositories.all()[key]["valid"] and "true" or "false",
172177
"state" : str(repositories.all()[key]["state"]),
173-
"error" : repositories.all()[key]["error"]
178+
"error" : repositories.all()[key]["error"],
179+
"inspection_filter" : repositories.inspectionFilter() and "true" or "false"
174180
})
175181

176182

@@ -478,3 +484,10 @@ def deleteRepository(self, reposName):
478484
repositories.remove(reposName)
479485
plugins.removeRepository(reposName)
480486
self.reloadAndExportData()
487+
488+
489+
# ----------------------------------------- #
490+
def setRepositoryInspectionFilter(self, reposName = None):
491+
""" temporarily block another repositories to fetch only one for inspection """
492+
repositories.setInspectionFilter(reposName)
493+
self.reloadAndExportData()

python/pyplugin_installer/installer_data.py

+29
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ def __init__(self):
232232
QObject.__init__(self)
233233
self.mRepositories = {}
234234
self.httpId = {} # {httpId : repoName}
235+
self.mInspectionFilter = None
235236

236237

237238
# ----------------------------------------- #
@@ -243,6 +244,9 @@ def all(self):
243244
# ----------------------------------------- #
244245
def allEnabled(self):
245246
""" return dict of all enabled and valid repositories """
247+
if self.mInspectionFilter:
248+
return { self.mInspectionFilter: self.mRepositories[self.mInspectionFilter] }
249+
246250
repos = {}
247251
for i in self.mRepositories:
248252
if self.mRepositories[i]["enabled"] and self.mRepositories[i]["valid"]:
@@ -254,6 +258,13 @@ def allEnabled(self):
254258
def allUnavailable(self):
255259
""" return dict of all unavailable repositories """
256260
repos = {}
261+
262+
if self.mInspectionFilter:
263+
# return the inspected repo if unavailable, otherwise empty dict
264+
if self.mRepositories[self.mInspectionFilter]["state"] == 3:
265+
repos [self.mInspectionFilter] = self.mRepositories[self.mInspectionFilter]
266+
return repos
267+
257268
for i in self.mRepositories:
258269
if self.mRepositories[i]["enabled"] and self.mRepositories[i]["valid"] and self.mRepositories[i]["state"] == 3:
259270
repos[i] = self.mRepositories[i]
@@ -479,6 +490,18 @@ def xmlDownloaded(self,nr,state):
479490
if not self.fetchingInProgress():
480491
self.checkingDone.emit()
481492

493+
494+
# ----------------------------------------- #
495+
def inspectionFilter(self):
496+
""" return inspection filter (only one repository to be fetched) """
497+
return self.mInspectionFilter
498+
499+
500+
# ----------------------------------------- #
501+
def setInspectionFilter(self, key = None):
502+
""" temporarily disable all repositories but this for inspection """
503+
self.mInspectionFilter = key
504+
482505
# --- /class Repositories ---------------------------------------------------------------- #
483506

484507

@@ -522,6 +545,12 @@ def keyByUrl(self, name):
522545
return None
523546

524547

548+
# ----------------------------------------- #
549+
def clearRepoCache(self):
550+
""" clears the repo cache before re-fetching repositories """
551+
self.repoCache = {}
552+
553+
525554
# ----------------------------------------- #
526555
def addFromRepository(self, plugin):
527556
""" add given plugin to the repoCache """

src/app/pluginmanager/qgspluginmanager.cpp

+20-11
Original file line numberDiff line numberDiff line change
@@ -787,6 +787,10 @@ void QgsPluginManager::clearRepositoryList()
787787
buttonRefreshRepos->setEnabled( false );
788788
buttonEditRep->setEnabled( false );
789789
buttonDeleteRep->setEnabled( false );
790+
foreach ( QAction * action, treeRepositories->actions() )
791+
{
792+
treeRepositories->removeAction( action );
793+
}
790794
}
791795

792796

@@ -797,11 +801,14 @@ void QgsPluginManager::addToRepositoryList( QMap<QString, QString> repository )
797801
// If the item is second on the tree, add a context menu
798802
if ( buttonRefreshRepos->isEnabled() && treeRepositories->actions().count() < 1 )
799803
{
800-
QAction* actionEnableThisRepositoryOnly = new QAction( tr( "Enable selected repository only" ), treeRepositories );
801-
actionEnableThisRepositoryOnly->setCheckable( true );
804+
QAction* actionEnableThisRepositoryOnly = new QAction( tr( "Only show plugins from selected repository" ), treeRepositories );
802805
treeRepositories->addAction( actionEnableThisRepositoryOnly );
806+
connect( actionEnableThisRepositoryOnly, SIGNAL( triggered() ), this, SLOT( setRepositoryFilter() ) );
803807
treeRepositories->setContextMenuPolicy( Qt::ActionsContextMenu );
804-
connect( actionEnableThisRepositoryOnly, SIGNAL( toggled( bool ) ), this, SLOT( enableSelectedRepositoryOnly( bool ) ) );
808+
QAction* actionClearFilter = new QAction( tr( "Clear filter" ), treeRepositories );
809+
actionClearFilter->setEnabled( repository.value( "inspection_filter" ) == "true" );
810+
treeRepositories->addAction( actionClearFilter );
811+
connect( actionClearFilter, SIGNAL( triggered( ) ), this, SLOT( clearRepositoryFilter() ) );
805812
}
806813

807814
QString key = repository.value( "name" );
@@ -1062,26 +1069,28 @@ void QgsPluginManager::on_treeRepositories_doubleClicked( QModelIndex )
10621069

10631070

10641071

1065-
void QgsPluginManager::enableSelectedRepositoryOnly( bool checked )
1072+
void QgsPluginManager::setRepositoryFilter( )
10661073
{
1067-
if ( ! checked ) {
1068-
QgsDebugMsg( "Enabling all repositories back");
1069-
QgsPythonRunner::run( QString( "pyplugin_installer.instance().enableThisRepositoryOnly()" ) );
1070-
return;
1071-
}
1072-
10731074
QTreeWidgetItem * current = treeRepositories->currentItem();
10741075
if ( current )
10751076
{
10761077
QString key = current->text( 1 );
10771078
key = key.replace( "\'", "\\\'" ).replace( "\"", "\\\"" );
10781079
QgsDebugMsg( "Disabling all repositories but selected: " + key );
1079-
QgsPythonRunner::run( QString( "pyplugin_installer.instance().enableThisRepositoryOnly('%1')" ).arg( key ) );
1080+
QgsPythonRunner::run( QString( "pyplugin_installer.instance().setRepositoryInspectionFilter('%1')" ).arg( key ) );
10801081
}
10811082
}
10821083

10831084

10841085

1086+
void QgsPluginManager::clearRepositoryFilter( )
1087+
{
1088+
QgsDebugMsg( "Enabling all repositories back");
1089+
QgsPythonRunner::run( QString( "pyplugin_installer.instance().setRepositoryInspectionFilter()" ) );
1090+
}
1091+
1092+
1093+
10851094
void QgsPluginManager::on_buttonRefreshRepos_clicked( )
10861095
{
10871096
QgsDebugMsg( "Refreshing repositories..." );

src/app/pluginmanager/qgspluginmanager.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,11 @@ class QgsPluginManager : public QgsOptionsDialogBase, private Ui::QgsPluginManag
156156
//! Reimplement QgsOptionsDialogBase method to prevent modifying the tab list by signals from the stacked widget
157157
void optionsStackedWidget_CurrentChanged( int indx ) { Q_UNUSED( indx ) }
158158

159-
//! Enable selected repository only
160-
void enableSelectedRepositoryOnly( bool checked );
159+
//! Only show plugins from selected repository (e.g. for inspection)
160+
void setRepositoryFilter( );
161+
162+
//! Enable all repositories disabled by "Enable selected repository only"
163+
void clearRepositoryFilter( );
161164

162165
private:
163166
//! Return true if given plugin is present in QgsPluginRegistry (c++ plugins) or is enabled in QSettings (Python plugins)

0 commit comments

Comments
 (0)