From 8cd7c30f79f252005642bc98b8b1bdec037b8ba1 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Fri, 23 Oct 2020 09:30:55 +1000 Subject: [PATCH 1/2] Fix can no longer paste colors from text strings, add tests --- src/core/symbology/qgssymbollayerutils.cpp | 25 +++--- tests/src/python/test_qgssymbollayerutils.py | 86 +++++++++++++++++++- 2 files changed, 98 insertions(+), 13 deletions(-) diff --git a/src/core/symbology/qgssymbollayerutils.cpp b/src/core/symbology/qgssymbollayerutils.cpp index 1501bee3f331..8a0d00dc549f 100644 --- a/src/core/symbology/qgssymbollayerutils.cpp +++ b/src/core/symbology/qgssymbollayerutils.cpp @@ -3261,23 +3261,26 @@ QMimeData *QgsSymbolLayerUtils::colorToMimeData( const QColor &color ) QColor QgsSymbolLayerUtils::colorFromMimeData( const QMimeData *mimeData, bool &hasAlpha ) { - if ( !mimeData->hasColor() ) - return QColor(); - //attempt to read color data directly from mime - QColor mimeColor = mimeData->colorData().value(); - if ( mimeColor.isValid() ) + if ( mimeData->hasColor() ) { - hasAlpha = true; - return mimeColor; + QColor mimeColor = mimeData->colorData().value(); + if ( mimeColor.isValid() ) + { + hasAlpha = true; + return mimeColor; + } } //attempt to intrepret a color from mime text data - hasAlpha = false; - QColor textColor = QgsSymbolLayerUtils::parseColorWithAlpha( mimeData->text(), hasAlpha ); - if ( textColor.isValid() ) + if ( mimeData->hasText() ) { - return textColor; + hasAlpha = false; + QColor textColor = QgsSymbolLayerUtils::parseColorWithAlpha( mimeData->text(), hasAlpha ); + if ( textColor.isValid() ) + { + return textColor; + } } //could not get color from mime data diff --git a/tests/src/python/test_qgssymbollayerutils.py b/tests/src/python/test_qgssymbollayerutils.py index e4be320b981a..5aa42d7ab31f 100644 --- a/tests/src/python/test_qgssymbollayerutils.py +++ b/tests/src/python/test_qgssymbollayerutils.py @@ -16,8 +16,16 @@ QgsMarkerSymbol, QgsArrowSymbolLayer, QgsUnitTypes) -from qgis.PyQt.QtGui import QColor, QPolygonF -from qgis.PyQt.QtCore import QSizeF, QPointF +from qgis.PyQt.QtGui import ( + QColor, + QPolygonF, + QImage +) +from qgis.PyQt.QtCore import ( + QSizeF, + QPointF, + QMimeData +) from qgis.testing import unittest, start_app start_app() @@ -326,6 +334,80 @@ def testAppendPolyline(self): [QPointF(11.0, 2.0), QPointF(11.0, 12.0), QPointF(111.0, 12.0), QPointF(111.0, 14.0), QPointF(111.0, 15.0)]) + def testColorFromMimeData(self): + data = QMimeData() + color, has_alpha = QgsSymbolLayerUtils.colorFromMimeData(data) + self.assertFalse(color.isValid()) + + # color data + data.setColorData(QColor(255, 0, 255)) + color, has_alpha = QgsSymbolLayerUtils.colorFromMimeData(data) + self.assertTrue(color.isValid()) + self.assertEqual(color.name(), '#ff00ff') + # should be true regardless of the actual color's opacity -- a QColor object has innate knowledge of the alpha, + # so our input color HAS an alpha of 255 + self.assertTrue(has_alpha) + self.assertEqual(color.alpha(), 255) + + data.setColorData(QColor(255, 0, 255, 100)) + color, has_alpha = QgsSymbolLayerUtils.colorFromMimeData(data) + self.assertTrue(color.isValid()) + self.assertEqual(color.name(), '#ff00ff') + self.assertEqual(color.alpha(), 100) + self.assertTrue(has_alpha) + + # text data + data = QMimeData() + data.setText('#ff00ff') + color, has_alpha = QgsSymbolLayerUtils.colorFromMimeData(data) + self.assertTrue(color.isValid()) + self.assertEqual(color.name(), '#ff00ff') + # should be False -- no alpha was specified + self.assertFalse(has_alpha) + self.assertEqual(color.alpha(), 255) + + data.setText('#ff00ff66') + color, has_alpha = QgsSymbolLayerUtils.colorFromMimeData(data) + self.assertTrue(color.isValid()) + self.assertEqual(color.name(), '#ff00ff') + self.assertTrue(has_alpha) + self.assertEqual(color.alpha(), 102) + + # "#" is optional + data.setText('ff00ff66') + color, has_alpha = QgsSymbolLayerUtils.colorFromMimeData(data) + self.assertTrue(color.isValid()) + self.assertEqual(color.name(), '#ff00ff') + self.assertTrue(has_alpha) + self.assertEqual(color.alpha(), 102) + + data.setText('255,0,255') + color, has_alpha = QgsSymbolLayerUtils.colorFromMimeData(data) + self.assertTrue(color.isValid()) + self.assertEqual(color.name(), '#ff00ff') + self.assertFalse(has_alpha) + self.assertEqual(color.alpha(), 255) + + data.setText('255,0,255,0.5') + color, has_alpha = QgsSymbolLayerUtils.colorFromMimeData(data) + self.assertTrue(color.isValid()) + self.assertEqual(color.name(), '#ff00ff') + self.assertTrue(has_alpha) + self.assertEqual(color.alpha(), 128) + + data.setText('rgba(255,0,255,0.5)') + color, has_alpha = QgsSymbolLayerUtils.colorFromMimeData(data) + self.assertTrue(color.isValid()) + self.assertEqual(color.name(), '#ff00ff') + self.assertTrue(has_alpha) + self.assertEqual(color.alpha(), 128) + + # wrong data type + data = QMimeData() + data.setImageData(QImage()) + color, has_alpha = QgsSymbolLayerUtils.colorFromMimeData(data) + self.assertFalse(color.isValid()) + if __name__ == '__main__': unittest.main() From 35ce498d8abf92d904b1709b5f50b5353d085005 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Fri, 23 Oct 2020 10:36:24 +1000 Subject: [PATCH 2/2] Fix PyQGIS docs for colorFromMimeData --- .../auto_generated/symbology/qgssymbollayerutils.sip.in | 8 +++----- src/core/symbology/qgssymbollayerutils.h | 5 ++--- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/python/core/auto_generated/symbology/qgssymbollayerutils.sip.in b/python/core/auto_generated/symbology/qgssymbollayerutils.sip.in index 30a36185f9b3..17ceae770711 100644 --- a/python/core/auto_generated/symbology/qgssymbollayerutils.sip.in +++ b/python/core/auto_generated/symbology/qgssymbollayerutils.sip.in @@ -566,16 +566,14 @@ mime data's text with the color's hex code. .. versionadded:: 2.5 %End - static QColor colorFromMimeData( const QMimeData *data, bool &hasAlpha ); + static QColor colorFromMimeData( const QMimeData *data, bool &hasAlpha /Out/ ); %Docstring Attempts to parse mime data as a color :param data: mime data to parse -:param hasAlpha: will be set to ``True`` if mime data was interpreted as a color containing - an explicit alpha value -:return: valid color if mimedata could be interpreted as a color, otherwise an - invalid color +:return: - valid color if mimedata could be interpreted as a color, otherwise an invalid color + - hasAlpha: will be set to ``True`` if mime data was interpreted as a color containing an explicit alpha value .. versionadded:: 2.5 %End diff --git a/src/core/symbology/qgssymbollayerutils.h b/src/core/symbology/qgssymbollayerutils.h index 98493d684fba..98598ebc22a0 100644 --- a/src/core/symbology/qgssymbollayerutils.h +++ b/src/core/symbology/qgssymbollayerutils.h @@ -537,11 +537,10 @@ class CORE_EXPORT QgsSymbolLayerUtils * \param data mime data to parse * \param hasAlpha will be set to TRUE if mime data was interpreted as a color containing * an explicit alpha value - * \returns valid color if mimedata could be interpreted as a color, otherwise an - * invalid color + * \returns valid color if mimedata could be interpreted as a color, otherwise an invalid color * \since QGIS 2.5 */ - static QColor colorFromMimeData( const QMimeData *data, bool &hasAlpha ); + static QColor colorFromMimeData( const QMimeData *data, bool &hasAlpha SIP_OUT ); /** * Attempts to parse mime data as a list of named colors