Skip to content

Commit

Permalink
Fix QgsStyle addSymbol
Browse files Browse the repository at this point in the history
  • Loading branch information
troopa81 committed Feb 27, 2023
1 parent 7a2a252 commit 9d10a32
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 1 deletion.
8 changes: 7 additions & 1 deletion src/core/symbology/qgsstyle.cpp
Expand Up @@ -291,7 +291,13 @@ bool QgsStyle::renameEntity( QgsStyle::StyleEntity type, const QString &oldName,
QgsSymbol *QgsStyle::symbol( const QString &name )
{
const QgsSymbol *symbol = symbolRef( name );
return symbol ? symbol->clone() : nullptr;
if ( !symbol )
return nullptr;

QgsSymbol *newSymbol = symbol->clone();
QgsSymbolLayerUtils::resetSymbolLayerIds( newSymbol );

return newSymbol;
}

const QgsSymbol *QgsStyle::symbolRef( const QString &name ) const
Expand Down
33 changes: 33 additions & 0 deletions tests/src/python/test_qgsstylemodel.py
Expand Up @@ -11,6 +11,8 @@

import qgis # NOQA
from qgis.PyQt.QtCore import QModelIndex, QSize, Qt
from qgis.testing import start_app, unittest
from qgis.PyQt.QtCore import Qt, QSize, QModelIndex
from qgis.PyQt.QtGui import QColor
from qgis.core import (
QgsAbstract3DSymbol,
Expand Down Expand Up @@ -2732,6 +2734,37 @@ def testSetData(self):
self.assertEqual(model.data(model.index(5, 0), Qt.DisplayRole), 'symbol3d new name')
self.assertEqual(style.symbol3DNames(), ['symbol3d new name'])

def test_reset_symbollayer_ids(self):
"""
Test that we have different symbol layer ids everytime we get symbol from style
"""
style = QgsStyle()
style.createMemoryDatabase()

layer = QgsLinePatternFillSymbolLayer()
fill_symbol = QgsFillSymbol([layer])

self.assertEqual(len(fill_symbol.symbolLayers()), 1)
subsymbol = fill_symbol.symbolLayers()[0].subSymbol()
self.assertTrue(subsymbol)
self.assertEqual(len(subsymbol.symbolLayers()), 1)
child_sl = subsymbol.symbolLayers()[0]
self.assertTrue(child_sl)
old_id = child_sl.id()
self.assertTrue(child_sl.id())

self.assertTrue(style.addSymbol('fillsymbol', fill_symbol, True))

new_fill_symbol = style.symbol('fillsymbol')
self.assertEqual(len(new_fill_symbol.symbolLayers()), 1)
subsymbol = new_fill_symbol.symbolLayers()[0].subSymbol()
self.assertTrue(subsymbol)
self.assertEqual(len(subsymbol.symbolLayers()), 1)
child_sl = subsymbol.symbolLayers()[0]
self.assertTrue(child_sl)
self.assertTrue(child_sl.id())
self.assertTrue(child_sl.id() != old_id)


if __name__ == '__main__':
unittest.main()

0 comments on commit 9d10a32

Please sign in to comment.