Skip to content

Commit f3f1b8e

Browse files
committedJan 16, 2018
Save/restore form "editable" and "label on top" settings
Fixes #17860
1 parent 7998745 commit f3f1b8e

File tree

3 files changed

+138
-0
lines changed

3 files changed

+138
-0
lines changed
 

‎src/core/qgseditformconfig.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,7 @@ void QgsEditFormConfig::setSuppress( QgsEditFormConfig::FeatureFormSuppress s )
261261
void QgsEditFormConfig::readXml( const QDomNode &node, const QgsReadWriteContext &context )
262262
{
263263
d.detach();
264+
264265
QDomNode editFormNode = node.namedItem( QStringLiteral( "editform" ) );
265266
if ( !editFormNode.isNull() )
266267
{
@@ -338,6 +339,22 @@ void QgsEditFormConfig::readXml( const QDomNode &node, const QgsReadWriteContext
338339
}
339340
}
340341

342+
d->mFieldEditables.clear();
343+
QDomNodeList editableNodeList = node.namedItem( QStringLiteral( "editable" ) ).toElement().childNodes();
344+
for ( int i = 0; i < editableNodeList.size(); ++i )
345+
{
346+
QDomElement editableElement = editableNodeList.at( i ).toElement();
347+
d->mFieldEditables.insert( editableElement.attribute( QStringLiteral( "name" ) ), static_cast< bool >( editableElement.attribute( QStringLiteral( "editable" ) ).toInt() ) );
348+
}
349+
350+
d->mLabelOnTop.clear();
351+
QDomNodeList labelOnTopNodeList = node.namedItem( QStringLiteral( "labelOnTop" ) ).toElement().childNodes();
352+
for ( int i = 0; i < labelOnTopNodeList.size(); ++i )
353+
{
354+
QDomElement labelOnTopElement = labelOnTopNodeList.at( i ).toElement();
355+
d->mLabelOnTop.insert( labelOnTopElement.attribute( QStringLiteral( "name" ) ), static_cast< bool >( labelOnTopElement.attribute( QStringLiteral( "labelOnTop" ) ).toInt() ) );
356+
}
357+
341358
QDomNodeList widgetsNodeList = node.namedItem( QStringLiteral( "widgets" ) ).toElement().childNodes();
342359

343360
for ( int i = 0; i < widgetsNodeList.size(); ++i )
@@ -439,6 +456,26 @@ void QgsEditFormConfig::writeXml( QDomNode &node, const QgsReadWriteContext &con
439456
node.appendChild( tabsElem );
440457
}
441458

459+
QDomElement editableElem = doc.createElement( QStringLiteral( "editable" ) );
460+
for ( auto editIt = d->mFieldEditables.constBegin(); editIt != d->mFieldEditables.constEnd(); ++editIt )
461+
{
462+
QDomElement fieldElem = doc.createElement( QStringLiteral( "field" ) );
463+
fieldElem.setAttribute( QStringLiteral( "name" ), editIt.key() );
464+
fieldElem.setAttribute( QStringLiteral( "editable" ), editIt.value() ? QStringLiteral( "1" ) : QStringLiteral( "0" ) );
465+
editableElem.appendChild( fieldElem );
466+
}
467+
node.appendChild( editableElem );
468+
469+
QDomElement labelOnTopElem = doc.createElement( QStringLiteral( "labelOnTop" ) );
470+
for ( auto labelOnTopIt = d->mLabelOnTop.constBegin(); labelOnTopIt != d->mLabelOnTop.constEnd(); ++labelOnTopIt )
471+
{
472+
QDomElement fieldElem = doc.createElement( QStringLiteral( "field" ) );
473+
fieldElem.setAttribute( QStringLiteral( "name" ), labelOnTopIt.key() );
474+
fieldElem.setAttribute( QStringLiteral( "labelOnTop" ), labelOnTopIt.value() ? QStringLiteral( "1" ) : QStringLiteral( "0" ) );
475+
labelOnTopElem.appendChild( fieldElem );
476+
}
477+
node.appendChild( labelOnTopElem );
478+
442479
QDomElement widgetsElem = doc.createElement( QStringLiteral( "widgets" ) );
443480

444481
QMap<QString, QVariantMap >::ConstIterator configIt( d->mWidgetConfigs.constBegin() );

‎tests/src/python/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ ADD_PYTHON_TEST(PyQgsDateTimeEdit test_qgsdatetimeedit.py)
3434
ADD_PYTHON_TEST(PyQgsDateTimeStatisticalSummary test_qgsdatetimestatisticalsummary.py)
3535
ADD_PYTHON_TEST(PyQgsDelimitedTextProvider test_qgsdelimitedtextprovider.py)
3636
ADD_PYTHON_TEST(PyQgsDistanceArea test_qgsdistancearea.py)
37+
ADD_PYTHON_TEST(PyQgsEditFormConfig test_qgseditformconfig.py)
3738
ADD_PYTHON_TEST(PyQgsEditWidgets test_qgseditwidgets.py)
3839
ADD_PYTHON_TEST(PyQgsEllipsoidUtils test_qgsellipsoidutils.py)
3940
ADD_PYTHON_TEST(PyQgsEncodingSelectionDialog test_qgsencodingselectiondialog.py)
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
# -*- coding: utf-8 -*-
2+
"""QGIS Unit tests for QgsEditFormConfig.
3+
4+
.. note:: This program is free software; you can redistribute it and/or modify
5+
it under the terms of the GNU General Public License as published by
6+
the Free Software Foundation; either version 2 of the License, or
7+
(at your option) any later version.
8+
"""
9+
__author__ = 'Nyall Dawson'
10+
__date__ = '11/04/2017'
11+
__copyright__ = 'Copyright 2018, The QGIS Project'
12+
# This will get replaced with a git SHA1 when you do a git archive
13+
__revision__ = '$Format:%H$'
14+
15+
import qgis # NOQA
16+
17+
from qgis.core import (QgsVectorLayer,
18+
QgsReadWriteContext)
19+
from qgis.gui import QgsGui
20+
21+
from qgis.testing import start_app, unittest
22+
from qgis.PyQt.QtXml import QDomDocument, QDomElement
23+
24+
start_app()
25+
26+
27+
class TestQgsEditFormConfig(unittest.TestCase):
28+
29+
@classmethod
30+
def setUpClass(cls):
31+
QgsGui.editorWidgetRegistry().initEditors()
32+
33+
def createLayer(self):
34+
self.layer = QgsVectorLayer("Point?field=fldtxt:string&field=fldint:integer",
35+
"addfeat", "memory")
36+
return self.layer
37+
38+
def testReadWriteXml(self):
39+
layer = self.createLayer()
40+
config = layer.editFormConfig()
41+
42+
config.setReadOnly(0, True)
43+
config.setReadOnly(1, False)
44+
config.setLabelOnTop(0, False)
45+
config.setLabelOnTop(1, True)
46+
47+
doc = QDomDocument("testdoc")
48+
elem = doc.createElement('edit')
49+
config.writeXml(elem, QgsReadWriteContext())
50+
51+
layer2 = self.createLayer()
52+
config2 = layer2.editFormConfig()
53+
config2.readXml(elem, QgsReadWriteContext())
54+
55+
self.assertTrue(config2.readOnly(0))
56+
self.assertFalse(config2.readOnly(1))
57+
self.assertFalse(config2.labelOnTop(0))
58+
self.assertTrue(config2.labelOnTop(1))
59+
60+
def testReadOnly(self):
61+
layer = self.createLayer()
62+
config = layer.editFormConfig()
63+
64+
# safety checks
65+
config.setReadOnly(-1, True)
66+
config.setReadOnly(100, True)
67+
68+
# real checks
69+
config.setReadOnly(0, True)
70+
config.setReadOnly(1, True)
71+
self.assertTrue(config.readOnly(0))
72+
self.assertTrue(config.readOnly(1))
73+
74+
config.setReadOnly(0, False)
75+
config.setReadOnly(1, False)
76+
self.assertFalse(config.readOnly(0))
77+
self.assertFalse(config.readOnly(1))
78+
79+
def testLabelOnTop(self):
80+
layer = self.createLayer()
81+
config = layer.editFormConfig()
82+
83+
# safety checks
84+
config.setLabelOnTop(-1, True)
85+
config.setLabelOnTop(100, True)
86+
87+
# real checks
88+
config.setLabelOnTop(0, True)
89+
config.setLabelOnTop(1, True)
90+
self.assertTrue(config.labelOnTop(0))
91+
self.assertTrue(config.labelOnTop(1))
92+
93+
config.setLabelOnTop(0, False)
94+
config.setLabelOnTop(1, False)
95+
self.assertFalse(config.labelOnTop(0))
96+
self.assertFalse(config.labelOnTop(1))
97+
98+
99+
if __name__ == '__main__':
100+
unittest.main()

0 commit comments

Comments
 (0)
Please sign in to comment.