Skip to content

Commit

Permalink
Fix can no longer paste colors from text strings, add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Oct 23, 2020
1 parent 8c623b2 commit f86a2e9
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 13 deletions.
25 changes: 14 additions & 11 deletions src/core/symbology/qgssymbollayerutils.cpp
Expand Up @@ -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<QColor>();
if ( mimeColor.isValid() )
if ( mimeData->hasColor() )
{
hasAlpha = true;
return mimeColor;
QColor mimeColor = mimeData->colorData().value<QColor>();
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
Expand Down
86 changes: 84 additions & 2 deletions tests/src/python/test_qgssymbollayerutils.py
Expand Up @@ -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()
Expand Down Expand Up @@ -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()

0 comments on commit f86a2e9

Please sign in to comment.