diff --git a/python/core/auto_generated/processing/qgsprocessingalgorithm.sip.in b/python/core/auto_generated/processing/qgsprocessingalgorithm.sip.in index bbc322a202f..a6059326b17 100644 --- a/python/core/auto_generated/processing/qgsprocessingalgorithm.sip.in +++ b/python/core/auto_generated/processing/qgsprocessingalgorithm.sip.in @@ -43,6 +43,7 @@ Abstract base class for processing algorithms. FlagCanCancel, FlagRequiresMatchingCrs, FlagNoThreading, + FlagDisplayNameIsLiteral, FlagDeprecated, }; typedef QFlags Flags; diff --git a/python/plugins/processing/algs/gdal/OgrToPostGis.py b/python/plugins/processing/algs/gdal/OgrToPostGis.py index ca7f18c5d4b..8479d5433de 100644 --- a/python/plugins/processing/algs/gdal/OgrToPostGis.py +++ b/python/plugins/processing/algs/gdal/OgrToPostGis.py @@ -158,7 +158,7 @@ class OgrToPostGis(GdalAlgorithm): return 'importvectorintopostgisdatabasenewconnection' def displayName(self): - return self.tr('Import Vector into PostGIS database (new connection)') + return self.tr('Import vector into PostGIS database (new connection)') def group(self): return self.tr('Vector miscellaneous') diff --git a/python/plugins/processing/algs/gdal/buildvrt.py b/python/plugins/processing/algs/gdal/buildvrt.py index cadbf4e6e93..cc4f60d0d5f 100644 --- a/python/plugins/processing/algs/gdal/buildvrt.py +++ b/python/plugins/processing/algs/gdal/buildvrt.py @@ -30,7 +30,8 @@ import os from qgis.PyQt.QtCore import QCoreApplication from qgis.PyQt.QtGui import QIcon -from qgis.core import (QgsProcessing, +from qgis.core import (QgsProcessingAlgorithm, + QgsProcessing, QgsProperty, QgsProcessingParameterMultipleLayers, QgsProcessingParameterEnum, @@ -93,7 +94,7 @@ class buildvrt(GdalAlgorithm): return 'buildvirtualraster' def displayName(self): - return QCoreApplication.translate("buildvrt", 'Build Virtual Raster') + return QCoreApplication.translate("buildvrt", 'Build virtual raster') def icon(self): return QIcon(os.path.join(pluginPath, 'images', 'gdaltools', 'vrt.png')) diff --git a/python/plugins/processing/algs/gdal/fillnodata.py b/python/plugins/processing/algs/gdal/fillnodata.py index 90795c12d0f..bdc38c7b86b 100644 --- a/python/plugins/processing/algs/gdal/fillnodata.py +++ b/python/plugins/processing/algs/gdal/fillnodata.py @@ -27,7 +27,8 @@ __revision__ = '$Format:%H$' import os -from qgis.core import (QgsRasterFileWriter, +from qgis.core import (QgsProcessingAlgorithm, + QgsRasterFileWriter, QgsProcessingException, QgsProcessingParameterRasterLayer, QgsProcessingParameterBand, @@ -93,6 +94,9 @@ class fillnodata(GdalAlgorithm): def commandName(self): return 'gdal_fillnodata' + def flags(self): + return super().flags() | QgsProcessingAlgorithm.FlagDisplayNameIsLiteral + def getConsoleCommands(self, parameters, context, feedback, executing=True): arguments = [] arguments.append('-md') diff --git a/python/plugins/processing/algs/gdal/gdal2tiles.py b/python/plugins/processing/algs/gdal/gdal2tiles.py index c28dfb92c53..2d9c3ea670f 100644 --- a/python/plugins/processing/algs/gdal/gdal2tiles.py +++ b/python/plugins/processing/algs/gdal/gdal2tiles.py @@ -26,7 +26,8 @@ __copyright__ = '(C) 2016, Médéric Ribreux' __revision__ = '$Format:%H$' -from qgis.core import (QgsProcessingException, +from qgis.core import (QgsProcessingAlgorithm, + QgsProcessingException, QgsProcessingParameterDefinition, QgsProcessingParameterRasterLayer, QgsProcessingParameterCrs, @@ -158,6 +159,9 @@ class gdal2tiles(GdalAlgorithm): def commandName(self): return 'gdal2tiles' + def flags(self): + return super().flags() | QgsProcessingAlgorithm.FlagDisplayNameIsLiteral + def getConsoleCommands(self, parameters, context, feedback, executing=True): arguments = [] diff --git a/python/plugins/processing/algs/gdal/gdal2xyz.py b/python/plugins/processing/algs/gdal/gdal2xyz.py index 5f120b8debd..2555d092437 100644 --- a/python/plugins/processing/algs/gdal/gdal2xyz.py +++ b/python/plugins/processing/algs/gdal/gdal2xyz.py @@ -25,7 +25,8 @@ __copyright__ = '(C) 2013, Alexander Bruy' __revision__ = '$Format:%H$' -from qgis.core import (QgsProcessing, +from qgis.core import (QgsProcessingAlgorithm, + QgsProcessing, QgsProcessingException, QgsProcessingParameterRasterLayer, QgsProcessingParameterBand, @@ -75,6 +76,9 @@ class gdal2xyz(GdalAlgorithm): def commandName(self): return 'gdal2xyz' + def flags(self): + return super().flags() | QgsProcessingAlgorithm.FlagDisplayNameIsLiteral + def getConsoleCommands(self, parameters, context, feedback, executing=True): arguments = [] arguments.append('-band') diff --git a/python/plugins/processing/algs/gdal/gdaltindex.py b/python/plugins/processing/algs/gdal/gdaltindex.py index 81a9cdb6f46..7b0a1932600 100644 --- a/python/plugins/processing/algs/gdal/gdaltindex.py +++ b/python/plugins/processing/algs/gdal/gdaltindex.py @@ -31,6 +31,7 @@ from qgis.PyQt.QtGui import QIcon from qgis.core import (QgsMapLayer, QgsProcessing, + QgsProcessingAlgorithm, QgsProcessingException, QgsProcessingParameterCrs, QgsProcessingParameterEnum, @@ -106,7 +107,7 @@ class gdaltindex(GdalAlgorithm): return 'tileindex' def displayName(self): - return self.tr('Tile Index') + return self.tr('Tile index') def group(self): return self.tr('Raster miscellaneous') diff --git a/python/plugins/processing/algs/gdal/ogr2ogrtopostgislist.py b/python/plugins/processing/algs/gdal/ogr2ogrtopostgislist.py index d026e7043f3..3803a2ebd5b 100644 --- a/python/plugins/processing/algs/gdal/ogr2ogrtopostgislist.py +++ b/python/plugins/processing/algs/gdal/ogr2ogrtopostgislist.py @@ -171,7 +171,7 @@ class Ogr2OgrToPostGisList(GdalAlgorithm): return 'importvectorintopostgisdatabaseavailableconnections' def displayName(self): - return self.tr('Import Vector into PostGIS database (available connections)') + return self.tr('Import vector into PostGIS database (available connections)') def group(self): return self.tr('Vector miscellaneous') diff --git a/python/plugins/processing/algs/grass7/Grass7Algorithm.py b/python/plugins/processing/algs/grass7/Grass7Algorithm.py index 19b37e30d3e..29a8c6f4705 100644 --- a/python/plugins/processing/algs/grass7/Grass7Algorithm.py +++ b/python/plugins/processing/algs/grass7/Grass7Algorithm.py @@ -160,7 +160,7 @@ class Grass7Algorithm(QgsProcessingAlgorithm): def flags(self): # TODO - maybe it's safe to background thread this? - return super().flags() | QgsProcessingAlgorithm.FlagNoThreading + return super().flags() | QgsProcessingAlgorithm.FlagNoThreading | QgsProcessingAlgorithm.FlagDisplayNameIsLiteral def tr(self, string, context=''): if context == '': diff --git a/python/plugins/processing/gui/menus.py b/python/plugins/processing/gui/menus.py index 8429b0b0a91..5d61e69611c 100644 --- a/python/plugins/processing/gui/menus.py +++ b/python/plugins/processing/gui/menus.py @@ -32,7 +32,7 @@ from processing.core.ProcessingConfig import ProcessingConfig, Setting from processing.gui.MessageDialog import MessageDialog from processing.gui.AlgorithmDialog import AlgorithmDialog from qgis.utils import iface -from qgis.core import QgsApplication, QgsMessageLog, QgsStringUtils +from qgis.core import QgsApplication, QgsMessageLog, QgsStringUtils, QgsProcessingAlgorithm from processing.gui.MessageBarProgress import MessageBarProgress from processing.gui.AlgorithmExecutor import execute from processing.gui.Postprocessing import handleAlgorithmResults @@ -183,7 +183,11 @@ def removeMenus(): def addAlgorithmEntry(alg, menuName, submenuName, actionText=None, icon=None, addButton=False): if actionText is None: - actionText = QgsStringUtils.capitalize(alg.displayName(), QgsStringUtils.TitleCase) + QCoreApplication.translate('Processing', '…') + if alg.flags() & QgsProcessingAlgorithm.FlagDisplayNameIsLiteral: + alg_title = alg.displayName() + else: + alg_title = QgsStringUtils.capitalize(alg.displayName(), QgsStringUtils.TitleCase) + actionText = alg_title + QCoreApplication.translate('Processing', '…') action = QAction(icon or alg.icon(), actionText, iface.mainWindow()) action.setData(alg.id()) action.triggered.connect(lambda: _executeAlgorithm(alg)) diff --git a/src/core/processing/qgsprocessingalgorithm.h b/src/core/processing/qgsprocessingalgorithm.h index 0556eb8dc90..cef5148bc6b 100644 --- a/src/core/processing/qgsprocessingalgorithm.h +++ b/src/core/processing/qgsprocessingalgorithm.h @@ -73,6 +73,7 @@ class CORE_EXPORT QgsProcessingAlgorithm FlagCanCancel = 1 << 4, //!< Algorithm can be canceled FlagRequiresMatchingCrs = 1 << 5, //!< Algorithm requires that all input layers have matching coordinate reference systems FlagNoThreading = 1 << 6, //!< Algorithm is not thread safe and cannot be run in a background thread, e.g. for algorithms which manipulate the current project, layer selections, or with external dependencies which are not thread-safe. + FlagDisplayNameIsLiteral = 1 << 7, //!< Algorithm's display name is a static literal string, and should not be translated or automatically formatted. For use with algorithms named after commands, e.g. GRASS 'v.in.ogr'. FlagDeprecated = FlagHideFromToolbox | FlagHideFromModeler, //!< Algorithm is deprecated }; Q_DECLARE_FLAGS( Flags, Flag ) diff --git a/src/gui/processing/qgsprocessingalgorithmdialogbase.cpp b/src/gui/processing/qgsprocessingalgorithmdialogbase.cpp index d36d460d3e8..03b9a9582f7 100644 --- a/src/gui/processing/qgsprocessingalgorithmdialogbase.cpp +++ b/src/gui/processing/qgsprocessingalgorithmdialogbase.cpp @@ -127,7 +127,12 @@ QgsProcessingAlgorithmDialogBase::QgsProcessingAlgorithmDialogBase( QWidget *par void QgsProcessingAlgorithmDialogBase::setAlgorithm( QgsProcessingAlgorithm *algorithm ) { mAlgorithm = algorithm; - setWindowTitle( QgsStringUtils::capitalize( mAlgorithm->displayName(), QgsStringUtils::TitleCase ) ); + QString title; + if ( algorithm->flags() & QgsProcessingAlgorithm::FlagDisplayNameIsLiteral ) + title = mAlgorithm->displayName(); + else + title = QgsStringUtils::capitalize( mAlgorithm->displayName(), QgsStringUtils::TitleCase ); + setWindowTitle( title ); QString algHelp = formatHelp( algorithm ); if ( algHelp.isEmpty() )